Arduino CLI

 

インストールおよび環境設定

Arduino CLI本体のインストール

Arduino CLIのインストールには、いろいろな方法があります。

ここでは、インストールスクリプトで入れる方法を書きます。

自分の環境(~/bin)にインストールするのは簡単で、以下のようにコマンドを入れます。

$ curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh

インストールスクリプト(install.sh)は自動的に機種判別を行い、必要なバイナリを落としてインストールします。

自分の環境(~/bin)以外にインストールしたい場合は、最後のshにインストール先を環境変数BINDIRで渡します。たとえば、~/local/binに入れたければ、最後のsh

BINDIR=~/local/bin sh

のようにして、

$ curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR=~/local/bin sh

のように実行します。

さらに細かい使い方については、公式ドキュメント・インストール編をご覧下さい。

本体のインストールが出来たら、環境設定ファイルを生成します。

$ arduino-cli config init

これにより、~/.arduino15/arduino-cli.yamlというファイルが生成されます。このファイルを編集することにより、Arduino CLIの実行環境を設定することができます。

コアのインストール

Arduinoは様々なハードウェア上で動いています。対応しているCPUは様々ですし、ボードも様々です。Arduinoを動かすためには、これらに対応した「コア」をインストールしなければなりません。

コアのIDを知る

初期状態のArduino CLI環境で現在使用できるコアの一覧は、

$ arduino-cli core search

とすることで得られます。searchの後にフィルタを指定することもできます。

実行すると、以下のような一覧が得られます。

$ arduino-cli core search
ID                       Version   Name                                                                                 
arduino:avr              1.8.6     Arduino AVR Boards                                                                   
arduino:esp32            2.0.13    Arduino ESP32 Boards                                                                 
arduino:mbed_edge        4.0.10    Arduino Mbed OS Edge Boards                                                          
arduino:mbed_giga        4.0.10    Arduino Mbed OS Giga Boards                                                          
arduino:mbed_nano        4.0.10    Arduino Mbed OS Nano Boards                                                          
arduino:mbed_nicla       4.0.10    Arduino Mbed OS Nicla Boards                                                         
arduino:mbed_opta        4.0.10    Arduino Mbed OS Opta Boards                                                          
arduino:mbed_portenta    4.0.10    Arduino Mbed OS Portenta Boards                                                      
arduino:mbed_rp2040      4.0.10    Arduino Mbed OS RP2040 Boards                                                        
arduino:megaavr          1.8.8     Arduino megaAVR Boards                                                               
arduino:nrf52            1.0.2     Arduino nRF52 Boards                                                                 
arduino:renesas_portenta 1.0.5     Arduino Renesas Portenta Boards                                                      
arduino:sam              1.6.12    Arduino SAM Boards (32-bits ARM Cortex-M3)                                           
arduino:samd             1.8.13    Arduino SAMD Boards (32-bits ARM Cortex-M0+)                                         
arduino:renesas_uno      1.0.5     Arduino UNO R4 Boards                                                                
Arrow:samd               2.1.0     Arrow Boards                                                                         
atmel-avr-xminis:avr     0.6.0     Atmel AVR Xplained-minis                                                             
emoro:avr                3.2.2     EMORO 2560                                                                           
esp32:esp32              2.0.11    esp32                                                                                
industruino:samd         1.0.1     Industruino SAMD Boards (32-bits ARM Cortex-M0+)                                     
Intel:arc32              2.0.6     Intel Curie Boards                                                                   
Intel:i586               1.6.7+1.0 Intel i586 Boards                                                                    
Intel:i686               1.6.7+1.0 Intel i686 Boards                                                                    
littleBits:avr           1.0.0     littleBits Arduino AVR Modules                                                       
renesas:rl78g22_fpb      2.0.0     RL78/G22 Fast Prototyping Board                                                      
renesas:rl78g23_fpb_p64  2.0.0     RL78/G23-64p Fast Prototyping Board                                                  
Microsoft:win10          1.1.2     Windows 10 Iot Core                                                                  
arduino:mbed             3.3.0     [DEPRECATED] [DEPRECATED - Please install standalone packages] Arduino Mbed OS Boards

