ATmega32U4にArduino Leonardoブートローダを書き込む方法

現在のプロジェクトで使っているATmega32U4にArduino Leonardoブートローダを書き込むのに苦労したので、Tipsや書き込み方を紹介します。

#ハードウェア
自作のPCBです。モータドライバー、センサー関係、昇圧回路など色々、乗っけました。
フラックスが残っていて汚いのは許してください笑
![IMG_8283.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/aebde22d-3c30-ca20-1d12-c464ec1233f7.jpeg)

- マイコン ATmega32U4
- クロック 16MHz
- インターフェース ICSP,MicroUSB対応


回路図やPCBガバーなど詳細は以下
<a href="https://github.com/rennn2002/Roomba"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/rennn2002/Roomba.png" width="460px"></a>

#失敗 Arduino Leonardoから書き込み
Arduino LeonardoをISPとして使いブートローダーを使う方法。
この方法では結局うまくいかなかったのですが、参考としてご覧ください。
![IMG_8288.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/7dda4503-b4ac-bc3e-17de-6f2c4111471a.jpeg)

Arduino LeonardoにはATmega32u4が乗っているので、ATmega32u4にブートローダを焼く場合は同じチップからの方が相性がいいらしい。書き込み機として使うLeonardoのリセットとGNDの間に10µFのコンデンサを挟んでもうまく行きませんでした。具体的には以下のエラーが出ました。
![Screen Shot 2021-04-03 at 13.48.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/443f711f-c152-6bcf-061c-251cd2c5ec00.png)
ArduinoIDEではブートローダーの書き込みを簡単にするため、対象を選択してボタンを押すだけで書き込めるようになっていますが裏ではavrdudeというコマンドが動いています。
![Screen Shot 2021-04-03 at 13.51.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/ea16833f-8d5d-c64e-deb8-3ec83ec5d0d1.png)
デフォルト設定では実行コマンドや進渉が見えないのでverbose outputをIDEの設定からアップロードとコンパイル中に有効にします。これでコマンドが確認できます。

```bash
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -v -patmega32u4 -cstk500v1 -P/dev/cu.usbmodem1101 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0xcb:m -Uhfuse:w:0xd8:m -Ulfuse:w:0xff:m 
```
エラーメッセージで-Fオプションをつけて試してくださいとあるので最後に-Fをつけて実行。

```bash
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -v -patmega32u4 -cstk500v1 -P/dev/cu.usbmodem1101 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0xcb:m -Uhfuse:w:0xd8:m -Ulfuse:w:0xff:m -F
```
やはりエラー、データの読み込みは完了しましたが、ブートローダーの書き込みがされず終了してしまいます。
![Screen Shot 2021-04-03 at 14.00.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/d0130eee-57f8-76a6-1559-fc6b6fb32412.png)

#対処法
結論から言うとUSBaspを使えば問題なく書き込みできました。
USBaspはAtmel社AVRマイコン用のプログラムライタです。10ピンなので、ICSP経由で書き込む場合は__6ピンに変換__が必要です。
![IMG_8289.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/9471aacd-b6a9-bb30-2fc4-31ff2035812a.jpeg)
画像では自作の変換ケーブル使ってます。

- USBasp

https://www.amazon.co.jp/-/en/dp/B011DT3MIS/ref=sr_1_4?dchild=1&keywords=usbasp&qid=1617452857&sr=8-4

- 6ピン変換

https://www.amazon.co.jp/AVRISP-USBASP-STK500-10-pin-Conversion/dp/B014KJ0Z5G/ref=pd_sbs_2?pd_rd_w=eoPHX&pf_rd_p=79af72db-ddc4-4bac-b5f0-83b0cc0fefab&pf_rd_r=5MHJPE0VXBF4QCKFX7FK&pd_rd_r=05eedae2-a132-4775-8f0d-ccab093db20d&pd_rd_wg=APGTH&pd_rd_i=B014KJ0Z5G&psc=1

###使い方

使い方は簡単でPCとUSBaspをUSBポートから接続します。
![IMG_8308.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/3d121e0a-ae6b-b655-30d8-c788d336d10f.jpeg)

次に、出力の10ピンをICSP用に6ピンに変換します。
![IMG_8309.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/05bc5720-6e4d-22ca-f7e8-b7413ec6a49c.jpeg)

変換ケーブルを自作したい方のためにUSBaspのピンアサインを載せておきます。
![usbasp_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/00337698-b7e4-c5a5-0110-34574ff98f8b.png)

さらに変換した6ピンのケーブルをターゲットのICSPに接続すれば配線は完了です。
![IMG_8310.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/b70f1042-8dc2-971a-9c4b-37a9e8295d32.jpeg)
PC側ではArduinoIDEを起動します。__メニュー＞ツール__から書き込みたいブートローダーの名前をボードから選択します。(この場合はLeonardoを選択)
ポートは何も選ばなくて大丈夫です。さらにUSBaspをプログラマとして選びます。最後にブートローダー書き込むを押せば書き込みGA開始されます。

書き込みが正常に終了すると以下のように表示されます。今回の環境では書き込みには30~40秒ほどかかりました。またエラーが出た際は、変換や差し間違えなど接続を再度確認してみてください。
![Screen Shot 2021-04-03 at 20.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/468235ec-4609-20c8-120e-4090bfbc3176.png)
![Screen Shot 2021-04-03 at 21.46.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/4f2c30c9-cf73-7d93-93dd-d641ce8dcb07.png)

書き込みが終了しボードをPCと直接繋ぐとATmega32U4がArduino Leonardoとして認識されArduinoIDEからスケッチが書き込めるようになります。
![Screen Shot 2021-04-03 at 21.50.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083406/bf741dac-d84e-e111-c32f-7c580df902a7.png)
お疲れ様でした！