JL1NIE ’s blog

趣味のアマチュア無線やプログラミングについて徒然と。

Blog引っ越ししました。

4年近くに渡りお世話になったはてなブログですが、以下に引っ越すことにしました。

jl1nie.wordpress.com

これまでの記事は新しいサイトに全て移行済みです。本サイトのコンテンツも暫くこのままにしておきます。新規記事は新しいサイトに投稿しますのでブックマーク等されている方は更新下さい。

EXIF Orientation問題

f:id:CentralAttack:20191012083029j:plain

 最近スマホGoogle Pixel3aに変更したのですが、ブログ記事の写真をSafariで見ると一部の写真がひっくり返っているというコメントをいただきました。

 冒頭の写真はPixel3aの上端(前面カメラのある方)を右側にして「右向き矢印」撮った写真を、はてなブログの「写真で投稿」でアップロードしたものです。Chrome(Windows/Android)でみると右向きに、Safari(iOS13)で見ると左向きに見えると思います。

 JPEGファイルにはEXIFという画像のメタ情報を保存するテーブルがあり、その中にOrientationというカメラの向きを表すフィールドがあります。冒頭の写真はスマホ内部では左向き矢印として保存され、スマホの向きからEXIFにはOrientation 3が指定されているため180度回転して、正しい「右向き矢印」として表示されています。

 実はHTMLの<img src="">で画像を表示する際にEXIFのOrientattionを解釈するか否かブラウザ毎に挙動が違っており、これが今回の問題の遠因になっています。具体的な対応状況は以下のリンクで調べることができます。

blog.knjcode.com

  こちらによればChromeEXIFに対応せずそのまま表示、SafariEXIFの仕様通り方向を解釈して表示となっています。またCSSのプロパティで指定された場合は回転するものもあります。これではブラウザ毎に見える画像が異なってしまい不便なのでブログサービス側で画像変換をサポートすることが多いようです。

はてなブログでの対応

 はてなブログでもブラウザを依らず表示できるようにしているようです。EXIFを解釈しないChromeでも冒頭の写真もきちんと右向き矢印で表示されています。
 ところがなぜかJPEGをそのまま表示すれば大丈夫なはずのSafariEXIFが解釈されずに画像がひっくり返って表示されてしまいます。またひっくり返るのはiOS13のSafariのみで、iOS12やmacOS CatalinaのSafariでは再現しません。前述の確認画像では全てのSafariEXIF対応して表示されるため、どうもブラウザ側の問題ではなさそうです。

 更に詳しく調べてみると、記事に埋め込んであるJPEGファイルが同じリンク先となっていてもブラウザ毎に表示が異なります(JPEGファイルを直接開いた場合はどのブラウザもEXIFを解釈するはずなのですが?)。どうもブラウザのバージョンを見てダウンロードするファイルを変える処理をしているようで、iOS13の時のみに発生しているようです。

対応策

 結局こちらで対応出来る問題ではなさそうなので、手間は増えますがアップロード前に画像をEXIF情報を元に回転して元のEXIF情報は削除してしまうことにしました。
 ということでEXIFの勉強も兼ねて、こちらの記事を参考にWindowsで以下のスクリプトを作ってみました。

qiita.com

使い方
 python3をインストールした上で、rotate.py, rotate.batを同じフォルダに入れて下さい。rotate.batに変換したい画像をdrag & dropすると画像と同じフォルダにrotatedというフォルダを作り、EXIFに基づき回転した画像を保存します。

  • rotate.py
import os
import sys
from PIL import Image

convert_image = {
    1: lambda img: img,
    2: lambda img: img.transpose(Image.FLIP_LEFT_RIGHT),                              # 左右反転
    3: lambda img: img.transpose(Image.ROTATE_180),                                   # 180度回転
    4: lambda img: img.transpose(Image.FLIP_TOP_BOTTOM),                              # 上下反転
    5: lambda img: img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Pillow.ROTATE_90),  # 左右反転&反時計回りに90度回転
    6: lambda img: img.transpose(Image.ROTATE_270),                                   # 反時計回りに270度回転
    7: lambda img: img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Pillow.ROTATE_270), # 左右反転&反時計回りに270度回転
    8: lambda img: img.transpose(Image.ROTATE_90),
}

