プログラムを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