前回の「Lチカ」に引き続き、今回は「ARDUINO CW KEYER」のスケッチを ATmega1284P に転送してみます。
Lチカのスケッチが問題なく転送できたので、「ARDUINO CW KEYER」のようにデータ量が大きいものでも簡単に転送できるだろうと気楽に考えていました。ところが、シリアル転送中にエラーが続出し、すっかりハマってしまいました。
そのため、ウェブで解決策を探したり、オシロスコープで波形を確認したりと、色々試行錯誤を繰り返しました。その結果、問題の原因が判明しました。
ATmega1284P のピン配置が影響して、ノイズがシリアル通信を妨害していたようです。具体的には、クロック(Pin 12、13)の隣にあるピン(Pin 14)が RX として使用されており、このクロック側のノイズが RX に影響を与えていたようです。その結果、データ転送中にプロトコルエラーが発生してしまっていました。
そこで、RX 側にローパスフィルタ(10kΩ の抵抗と 100pF のコンデンサ)を追加してみました。その結果、これまで悩まされていた書き込みエラーが嘘のように解消し、データを一発で転送できるようになりました。
さて、ここからは「ARDUINO CW KEYER」シールドと ATmega1284P の接続についての話になります。

写真左側の「ARDUINO CW KEYER」シールドと、右側の 1284P が乗ったブレッドボードをジャンパワイヤで接続します。
シールドと 1284P の実際の接続は以下のとおりです。

■ 「ARDUINO CW KEYER」シールド、ATmega1284P ピン番号対応表
| Keyer シールド | ATmega1284P | |
| RESET | 9 | |
| 5V | 10 | |
| GND | 11 | |
| Vin | 30 (AVCC) | |
| A0 | 40 | Speed VR |
| A1 | 39 | Button |
| A3 | 37 | PS2 DATA |
| A4 | 23 (SDA) | I2C SDA |
| A5 | 22 (SCL) | I2C SCL |
| - | 14 (RX0) | FT232RL TX |
| - | 15 (TX0) | FT232RL RX |
| D2 | 3 | Left Paddle |
| D3(D10)* | 16 (INT0) | PS2 Clock |
| D4 | 5 | Speaker |
| D5 | 6 | Right Paddle |
| D11 | 17 | TX Key 1 |
| D12 | 18 | TX Key 2 |
※ keyer シールドのピン配置は Arduino Uno に合わせています。
(Arduino Uno の D3 には、Atmega1284p の D10 を接続しています。 )
※ Arduino Uno で PS2 Keyboard を使うときには、"keyer_pin_settings.h" の設定を pin = 3 に、1284p では pin = 10 に設定する必要があります。

※ 328P と 1284P ではピン配置に違いがあるため、実際に接続する時には注意が必要です。

取り急ぎ、「ARDUINO CW KEYER」 のスケッチが正しく書き込めたか確認したかったので、上の対応表の一部だけを接続して試験を行いました。

パドルを接続した試験も良好です。
メモリ機能も動作してます。
これで、「ARDUINO CW KEYER」のような大きなデータサイズのスケッチでも 1284P に書き込めることが確認できました。
やれやれ。