OrangePi ONEでarduino-cliを動かす

# OrangePi ONEとは
とても安価で、私には扱いやすいマイコンボードです。詳細はこちら

[本家によるOrangePiONEの紹介] (http://www.orangepi.org/orangepione/)

色々なOSが選択できますが、ここでは、Armbianを使うことにします。


# arduino-cliとは
有名なArduinoの開発環境でポピュラなものはArduino IDEです。

[githubのリポジトリ arduino/arduino-cli] (https://github.com/arduino/arduino-cli)

GUI使用前提のArduinoの開発環境をCLI(Command Line Interface)でGUIを使わないでコンパイルやプログラミングが出来るように作られたプログラムです。


# OrangePi ONEにarduino-cliをインストールする
上述のgithubにアクセスします。ソースコードを入手してコンパイルしてインストールするのが正統派でしょうが、そもそも非力なOrangePi ONEにそんな事をさせるのは可愛そうなので(実は自分が面倒くさい)、
[QuickstartのInstall] (https://arduino.github.io/arduino-cli/installation/) のDownload the latest packagesからバイナリとして出来上がっているファイルを入手します。

対象となるバイナリファイルは、[Linux ARM 32bitファイル] (https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Linux_ARMv7.tar.gz) です。

このファイルをwgetなどでOrangePi ONEで取り込みます。
取り込んだtar.gzファイルをお約束で展開すると2個のファイルができます。
実行ファイルを/usr/local/binなどにinstallします。

    $ wget https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Linux_ARMv7.tar.gz
    $ tar xvzf arduino-cli_latest_Linux_ARMv7.tar.gz
    LICENSE.txt
    arduino-cli
    $ sudo install arduino-cli /usr/local/bin

## インストール直後に行う事

core情報を最新のものにする。

    $ arduino-cli core update-index
    $ arduino-cli core install arduino:avr

必要に応じてupgradeする。

    $ arduino-cli core upgrade


もし、Arduino IDEを使っていたら、Arduino/librariesの配下に入っているライブラリ群が同様に使用できるかを

    $ arduino-cli lib list
    Name                        Installed Available Location
    Adafruit_MCP9600_Library    1.1.0     -         user    
    Adafruit_STMPE610           1.1.0     -         user    
    Adafruit_TouchScreen        1.0.4     -         user    
    Adafruit_Unified_Sensor     1.1.2     -         user    
    MPU6050_tockn               1.5.2     -         user    
    Adafruit_ADT7410_Library    1.0.2     -         user    
    Adafruit_Circuit_Playground 1.10.4    -         user    
    NTPClient                   3.2.0     -         user    
    LiquidCrystal_I2C           1.1.2     -         user    
    UARDECS_MEGA_Library        1.2.1     -         user    
    HX711_Arduino_Library       0.7.2     -         user    
    IRremote                    2.2.3     -         user    
    HOLLY_UARDECS_MEGA_Library  1.2.1     -         user    
    SdFat                       1.1.2     -         user    
    Adafruit_SHT31_Library      1.1.6     -         user    
    Adafruit_SSD1306            2.2.0     -         user    
    K30_CO2_I2C_Arduino                   -         user    
    UARDECS_Library             1.2.1     -         user    
    UARDECS_MEGA_Library-orig   1.2.1     -         user    
    Adafruit_BusIO              1.2.1     -         user    
    DS3231                      1.0.2     -         user    
    SpacebrewYun                1.0.2     -         user    
    SD                          1.2.4     -         user    
    Servo                       1.1.6     -         user    
    Adafruit_GFX_Library        1.7.5     -         user    
    Adafruit_ILI9341            1.5.4     -         user    
    ELT_S300_Library            1.0.0     -         user    
    Ethernet2                   1.0.4     -         user    
    Rtc_by_Makuna               2.3.4     -         user    
    AT24Cx                                -         user    
    Adafruit_ADXL343            1.2.0     -         user    

などとして確認する。

# 簡単なプログラミングを試してみる

お約束のLチカをArduino NANO V3(互換機)(以下、NANO)で試してみる。

## USBインタフェースにNANOを接続する

    $ arduino-cli board list
    Port         Type              Board Name   FQBN             Core       
    /dev/ttyS0   Serial Port       Unknown                                  
    /dev/ttyUSB0 Serial Port (USB) Arduino Nano arduino:avr:nano arduino:avr

接続が確認できる。
実際には、多くの互換ボードではVender IDやProduct IDが本家とは異なり、そのままでは認識されない、それを是正する方法は別に記す。

## ソースコードを書く

作業用のサブディレクトリを作って、そこに移動。例えば、'work' というサブディレクトリを作りその下で作業をする。
今回は、Arduino界のHello Worldと呼ばれる、Blinkを作ることにする。

    $ mkdir work
    $ cd work
    $ arduino-cli sketch new Blink
    $ cat Blink/Blink.ino
    void setup() {
    }

    void loop() {
    }

このように空のBlink.inoファイルがBlinkサブディレクトリの下に作られる。
そこに本来のBlink.inoの動作部分だけをコピペする。

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

void loop() {
    digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(1000);                       // wait for a second
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
    delay(1000);                       // wait for a second
}
```

## コンパイルしてNANOに書き込む

ここでは、NANOで古いブートローダを使った互換機であることから、ボードの指定を少し細かく行う。
work/Blink内でオペレーションを行うのではなくて、workの下で行う点に注意。

    $ cd work
    $ arduino-cli compile -b arduino:avr:nano:cpu=atmega328old Blink
    Sketch uses 924 bytes (3%) 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-cli upload -p /dev/ttyUSB0 -b arduino:avr:nano:cpu=atmega328old Blink

コンパイルが無事に成功すると、コンパイルメッセージが表示される。
アップロードをはじめて、無事終了すると、何のメッセージも出さずにプロンプトに返ってくる。直後からNANOはLチカを始める。uploadにはボード指定は不要なのかもしれないが、複数のボード対象にコンパイルしている場合にはボード毎のhexファイルが生成されるのでその区別のために指定することは有効である。
なお、Blinkディレクトリの中には、elf,hexファイルなどが残る。

    $ ls -l Blink
    total 32
    -rwxr-xr-x 1 mhorimoto users 14104 Mar 21 07:44 Blink.arduino.avr.nano.elf
    -rw-r--r-- 1 mhorimoto users  2615 Mar 21 07:44 Blink.arduino.avr.nano.hex
    -rw-r--r-- 1 mhorimoto users  7952 Mar 21 07:44 Blink.arduino.avr.nano.with_bootloader.hex
    -rw-r--r-- 1 mhorimoto users   359 Mar 20 16:04 Blink.ino

このhexファイルだけが残っていれば、後からarduino-cli uploadコマンドだけで毎回コンパイルしなくてもプログラムをArduinoにアップロードできるので何十枚のArduinoボードが有ってもプログラムのコピーが機械的に楽に実行できる。

# Arduino互換機のためのチューニング

今回のNANOもそうですが、互換機の場合には、USBインタフェースに認識されるVender IDやProduct IDが本家とは異なり、そのためBoard設定で接続しているArduinoボードが認識されない、もしくは、期待したモデルで認識されない。という問題が生じる。
その対策については別記事として後日投稿予定。