OrangePi ONEとは
とても安価で、私には扱いやすいマイコンボードです。詳細はこちら
色々なOSが選択できますが、ここでは、Armbianを使うことにします。
arduino-cliとは
有名なArduinoの開発環境でポピュラなものはArduino IDEです。
githubのリポジトリ arduino/arduino-cli
GUI使用前提のArduinoの開発環境をCLI(Command Line Interface)でGUIを使わないでコンパイルやプログラミングが出来るように作られたプログラムです。
OrangePi ONEにarduino-cliをインストールする
上述のgithubにアクセスします。ソースコードを入手してコンパイルしてインストールするのが正統派でしょうが、そもそも非力なOrangePi ONEにそんな事をさせるのは可愛そうなので(実は自分が面倒くさい)、
QuickstartのInstall のDownload the latest packagesからバイナリとして出来上がっているファイルを入手します。
対象となるバイナリファイルは、Linux ARM 32bitファイル です。
このファイルを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の動作部分だけをコピペする。
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ボードが認識されない、もしくは、期待したモデルで認識されない。という問題が生じる。
その対策については別記事として後日投稿予定。