背景
ATmega328PBとは、Arduino Unoなどに使われているATmega328Pというマイコンの後継機です。ATmega328PBをArduinoフレームワークで開発できるようにしてくれるMiniCoreというプラットフォームでブートローダーを提供してくれています。
このブートローダーを書き込むとUART経由でプログラムを書き込めるようになるということだったので、試してみました。
備忘録を兼ねて取り組んだ内容を共有します。
使ったもの
- ArduinoIDEをインストールしたPC
Ubuntu20.04にArduino IDE1.8.12をインストールしました。 - ATMega328PBのピンを引き出しているボード
以前作ったものを利用しました。 - ISPの書き込み装置
Arduino as ISPを書き込んだProMicroを利用しました。 - ジャンパワイヤ
ATmega328PBの信号線と利用する装置の接続に利用しました。 - USB UART変換モジュール + USBケーブル
ブートローダー書き込み後にこれでプログラムを書き込みます。 - 0.1ufコンデンサ + 10k抵抗
UARTモジュールとATMega328PBのリセットピンを繋ぐのに利用します。 - LED + 1k抵抗
動作確認としてLEDを光らせます。
Arduino IDEにMiniCoreを設定
MiniCoreの設定方法に従います。ArduinoIDEのファイル -> 環境設定を開き、「追加の設定にMiniCoreのボードマネージャのURL」に下記のMiniCoreのjsonのURLを追加してください。
(記事を書いている時点では下記のURLですが時間が経つと変わる可能性があるので、期待するように設定できないときはMiniCoreの設定方法を参照してください。)
(記事を書いている時点では下記のURLですが時間が経つと変わる可能性があるので、期待するように設定できないときはMiniCoreの設定方法を参照してください。)
https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
jsonを追加したら、ツール->ボード->ボードマネージャ を選んでボードマネージャを開き、MiniCoreを検索してインストールしてください。
これでMiniCoreを通してATmega328PBのプログラムを開発する準備ができました。
ブートローダー書き込み用の回路
Arduino as ISPを書き込んだProMicroの書き込み用の信号線をATmega328PBに接続します。接続の関係はこうです。
ProMicro | ATmega328PB |
---|---|
Reset signal(D10) | RST |
MOSI(D16) | MOSI0(D11) |
MISO(D14) | MISO0(D12) |
SCK(D15) | SCK0(D13) |
VCC | VCC |
GND | GND |
繋ぐとこうなりました。
ブートローダーを書き込む
下記の設定で動くブートローダーを書き込みます。(アップロード速度など、設定画面では選べないものの裏側で自動的に選択される設定値がありますが、今回はArduino IDEの設定画面で選べて重要なものだけ注目します。)
- マイコン: 328PB
- 利用する発振子と周波数: 内蔵8MHz
- 書き込み用のUARTポート: UART0
そうなった場合、XTAL1(D20)が出ていれば(出て無ければ引き出せば)、発信子を接続すれば(Arduinoを発信子として動かして接続するのでも良いです)、マイコンが動くので設定を書き直せると思います。
Arduino as ISPを書き込んだProMicroをPCに接続詞た状態で、Arduino IDEを下記のような設定にします。
- ボード: (MiniCoreの)ATmega328
- Clock: Internal 8MHz (Externalを選ぶ場合は、発振子がD20に繋がっていることを確認してください。)
- Variant: 328PB
- Bootloader: Yes UART0
- シリアルポート: Arduino as ISPを書き込んだProMicroのポート
- 書き込み装置: Arduino as ISP(ATmega32U4)
ProMicroで使われているマイコンがAtmega32U4なので、マイコンが言及されている方を選びます。
このようなログが出たら、書き込み成功です。
MiniCoreのブートローダー書き込み後はD13に接続したLEDを1秒に1度2回連続点滅するプログラムが動くようになっているので、D13にLEDを繋ぐと光ります。
UART経由で書き込む回路
ブートローダーを書き込んだATmega328PBにUSB UART変換モジュールを接続して、UART経由でのプログラム書き込みを試みます。注意として、UARTモジュールのDTRをRSTに直接つないだのでは下記のタイミングに関するエラーが発生して書き込めないので、0.1ufのコンデンサと10kΩ抵抗を設置してください。
avrdude: stk500_recv(): programmer is not respondingArduino Unoの回路図でも同じようなコンデンサC5と抵抗RN1Dが使われているので、ATmega328系共通の回路なのかもしれません。
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
MiniCoreの接続例を参考に、コンデンサと抵抗を組み合わせて下記のように接続します。
UART | ATmega328PB |
---|---|
DTR | 10kΩのプルアップと0.1uf抵抗コンデンサ経由(下記の図参照)でRST |
RX | TX(D1) |
TX | RX(D0) |
VCC | VCC |
CTS | GND |
GND | GND |
繋ぐとこうなりました。
USB変換の前にコンデンサを設置し、コンデンサとAtmega328PBの間にプルアップ抵抗の設置が必要なため、場所を取ります。
USB UART変換モジュールは5Vを供給する設定で利用しました。
UART経由で書き込み
USB UART変換ケーブルをPCに接続し、Arduino IDEのツールメニューを下記のように設定します。シリアルポートの設定以外はブートローダーを書き込むときと同じです。
ブートローダーを書き込むわけではないので「書き込み装置」の項目は今回の操作に影響しません。
- ボード: (MiniCoreの)ATmega328
- Clock: Internal 8MHz
- Variant: 328PB
- Bootloader: Yes UART0
- シリアルポート: USB UART変換モジュールのポート
D26でLEDの点灯と消灯を1秒毎におこなうプログラムを書き込んでみます。
#define PIN_LED 26
void setup() {
pinMode(PIN_LED, OUTPUT);
}
void loop() {
digitalWrite(PIN_LED, HIGH);
delay(1000);
digitalWrite(PIN_LED, LOW);
delay(1000);
}
書き込みボタンを押すと、書き込みが始まります。
このようなログが表示されたら書き込み成功です。
D26にLEDを接続して、LEDが点滅することを確認できました。
0 件のコメント :
コメントを投稿