rotdir = os.path.sep + 'rotated'

file_paths = sys.argv[1:]

for file_path in file_paths:
    img = Image.open(file_path)
    exif = img._getexif()
    if exif:
        orientation = exif.get(0x112,1)
        print('Roate ' + str(orientation)+' : ' + file_path)
        rot_img = convert_image[orientation](img)

        dirname,fname = os.path.split(file_path)
        os.makedirs(dirname + rotdir, exist_ok = True)
        rot_img.save(dirname + rotdir + os.path.sep + fname, quality=95)
  • rotate.bat
python %~dp0"rotate.py" %*
pause

変換後の画像

 変換後の画像をはてなブログに投稿してみました。Chrome/Safari共に右向き矢印になっています。

f:id:CentralAttack:20191012101859j:plain

nanoVNAを使ってみた

f:id:CentralAttack:20191009233203j:plain

 国慶節の真っ只中に2.7GHzのアナライザを購入してしまい、未だにサプライヤの在庫状況も不明なようです。先日購入したnanoVNAもexperimentalとありますが1.5GHzまで計測できるようです。リリーフとして使えないか1.2GHz帯のアンテナで試してみました。

 使ったファームウェアのバージョンは0.2.3。データはnanovna-saver V0.1.1で取りました。

f:id:CentralAttack:20191009233732j:plain

nanoVNAの設定

 まずnanovna-saverの「Sweep Setting」で23cmを選択。次にキャリブレーションを「Calibration」→「Calibration Assistant」を押して実行します。Calibration Assistantを使うとインタラクティブキャリブレーションを実行してくれるの楽です。

 次に「Sweep Setting」で「Averaged Sweep」を選択。1.2GHz帯ではかなりノイズが多いので何回かのスイープを平均して良い値を選択するこのモードを使ってみました。今回はNumber of measurements to averageを9に、Number to dicardを4に設定してみました。

アンテナの計測

 まずはプリント基板ヘンテナ。若干中心周波数が下ですが、確かパターン変更で低めになってしまったという話を聞いたような気がするので合っているのではないかと?

f:id:CentralAttack:20191009234908p:plain

 次にBiquadアンテナ。ブロードな特性がよく表れています。若干SWRが高いのは屋内で計測しているため周りに障害物が多いせいでしょうか。

f:id:CentralAttack:20191009235222p:plain

結論

 何れもノイズは多いですが、大きな傾向は判るのでアンテナ調整には十分使えそうなレベルです。アンテナアナライザが届くまでnanoVNAでパッチアンテナの製作を進めてみたいと思います。

東籠ノ登山(JA/NN-051)

f:id:CentralAttack:20191006215341j:plain 週末、関東地方の天気が微妙ということで、急遽長野まで足を延ばして東籠ノ登山(JA/NN-051)をアクティベーションして来ました。早朝4時に東京を出発して佐久北ICから高峰高原を目指します。途中、上越道は土砂降りの雨でしたがチェリーパークラインを登る頃には青空が見えてきました。

 高峰高原から林道を抜けて、池の平駐車場に到着。今日はJG1GPY局も一緒。久しぶりのSOTAアクティベーションでした。

f:id:CentralAttack:20191008225419j:plain
駐車場から見える東籠ノ登山(左)。

f:id:CentralAttack:20191008225457j:plain

休憩場所の先の登山口から整備された登山道を登ること35分、山頂に到着しました。

f:id:CentralAttack:20191008225536j:plain

当初雲の中だった山頂も次第に晴れ上がり、目の前には大雲海が広がっていました。

f:id:CentralAttack:20191008225617j:plain

山頂はかなりの風もあり場所も狭いためGPY局持参の10mポールは断念。当局の7m竿とEFHWでHF/UHFを分担してQRVすることにしました。

