2017/1/12 振りの「Arduino CW Keter」ネタになります。
GitHub の最新バージョンにアップデートしました。
今回は ATmega1284p を載せたボードだけじゃなく、汎用の Arduino Uno でも動作させてみました。
2018.07.15.01 バージョン
GitHub - k3ng/k3ng_cw_keyer: K3NG Arduino CW Keyer
GitHub から最新バージョンを取得します。
「Clone or Download」 → 「Download ZIP」 で、"k3ng_cw_keyer-master.zip" を取得します。
Arduino IDE 1.8.5 インストール
私は、一番上の "Windows Installer" を選択しました。
"Windows app” のインストール先は隠しフォルダなので、後々のことを考えて普通に C ドライブにインストールするのが賢明のようです。
Arduino の ユーザ領域 EEPROM の初期化
Arduino CW Keyer を初期化する方法としては、左右のパドルをオンにしながら電源を入れることでも可能ですが、ここでは EEPROM をクリアする方法を試してみます。
Arduino は電源を断にしてもデータは消えずに残っているユーザ領域(EEPROM)を持っています。
Uno なら1キロバイトです。
本体をリセットしても初期化されずに、次のデータが書込まれるまで消えることはなく、たとえ新たなスケッチを書き込んだとしてもこのユーザ領域はそのままです。
ユーザ領域である EEPROM はハード的に書き込める回数に制限があり、その寿命を延命するために、スケッチの書き込み頻度でクリア(FF または 0 で書き込み)することを避けているのだろうと思います。
今回はアップデートも久しぶりで、前の設定も忘れているということもあったので、EEPROM をクリアすることにしました。
この EEPROM の初期化は、Arduino IDE にある「スケッチ例」の EEPROM 関連のサンプルファイルを使います。
EEPROM の初期化は "eeprom_clear" を読み込み、Arduino に書き込みます。
最初に "eeprom_read" でどんなデータが書き込まれているか確認しました。
00 、FF 以外のデータが書込まれているので、何かデータは書き込まれているようです。
メインスケッチの "k3ng_keyer.ino" を読み解いて、EEPROM を直接編集する補助ツールを作ってみるのもいいかもしれません。
"eeprom_clear" を使って初期化し、もう一度、"eeprom_read" です。
すべてのユーザ領域で ”0” になっていることを確認しました。
(調べてないので何とも言えませんが、購入時のデータは "FF" かもしれません。)
最初アップデートした時に、potentiometer が効かず速度調整ができませんでした。ハード的な障害でも発生したかとチェックするも異常なしで。前に色んな事やった時の設定が残ったままになっていたようです。
コマンドの "V" で potentiometer を disable にしていたことをすっかり忘れていたようです。
他にも何か設定を変えたかもしれないので、今回 EEPROM を明示的にクリアすることにしました。
「動作なんか変・・・?」って感じたら、EEPROM をクリアしてみるのも一考かもしれません。
Arduino Uno + CW Keyer シールドの試験
まず、何人かの方にメールで質問があったので・・・一般的な Arduino Uno で正常に起動するか動作確認してみました。
Arduino Uno + Arduino CW Keyer の組み合わせで動かしました。
GitHub の 2018.07.15.01 バージョンのスケッチをダウンロードして、そのまま何も手を加えずに Arduino Uno に書き込みをました。
("keyer_features_and_options.h" もまったく触らずにそのままです。)
スケッチの書き込みが終了すると、Arduino CW Keyer シールドのスピーカからは正常に起動したことを知らせるモールスで ”HI” が鳴動しました。
パドル操作で、短点と長点が送出することも確認できました。
続いて、コマンド、メモリ、potentiometer で速度が変更できるように設定してみました。
"keyer_features_and_options.h" の次の行をコメントアウト(先頭の // を外す)します。
// #define FEATURE_COMMAND_BUTTONS
// #define FEATURE_MEMORIES // on the Arduino Due, you must have FEATURE_EEPROM_E24C1024 and E24C1024 EEPROM hardware in order to compile this
// #define FEATURE_POTENTIOMETER // do not enable unless you have a potentiometer connected, otherwise noise will falsely trigger wpm changes
CW Keyer シールドの回路が K3NG のウェブに掲載されている構成と同じなら、この設定だけコメントアウトするだけで大丈夫です。
パドル操作によるコマンド送出と、POT で速度が変更できることを確認しました。
<コマンド>
Arduino Uno で正常に動作することを確認しました。
Arduino IDE に ATmega1284 ボードを追加する
ここから、 Atmega1284p ボードの話になります。
これまでは、mighty-1284p を hardware に設定してましたが、Arduino IDE 1.8.5 では環境設定の「追加のボードマネージャのURL」で行います。
https://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.jso
「環境設定」の 「追加のボードマネージャのURL」に上のURLを貼り付けます。
「ツール」 → 「ボード」 → 「ボードマネージャ」 で "MightyCore" を選択してインストールします。
インストールが終了したらボードマネージャは閉じます。
ツール → ボード に "MightyCore" が追加されました。
この状態で、先ほどの Arduino Uno で使ったスケッチが ATmega 1284p ボードに書き込めるか確認します。
書き込み完了後に "HI" が鳴動。
ATmega1284p ボードに正常に書き込めました。
各コマンドも良好、メモリ動作良好、POT で速度変更もできました。
LCD を設定します
LCD(2004A)を I2C で使えるように設定します。
過去記事を参考にします。
上記の記事を参考にして、LiquidCrystal ライブラリを取得し、ライブラリフォルダに配置します。
LCD が使えるように以下の行のコメントを外します。
#define FEATURE_LCD_YDv1 // YourDuino I2C LCD display with old LCM 1602 V1 ic
コンパイルが通り、正常に書き込めました。
LCD に "K3NG Keyer hi" と表示されます。
PS/2 キーボードが使えるように設定します
PS/2 キーボードを使うため、”keyer_features_and_options.h” の以下の行をコメントアウトします。
#define FEATURE_PS2_KEYBOARD // Use a PS2 keyboard to send code - Change keyboard layout (non-US) in K3NG_PS2Keyboard.h. Additional options below.
k3ng のサイトと同じ回路を使っていれば、”keyer_pin_settings.h” の設定は不要です。
私が作成した Arduino CW Keyer シールドは Arduino Uno とピン配置に互換を持たせているのでそのままで OK ですが、ATmega1284p ボードは PS/2 のデータピンに D10 を割り当てているので、こちらのボードを使うときには、以下のように設定を変更する必要があります。
〇キーボードを接続する際の注意点
使用するキーボードの種類によっては、全く反応しないものがあるようです。
今私が使っていて、しっかり反応しているキーボードは、ルートアールの ”RKB-M89UPBK" という型番のものになります。
ルートアール 日本語89キー USB&PS/2キーボード RKB-M89UPBK
今しがた Amazon を覗いてみましたが、残念ながら在庫切れのようです。
ちなみに、同じようなキーボードで手元にあり動作しないものとしては、ペリックス の "PERIBOARD-409P" という型番のものになります。(PS/2 コネクタ)
残念ですがこのキーボードは使えませんでした!
キーボードが反応しなかったりすると、どこに原因があるのかその原因究明に無駄な時間を費やすことになります。
回路の再チェックに始まり、設定ファイルを見直したり、はたまたキーボードを新しくしてみたり・・・泥沼にはまりウンザリすると思います。
こんな時は、原因を切り分けるために、標準のキーボードライブラリ(PS2Keyboard)を使って、打ち込んだ文字がシリアルモニタに表示するかチェックしてみることをお勧めします。
私が入手したキーボードは偶然にも動作しただけの、ただラッキーだったのかもしれません。
使えないキーボードがあるということだけはメールを貰ったハム局の情報で知ってはいたので、今回は所有しているもう一つキーボード、ぺリックスのものでも試してみました。
メール主さんの言うとおりで、まったくの無反応でした。
ここに掲載されているシンプルなサンプルファイルを動かしてみたり、少し時間をかけて調査してみましたが、どうしてもこのキーボードとは相性が悪いようです。
もっと時間をかけて、例えば Arduino とキーボードの間にロジアナでも繋いで信号の流れを直接観測でもすれば、何かロジック的な問題を見つけることができるかもしれませんが、そこまでやる元気はありませんでした。。。
keyer_features_and_options.h の設定について
以下、最終的に設定した "keyer_features_and_options.h" になります。
// compile time features and options - comment or uncomment to add or delete features // FEATURES add more bytes to the compiled binary, OPTIONS change code behavior #define FEATURE_COMMAND_BUTTONS #define FEATURE_COMMAND_LINE_INTERFACE // Command Line Interface functionality #define FEATURE_MEMORIES // on the Arduino Due, you must have FEATURE_EEPROM_E24C1024 and E24C1024 EEPROM hardware in order to compile this #define FEATURE_MEMORY_MACROS #define FEATURE_WINKEY_EMULATION // disabling Automatic Software Reset is highly recommended (see documentation) // #define FEATURE_BEACON // #define FEATURE_TRAINING_COMMAND_LINE_INTERFACE #define FEATURE_POTENTIOMETER // do not enable unless you have a potentiometer connected, otherwise noise will falsely trigger wpm changes // #define FEATURE_SIDETONE_SWITCH // adds switch control for the sidetone output. requires an external toggle switch (assigned to an arduino pin - see keyer_pin_settings.h). #define FEATURE_SERIAL_HELP // #define FEATURE_HELL #define FEATURE_PS2_KEYBOARD // Use a PS2 keyboard to send code - Change keyboard layout (non-US) in K3NG_PS2Keyboard.h. Additional options below. // #define FEATURE_USB_KEYBOARD // Use a USB keyboard to send code - Uncomment three lines in k3ng_keyer.ino (search for note_usb_uncomment_lines) // #define FEATURE_CW_COMPUTER_KEYBOARD // Have an Arduino Due or Leonardo act as a USB HID (Human Interface Device) keyboard and use the paddle to "type" characters on the computer -- uncomment this line in ino file: #include// #define FEATURE_DEAD_OP_WATCHDOG // #define FEATURE_AUTOSPACE // #define FEATURE_FARNSWORTH // #define FEATURE_DL2SBA_BANKSWITCH // Switch memory banks feature as described here: http://dl2sba.com/index.php?option=com_content&view=article&id=131:nanokeyer&catid=15:shack&Itemid=27#english // #define FEATURE_LCD_4BIT // classic LCD disidefplay using 4 I/O lines // #define FEATURE_LCD_8BIT // classic LCD display using 8 I/O lines // #define FEATURE_LCD_ADAFRUIT_I2C // Adafruit I2C LCD display using MCP23017 at addr 0x20 // #define FEATURE_LCD_ADAFRUIT_BACKPACK // Adafruit I2C LCD Backup using MCP23008 (courtesy Josiah Ritchie, KE0BLL) #define FEATURE_LCD_YDv1 // YourDuino I2C LCD display with old LCM 1602 V1 ic // #define FEATURE_LCD1602_N07DH // http://linksprite.com/wiki/index.php5?title=16_X_2_LCD_Keypad_Shield_for_Arduino // #define FEATURE_LCD_SAINSMART_I2C // #define FEATURE_LCD_FABO_PCF8574 // https://github.com/FaBoPlatform/FaBoLCD-PCF8574-Library : : 以下、修正なし
基板化について
前々から最終的には基板化すると言ってましたが、KiCad の扱いも少しは慣れてきたので、そろそろ ATmega1284p ボードと、現バージョンに CW デコード回路を追加したシールドの2枚を基板化してみようかと思っています。
いざ、基板化となると細かなところでミスったりして作り直しが発生するなど、何度かはプロトタイプを作る羽目になることも覚悟しないといけないので、まぁ少し気長に取り組んでいきたいと思っています。
■ ■
k3ng の Arduino CW Keyer は、性能は勿論のこと、アップデートも GitHub で頻繁で拡張性もあり、少ないパーツで製作できるのでコスト的にも安価と、どれをとっても優れています。
ハムで CW を続ける者にとっては、末永く付き合える最高の Keyer ではないでしょうか。