Arduino HEX/BIN Fileを手動で転送

2022.1.9

プログラムをArduinoへ手動でコマンドプロンプトから送る方法を記載します。Arduinoのプログラム開発(コンパイル・転送)はArduino IDEを使うことが最も一般的かと思います。しかし、いくつかのプログラムを切り替えて試したい場合、IDEのコンパイル「マイコンボードに書き込む」ボタンは転送だけでなく、コンパイルも行いますので冗長に感じることがあります。コンパイルした結果のファイルはコンピュータの中のどこかに保存されているはずですので、これを転送すれば手数を省くことができます。

まず、どいうコマンドでどのファイルを書き込んているかを見つけます。ここではWIndows 10, Arduino IDE 1.8.19, Arduino UNOを使って試しています。(MACでは多少違った結果になります。)

Arduino IDEのファイル>環境設定を開きます。「より詳細な情報を表示」の「書き込み」にチェックを入れます。環境設定をOKを押して閉じます。



Arduino UNOが接続されているものとします。スケッチ例のBlink.inoを開きます。「マイコンボードに書き込む」ボタンを押します。Arduino IDEの下半分、黒いウインドウにIDEが実行した情報が表示されます。



ポイントは白文字で表示される以下の箇所です。

C:\Users\<user>\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17/bin/avrdude -CC:\Users\<user>\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:C:\Users\<user>\AppData\Local\Temp\arduino_build_601550/Blink.ino.hex:i 

avrdudeが送信するためのコマンドです。その前段はavrdudeのあるPathを示しています。

C:\Users\<user>\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17/bin/avrdude

-CオプションはArduinoにプログラムを書き込むための、プログラマを指定するコンフィグファイルを設定します。

-CC:\Users\<user>\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf

-v オプションは詳細出力を有効にします。 -v オプションを増やすと、詳細出力のレベルが上がります。

-p オプションは必須オプションであす。avrdude に接続されているデバイス (MCU) のタイプを伝えます。Arduino UNOの場合、-patmega328p と設定されています。

-c オプションはプログラマを指定します。Arduino UNOの場合、-carduino と設定されています。

-P COMポートを指定します。

-b ボーレートを設定します。

-D フラッシュの自動消去を無効にします。 フラッシュ メモリで -U オプションが指定されている場合、 avrdude はプログラミング操作を開始する前にチップ消去を実行します。

-U このオプションは次の形式で記載します。

-U memtype:op:filename[:format]

この例では以下のような設定となっています。ここでUNOに転送するファイルはC:\Users\<user>\AppData\Local\Temp\arduino_build_601550/Blink.ino.hexであることがわかります。

-Uflash:w:Filename.hex:i

メモリータイプはflash、w:オプションは書き込みを、最後の:iはファイル形式を示しています。iの場合はiIntel Hexです。

Command Line

コマンドラインからhexを転送するために環境変数を設定します。PATHにavrdudeの場所を登録します。



C:\Users\<user>\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17\bin

環境変数に、avrdude.confの場所を設定しておきます。環境設定で新規ボタンを押すことで新しい環境変数を追加できます。





AVRDUDE=C:\Users\<user>\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17\etc\avrdude.conf

次にhexファイルをworkフォルダーにコピーしておきます。

> mkdir work
> cd work
> copy C:\Users\<user>\AppData\Local\Temp\arduino_build_601550/Blink.ino.hex blink.ino.hex
COMポートのリセット

Arduino UNOがつながっているCOMポートを確認してリセットします。コマンドプロンプトからCOMポートを確認するにはmode命令を使います。

> mode

デバイス状態 COM3:
------------
    ボー レート:        115200
    パリティ:           None
    データ ビット:      8
    ストップ ビット:    1
    タイムアウト:       ON
    XON/XOFF:           OFF
    CTS ハンドシェイク: OFF
    DSR ハンドシェイク: OFF
    DSR の検知:         OFF
    DTR サーキット:     OFF
    RTS サーキット:     OFF


