普段はATMega328PでArduino互換機を活用している友人から、ピン数が「足りなくなったので40PinのマイコンでArduinoの様に使えますか」と相談を受けました。その友人が購入してあったATMega4809ーPF(40pinDIP)を使い、Arduino互換機化することをしました。
ATMega4809
以前に、ATMega1284-PUを使ってArduino化したことがありました。そこでArduino化に向けてリサーチをしたところ、ATMega4809がArduino対応しているということで、調べるとMicrochip社に買収されたためか、マイコンの機能がかなり上がっていることにびっくりしました。
例えば、ATMega328Pでは内部クロックが8MHzは有効になったけれど、Arduino標準のClock 16MHzにはならなかったことです。PICマイコンでは32MHz、48MHzなどまで対応できていたことろ考えると、長年、Arduino用のマイコンとしてATMega328Pが使い続けられ、変わらなかったのが一因かもしれません。
ATMega4809のように内部クロックがあると、外部にクロック素子を付けずに使えるため、回路も簡単になり、使いやすくなりました。
ATMega4809のArduino互換機化
まずは、ブートローダを書き込む回路を製作します。制御マイコンはArduinoNanoとしました。
回路は簡単で、電源+5V、GNDをNanoからATMega4809に供給します。書き込みをするために、Nano(D6)とATMega(UPDI)を接続します。接続はこの3本のみです。
ブートローダを書き込むプログラム「JTAG2UPDI」を書き込むと、ArduinoNanoが書込器になります。
ブートローダの書き込みの時に、書込装置「JTAG2UPDI」を選択します。またPinoutが「48pin」になっているので、「40pin」にします(他は標準のままでOKです)。
設定後にブートローダを書き込みます。
まずは、ブートローダの書込器が出来上がりました。
この書込器はプログラムを書き込む機能も持っています。Bootloaderの設定が「NoBootloader」となっていると、外部に付けたマイコン(上図ではNano)の機能でプログラムの書き込みをします。
しかし、プログラムの書き換えの時に、必ず外部マイコンが必要となるため、Aruinoと同じようにシリアル機能のみでプログラムを書き込みできるようにしていきます。
ブートローダの組み込み
Arduinoのボードマネージャの設定を見ると「Bootloader」の設定を見ると「Optiboot」の選択ができます。
リサーチの結果のように、Bootloaderの設定を「Optiboot(UART1)」にして、ブートローダを書き込み直すと、UART1から書き込むことができるようになりました。
(ここまではリサーチ結果で動きました)
しかし、UART1はピン1、2番で、電源ピンと離れています。そこで、まとまってピン配置されているUART0(ピン33、34)、電源VDD 31ピン、GND 32ピンと端子が揃っているところを使い、書き込みポートにします。(UART0を使うと、Arduinoと同じようにシリアルポートが0、1番のポートとなり、同じになります)
この状態にするには、ブートローダの書き込み設定、Bootloaderを「Optiboot UART0(default pin)」に設定(上図)して、ブートローダを書き込みます。
これで、UART0からプログラムの書き込みができるようになります。
Arduino書き込み回路
Arduino互換機で書き込みするときに、右図のようにシリアルポートから、リセット用のRTS信号、通信のためのTxD、RxDの3本の線を使い、書き込みが行われます。 ATMega4809でも、Arduino互換機を参考にして同様の回路で書き込むことができるはずです。
回路にある0.1uFはRTSからリセット信号を作るためのコンデンサです。プルアップ抵抗10kΩ以上が必要です。
(電子回路の微分回路が組み込まれています)
TxDとRxDに1kΩの抵抗が入っています。これは、PA0とPA1をI/Oとして使う場合に、他の回路と干渉しないようにする保護抵抗です。
この回路をブレッドボードに組み立てました。右上のケーブルが、秋月電子通商で販売されている「FTDI USBシリアル変換ケーブル(5V)」です。シリアル機能とともに、電源も供給されます(ブレッドボードの電源はこの電源を使用しています)。
シリアル変換ケーブルの下あたりに、抵抗、コンデンサがあります。ここが書き込み用の回路です。
右下に、LEDがあります。これは、マイコンの40番端子に接続されています。
Arduinoのポートでは7番になります。書き込みテスト用にLEDを付けています。
Optibootを使った書き込みテストです。書き込むプログラムは、ポート7に接続されているLEDを点滅するプログラムです。(プログラム例 blink を改良)
#define LED 7
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, 1); delay(1000);
digitalWrite(LED, 0); delay(1000);
}
Bootloaderを「Optiboot UART0(default pin)」に設定して、プログラム書き込みます。すると、LEDが1秒間隔で点滅を繰り返し、問題なく書き込むことができました。
Arduinoのピン番号
Aruinoの制御ぷろぐらむでは「マイコンのどの端子がどのポートになるのか」を把握する必要があります。
この割り当ては、「MegaCoreX」のサイトに、次の画像があります。
例えば、DIP ICの1番ピンの部分に「PC0」、「8」などと書かれています。この図の中で赤線枠内がArduinoのポート番号を示します。
つまり、ICの1番端子を使うときには、Arduinoからみると、ポート「8」として扱うようになります。
この赤線枠のArduinoのポート番号のほか、アナログ入力ピンが「AINx」、SPIピンが「MISO、MOSI、SCK、SS」、I2Cピンが「SCL、SDA」などと機能により使う端子が図からわかります。




0 件のコメント:
コメントを投稿