酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

macOSでArduino UNO R3にDFUモードでプログラムを書き込む

つい先日、Arduino UNO R3を購入しました。正確にはArduino UNO R3互換機の「ELEGOO UNO R3」です。

過去に触ったArduinoは、大人の科学マガジンの付録のArduino互換機「Japanino」だったので、かれこれ9年ぶりにマイコンに触ります。Arduinoを使うのはWindowsユーザーが多いのか、macOSから扱う情報が少ないように思いました。

本記事では、macOSからArduino UNO R3にプログラムを書き込む方法について紹介します。Homebrewがすでにインストールされている前提です。

ELEGOO UNO R3 初心者スターターキットについて

それはそれは大昔廃棄するブレッドボードなどを大量にもらいましたが、前の前の前の引越しの際に使うことなくすべて処分してしまいました。

電子工作に必要なものは、ゲームボーイの改造用に購入したはんだごてくらいです。なにも持っていない状態なので、スターターセットをひとつ買えば色々ついてくるのは助かりますね。個別に買えばもっと安く済むんだろうけど、これで1,800円くらいなので買い集めることを考えるとよかったかなと。

avr-gccのインストール

brew tap osx-cross/avr
brew install avr-gcc

とても時間がかかりました。MacBook Pro (15-inch, 2018)で10分以上でした。

dfu-programmer のインストール

Arduino UNO R3には、チップがふたつ搭載されています。Arduino IDEを使ってスケッチを書き込むためのATmega328Pと、USBの通信のためのATmega16U2です。今回はATmega16U2の方にプログラムを書き込むためdfu-programmerが必要になりました。

brew install dfu-programmer

マイコンにプログラムを書き込む

  • ELEGOO UNO R3 (Arduino UNO R3互換機)
  • ジャンパー(オス-メス)
  • ブレッドボード

前述した「ELEGOO UNO R3基本部品 初心者スターター 互換キット チュートリアル Arduino用」に必要なものがすべて揃っています。2,000円以下でブレッドボード含めいろんなものが含まれているのでとても満足しています。

センサー類は含まれていないので、Lチカ以上のことをする場合には別途購入する必要があります。

DFUモードに入る

DFUモードに入るためにはRSTGNDをショートさせる必要があります。Arduino UNO R3でのRSTGNDは下図の場所にあります。ELEGOO UNO R3も純正に準じますが、ほかの互換機によっては場所が異なるようですので各自で回路図を確認した方が良いでしょう。

f:id:ch3cooh393:20191214115010p:plain

後述している「RST端子とGND端子をショートさせた状態」は下図の通りです。

f:id:ch3cooh393:20191214115938j:plain

手順としては下記の通りです。

  1. Arduino UNO R3に挿しているUSBケーブルを抜く
  2. RST端子とGND端子をショートさせる
  3. ショートさせた状態でMacに接続する
  4. LEDが光ったらジャンパーをはずす
$ dfu-programmer atmega16u2 get

レスポンスがあればMacがマイコンを認識できています。

Bootloader Version: 0x20 (32)

プログラムを書き込む

Arduino UNO R3を認識できれば、あとはプログラムを書き込むだけです。

$ dfu-programmer atmega16u2 erase
$ dfu-programmer atmega16u2 flash {FILE_NAME}.hex
$ dfu-programmer atmega16u2 reset

順番に実行していきます。

$dfu-programmer atmega16u2 erase

Checking memory from 0x0 to 0x2FFF...  Not blank at 0x1.
Erasing flash...  Success
$ dfu-programmer atmega16u2 flash {FILE_NAME}.hex

Checking memory from 0x0 to 0xEFF...  Empty.
0%                            100%  Programming 0xF00 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
0%                            100%  Reading 0x3000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
Validating...  Success
0xF00 bytes written into 0x3000 bytes memory (31.25%).
dfu-programmer atmega16u2 reset

以上で完了です。

参考記事