2020年7月19日日曜日

ATMega328PBにMiniCoreのブートローダーを書き込み、UART経由でプログラムを書き込んでみた


背景

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の設定方法を参照してください。)

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 responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
Arduino Unoの回路図でも同じようなコンデンサC5と抵抗RN1Dが使われているので、ATmega328系共通の回路なのかもしれません。

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が点滅することを確認できました。


まとめ

USB UART変換ケーブルのDTRとATmega328PBのRSTピンの間に抵抗やコンデンサを設置する必要がありましたが、USB UART変換ケーブルを通してブートローダーを書き込済みのATmega328PBにプログラムを書き込めました。

0 件のコメント :