$ 

この中に希望するアーキテクチャのものが存在すれば、それでコアのIDを知ることができます。

「Arduinoが対応しているはずなのにこの一覧にない」ものは、サードバーティー製のコアです。そのような場合は別途設定してやる必要があります。詳しくは、「サードパーティーのコアを使う場合」をご覧下さい。

コアをインストールする

コアのIDがわかれば、コアをインストールすることができます。

たとえば最初の例であれば、コアのIDはesp32:esp32です。これをインストールするには、

$ arduino-cli core install esp32:esp32

そうすると、

$ arduino-cli core install esp32:esp32
Downloading packages...
esp32:xtensa-esp32-elf-gcc@esp-2021r2-patch5-8.4.0 downloaded                                                                 
esp32:xtensa-esp32s2-elf-gcc@esp-2021r2-patch5-8.4.0 downloaded                                                               

(中略)

Configuring tool....
arduino:dfu-util@0.11.0-arduino5 installed
Installing platform esp32:esp32@2.0.11...
Configuring platform....
Platform esp32:esp32@2.0.11 installed
$ 

のように表示され、コアがインストールされます。

これで、このコアでサポートされるボードが利用可能になります。

FQBN

ArduinoはFQBNという文字列で、ハードウェアを識別します。

まず、自分のこれから使うハードウェアに対応したFQBNを知る必要があります。

Arduinoの対応しているハードウェアであれば、シリアルポートに接続した状態で

$ arduino-cli board list

と入力すると、以下のように接続ポートやFQBN, Coreの名前を教えてくれます。

Port         Protocol Type              Board Name  FQBN                      Core       
/dev/ttyACM0 serial   Serial Port (USB) WiFiduinoV2 esp32:esp32:wifiduino32c3 esp32:esp32
/dev/ttyS9   serial   Serial Port       Unknown                                          

この例では、USBポートにXIAO ESP32C3がつながっています。また、この例ではBoard NameWiFiduinoV2FBQNesp32:esp32:wifiduino32c3であるということがわかります。ただし、これは間違いがあります。正しくはBoard NameXIAO ESP32C3で、FQBNesp32:esp32:XIAO_ESP32C3です。

arduino-cliが知らないボードがつながっている場合は、

$ arduino-cli board list
Port         Protocol Type              Board Name FQBN Core
/dev/ttyS9   serial   Serial Port       Unknown             
/dev/ttyUSB0 serial   Serial Port (USB) Unknown             
/dev/ttyUSB1 serial   Serial Port (USB) Unknown             

$ 

というような表示になります。この例はMaix Bitをつないだ場合です。

ターゲットボードが接続されていない等の理由でboard listで情報が取得できない場合や間違いがあるは別の方法でコアのIDとFQBNを知る必要があります。

FQBNを知る

arduino-cli board listでFQBNを知ることが出来なかった場合は、サポート対象のボードの一覧から探すことができます。

公式を含む多くのドキュメントではboard listallでサポート対象のボードを全件表示させる方法があると書かれています。

$ arduino-cli board listall

しかし、現在(2023年12月)この方法では「コアがインストール済みのボード」しか表示されません。コアがインストールされていない状態でlistallをすると、

$ arduino-cli board listall
Board Name FQBN 

$ 

と表示されるだけです。

なので、コアをインストールしてから、listallを実行すると、

$ arduino-cli board listall
Board Name                                                              FQBN                                               
AI Thinker ESP32-CAM                                                    esp32:esp32:esp32cam                               
ALKS ESP32                                                              esp32:esp32:alksesp32                              
ATMegaZero ESP32-S2                                                     esp32:esp32:atmegazero_esp32s2                     
Adafruit ESP32 Feather                                                  esp32:esp32:featheresp32                           

(中略)

unPhone 8                                                               esp32:esp32:unphone8                               
unPhone 9                                                               esp32:esp32:unphone9                               

