K3NG Keyer を STM32F103C(BluePill) で製作

2020/8/1 7M4MON




前置きが長いので、制作過程まで飛ばすリンクを貼っておきます。
BluePillで作る

1.前置き

およそ20年前のコンテスト運用ではZLOGを使っていていました。
ZLOGではパラレルポート付きのPCとWindows9x/MEとの組み合わせで
プリンタポートにつないだパドル(当時は カツミ KM-23 を愛用)でキーイングが可能でした。
その後、OSはWindows 2000/XPが主流になりましたが、ZLOG+NT系の組み合わせは、
シリアルポートのDTR線でキーイングは可能なものの、パラレルポートでのパドル操作はできなくなりました。
XP/2000では USBIF4CW がサポートされていたものの、微妙に高価でなんとなく手が出せずにいました。
という訳で、熱があるうちはWindows98とパラレルポート付きのノートPCを使用し、
熱が冷めてからはDTR線でのキーイング+外付けキーヤー(OIKey-F675等)でのパドル操作で参戦していました。
外付けのキーヤーではロギングソフト側と速度の同期が取れないので、パラレルポートでのパドル操作と比べるとイマイチ不便でした。

時は流れて21世紀となり、ZLOGの開発が終了し、国内コンテストロギングソフトの主流はCtestWinに変わりました。
CtestWinでもシリアルポートのフロー制御線でキー操作は可能でしたので、しばらくそれで参加していたのですが、
あるとき、CWポート設定に WinKeyer があることに気づきました。



調べてみると、オリジナルの WinKeyer は USBIF4CW と同じくらいの値段でしたが、
K4NG CW Keyerというオープンソースで開発されているキーヤーには「WinKeyer Emulation Mode」というものがあり
CtestWinとの組み合わせで、ロギングソフトと連動したパドル操作が可能ということが分かりました。

2.Arduino nano (ATMega328P)バージョンの製作

まずはArduino nano (ATMega328P)で試してみることに。
K3NG Keyerには様々な機能がありますが、keyer_features_and_options.h の該当機能の行のコメントアウトを外すと
任意の機能を有効にすることができます。

せっかくだから液晶を付けたいよね。と、とりあえず
FEATURE_LCD_YDv1, FEATURE_POTENTIOMETER, FEATURE_COMMAND_BUTTONS, FEATURE_WINKEY_EMULATION
あたりでビルドしてみると、[スケッチが大きすぎます]となり全然入りません。
色々オプションを試してみましたが、どうやら表示器をつけた時点で入らないっぽいです。
ということで、液晶は諦めて
FEATURE_COMMAND_BUTTONS, FEATURE_MEMORIES, FEATURE_WINKEY_EMULATION, FEATURE_POTENTIOMETER
のオプションを有効にして作りました。

出来上がった写真が

です。
内部は2階建てで、1階部分は Mumble-Funk用に制作したトランスを使用の
絶縁型オーディオインターフェースとシリアル(リグ)コントロール+旧フロー制御PTT/CWインターフェースです。



2階部分にPICマイコンを使用したキーヤーがついていたのですが取り外してK3NG Keyerを設置しました。



微妙に高さが入らなかったのでUSBコネクタ部は超音波カッターで取り除いてあります。
これでCtestWinと同期してパドル操作できるようになりました。

3.BluePillで作る

Arduino nano版を使ってみると絶好調で、そうなると液晶付きの K3NG Keyerを作ってみたくなるのが人情です。
Arduino Mega 2560を使った作例が多いようでしたが、ATmega2560はマイコンボード単体でも結構な大きさです。
keyer_hardware.h を覗いてみると HARDWARE_GENERIC_STM32F103C が存在しています。
ということで、IPトランシーバ の検討用に購入した STM32F103 (BluePill)を使ってみることにしました。
ATmega328と比較すると下表の通り、Flash容量4倍、クロック4.5倍、SRAM容量10倍です。



ターゲットをSTM32F103CB にして試しにビルドしてみると、
エラー[call of overloaded 'noTone(<anonymous enum>)' is ambiguous]
とでてビルドできませんでした。
調べてみると、これは hardwareフォルダにある [tone.h] と、 [keyer_stm32duino.h] で定義されている
tone関数および noTone 関数の型定義が不一致であることが原因でした。
修正後に焼いてみて1602の液晶を付け、ブレッドボード上で動作確認ができたので、
勇気を出して人生初の Pull Request をかけました。
Fixed error : call of overloaded 'noTone()' is ambiguous #94



しばらくして無事にMargeされました。


どうせ作るなら、液晶は20x4行でTX切り替え機能もほしいと欲が出て、最終的には↓のようになりました。





主要部材は

などで、かかった費用は3500円くらいでした。

で、作ったものの、コマンドボタン 1〜3 が動きません。("Button - 0" だけは動作する)
調べてみると ボタンを読み込む analogRead()の範囲が異なっていることが原因と判明。
再度 Pull Request をかけて、こちらもマージされました。
Command buttons 1-3 are not working with ARDUINO_GENERIC_STM32F103C. #100

素晴らしいソフトを公開し、メンテナンスを継続されているK3NG [Anthony Good] OMに感謝します。


4.その他