無線ブログ集
メイン | 簡易ヘッドライン |
CW Decoder を M5Core2 (M5Unified) に移植してみた (2024/9/26 11:11:00)
たまたまデンマークの OZ1JHM Hjalmar Skovholm Hansen さんの、Arduino CW Decoder
" A VERY simpel CW decoder EASY BUILD "
ページを訪れて、試してみたくなってしまった。
Arduino Uno互換ボードへの移植
手始めに、Arduino Uno 互換のCPUボードと10個のセンサモジュールが一体になった、
Grove Beginner Kit for Arduino で動かしてみた。
元のソースから、
データ線 4 bits の20桁4行 LCD を使うようになっていたのを
- Beginner Kit 搭載の Grove - OLED Display 0.96" (SSD1315)
- I2C 接続の Grove - I2C 16x2 RGB Backlight LCD
- 入力のADCのサンプリング周波数を起動時に自動計測
Beginner Kit 搭載の
- マイク Grove - Sound Sensor
- LED Grove - Red LED
特に問題もなく、簡単に移植できました。
動作している動画
M5Core2 への移植
Grove
Beginner Kit for Arduino では実用するには大きすぎるので、LCD も Mic 入力も搭載している M5Core2 に移植を試みる。
M5Stack シリーズでは、私の持っている M5Core2 より通常の M5Stack系の方が普及していそうなので。
仕様の異なるハードウェアのM5Stack製品間を共通のAPIで使用できるライブラリ M5Unified を利用して作成すれば多くの人に使ってもらえそう。
M5Unified に関しては公式ページよりも、こちらの M5Unified入門
ページの方が分かりやすいかも。
改造点
表示
- スクロール・テキスト領域に、デコードした文字を表示。
- 下記の強度表示領域の左側に、WPM を表示。
- トーン信号強度を GREEN 、検出閾値の強度を DARKGRAY、検出したと判断したら YELLOW で描画する領域。これは追加してみると無線機音量や無線機との距離の目安や、パラメータ調整にもかなり便利でした。
OZ1JHMさんの decoder11.ino は GPL なので、
"This program is a modified version of "OZ1JHM CW Decoder VER 1.01”,
originally developed by Hjalmar Skovholm Hansen."
という文章を表示する起動時 Splash も追加。
ほぼ初めて M5Unified を使いまいしたが、高機能な LovyanGFX をラッピングした M5GFX
でチラつきのないスプライト処理などが簡単に扱えて非常に便利。
ただ高機能なゆえ、M5Unified
の公式ページのドキュメントだけでは分かりにくい部分もあり、
結局 [Arduinoフォルダ]/libraries/M5GFX/src/ で Header
などを眺めるのが確実。
Goertzel Algorithm
M5Stackシリーズに搭載されている ESP32
では浮動小数点演算機能が搭載されているので、元々の float による演算でも早くて負荷は軽いのですが。
他の CPU や固定小数点 DSP でも利用しやすいように、固定小数点演算化しました。
また、得られる信号強度を演算サンプル数で正規化してサンプル点の大小によらず一定の値が得られるようにしました。
Mic 入力
Mic 入力は Arduino 版の analogRead() による ADC ではなく、
M5Core2 の PDM 出力 Mic を
M5.Mic.record() でデータを取得。
少しハマったのは record()
関数で指定したバッファは常にデータ転送で上書きされていくので、
スタック領域ではなく、静的なデータ領域に確保して転送が完了したらすぐに
他のバッファにコピーしておかないと不連続なデータになってしまうようです。
無線機スピーカの音量や、無線機スピーカとの距離に気を使わなくてすむように、
Mic 入力に AGC ( A
utomatic G ain C ontrol) 処理を追加しました。
動作動画
所感
M5Core2 に小さくまとまりMic
入力で配線接続の手間のなくなったので、かなり実用的になったと思う。
シンプルなアルゴリズムにも拘らず、弱くてノイズの多い受信音でも結構な解読性能を示します。
ただ当然ながら、文字間の短いつながりかけた符号や粘っている符号には歯が立ちません。
またノイズすれすれの受信信号では、人間の耳の解読性能にはるかに届きませんね。
送信符号の打ち間違いでも、人間の耳の場合は脳が勝手に補完できちゃったりするし。
検出強度と符号との相関を見たり、ML的な学習を行うことで解読性能は上がりそうな気もしますが。
このシンプルなアルゴリズムとはけた違いに演算負荷が増えてしまうでしょう。
M5 シリーズのような ESP32
ではなんとかなっても、通常の Arduino Uno などでは動かなそう。
そこまでする?という話になるのかな。
個人的には M5Unified の使い方を習得出来たのが一番の収穫でした。
ToDo
- 和文モールス符号に対応。 ホレ 、 ラタ で英文/和文自動切換え?
- 検出 Tone 周波数の自動追従を追加したい。
- Mic AGC の最大ゲイン調整機能を追加した方がいいかな?
execution time : 0.062 sec