$ 

のように表示されるようになります。

この中から自分の持っているボードを探してFQBNを得ることができます。

手順としては、

  1. コアの名前を知る

    調べるなり探すなりします。

  2. コアをインストールする

    arduino-cli core install <コア名>

  3. ボード一覧を出してFQBNを知る

    arduino-cli board listall

ということになります。

FQBNはしばしば使いますので、どこかにメモをしておきます。

サードパーティーのコアを使う場合

初期状態で

$ arduino-cli core search

としても自分の持っているボードのIDが表示されない場合はサードパーティーのコアを使う必要があります。

サードパーティーのコアやその情報がどこにあるかは、それぞのボードによって異なりますので、一般的な方法はありません。

ここでは、SiPEEDのMaixについてのインストールを例に説明します。

まず、MaixのボードのArduinoについては、

Install Arduino Environment

に情報があります。このドキュメントを見ると、ボードに対応したパッケージ情報のファイルは

http://dl.sipeed.com/MAIX/Maixduino/package_Maixduino_k210_index.json

であることがわかります。このファイルのことを、環境設定ファイル.arduino15/arduino-cli.yamlに設定します。具体的には、冒頭にある

board_manager:
  additional_urls: []
build_cache:

board_manager:
  additional_urls:
    - http://dl.sipeed.com/MAIX/Maixduino/package_Maixduino_k210_index.json
build_cache:

のように変更します。このadditional_urlsにパッケージ情報を記述したファイルのURLを追加して行きます。

このようにしてやると、

$ arduino-cli core search k210

としてやった時に、

$ arduino-cli core search k210
ID             Version Name           
Maixduino:k210 0.3.11  Maixduino(k210)

のように表示されるようになります(k210を入れなければ全てが出ます)。

これにより、k210用のコアがインストール可能になります。

ただし、サードパーティーのコアの場合、必ずしも全ての環境でコアがインストール可能とは限りません。このk210用のコアの場合、ARM64環境でコアをインストールしようとすると、

$ arduino-cli core install Maixduino:k210
Downloading packages...
Error during install: Error downloading tool Maixduino:riscv64-unknown-elf-gcc@8.2.0_20190409: no versions available for the current OS, try contacting support@sipeed.com

のようになってインストールができません。これは、riscv64用のtoolchainがコアのリポジトリに存在しないためです。

この問題の解決方法については別項で書こうと思いますが、今のところは諦めてAMD64環境をホスト環境にして回避して下さい。

ライブラリ

Arduinoには多くのライブラリが存在しています。標準的なものについては、コアをインストールする時について来ますが、それ以外のもので利用可能な状態で公開されていることがあります。

標準でない機能を使いたい場合、自分で作らなくても利用可能なライブラリが公開されているかも知れません。

公開されているライブラリも、公式リポジトリに登録されているものとそうでないものとがあります。このうち、公式リポジトリに登録されているものに関しては、arduino-cliで簡単に検索およびインストールが可能となっています。

公式リポジトリにないライブラリについてはもう一手間かかりますが、これもarduino-cliでインストールできます。

公式リポジトリにあるライブラリを検索する

公式リポジトリに存在するライブラリを検索するには、

$ aruduino-cli lib search キーワード

のようにします。

たとえば、

$ arduino-cli lib search SNMP

のようにすると、

$ arduino-cli lib search SNMP
Name: "SNMP"
  Author: Patrick Lafarguette <patrick.lafarguette@gmail.com>
  Maintainer: Patrick Lafarguette <patrick.lafarguette@gmail.com>
  Sentence: An SNMP library to write SNMP agent or manager for Arduino boards.
  Paragraph: SNMP getrequest, getnextrequest, getresponse, setrequest, trap, informrequest and snmpv2trap PDUs are supported.
  Website: https://github.com/patricklaf/SNMP
  Category: Communication
  Architecture: *
  Types: Contributed
  Versions: [1.0.0, 1.1.0, 1.2.0, 1.3.0]
  Provides includes: SNMP.h