f:id:CentralAttack:20191008225643j:plain
当局は1200MHzから。スポットしてもメインでCQを出しても呼ばれません。

f:id:CentralAttack:20191008225726j:plain

Radio Mobile Onlineの事前調査では北関東方面はいけるはずだったのですが黒斑山の壁は厚かったようです。

f:id:CentralAttack:20191006214601j:plain

 気を取り直して430MHzでQRV。やっとチェイサー各局からコールいただきました。GPY局も20m/17mがあまり飛ばないということで6mへ。やっと規定局数クリアできたようです。

f:id:CentralAttack:20191008225813j:plain

そろそろ山頂についてから2時間程。天気が不安定で山頂もガスに覆われはじめたのでそろそろ下山の準備。

f:id:CentralAttack:20191006215814j:plain

紅葉にはまだちょっと早そうですが木々の葉が色づき始めています。

f:id:CentralAttack:20191008225857j:plain
帰りは湯ノ丸高原経由で、道の駅「雷電くるみの里」で一休み。天気は不安定でしたが雨に降られることもなく、高原の初秋の風景を楽しむことが出来ました。

 本日もコールいただいた各局ありがとうございました。

地蔵岳(JA/GM-026)

f:id:CentralAttack:20191008230549j:plain
 群馬県 赤城山地蔵岳(JA/GM-026)をアクティベーションしてきました。練馬ICから関越道に入り前橋ICを抜けて4号線へ。順調にいけば現地には8時前に到着予定だったのですが、「赤城山ヒルクライム」で4号線が山頂までまさかの通行止め。
 なんと昼頃まで通行止めとのことなので、道の駅「ふじみ」で休憩。早朝からの運転で腹も空いたのでコロッケでエネルギー補給。

f:id:CentralAttack:20191008230626j:plain

山頂へは少し先の16号を経由しても行けるのですが、あいにく土砂崩れで通行止めです。仕方がないので赤城ICまで足を延ばし、昭和ICから251号を抜けて反対側からアクセスしてみました。

 11時前には大沼に到着したのですが最終組がまだスタートしておらず通行止めです。ここから地蔵岳まで歩くことも出来るのですが、心折れて車の中でふて寝。

f:id:CentralAttack:20191005210619j:plain

黒檜山(写真中央)をアクティベーション予定のJK1NRL局は既に赤城駒ケ岳まで登られているようです。

f:id:CentralAttack:20191008230707j:plain

その後、車を八丁峠に停めて地蔵岳へ。木製の階段を登り30分弱で山頂へ到着。

f:id:CentralAttack:20191005212147j:plain

 今日は時間が無くなってしまったのでアクティベーションは1200MHzのみ。南東側は関東一円に開けており中々のロケーションです。途中JA/YN-033をアクティベーション中のJF1NDT局からもコールいただき1200MHz初のS2S QSOとなりました。

f:id:CentralAttack:20191005213321j:plain

 気が付くと少し先でJK1NRL局が430MHzでQRV中。早速ご挨拶させていただきアイボールQSOとなりました(もう少し当局が早く登っていれば赤城山内でS2Sが出来たのに残念でした)。夕方用事もあるので先に下山させていただきました。

 朝はどうなることかと思った地蔵岳アクティベーションでしたが、初の1200MHz S2Sも出来まずまずの結果となりました。本日もコールいただいた各局ありがとうございました。

 

nanoVNA購入

f:id:CentralAttack:20191011071009j:plain

巷で大人気のnanoVNAモドキを衝動買いしました。購入したのはこちら。若干価格が高めですがシールドがしっかりしているのが売りとか。

www.ebay.com

 まずはキャリブレーションを行い、144/430MHzのホイップアンテナを繋いでSWRとスミスチャートを出してみました(冒頭の写真)。

とりあえず動くことが判ったのでいきなりファームアップデートをしてみました。

nanoVNAのファームウェアアップデート
※本作業は各自の責任の元で行って下さい。
※※アップデート手順について、更に詳しい説明がNanoVNA User Guideにありました(2019/10/10)