デバイス状態 CON:
-----------
    行数:                9001
    桁数:                120
    キーボード速度:      31
    キーボード ディレイ: 1
    コード ページ:       932

Arduino UNOをリセットするには該当のポートに1200bpsのボーレートを設定します。

> mode com3 baud=1200
既定値は、7 データ ビットです。
既定値は、偶数パリティです。

デバイス状態 COM3:
------------
    ボー レート:        1200
    パリティ:           Even
    データ ビット:      7
    ストップ ビット:    1
    タイムアウト:       ON
    XON/XOFF:           OFF
    CTS ハンドシェイク: OFF
    DSR ハンドシェイク: OFF
    DSR の検知:         OFF
    DTR サーキット:     OFF
    RTS サーキット:     OFF

ここまでの準備はできると次のコマンドでhexファイルをArduino UNOに送ることができます。

> avrdude -C%AVRDUDE% -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:blink.ino.hex:i 

以下のようなリストが表示できたら書き込みできています。

> avrdude -C%AVRDUDE% -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:blink.ino.hex:i

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Users\<user>\Documents\ArduinoData\packages\arduino\tools\avrdude\6.3.0-arduino17\etc\avrdude.conf"

         Using Port                    : COM3
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino
         Hardware Version: 3
         Firmware Version: 4.4
         Vtarget         : 0.3 V
         Varef           : 0.3 V
         Oscillator      : 28.800 kHz
         SCK period      : 3.3 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: reading input file "blink.ino.hex"
avrdude: writing flash (924 bytes):

Writing | ################################################## | 100% 0.33s

avrdude: 924 bytes of flash written
avrdude: verifying flash memory against blink.ino.hex:
avrdude: load data flash data from input file blink.ino.hex:
avrdude: input file blink.ino.hex contains 924 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.28s

avrdude: verifying ...
avrdude: 924 bytes of flash verified

avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: safemode: Fuses OK (E:00, H:00, L:00)

avrdude done.  Thank you.
MACの場合

MACのArduino IDEを使って、Arduino IDEからのhex fileの転送を確認すると、以下のように表示されました。

/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude 
 -C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf 
 -v -patmega328p -carduino -P/dev/cu.usbmodem141101 -b115200 -D 
 -Uflash:w:/var/folders/4c/99b80njj2_7cj3g9bfckkqpc0000gn/T/arduino_build_608338/Blink.ino.hex:i

これを見ると、アプリケーションavrdude、avrdude.conf、Blink.ino.hexはそれぞれ以下のフォルダにあることがわかります。

/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf
/var/folders/4c/99b80njj2_7cj3g9bfckkqpc0000gn/T/arduino_build_608338/Blink.ino.hex

windowsの場合と同様に、avrdudeのあるフォルダーをPATHに追加設定、 avrdude.confをフォルダーパス含めて環境変数に設定、 Blink.ino.hexをローカルにコピーします。

export PATH="/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/:$PATH"
export AVRDUDE="/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf"
cp /var/folders/4c/99b80njj2_7cj3g9bfckkqpc0000gn/T/arduino_build_608338/Blink.ino.hex ./Blink.ino.hex

COMポートのリセット

Arduino UNOがつながっているCOMポートを確認してリセットします。Macの場合、コマンドプロンプトからCOMポートを確認するにはls /dev/cu.*命令を使います。

ここで見つかったCOMポートをリセットするには、sttyを使います。


> ls /dev/cu.*
cu.usbmodem141101
> stty -f /dev/cu.usbmodem141101 1200

ここまで設定しておけば、以下のようにhexファイルをArduino UNOへ転送することができます。

avrdude -C$AVRDUDE -v -patmega328p -carduino -P/dev/cu.usbmodem141101 -b115200 -D -Uflash:w:Blink.ino.hex:i