Name: "SNMP Manager"
  Author: Martin Rowan <martin@martinrowan.co.uk>
  Maintainer: Martin Rowan <martin@martinrowan.co.uk>
  Sentence: An SNMP Manager library to make SNMP requests to other SNMP enabled devices.
  Paragraph: Supporting SNMP v1 and v2, SNMP requests can be sent (GetRequest) and their responses received (GetResponse) for various SNMP data types.
  Website: https://github.com/shortbloke/Arduino_SNMP_Manager
  Category: Communication
  Architecture: *
  Types: Contributed
  Versions: [1.1.0, 1.1.1, 1.1.2, 1.1.3, 1.1.4, 1.1.5, 1.1.6, 1.1.7, 1.1.9, 1.1.10, 1.1.11, 1.1.12]
  Provides includes: Arduino_SNMP_Manager.h
Name: "SNMP_Agent"
  Author: Aidan Cyr <cyraidan@gmail.com>
  Maintainer: Aidan Cyr <cyraidan@gmail.com>
  Sentence: SNMP Agent: An fully compliant SNMPv2c Agent for esp32 for acting as an SNMP client device.
  Paragraph: (Previously Arduino_SNMP) Can respond to SNMP GET and SET requests, and can send SNMP v1 or SNMP v2c TRAP and INFORM messages.
  Website: https://github.com/0neblock/Arduino_SNMP
  Category: Communication
  Architecture: esp32, esp8266
  Types: Contributed
  Versions: [2.0.1, 2.0.2, 2.0.3, 2.1.0]
  Provides includes: SNMP_Agent.h, SNMPTrap.h

$ 

のようにSNMPに関するライブラリを検索して一覧にしてくれます。

この例では、いろいろ試してみて検索結果が少なくなるキーワードで検索したのですが、たとえばよく使われがちのneopixelとかntpとかで検索すると、山のように出て来ます。そのくせ、たとえば「WebRTC」のようなキーワードだと1件もひっかかりません。つまり、Arduinoのサイブラリの現状を簡単に説明すると、「あるものは大量にあるが、ないものは全くない」という感じです。

大量に出て来るものに関して、どれを選べば良いか指針になりそうなものはありません。とは言え、使うためにはドキュメントがないと使えないわけで、そうなると検索結果の中にあるWebsiteを見ることになると思います。ドキュメントの内容を見ると使いやすいとか「元気なプロジェクト」かどうかわかることもありますし、多くの場合WebsiteはGitHubに置かれていることが多いので、そこでスターの数とかアクティビティを見て比較してみるのも良いと思います。

次の工程に必要なのは、Name:のフィールドです。気に入ったライブラリのName:を把握しておきます。

公式リポジトリにあるライブラリをインストールする

公式リポジトリにあるライブラリのインストールは簡単で、

$ arduino-cli lib install ライブラリ名

のようにします。このライブラリ名は大文字小文字を区別しません。

では、例として検索で出て来たSNMP_Agentをインストールしてみます。

SNMP_Agentの説明は、こんな感じ

Name: "SNMP_Agent"
  Author: Aidan Cyr <cyraidan@gmail.com>
  Maintainer: Aidan Cyr <cyraidan@gmail.com>
  Sentence: SNMP Agent: An fully compliant SNMPv2c Agent for esp32 for acting as an SNMP client device.
  Paragraph: (Previously Arduino_SNMP) Can respond to SNMP GET and SET requests, and can send SNMP v1 or SNMP v2c TRAP and INFORM messages.
  Website: https://github.com/0neblock/Arduino_SNMP
  Category: Communication
  Architecture: esp32, esp8266
  Types: Contributed
  Versions: [2.0.1, 2.0.2, 2.0.3, 2.1.0]
  Provides includes: SNMP_Agent.h, SNMPTrap.h

これを入れるためには、以下のようにします。

$ arduino-cli lib install snmp_agent

ライブラリ名が小文字だけですが、前述のように大文字小文字を区別しませんので、これで問題ありません。