・ジャンパの設定

 MCUがDFU(Device Firmware Upgrade)モードで動くようにするためジャンパを取り付けます。新しいバージョンのファームウェアではGUIからDFUモードにすることができるのですが、通常出回っているものは古いファームなので改造が必要です(一度しか使わないのですが)。

・まずは右上側のP1の部分にピンヘッダを取り付け

f:id:CentralAttack:20191011071039j:plain

・ショートピンでショートしてから電源を入れるとDFUモードで立ち上がります。

f:id:CentralAttack:20191011071112j:plain

・USBケーブルの準備

nanoVNA本体はUSB-Cになっていました。附属のケーブルでPCに接続。

f:id:CentralAttack:20191011071148j:plain
・必要なソフトウェアの準備

ここではWindows10環境でのアップデート手順について説明します。

  1. nanoVNAのファームウェアのダウンロード
    こちらからnanovna-firmware-X.X.X.zipというファームウェアのバイナリが入ったzipファイルをダウンロードしてください。
  2. dfu-utilのダウンロード
    WindowsでUSB経由でDFUを行うコマンドラインのツールです。こちらのrelasesからWindows用のバイナリを入手してください。
  3. Zadigのダウンロード
    こちらからdfu-utilに必要なWindowsの汎用USBライブラリをインストールするZadig2.4をダウンロードしておきます。

・USB接続とドライバのインストール

 DFUモードにしたnanoVNAとPCを接続してnanoVNAの電源を入れるとデバイスにSTM32 BOOTLOADERが表示されると思います。ここで先ほどのZadigを立ち上げ、Options→List All Devicesにチェックを入れて下さい。

f:id:CentralAttack:20191002235330j:plain

バイスが表示されますので、上記の様にSTM32 BOOTLOADERを選択後、緑の矢印の右側をWinUSBとし、その下のInstall Driverのボタン押してドライバをインストールして下さい。

ファームウェアのアップロード

 nanovnaのファームウェアとdfu-utilを展開し、dfu-util.exeとlibusb-1.0.dllをnanovnaのbuildディレクトリと同じ場所に置きます。USBケーブルを接続しDFUモードでnanoVNAを立ち上げたあと、nanoVNAのReadme等の記載に基づきdfu-utilでファームウェアをアップデートしてください。進捗状況を示すプロンプトが表示されアップロードが終了すればファームウェアの更新は完了です。

 例:C:nanovna> .¥dfu-util.exe -d 0483:df11 -a 0 -s 0x08000000:leave -D build/ch.bin

f:id:CentralAttack:20191011071228j:plain

・電池残量インジケータ

せっかくファームウェアをアップデートしたので、こちらを参考にダイオードを追加。電池の残量も判るようになりました。

f:id:CentralAttack:20191003212227j:plain

 

SOTAmap用GPXファイル生成ツール

f:id:CentralAttack:20190928075734j:plain

 SOTA Mapping Project(通称SMP)にはGPSナビの経路情報をGPXファイルとしてアップロードし、登山経路を記録できる便利な機能があります。

 登山用GPSスマホアプリの出力するGPXファイルには独自の拡張がされていたり(GPXファイル形式としては正しいのですが)、経路に含まれる地点数が多すぎたりして、そのままではSMPにアップロードできないものがあります。 

 回避策としてカシミール3Dに一度GPXファイルを読み込んだ後、GPXファイルの書き出し機能(「ファイル」→「GPS各種ファイルに書き出す」)で書き出してやることでSMPにアップロード可能なGPXファイルを作ることができます。

 ただGPXファイル変換の為だけにカシミールを立ち上げるのも面倒なので簡単な変換ツールを作ってみました。

 

GPXファイルの変換

f:id:CentralAttack:20190928081248j:plain

 こちらの画面で変換したいGPXファイルを指定し、経路に含まれる地点数を間引く間隔をMinimum Track point Intervalに指定して下さい(デフォルト値では60秒間隔で地点を出力します)。指定されたGPXファイルから、変換ツールがSMPに必要な緯度・経度・高度情報を指定された間隔で間引いて出力します。

