Windowsのコマンドプロンプトでarduino-cliに挑戦

(2018/10/12) バージョン追従メンテナンス (invalid baud rate specified '{upload.speed}'の話題)
(2018/9/5) 追記 [ignorant](https://qiita.com/ignorant)さんからold bootloaderの情報あり

#はじめに
arduino-cliが[Blogで発表](https://blog.arduino.cc/2018/08/24/announcing-the-arduino-command-line-interface-cli/)されていたので、早速Windowsで使ってみました。
試したボードはArduino Nanoです。
#試したこと
まず、Windows版arduino-cliをダウンロードして「配置(コマンドプロンプト)」のように配置しました。
%USERPROFILE%\workディレクトリの下です。

- https://downloads.arduino.cc/arduino-cli/arduino-cli-0.3.1-alpha.preview-windows.zip

```shell-session:配置(コマンドプロンプト)
C:\Users\user1\work>dir
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は 96E0-12DB です

 C:\Users\user1\work のディレクトリ

2018/10/12  10:06    <DIR>          .
2018/10/12  10:06    <DIR>          ..
2018/10/12  08:56        17,134,592 arduino-cli-0.3.1-alpha.preview-windows.exe
               1 個のファイル          17,134,592 バイト
               2 個のディレクトリ  24,482,226,176 バイトの空き領域
```

Arduino Nanoが使えるか、パッケージ情報の更新などしてみました。
~~ただし、Arduino Nanoのold bootloaderには対応していないようです。~~
arduino:avrが対象のようです。

```shell-session:準備
C:\Users\user1\work>arduino-cli-0.3.1-alpha.preview-windows.exe core update-index
Updating index: package_index.json downloaded

C:\Users\user1\work>arduino-cli-0.3.1-alpha.preview-windows.exe core search arduino
Searching for platforms matching 'arduino'

ID                      Version Name
Intel:arc32             2.0.2   Intel Curie Boards
arduino:avr             1.6.23  Arduino AVR Boards
arduino:nrf52           1.0.2   Arduino nRF52 Boards
arduino:sam             1.6.11  Arduino SAM Boards (32-bits ARM Cortex-M3)
arduino:samd            1.6.19  Arduino SAMD Boards (32-bits ARM Cortex-M0+)
arduino:samd_beta       1.6.24  Arduino SAMD Beta Boards (32-bits ARM Cortex-M0+)
arduino:stm32f4         1.0.1   Arduino STM32F4 Boards
littleBits:avr          1.0.0   littleBits Arduino AVR Modules
```

ここでArduino Nano用にarduino:avrをインストールしました。

```shell-session:インストール
C:\Users\user1\work>arduino-cli-0.3.1-alpha.preview-windows.exe core install arduino:avr
Downloading arduino:avr-gcc@5.4.0-atmel3.6.1-arduino2...
arduino:avr-gcc@5.4.0-atmel3.6.1-arduino2 downloaded
Downloading arduino:avrdude@6.3.0-arduino14...
arduino:avrdude@6.3.0-arduino14 downloaded
Downloading arduino:arduinoOTA@1.2.1...
arduino:arduinoOTA@1.2.1 downloaded
Downloading arduino:avr@1.6.23...
arduino:avr@1.6.23 downloaded
Installing arduino:avr-gcc@5.4.0-atmel3.6.1-arduino2
arduino:avr-gcc@5.4.0-atmel3.6.1-arduino2 installed
Installing arduino:avrdude@6.3.0-arduino14
arduino:avrdude@6.3.0-arduino14 installed
Installing arduino:arduinoOTA@1.2.1
arduino:arduinoOTA@1.2.1 installed
Installing arduino:avr@1.6.23...
arduino:avr@1.6.23 installed
```

ワークスペースを作ります。
なお、ワークスペースとプログラムが置かれる場所は以下のようです。

- "%USERPROFILE%\Documents\Arduino"
- "%USERPROFILE%\AppData\Local\Arduino15"

```shell-session:ワークスペースを作成する
C:\Users\user1\work>arduino-cli-0.3.1-alpha.preview-windows.exe sketch new Blink
Sketch created in: C:\Users\user1\Documents\Arduino\Blink
```

スケッチを編集します。

```text:スケッチを編集する
C:\Users\user1\work>start notepad C:\Users\user1\Documents\Arduino\Blink\Blink.ino
```

今回のスケッチはLチカ。

```c++:blink.ino
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(500);
  digitalWrite(13, LOW);
  delay(500);
}
```
コンパイルします。
ただし、Arduino Nanoはブートローダの種類によって少しオプション(fqbn)が違います。

```shell-session:コンパイル(new.bootloader)
C:\Users\user1\work>arduino-cli-0.3.1-alpha.preview-windows.exe compile --fqbn arduino:avr:nano:atmega328 "%USERPROFILE%\Documents\Arduino\Blink"
Downloading and installing missing tool: builtin:ctags@5.8-arduino11
Downloading builtin:ctags@5.8-arduino11...
builtin:ctags@5.8-arduino11 downloaded
Installing builtin:ctags@5.8-arduino11
builtin:ctags@5.8-arduino11 installed
Sketch uses 444 bytes (1%) of program storage space. Maximum is 30720 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.
```
```shell-session:コンパイル(old.bootloader)
C:\Users\user1\work>arduino-cli-0.3.1-alpha.preview-windows.exe compile --fqbn arduino:avr:nano:cpu=atmega328old %USERPROFILE%\Documents\Arduino\Blink"
Downloading and installing missing tool: builtin:ctags@5.8-arduino11
Downloading builtin:ctags@5.8-arduino11...
builtin:ctags@5.8-arduino11 downloaded
Installing builtin:ctags@5.8-arduino11
builtin:ctags@5.8-arduino11 installed
Build options changed, rebuilding all
Sketch uses 444 bytes (1%) of program storage space. Maximum is 30720 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.
```
Arduino NanoのCOMポート番号を調べます。
日本語だとガタガタ表示になったので「chcp 437」で英語にしました。「chcp 932」で日本語へ戻せます。

```shell-session:COMポート番号を調べる
C:\Users\user1\work>mode

Status for device COM3:
-----------------------
    Baud:            115200
    Parity:          None
    Data Bits:       8
    Stop Bits:       1
    Timeout:         ON
    XON/XOFF:        OFF
    CTS handshaking: OFF
    DSR handshaking: OFF
    DSR sensitivity: OFF
    DTR circuit:     OFF
    RTS circuit:     OFF


Status for device CON:
----------------------
    Lines:          9001
    Columns:        120
    Keyboard rate:  31
    Keyboard delay: 1
    Code page:      437
```
コンパイルしたスケッチをArduino Nanoへアップロードします。
次の例ではnew bootloaderなのでfqbnが「arduino:avr:nano:cpu=atmega328」です。
old bootloaderの場合は「arduino:avr:nano:cpu=atmega328old」としてください。
arduino:avr:nanoとしてfqbnを指定するとアップロードに失敗するようです。(invalid baud rate specified '{upload.speed}')

```shell-session:アップロードする
C:\Users\user1\work>arduino-cli-0.3.1-alpha.preview-windows.exe upload -v -p COM3 --fqbn arduino:avr:nano:cpu=atmega328 %USERPROFILE%\Documents\Arduino\Blink

avrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Users\user1\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino9/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.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: reading input file "../Documents/Arduino/Blink/Blink.arduino.avr.nano.cpu=atmega328.hex"
avrdude: writing flash (928 bytes):

Writing | ################################################## | 100% 0.38s

avrdude: 928 bytes of flash written

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.


C:\Users\user1\work>
```

#まとめ
そこそこ使えそうです。
GUIと組み合わせて実行したりだとか夢見られそうです。
いつかBlocklyと組み合わせたいです。

#参考
- https://blog.arduino.cc/2018/08/24/announcing-the-arduino-command-line-interface-cli/
- https://github.com/arduino/arduino-cli
- [arduino-cli を試してみる (Windows10)](https://qiita.com/ignorant/items/c233f8a3db73f6fb2a35)