si5351aとグラフィックOLEDモジュールを使ったVFOについて
自作する無線機にちょうどいいサイズのSメーターも手持ちが少なくなりました。このサイズのものを手ごろな価格で新たに入手することは困難になってきました。
また、前回の製作した無線機のVFOに使用したsi5351aは、低価格で幅広い周波数が出力できるので、これからの製作にも使用していきたいと考えています。si5351aの電源は3.3Vなので、周波数表示に使用する液晶なども3.3V対応でI2C制御できると便利です。・・・・ということで、aitendoさんで安く購入できるOLEDモジュール(品番:M096P4W、単価:595円)を入手しました。128×64ドットのグラフィック表示するタイプです。グラフィックを使えばSメーター表示も可能です。
ブレッドボードでマイクロコントローラーにPICを使用して表示させてみました。Arduinoでの作例はu8glibというグラフィック表示用のライブラリを使用したものが多いのですが、PICでは対応するライブラリを見つけることができません。仕方がないのでこのOLEDモジュールのコントローラーのSSD1306に対応したソースプログラムをGithubから探して適当に作ってみました。
グラフィック液晶などを使用するプログラムで多いのは、画面全体と同じサイズのメモリを確保して、そのメモリに描画後、まとめて転送するタイプです。しかしこの仕組みのプログラムでは、1024バイト(128×64/8)のメモリが必要となります。使用したPIC18F14K22はRAMは512バイトしかありません。そこで画面バッファとして256バイト(2ページ分)のみを使用してページ単位(1ページまたは2ページ)で転送する方式としました。OLEDモジュールは、128×8を1ページとして8ページで構成されているので周波数表示に3ページ、RITやステップなどの情報表示に2ページ、Sメーターに3ページを使用しました。
Sメーターの表示は、PICのAD変換で読み込んだものを適当に変換してバー表示させてみました。テストではトリマで分圧した電圧を表示させてみましたが、OLEDは液晶とは違い画面の反応が早いのでいい感じに表示します。ただ、このSメーターの処理が結構重たいので周波数変更の操作感があまりよくありません。とりあえずPICのクロックを内蔵PLLを使用して32MHzとしてしのいでいます。
si5351aの制御とOLEDモジュールの制御を含めて一通りの動作を確認しましたが、問題なく使えそうです。また、OLEDはコントラストが高く視認性が良いのも大きなメリットになります。