SMPへのアップロード

生成したファイルは以下の手順でSMPにアップロードできます。

SMPの「mapping」→「tracks mapping page」を選択

f:id:CentralAttack:20190928081954j:plain

・「Upload track」タブを選択し、「ファイルを選択」でGPXファイルを指定

f:id:CentralAttack:20190928082203j:plain

・アップロード完了

f:id:CentralAttack:20190928082334j:plain

さいごに

SMPのアップロード機能が強化されれば不要になるツールですが、今のところ一部のGPSナビでは面倒な変換が必要ですのでご活用ください。

アンテナのシミュレーション(その2)

f:id:CentralAttack:20190916223210j:plain

誘電体上のパターンでエレメントを作ってみる

 OpenFDTDを使って前回に引き続きパッチアンテナのシミュレーションをしています。今回はプリント基板上のパターンでエレメントを形成してシミュレーションしてみました。プリント基板の素材はFR-4。誘電率4.34としてシミュレーションしています。

 誘電率から短縮率2.08(=√(4.43))となるのでパッチの1辺は50mmほど。ずいぶんコンパクトになりますが、それなりのゲインになってしまいました。

f:id:CentralAttack:20190916211828j:plain

コンパクトなので200mm x 100mの基板でアレーにもできますが、ゲインはやはり今一つです。

f:id:CentralAttack:20190916213730j:plain

結論

 いくつかシミュレーションを重ねてみましたが、安価な200mm x 150mmの紙エポキシの片面基板をグラウンド板として、104mm(X軸) x 100mm(Y軸)の厚さ1mmの真鍮板(モノタロウや きりいた.comで入手)を5.5mmの高さに置く構成が良さそうです。給電点はパッチの中心からX軸方向に21mmの距離にあります(中心から離れるほどインピーダンスが高くなります)。

f:id:CentralAttack:20190916215321j:plain

 リターンロスも1295MHzで-30dB近くになりました(あくまでもシミュレーションなので目安です)。

f:id:CentralAttack:20190916220039j:plain

 ゲインは9dBiほどになりました。偏波面はX軸方向を縦にすると垂直偏波となります。グラウンド板の余白をX軸方向を多めに取ることで垂直方向のパターンが若干絞られるようになっています。 

f:id:CentralAttack:20190916220647j:plain

作り方

・片面基板と真鍮板の中央にM5程度の穴をあけ、5mmのスペーサにワッシャ等をかましてM5ボルトで固定。ワッシャの枚数で高さを調整する。(高くすると中心周波数が下がり、低くすると逆に上がります)

・片面基板の中心から21mm下の位置にパネル用のSMA-Jを固定。同じく真鍮板の中心から21mmの箇所に穴をあけ、錫メッキ線等でSMA-Jと接続。

さいごに

 いろいろシミュレーションしてきましたが、残念ながらまだ1200MHz対応のアナライザを入手できていないので製作は先になりそうです。アナライザさえあれば比較的簡単に作れそうですので、どなたかチャレンジしてみて下さい。
(シミュレーションしかしていないので責任は取れませんが、、、:-P)

参考文献

作ろう!お手軽UHFアンテナ大研究

 

おまけ

本アンテナを2枚パラにするには以下のようにQマッチを使ってインピーダンス変換するのが良いと思います。

・15cm位x2本のRG316の片方を各々のアンテナに繋ぎ、反対側をSMAのT型分配アダプタに接続(分配アダプタの先のインピーダンスは25Ω)。

・Qマッチの伝送線路の特性インピーダンスを求める。
 Zin * Zl = Z0^2となるのでZ0 =√(50 * 25) = 35.4Ω

ここらへんで計算してみる。FR-4の1.6mmの両面基板でストリップラインの幅5.15mm、長さ31.3mmぐらいにパターンを剥がして両端にSMA-Jを取り付ける。

・上の基板の片側に分配アダプタをもう片方は通常の50Ωの同軸を取り付けて完成。