背景
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ライタ | 書き込む基板 |
---|---|
V | 5V |
G | GND |
MO | MOSI |
MI | MISO |
SC | SCK |
RST | Reset |
繋ぐとこうなりました。
Atmega32u4搭載のArduinoを利用する場合
ArduinoISPもページを参考にしつつ、下記のように配線してください。Aaruino as ISP | 書き込む基板 |
---|---|
5V | 5V |
GND | GND |
MOSI(ProMicroなら D16) | MOSI |
MISO(ProMicroならD14) | MISO |
SCK(ProMicroならD15) | SCK |
D10 | Reset |
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 件のコメント :
コメントを投稿