$ arduino-cli lib install snmp_agent
Downloading SNMP_Agent@2.1.0...
SNMP_Agent@2.1.0 downloaded                                                                                                                            
Installing SNMP_Agent@2.1.0...
Installed SNMP_Agent@2.1.0

こういった感じで入ってくれます。

このライブラリはWebsite:を見ると https://github.com/0neblock/Arduino_SNMP にあることがわかります。サイトを開くと結構詳しいドキュメントがありますね。

上記の方法でインストールされるのはlatestつまり、最新版です。最新版以外のバージョンをインストールしたい場合は、ライブラリ名をバージョン番号で修飾します。

たとえばSNMP_Agentのバージョン2.0.1をインストールしたい場合は、

$ arduino-cli lib install snmp_agent@2.0.1

のようにします。

公式リポジトリにないライブラリをインストールする

公式リポジトリにないライブラリを探すのは、通常のソフトウェアを探すのと同じような手間がかかります。つまり、Google等を駆使して探したり、GitHubを検索したりするということです。

GitHubに目的とするライブラリが発見できた場合は、

$ arduino-cli lib install --git-url GitHubのURL

のように指定するとインストールできます。

たとえば、NTPClientをGitHubからインストールする場合は、

$ arduino-cli lib install --git-url https://github.com/arduino-libraries/NTPClient.git

のようにします。このようにすると、

$ arduino-cli lib install --git-url https://github.com/arduino-libraries/NTPClient.git
--git-url and --zip-path are disabled by default, for more information see: https://arduino.github.io/arduino-cli/0.34/configuration/#configuration-keys

怒られます。怒られる理由は示されているURLに以下のように説明があります。

  • library - configuration options relating to Arduino libraries.

    • enable_unsafe_install - set to true to enable the use of the --git-url and --zip-file flags with arduino-cli lib install. These are considered “unsafe” installation methods because they allow installing files that have not passed through the Library Manager submission process.

これは何かと言えば、要するに公式リポジトリにないものは安全ではないので、デフォルト状態ではインストールできないようになっているということです。そこで、Arduino CLIの設定ファイル~/.arduino15/arduino-cli.yamlを修正します。

具体的には、

library:
  enable_unsafe_install: false

となっている箇所を、

library:
  enable_unsafe_install: true

のように変更します。そうすると、

$ arduino-cli lib install --git-url https://github.com/arduino-libraries/NTPClient.git
--git-url and --zip-path flags allow installing untrusted files, use it at your own risk.
Enumerating objects: 102, done.
Counting objects: 100% (102/102), done.
Compressing objects: 100% (71/71), done.
Total 102 (delta 45), reused 58 (delta 22), pack-reused 0
Library installed

という感じでインストールできます。

GitHubではない場合は、zipで入手すると

$ arduino-cli lib install --zip-path ZIPへのpath

のように指示するとインストールできます。

ライブラリの環境について

ライブラリがインストールされて使えるようになるのは良いのですが、それがどこに置かれていることが気になったりしませんか?

オープンソースなソフトウェアはドキュメントが微妙だったりバグがあったりします。そういった時にソースコードにアクセスできると都合が良いのですが、これを一々探したりするのは結構面倒臭いですし、ものによっては簡単に発見できなかったりします。

幸い基本的にArduinoのライブラリはソースコードで取得されます。ですから、

ライブラリが利用可能 = ライブラリのソースがアクセスできる

と思って構いません。では、実体はどこにあるでしょうか?

それについては、~/.arduino15/arduino-cli.yamlに書かれています。私の環境だと、中程付近に

directories:
  data: /home/ogochan/.arduino15
  downloads: /home/ogochan/.arduino15/staging
  user: /home/ogochan/Arduino

というのがあります。/home/ogochan/というのは私のホームディレクトリです。このuser:と書かれているディレクトリ(/home/ogochan/Arduino)にlibrariesというサブディレクトリがあります。この下にライブラリ名のディレクトリがあって、その中にライブラリが納められています。