【M5swarm】安い小型マイコンを使ったオリジナルArduinoボード環境の作りかた【Qiita Advent Caldendar 2021】

こんにちは。

修論研究が大詰めのume-boshiです。卒業するために被験者実験をしなくちゃならないのに、理由もなくQiita Advent Calendarに申し込み、誰にも読まれない記事を書いています。おわた~~~(:3 」∠)



さて、今回はATMEGA328P AUという安価な表面実装のマイコンブートローダを書き込んで、オリジナルArduinoボード環境を作る方法について紹介します!

対象の基板

以前、ATMEGA328P AUを対象とした自作基板について、↓ 基板設計面で紹介しました。

ume-boshi.hatenablog.jp

この基板に採用したATMEGA328シリーズのマイコンですが、実際にArduino系で利用されています。その中でも、表面実装できるATMEGA328P AU小型マイコンであり、230円と安いメリットがあります(およそESP32-WROOM-32の面積比1/4、値段1/2)。

akizukidenshi.com

ただ、Arduino用のブートローダを書き込んでいない状態では、Atmel Studioなどでしか開発できません... もちろんそのまま使うのも粋なものでしょうけれど、慣れ親しんだArduino IDEで開発できるほうが便利ですよね!

ということで今回は、以前紹介した基板を用いて、ATMEGA328P AUArduino IDEで開発するための環境を整えていこうと思います。
最終ゴールは、ATMEGA328P AUArduino Pro miniのブートローダを書き込み、Arduino IDEのsketchを普通に書き込める状態です。




Arduino as ISPの書き込み機を用意する

まず、ATMEGA328P-AUブートローダを書き込むための書込装置を作成します。

我々が普段よく使っている(?)書込装置は「AVRISP mkII」というものですが、これはFT232RLのような書き込み機で使われています。{Tx, Rx, RTS, DTR}ピンを使っているやつですね。
それに対しブートローダの書き込みには、「Arduino as ISP」という書込装置を用います。この規格では、SPI通信で使われるような{MISO, MOSI, SCK, RESET}ピンを用います。詳細は他の人に任せます...

そして、このArduino as ISPの書込装置を作成する際には、既にArduino IDEで動作させられるマイコンが必要になります。これはKumanなどの互換品のArduino Unoで大丈夫です。
用意したArduino系のマイコンには、「ArduinoISP」というサンプルスケッチを書き込んでおきます。いつも通りボードとポート番号を正しく指定して、「マイコンボードに書き込む」機能を使ってください。

f:id:ume-boshi:20211206005809p:plain:w450 f:id:ume-boshi:20211206005806p:plain:w450
スケッチの選択とボードへの書き込み設定


ブートローダを書き込みたいマイコンを接続

作成したArduino as ISPの書込装置を、ブートローダを変えたいATMEGA328P AUに接続していきます。Arduino Unoを用いた際の対応表は ↓ の通りです。

index 役割 Arduino Unoのピン ATMEGA328P AU側のピン
1 電源 3V3 3V3
2 電源 GND GND
3 RESET 10 PC6
4 MOSI 11 PB3
5 MISO 12 PB4
6 SCK 13 PB5

f:id:ume-boshi:20211206015510p:plain:w300
データシートより抜粋
※ATMEGA328P AUのデータシート



Arduino Unoを採用した場合、下図のようにピンが配線されることになります。赤が3V3、黒がGND、青がRESET、茶がMOSI、黄がMISO、緑がSCKです。
// MISOが茶色じゃないんかい!(大爆笑の嵐 ;) )

f:id:ume-boshi:20211206014304j:plain:w450
Arduino as ISP側のピン出力位置



そして、読者さんには全く役立つ写真ではないですが、自身の基板では下図のように配線した状態になりました。
この基板を設計した当初は、ブートローダをSPIピンだけで書き込めると勘違いしていたため、RESETピンをつなぐ用の場所を用意していませんでした... ということで青線は、RESETボタンのハンダ部分に手で押さえつけています ¯\(ツ)

f:id:ume-boshi:20211206021456j:plain:w450
毎回接続先を忘れるので写真を撮っておくことをお勧めします


ブートローダを書き込む!

それでは、実際にATMEGA328P AUブートローダを書き込んでいきます。Arduino IDE側の設定は下図の通りです。

f:id:ume-boshi:20211206022407j:plain:w450
設定

①まず、ATMEGA328P-AUに書き込むブートローダを選択します。今回は「Arduino Pro mini」を選択します。プロセッサについては、電源電圧を気にしなくて大丈夫です。今回は16MHzのクリスタルを実装しているため、 「ATmega328P(5V, 16 MHz)」を選択しています。

②書込装置を選択します。これは先ほど作成した「Arduino as ISP」を選択します。※「ArduinoISP」では動作しなかったのでご注意を!

ブートローダを書き込みます。この際、ATMEGA328P-AU側のRESETボタンを1回押してから、「ブートローダを書き込む」をクリックします。Arduino Uno側のLEDが激しくチカチカし始め、Arduino IDEに「ブートローダの書き込みが完了しました」と出力されたら成功です!
※③におけるRESETを押すタイミングによっては、うまく書き込めないことがあります。失敗しても何度か試してみてください。

これ以降、Arduino as ISPは不要なので、取り外して問題ないです。


Arduino Pro miniとしてプログラムを書き込む

それでは、ブートローダも正常に書き込めたことですので、適当なプログラムを実行して動作確認したいと思います。定番のBlinkを書き込みましょう。

まず、FT232RLの書き込み機を接続します。親切に接続対応表もつけておきましょう。

f:id:ume-boshi:20211206033015j:plain:w450
FT232RLを接続

index 役割 FT232RL側のピン ATMEGA328P AU側のピン
1 電源 3V3 3V3
2 電源 GND GND
3 Tx Tx PD0(Rx)
4 Rx Rx PD1(Tx)
5 RESET DTR PC6(前回記事画像C20の位置)



Blinkのプログラムを書き込む際には、元の書き込み設定に戻す必要があります。そのため、シリアルポートはFT232RLのものを選択し、書込装置は「AVRISP mkII」を選択します。実際に書き込む際は、赤で囲ったいつものボタンをクリックします。

f:id:ume-boshi:20211206032927j:plain:w450
書き込み規格をAVRISP mkIIに戻す



動画のように、目的の動作がされたら成功です!Lチカの速度を適当に変更して動作確認しています。(delayを1000 -> 100 -> 10 -> 10000に変更して書き込んだ) youtu.be

もし書き込めなかった場合は、FT232RLとの配線の確認や、プロセッサの ○MHzの値があっているかなどを確認してみてください。




おわりに

今回はATMEGA328P-AUArduino系ボード化する話でした。表面実装でないATMEGAをArduino化する記事は結構あるのですが、今回対象にした表面実装のは見つからなかったので記事にした次第です。

記事では簡単に説明できているものの、私が書き込みに成功するまでには1週間以上がかかりました... どれもこれも、ちゃんとクリスタルを選定してから基板設計しなかったことと、デバッグ用LEDを用意していなかったことが原因です。つらいつらい。

ということで、この記事が皆さん参考になり、Fakedeino開発がはかどれば幸いです!

それではまた ;)


参考文献