入院中は特に具合が悪いときでなければ基本ヒマです。
そこで、かつて設計した無線機、、、いやいやコピーした無線機ついて、きちんと構造を理解しておきたいと思うようになり、今さら勉強しております。
その時の無線機はDDSボードとチップマイコンを使用し、周波数表示部には4桁の7セグLEDを使いました。
そんな中、凄まじいVFOを発見
JF3HZB氏による作品で、2インチカラーLCDにアナログダイアルを表示させるというものです。
是非動画を探してご覧頂きたいのですが、往年の実機に組み込んでも違和感の無い、滑らかな動きをします。
仕様を見るとArduinoを使用しているようです。
LCDは動画に耐えうる性能なら何とかなりそうですが、Arduino側で描画速度を稼げるんですね。。。
まあ、これは面白いということで、これと似たものを作ることに挑戦してみることにしました。
今回の描画は円形のダイアルなので、描画アルゴリズムの肝は座標計算です。
目盛り1つ1つを描いては消すという繰り返し。
ここは良い子におなじみの三角関数の登場です。
参考になったVFOの目盛りのように、内径をMHz表示、外径をKHz表示としたディレイ動作(外径より内径がゆっくり動く)を実現します。
アウトラインを描画したところ。
これを作るに当たって、NS-Ware さんのBasic for Androidを使いました。
しかーし!
分かってはいたけど、インタープリタでは描画遅すぎて話にならない。フリーソフトだから仕方ないか。。
ところが、このBasic for Androidはフリー版と有償版がありまして、有償版は中間言語に翻訳して高速に実行することができるとか、その他諸々の機能も強化されています。
しかして、そのお値段ですが、
500円ぽっきり!
しかも有償版は、中間言語に翻訳したバイナリファイルを保存して頒布することも可能。
さらにバイナリファイルを実行だけしたい人向けのランタイムキットはフリー(無償)です。
安い!!
ということで、少し迷って購入。
(今のところこれにしか使う予定ないし。。。)
きっと1,000円以上だったら買わなかったかも。
で、四の五の言わずに、有償版で目盛り動作まで作り込んだのがこちら。
今回、動画です。
表示は開口部を扇状に120度だけ見える仕様。
内側は上述通りMHz、外側をKHzとしています。
KHzは目盛り1つで3度で、MHzを9度としています。
しかし、この時点で本家の足元にも及びません。
専門の方なら分かると思うのですが、長かろうが短かろうが直線を引くのは楽勝です。
Basicには標準で算術関数が実装されているので、高校数学くらいまでなら対応できるので。
問題は文字列の傾斜表示。
目盛りだけでは、何Hzなのかわからないので、目盛りの下にせめて100KHz、0.5MHz単位に文字も表示したいです。
これも文字列を長方形と捉えて、そのドット座標の色情報と円形に移動した時の各ドットの座標を計算して古い情報を消して、新しいドットを描けば良いはず。
ただドットの情報量が多すぎて、なめらかに動かない可能性が高いため、全体的な高速化を図る必要に迫られそうです。
この先も頑張って見ますが、生きてる間に成功させる自信がないです。
きっと、これがAndroidアプリ開発用の言語で、グラフィックライブラリを使えば、あまりアルゴリズムに苦労せずに済むんでしょうねぇ。
有力なのがJavaかkotlinだそうですが、そもそも開発実績がありません。。