プログラムを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です。
コマンドラインから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
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の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
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