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
いろいろ検索してみるとシリアルポートを開いて閉じてしてリセットしているらしい2。 Arduino IDEのコンパイル&書き込みのログ3をよく見てみたら書いてあった。 しかも、書き込み時のポートが指定したポートと違うし。
面倒なのでスクリプト書いた。 リセット後のCOM番号は絶対にリセット前+1なのか自信がないので探索した。
これでうまくいった。
python atmega32u4_build_and_upload.py blink.c
参考
- USB Mouse with ATmega32U4 Pro Micro Clone and LUFA – Code and Life
- Windows で 有効な COMポートをDOSから 調べる方法【改良版】 - Windows 2000 Blog
- ArduinoISPを汎用AVRライタとして使う(2) - しなぷすのハード製作記
- avrdudeのコマンドラインオプション
-
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.10.0_x86__mdqgnx93n4wtt\hardware\tools\avr\etc\avrdude.conf
↩ -
arduino - avrdude command line can’t connect to programmer for leonardo - Stack Overflow↩
-
コンパイル、書き込みの詳細なログは「ファイル」→「環境設定」から「より詳細な情報を表示する」をチェックしないと出てこない↩