Arduino IDE を使わずにコンパイル&書き込みをする

この記事の内容を実行するとArduinoブートローダが書き換わり、PCがArduinoを認識できなくなります。気を付けてください。

ブートローダの修復方法についてはこちらを参照のこと

環境

準備

Arduino IDEについているAVRのツールチェーンを使いたいんだけど、このディレクトリだと権限がなくて実行できなかった。

C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.10.0_x86__mdqgnx93n4wtt\hardware\tools\avr

仕方なく別のディレクトリにコピーしてbinにパスを通しておいた。

スケッチ

blink.c

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>

int main () {
    DDRB = 0b00000001;

    for(;;) {
        PINB = 0b00000001;
        _delay_ms(100);
        PINB = 0b00000000;
        _delay_ms(100);
    }

    return 0;
}

コンパイル

avr-gcc -O2 -mmcu=atmega32u4 blink.c -o blink.elf
avr-objcopy -j .text -j .data -O ihex blink.elf blink.hex

書き込み

avrdude -v -D -C avrdude.conf -p atmega32u4 -c avr109 -b 57600 -P COM19 -U flash:w:.\blink.hex:i

avrdude.confはArduino IDEに入っているやつ1を使う。 が、以下のログのようにうまくいかない。

avrdude  -v -D -C avrdude.conf -p atmega32u4 -c avr109 -b 57600 -P COM19 -U flash:w:.\blink.hex:i
# (一部省略)
Connecting to programmer: .avrdude.exe: butterfly_recv(): programmer is not responding

avrdude.exe: butterfly_recv(): programmer is not responding

いろいろ検索してみるとシリアルポートを開いて閉じてしてリセットしているらしい2Arduino IDEコンパイル&書き込みのログ3をよく見てみたら書いてあった。 しかも、書き込み時のポートが指定したポートと違うし。

compile_upload_log
Arduino IDEでのコンパイル&書き込み時のログ

面倒なのでスクリプト書いた。 リセット後のCOM番号は絶対にリセット前+1なのか自信がないので探索した。

これでうまくいった。

python atmega32u4_build_and_upload.py blink.c

参考


  1. C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.10.0_x86__mdqgnx93n4wtt\hardware\tools\avr\etc\avrdude.conf

  2. arduino - avrdude command line can’t connect to programmer for leonardo - Stack Overflow

  3. コンパイル、書き込みの詳細なログは「ファイル」→「環境設定」から「より詳細な情報を表示する」をチェックしないと出てこない