2019年4月21日日曜日

Atmega32u4にArduino Leonardoのブートローダーを書き込んでみた


背景

Atmega32u4とは、Arduino Leonardo, Arduino Micro, Pro Microなどに使われるMicrochip(買収前はAtmel)のAVRマイコンと呼ばれるものの1つです。

Leronardo互換機版を作る際にブートローダー(ファームウェア)の書き込みが必要だったのですが、思っていたよりも挙動の把握に手間取ったので、備忘録を兼ねてメモを共有します。

使ったもの

Ubuntu18.04をインストールしたPC(WindowsPCでも書き込めると思いますが未確認です)

USBの認識にlsusbコマンド利用しました。
Windowsでもデバイスマネージャーを開けば確認できると思いますが、この記事ではlsusbで確認できた情報を共有します。

Arduino IDE


Arduinoの開発環境ソフトウェアです。
このソフトを利用してLeonardoのファームウェアを書き込みます。

Download Arduino IDE

Aatmega32u4が載った基板



今回はArmega32u4を買って実装した基板であるLeonardoBBを例に説明します。
Atmega32u4にArduinoのブートローダーをまだ書き込んでいないため、Arduinoとしては動いていません。

書き込み装置(どれか1つ)

AVRライタ



USBTinyというAVRマイコン用のプログラム書き込み装置を使ってみました。
Aliexpressで$2弱でした。

ピンソケットは別途購入とはんだ付けが必要です。
秋月電子とかで買えます。

Atmega32u4が使われているArduino(LeonardoやMicroやProMicro)



LeonardoやMicroやProMicroを書き込み装置として利用する場合は、Arduino IDEからArduinoをAVRライタとして動かすためのプログラム(Arduino as ISP)を書き込んでおいてください。


自分が試した限りでは、Arduino UnoをArduino as ISPとして動かしてもAtmega32u4を認識してくれませんでした。
そのため、Atmega32u4向けのArduinoを書き込み装置として利用する場合は、同じくAtmega32u4が使われているものを用意するのが良いと思います。
Megaとか他のチップのArduinoでは未検証です。

ジャンパワイヤ

書き込み対象の基板と書き込み装置の接続に利用します。

書き込み装置や書き込み対象のピンによって、オスメスだったりメスメスだったりオスオス+ブレッドボードが必要になると思います。

ブートローダー書き込み前の挙動


工場出荷状態のAtmega32u4にはDFUブートローダーが書き込まれています。
このブートローダーは、lsusbやデバイスマネージャーとして認識できるデバイスとして動きますが、USB接続してもLeroanrdoのブートローダーのようにCOMポートは作ってくれません

基板作成後にUSBの接続を確認したい場合は、COMポートの有無ではなくlsusbやデバイスマネージャーを利用すると、USB通信できていることを確認できます。

lsusb
Bus 002 Device 010: ID 03eb:2ff4 Atmel Corp. atmega32u4 DFU bootloader


配線

ブートローダーを書き込むために、Atmega32u4が載った基板に書き込み装置を接続します。

AVRライタを利用する場合

AVRライタ書き込む基板
V5V
GGND
MOMOSI
MIMISO
SCSCK
RSTReset

繋ぐとこうなりました。


Atmega32u4搭載のArduinoを利用する場合

ArduinoISPもページを参考にしつつ、下記のように配線してください。
Aaruino as ISP書き込む基板
5V5V
GNDGND
MOSI(ProMicroなら D16)MOSI
MISO(ProMicroならD14)MISO
SCK(ProMicroならD15)SCK
D10Reset

ISCPの6ピンはこのような役割になっています。


繋ぐとこうなりました。



書き込み

Arduino IDEのツールこのような設定を選びます。

USBTinyを利用する場合
ボード: Arduino Leonardo
ポート: 未選択(USBtinyはポートの一覧に出てこないようです)
書き込み装置: USBtinyISP


LeonardoなどのArduinoを書き込み装置として利用する場合
ボード: Arduino Leonardo
ポート: 接続している書き込み装置として動かすArduinoのポート
書き込み装置: Arduino as ISP


設定を選べたら書き込み装置がPCに繋がっていることを確認し、ツール -> ブートローダーを書き込む」を選択します。


1分弱でLeonardoのブートローダーが書き込まれます。


書き込み後の挙動

D13にLEDが接続されていれば、ブートローダー書き込み後はLEDが点滅します。


ブートローダーを書き込んだボードのUSBをPCに接続するとArduino Leonardoと同様、下記の用に動作します。
  • シリアルポート(Ubuntuの場合/dev/ttyACM*)ができる
  • Leonardoとして認識される


余談: avrdudeコマンドを使って、書き込み装置がAtmega32u4を認識していることを確認する

avrdudeコマンドを利用すると、書き込み装置として動かしているArduinoが書き込み対象のAVRマイコンを認識できているか確認できます。
ubuntuならavrdudeコマンドはaptでインストールできます。
sudo apt install avrdude

USBTinyがAtmega32u4を認識しているかどうかは、下記のコマンドで確認できます。
avrdude -c usbtiny -p m32u4

ArduinoISPとして動かしているArduinoがAtmega32u4を認識しているかどうかは、下記のコマンドで確認できます。
(Leonardo系なら認識できましたが、UnoではAtmega32u4を認識できませんでした。)
avrdude -c avrisp -p m32u4 -P /dev/ttyACM0

下記のようにatmega32u4のSignatureが表示されれば、認識できています。
avrdude: Device signature = 0x1e9587 (probably m32u4)

ちなみに、ブートローダーの書き換え時にヒューズの値も書き換えられるようでした。

ブートローダー書き込み前
avrdude: safemode: Fuses OK (E:F3, H:99, L:5E)


ブートローダー書き込み後
avrdude: safemode: Fuses OK (E:CB, H:D8, L:FF)


まとめ

最初は、USB接続しても認識されず、Arduino Unoからはプログラムを書き込めなくて、戸惑いました。
しかし、lsusbコマンドを使えばデバイスとして認識していることが分かり、USBTinyかLeonardo系のArduinoを使えばプログラムを書き込めました。

Leonardoを自作できる方法が分かって良かったです。

Arduino UnoではAtmega32u4を認識できない理由をご存知でしたら、コメントなどで情報を共有してもらえると嬉しいです。

参考

Arduino ISP

変更履歴

2020.10.31
Arduino as ISPを利用する際の書き込み装置の選択が「Arduino」になっていたので、「Arduino as ISP」に修正しました。

0 件のコメント :