Arduino CLIの使い方|Windowsでのインストールとコンパイル・書き込みのコマンド
Arduino CLI(arduino-cli)は、Arduino IDE 上でやっている操作を、コマンドで行えるようにした公式のツールです。IDE を開かずに、好きなエディタで書いたスケッチを、ターミナルからコンパイルしてボードへ書き込めます。
Windows に arduino-cli 1.5.1 を入れ、UNO R3 と R4 のスケッチをコンパイルするまでを、コマンドごとの出力と、その出力のどこを読むかで解説します。出力は、Windows 11 と arduino-cli 1.5.1 で実行した例で、ボードはつないでいません。そのため、書き込みとシリアルモニタは、コマンドの書式と、ボードが無いときのエラーまでです。出力に出るフォルダのパスは、途中を「…」で省いています。
- IDE を開かずに、コマンドで UNO R3 と R4 のスケッチをコンパイルする
- compile の出力の2行から、フラッシュと RAM の使用量と残りを読む
- 古い記事のコマンドがエラーになるときに、1.x の書き方へ直す
目次
Arduino CLIとは|IDEと同じ処理をコマンドで呼ぶ
IDE 2.x の中で動いているのは arduino-cli
Arduino IDE 2.x をインストールしていれば、arduino-cli もその中に入っています。Windows では、IDE のインストール先の resources\app\lib\backend\resources フォルダに arduino-cli.exe があります。Arduino IDE 2.3.10 には、単体で配布されている arduino-cli 1.5.1 と同じ版が入っていました。IDE の版によって、中の arduino-cli の版は変わります(どの版を入れたかは Arduino IDE のリリースノートに書かれています)。
IDE の画面の操作と、そのとき呼ばれる arduino-cli の処理を並べると、次の図のようになります。図の上の枠が IDE の中、下の枠がターミナルで、真ん中の点線の枠が両方で使うフォルダです。

IDE の検証は compile に、ボードマネージャは core install に、ライブラリマネージャーは lib install に、シリアルモニタは monitor に相当します。IDE では、既定の設定で、書き込むときにも検証(コンパイル)が行われます。arduino-cli の upload はコンパイルしません。IDE の書き込みに当たるのは、「compile のあとに upload」か、続けて行う compile -u です。
設定を変えていなければ、IDE とターミナルの arduino-cli は同じフォルダを使います。ボードのコアは %LOCALAPPDATA%\Arduino15、スケッチとライブラリは「ドキュメント」の中の Arduino フォルダです。OneDrive でドキュメントを同期している PC では、OneDrive\ドキュメント\Arduino になります。
ボードが無くてもできるのはコンパイルまで
コンパイルは PC の中で終わるので、ボードをつながなくても実行できます。書き込みとシリアルモニタは、ボードを PC につないで使うコマンドです。ボードが届く前にスケッチの動きを確かめたいときは、Arduinoシミュレータ「Wokwi」で試す方法もあります。
Windowsにarduino-cliをインストールする
公式の Installation では、64bit 版の msi インストーラも配布されています。
zip を取得して SHA256 を照合する
- リリースページから zip を取得する
arduino-cli のリリースページ(v1.5.1)から、arduino-cli_1.5.1_Windows_64bit.zip(17.1 MiB)をダウンロードします。ハッシュ値の一覧の1.5.1-checksums.txtも、同じページからダウンロードします。 - Get-FileHash でハッシュ値を照合する
ダウンロードしたフォルダで PowerShell を開き、zip のハッシュ値を出します。PowerShell> Get-FileHash .\arduino-cli_1.5.1_Windows_64bit.zip -Algorithm SHA256 Algorithm Hash Path --------- ---- ---- SHA256 FABE42E0EB04D00E776A66178299FF95A46C623DBC260F997E58FD514853DD40 C:\…Hashの列の64文字が、zip のハッシュ値です。Pathの列は、画面の幅によっては途中で切れる場合がありますが、照合には使いません。1.5.1-checksums.txtの、zip のファイル名の行と比べます。1.5.1-checksums.txt(zip の行)fabe42e0eb04d00e776a66178299ff95a46c623dbc260f997e58fd514853dd40 arduino-cli_1.5.1_Windows_64bit.zip大文字と小文字の違いは無視して比べ、同じ値なら照合は成功です。値が違うときは、ファイルが壊れているか書き換えられている可能性があるので、使わずにダウンロードし直します。
- zip を展開する
中身はarduino-cli.exeとLICENSE.txtの2つだけです。ここではC:\arduino-cliに展開します(場所は好きなフォルダで構いません)。 - 展開したフォルダで version を打つ
.\arduino-cli.exe versionで版が表示されれば、使える状態です。PowerShell(展開したフォルダで)> .\arduino-cli.exe version arduino-cli Version: 1.5.1 Commit: 01f3d4f2b Date: 2026-06-05T10:22:12Z表示に出ている
Version: 1.5.1の部分が、いま入れた版です。
「認識されません」と出たら PATH を確かめる
PowerShell では、展開したフォルダの中でも、.\ を付けずに打つと次のエラーになります。
> arduino-cli.exe version
arduino-cli.exe : 用語 'arduino-cli.exe' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前と
して認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再
試行してください。
発生場所 行:1 文字:1
+ arduino-cli.exe version
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (arduino-cli.exe:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PowerShell は、セキュリティ上の理由から、今いるフォルダのプログラムを自動では探しません(PowerShell のコマンドの優先順位、Microsoft Learn)。コマンドプロンプトは、展開したフォルダの中なら .\ を付けなくても通ります。
展開したフォルダの外では、PowerShell もコマンドプロンプトも、PATH(コマンドを探すフォルダを登録した環境変数)に無いプログラムを見つけられません。コマンドプロンプトでは、次のメッセージになります。
> arduino-cli version
'arduino-cli' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
いま開いている PowerShell の中だけで使えればよいなら、$env:Path に展開したフォルダを足します。PowerShell を閉じると、この変更は元に戻ります。
> $env:Path += ';C:\arduino-cli'
> arduino-cli version
arduino-cli Version: 1.5.1 Commit: 01f3d4f2b Date: 2026-06-05T10:22:12Z
どのフォルダからでも打てるようにするには、展開したフォルダを Windows の環境変数 Path に追加します(公式の Installation の案内)。環境変数の変更は、すでに開いているターミナルには適用されないので、開き直してから試します。
設定ファイルを作り、ボードのコアを入れる
config init で設定ファイルを作る
config init を打つと、arduino-cli.yaml という設定ファイルが作られます。
> arduino-cli config init
Config file written to: C:\…\arduino-cli.yaml
表示に出ている Config file written to: の後ろの部分が、設定ファイルの場所です。既定では、データのフォルダ %LOCALAPPDATA%\Arduino15 の中に書かれます。Arduino IDE 2.x の設定ファイル(.arduinoIDE フォルダの arduino-cli.yaml)とは別のファイルです。
config dump では、設定ファイルや環境変数で指定した値しか表示されず、既定の値は出ません。既定の値は config get で1つずつ確かめます。
> arduino-cli config get directories.user
C:\Users\ユーザー名\OneDrive\ドキュメント\Arduino
> arduino-cli config get build_cache.path
C:\Users\ユーザー名\AppData\Local\arduino
directories.user がスケッチとライブラリの置き場で、IDE の「スケッチブックの場所」に当たります。build_cache.path は、コンパイルの途中で作るファイルを残しておく場所です。
core install でボードのコアを入れる
コアは、ボードごとのコンパイラや書き込みのツールをまとめたもので、IDE のボードマネージャで入れるものに当たります。まず core update-index で、入れられるコアの一覧を取ってきます。
> arduino-cli core update-index
Downloading index: library_index.tar.bz2 downloaded
Downloading index: package_index.tar.bz2 downloaded
Downloading missing tool builtin:ctags@5.8-arduino11...
…
builtin:serial-monitor@0.15.0をインストールしました
Downloading index: package_index.tar.bz2 downloaded
初回は、ボードの検出などに使う builtin: のツール5つも、合わせてインストールされます。ダウンロードの進み具合の表示は、途中の行を省いて、終わったときの行だけにしています。
UNO R3 のコアは arduino:avr です。core search で名前と最新の版を確かめてから入れます。
> arduino-cli core search avr
ID Version Name
arduino:avr 1.8.8 Arduino AVR Boards
arduino:megaavr 1.8.8 Arduino megaAVR Boards
…
> arduino-cli core install arduino:avr
Downloading packages...
arduino:arduinoOTA@1.3.0 downloaded
arduino:avr-gcc@7.3.0-atmel3.6.1-arduino7 downloaded
arduino:avrdude@8.0.0-arduino1 downloaded
arduino:avr@1.8.8 downloaded
…
Installing platform arduino:avr@1.8.8...
Skipping platform configuration....
Platform arduino:avr@1.8.8 installed
最後の行の Platform arduino:avr@1.8.8 installed で、入ったコアと版が分かります。UNO R4(Minima と WiFi)のコアは arduino:renesas_uno です。同じように、core install arduino:renesas_uno で入れます。
取ってきたアーカイブの大きさと、かかった時間は次のとおりでした。
| コア | 取得したアーカイブ | かかった時間 |
|---|---|---|
| arduino:avr(UNO R3) | 61.4 MiB | 4.9 秒 |
| arduino:renesas_uno(UNO R4) | 143.2 MiB | 10.0 秒 |
時間はダウンロードを含むので、回線で変わります(arduino-cli の zip の 17.1 MiB を 0.9 秒で取れた回線での値)。展開したあとのデータのフォルダは、builtin のツールなども含めて 880.8 MiB になり、UNO R4 のコンパイラだけで 415.3 MiB を使っています。
入ったコアは、core list で確かめます。
> arduino-cli core list
ID インストール済 Latest Name
arduino:avr 1.8.8 1.8.8 Arduino AVR Boards
arduino:renesas_uno 1.6.0 1.6.0 Arduino UNO R4 Boards
列名のうち「インストール済」だけが日本語で表示されます。「インストール済」と Latest の版が同じなら、そのコアは最新です。
FQBNでボードを指定する
FQBN(Fully Qualified Board Name)は、ボードを1つに決めるための名前で、IDE でボードを選ぶ操作に当たります。「パッケージ名:アーキテクチャ名:ボード名」の3つを、コロンでつないだ形で書きます。
| FQBN | アーキテクチャ | ボード |
|---|---|---|
| arduino:avr:uno | avr | UNO R3 |
| arduino:renesas_uno:minima | renesas_uno | UNO R4 Minima |
| arduino:renesas_uno:unor4wifi | renesas_uno | UNO R4 WiFi |
core install で指定したコアの名前は、FQBN のパッケージ名とアーキテクチャ名(UNO R3 なら arduino:avr)に当たります。
board listall で FQBN を調べる
board listall にボード名の一部を付けると、入れたコアのボードから FQBN を探せます。
> arduino-cli board listall uno
Board Name FQBN
Arduino Nano R4 arduino:renesas_uno:nanor4
Arduino UNO arduino:avr:uno
Arduino UNO Mini arduino:avr:unomini
Arduino UNO R4 Minima arduino:renesas_uno:minima
Arduino UNO R4 WiFi arduino:renesas_uno:unor4wifi
Arduino UNO WiFi arduino:avr:unowifi
Board Name の列で自分のボードを探し、同じ行の FQBN を使います。UNO R3 は、R3 の表記が無い Arduino UNO の行です。
board list でつないだボードのポートを調べる
board list は、PC につながっているボードとポートを一覧にします。ボードをつないでいないと、No boards found. とだけ表示されます。
> arduino-cli board list
No boards found.
ボードをつなぐと、ポートごとに1行出ます。日本語の環境では、列名の Port が「シリアルポート」、Type が「タイプ」と出ます(board list の実行例、Lang-ship)。書き込みには、先頭の列の COM3 のようなポートの名前が必要です。
互換機などで Board Name が Unknown になる場合もあります。公式の Getting started には、Unknown でも、コアと FQBN が合っていれば書き込めると書いてあります。どのポートか分からないときは、ボードをつなぐ前と後で board list を打ち、増えた行を見ます。
コンパイルして、フラッシュとRAMの使用量を読む
sketch new でスケッチを作り、compile する
sketch new は、同じ名前のフォルダと .ino ファイルを作ります。
> arduino-cli sketch new MyFirstSketch
Sketch created in: C:\…\MyFirstSketch
作られた .ino には、空の setup() と loop() だけが入っています。
void setup() {
}
void loop() {
}
IDE で作ったスケッチのフォルダも、そのまま compile に渡せます。compile には、--fqbn でボードを、最後にスケッチのフォルダを渡します。
> arduino-cli compile --fqbn arduino:avr:uno MyFirstSketch
最大32256バイトのフラッシュメモリのうち、スケッチが444バイト(1%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が9バイト(0%)を使っていて、ローカル変数で2039バイト使うことができます。
成功すると、この2行だけが表示されます。
出力の2行で、フラッシュと RAM の残りを読む
1行目がフラッシュ、2行目が RAM の使用量です。フラッシュは、スケッチのプログラムが入る場所です。RAM は、動いている間に変数を置く場所で、2行目にはグローバル変数の使用量と、ローカル変数に使える残りが出ます。
LED を1秒ごとに点滅させ、その状態をシリアルモニタへ出すスケッチ(first-blink)で比べます。
// D8 につないだ LED を1秒ごとに点滅させ、状態をシリアルモニタに出す
const int LED_PIN = 8;
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
Serial.println("LED ON");
delay(1000);
digitalWrite(LED_PIN, LOW);
Serial.println("LED OFF");
delay(1000);
}
> arduino-cli compile --fqbn arduino:avr:uno first-blink
最大32256バイトのフラッシュメモリのうち、スケッチが1992バイト(6%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が202バイト(9%)を使っていて、ローカル変数で1846バイト使うことができます。
> arduino-cli compile --fqbn arduino:renesas_uno:unor4wifi first-blink
最大262144バイトのフラッシュメモリのうち、スケッチが51968バイト(19%)を使っています。
最大32768バイトのRAMのうち、グローバル変数が6740バイト(20%)を使っていて、ローカル変数で26028バイト使うことができます。
読むのは、2行目の「ローカル変数で〜バイト使うことができます」の数字です。動いている間に、関数の中の変数などに使える RAM の残りで、UNO R3 では 1,846 バイトでした。割合(%)は切り捨てで出るので、202 バイトは 2,048 バイトの 9.86% ですが、「9%」と表示されます。
「最大」の数字は、ボードごとに決まっている上限です。UNO R3 はフラッシュ 32,256 バイトと RAM 2,048 バイト、UNO R4 WiFi は 262,144 バイトと 32,768 バイトです。UNO R4 WiFi は、空のスケッチでもフラッシュ 51,824 バイト、RAM 6,740 バイトを使っています。
出力の言語は、設定ファイルの locale、環境変数の LC_ALL と LANG、Windows のユーザーの既定のロケールの順で決まります。どれも設定していない場合は、Windows のユーザーの既定のロケールが日本語(ja-JP)なら、日本語で出ます。環境変数 LANG を en_US.UTF-8 にすると、Sketch uses 1992 bytes (6%) of program storage space. のような英語で出ます。
Arduino総合演習(自動温湿度調整システム)のスケッチも、UNO R3 向けのコンパイルは通ります。フラッシュ 5,262 バイト(16%)、RAM 663 バイト(32%)を使っています。
arduino-cli に渡すときは、模範解答の main.cpp を final_project.ino に名前を変えます。名前を変えた .ino は、ドリルの部品の .cpp と .h の10本と同じ final_project フォルダに置きます。スケッチのフォルダ名と .ino の名前は、一致している必要があります(公式の Sketch specification)。
同じスケッチを UNO R4 WiFi 向けにコンパイルすると、最初のエラーで止まります。
> arduino-cli compile --fqbn arduino:renesas_uno:unor4wifi final_project
C:\…\sketches\final_project\eeprom_log.cpp:2:10: fatal error: avr/io.h: No such file or directory
#include <avr/io.h>
^~~~~~~~~~
compilation terminated.
Used platform Version Path
arduino:renesas_uno 1.6.0 C:\…\packages\arduino\hardware\renesas_uno\1.6.0
Error during build: exit status 1
fatal error: の行が原因です。avr/io.h は UNO R3 の AVR マイコン用のヘッダで、UNO R4 のコアにはありません。このスケッチは EEPROM やタイマのレジスタを直接書いているので、UNO R4 で動かすには書き直しが要ります。UNO R3 と R4 の違いとボードの選び方は、別の記事にまとめています。
RAM が足りないと、終了コード1で止まる
RAM の使用量が 100% を超えると、コンパイルはエラーで止まります。シリアルモニタへ文字列を多く出す計測用のスケッチから、F() を外したもの(measure_noF)を、UNO R3 向けにコンパイルした例です。
> arduino-cli compile --fqbn arduino:avr:uno measure_noF
最大32256バイトのフラッシュメモリのうち、スケッチが15506バイト(48%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が4296バイト(209%)を使っていて、ローカル変数で-2248バイト使うことができます。
スケッチが使用するメモリが足りません。メモリを節約する方法については、以下のURLのページを参照してください。https://support.arduino.cc/hc/en-us/articles/360013825179
Used platform Version Path
arduino:avr 1.8.8 C:\…\packages\arduino\hardware\avr\1.8.8
Error during build: data section exceeds available space in board
2行目の 209% と、マイナスになったローカル変数の残りから、RAM が足りないことが分かります。最後の行の data section exceeds available space in board は、RAM(data)が上限を超えたときのエラーです。フラッシュ(text)が上限を超えたときは、「スケッチが大きすぎます。」と text section exceeds available space in board が出ます。
どちらも終了コードは 1 で、コンパイルは失敗として終わります。終了コードは、PowerShell なら $LASTEXITCODE、コマンドプロンプトなら %ERRORLEVEL% で確かめられます。0 なら成功、0 以外なら失敗です。
UNO R3 では、文字列を F() で囲むと、文字列は RAM へ写されずにフラッシュに置かれたままになります。F() で囲んだ元のスケッチ(measure)は、RAM を 264 バイト(12%)使っていて、コンパイルが通ります。
> arduino-cli compile --fqbn arduino:avr:uno measure
最大32256バイトのフラッシュメモリのうち、スケッチが16006バイト(49%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が264バイト(12%)を使っていて、ローカル変数で1784バイト使うことができます。
フラッシュの使用量は、15,506 バイトと 16,006 バイトで、ほとんど変わりません。F() が無くても文字列はフラッシュに入っていて、起動するときに RAM へ写されるからです。同じ F() なしのスケッチも、UNO R4 WiFi では RAM 6,768 バイト(20%)で通ります。
RAM の使用量が 75% を超えて 100% に届かないときは、エラーにはならず、警告が出ます。グローバル変数の配列で 1,600 バイトを確保したスケッチ(low_mem)を、UNO R3 向けにコンパイルすると、次のようになります。
> arduino-cli compile --fqbn arduino:avr:uno low_mem
最大32256バイトのフラッシュメモリのうち、スケッチが1596バイト(4%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が1790バイト(87%)を使っていて、ローカル変数で258バイト使うことができます。
スケッチが使用できるメモリが少なくなっています。動作が不安定になる可能性があります。
3行目が、RAM が 75% を超えたときの警告です。終了コードは 0 で、コンパイルは成功として終わるので、2行目の割合とローカル変数の残りで、RAM の余裕を確かめます。
2回目からのコンパイルは、キャッシュで速くなる
arduino-cli は、コンパイルしたコアとスケッチのファイルをキャッシュに残し、2回目からは変わっていない部分を再利用します。同じ計測用のスケッチ(measure)で、かかった時間を3回ずつ測った中央値は次のとおりです。
| ボード | 1回目 | 2回目 | –clean |
|---|---|---|---|
| UNO R3 | 1.62 秒 | 0.89 秒 | 1.61 秒 |
| UNO R4 WiFi | 5.79 秒 | 0.98 秒 | 5.83 秒 |
1回目はキャッシュを消してから測りました。測った PC は、Core i7-14700F、メモリ 31.9 GB、NVMe の SSD です。
-v を付けて2回目を打つと、Using precompiled core の行が出て、コアをキャッシュから使ったことが分かります(総合演習のスケッチの例)。
> arduino-cli compile -v --fqbn arduino:avr:uno final_project
…
Using precompiled core: C:\…\cores\arduino_avr_uno_1ffded780f0945ea107d74ea41e8ed7d\core.a
…
キャッシュの場所は %LOCALAPPDATA%\arduino で、cores にコア、sketches にスケッチごとのファイルが入ります。--clean を付けると、キャッシュを使わずに最初から作り直すので、時間は1回目と同じくらいかかります。
コンパイラの警告の設定を変えたときは、--clean が要ります。
IDE の「コンパイラの警告」の「なし」「デフォルト」「詳細」「全て」は、--warnings の none、default、more、all に当たり、既定は none です。== のつもりで = と書いたミスなど、2つの誤りをわざと入れたスケッチ(warn_demo)で試しました。まず --warnings なしで、次に --warnings all を付けてコンパイルした出力です。
> arduino-cli compile --fqbn arduino:avr:uno warn_demo
最大32256バイトのフラッシュメモリのうち、スケッチが916バイト(2%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が11バイト(0%)を使っていて、ローカル変数で2037バイト使うことができます。
> arduino-cli compile --fqbn arduino:avr:uno --warnings all warn_demo
最大32256バイトのフラッシュメモリのうち、スケッチが916バイト(2%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が11バイト(0%)を使っていて、ローカル変数で2037バイト使うことができます。
--warnings all を付けても、警告は1件も出ません。前回コンパイルしたスケッチの .o ファイルがキャッシュに残っていて、そのまま使われるからです。警告の設定が、キャッシュを使い直すかどうかを決める判定に含まれていないのが原因です。-v を付けると、以前コンパイルされたファイルを使用中:の行で、前回のファイルを使ったことが分かります。
--clean を付けると、2つの誤りが警告として出ます。
> arduino-cli compile --fqbn arduino:avr:uno --warnings all --clean warn_demo
C:\…\sketches\warn_demo\warn_demo.ino: In function 'void setup()':
C:\…\sketches\warn_demo\warn_demo.ino:17:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i = 0; i < sizeof(buf); i++) { /* 2) int と size_t の比較 */
~~^~~~~~~~~
C:\…\sketches\warn_demo\warn_demo.ino: In function 'void loop()':
C:\…\sketches\warn_demo\warn_demo.ino:23:13: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
if (count = 10) { /* 1) == のつもり */
~~~~~~^~~~
…
省略した残りの4件の警告は、コアの new.cpp にある、使っていない引数(tag)が原因で出ています。オプションを変えたら、--clean を付けてコンパイルし直します。
.hex ファイルを出力するには -e を付ける
compile だけでは、スケッチのフォルダに .hex などのファイルは生成されません。-e(--export-binaries)を付けると、スケッチのフォルダの中に build\arduino.avr.uno ができて、.hex などが出ます。IDE の「スケッチ」メニューの「コンパイル済みバイナリをエクスポート」に当たる操作です。
> arduino-cli compile --fqbn arduino:avr:uno --export-binaries first-blink
最大32256バイトのフラッシュメモリのうち、スケッチが1992バイト(6%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が202バイト(9%)を使っていて、ローカル変数で1846バイト使うことができます。
UNO R3 では、first-blink.ino.hex、.elf、.eep、.with_bootloader.hex、.with_bootloader.bin の5つが生成されます。UNO R4 WiFi では、.bin、.elf、.hex、.map の4つが生成されます。出力先を別のフォルダにするときは、--output-dir オプションでフォルダを指定します。
ライブラリを入れる
「No such file or directory」は、ライブラリが入っていないときのエラー
CAN モジュール(MCP2515)を使う送信のスケッチ(can_tx)を、ライブラリを入れる前にコンパイルすると、次のように止まります。
> arduino-cli compile --fqbn arduino:avr:uno can_tx
C:\…\sketches\can_tx\can_tx.ino:21:10: fatal error: mcp_can.h: No such file or directory
#include <mcp_can.h>
^~~~~~~~~~~
compilation terminated.
Used library Version Path
SPI 1.0 C:\…\packages\arduino\hardware\avr\1.8.8\libraries\SPI
Used platform Version Path
arduino:avr 1.8.8 C:\…\packages\arduino\hardware\avr\1.8.8
Error during build: exit status 1
can_tx.ino:21:10 は、21行目の10文字目で mcp_can.h を読み込もうとして、見つからなかったという意味です。-v を付けないときは、Used library と Used platform の表は、失敗したときしか出ません。-v を付けると、成功したときも表が出ます。表の Path を見ると、どのフォルダのライブラリが使われたかが分かります。
lib search で探し、lib install で入れる
lib search は、名前や説明に語を含むライブラリを並べるので、関係ないものも出ます。mcp_can で検索すると43件出て、先頭が目的の mcp_can でした。
> arduino-cli lib search mcp_can
Name: "mcp_can"
Author: coryjfowler
Maintainer: coryjfowler
Sentence: MCP_CAN Library
Paragraph: Adds support for Microchip CAN 2.0B protocol controllers (MCP2515, MCP25625, and similar)
Website: https://github.com/coryjfowler/MCP_CAN_lib
Category: Communication
Architecture: *
Types: Contributed
Versions: [1.5.0, 1.5.1]
Name: "107-Arduino-MCP2515"
…
同じような名前のライブラリがあるので、Author と Website を見て選びます。入れるときは、Name: の名前を lib install に渡します。
> arduino-cli lib install mcp_can
Downloading mcp_can@1.5.1...
mcp_can@1.5.1 downloaded
Installing mcp_can@1.5.1...
Installed mcp_can@1.5.1
Installed mcp_can@1.5.1 の行で、入った版が分かります。
ほかのライブラリを使うライブラリは、lib install で依存するライブラリも一緒に入ります。温湿度センサーの DHT sensor library を入れると、Adafruit Unified Sensor も入りました。
> arduino-cli lib install "DHT sensor library"
Downloading DHT sensor library@1.4.7...
DHT sensor library@1.4.7 downloaded
Installing DHT sensor library@1.4.7...
Installed DHT sensor library@1.4.7
Downloading Adafruit Unified Sensor@1.1.15...
Adafruit Unified Sensor@1.1.15 downloaded
Installing Adafruit Unified Sensor@1.1.15...
Installed Adafruit Unified Sensor@1.1.15
入ったライブラリは、lib list で確かめます。
> arduino-cli lib list
Name インストール済 Available Location Description
Adafruit Unified Sensor 1.1.15 - user -
DHT sensor library 1.4.7 - user -
mcp_can 1.5.1 - user -
Location の user は、スケッチブック(ドキュメントの Arduino フォルダ)の libraries フォルダに入ったという意味です。入れたあとは、同じ can_tx がフラッシュ 3,910 バイト、RAM 216 バイトでコンパイルを通りました。
ライブラリマネージャーに無いライブラリを GitHub の URL から入れる --git-url は、既定では使えません。
> arduino-cli lib install --git-url https://github.com/coryjfowler/MCP_CAN_lib.git
--git-url and --zip-path are disabled by default, for more information see: https://arduino.github.io/arduino-cli/1.5/configuration/#configuration-keys
使うには、設定ファイルの library.enable_unsafe_install を true にします。zip ファイルから入れる --zip-path も同じです。
書き込みとシリアルモニタのコマンド
upload と compile -u で書き込む
UNO R3 への書き込みは、コアに入っている avrdude というツールが行います。board details -b arduino:avr:uno の出力の、Required tool: arduino:avrdude の行で確かめられます。
upload には、-p でポートを、--fqbn でボードを渡します。upload はコンパイルしないので、先に compile しておきます。
> arduino-cli compile --fqbn arduino:avr:uno first-blink
> arduino-cli upload -p COM3 --fqbn arduino:avr:uno first-blink
ボードが無いと、upload はポートを開けずに失敗します。
> arduino-cli upload -p COM3 --fqbn arduino:avr:uno first-blink
Error: cannot open port \\.\COM3: 指定されたファイルが見つかりません。
Error: unable to open port COM3 for programmer arduino
Failed uploading: uploading error: exit status 1
cannot open port の後ろの「指定されたファイルが見つかりません。」は、指定したポートが PC に無いことを示しています。ボードをつないでいるのにこのエラーが出るときは、board list でポートの名前を確かめます。-p を付け忘れると、Failed uploading: no upload port provided と表示されて止まります。
compile -u を使うと、コンパイルが通ったあとに続けて書き込みます。
> arduino-cli compile -u -p COM3 --fqbn arduino:avr:uno first-blink
最大32256バイトのフラッシュメモリのうち、スケッチが1992バイト(6%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が202バイト(9%)を使っていて、ローカル変数で1846バイト使うことができます。
Error: cannot open port \\.\COM3: 指定されたファイルが見つかりません。
Error: unable to open port COM3 for programmer arduino
Error during Upload: Failed uploading: uploading error: exit status 1
メモリの2行が出てから止まっているので、コンパイルは通り、書き込みで失敗したことが分かります。
-v を付けると、arduino-cli が呼んだ avrdude のコマンドラインが出ます。
> arduino-cli upload -v -p COM3 --fqbn arduino:avr:uno first-blink
"C:\…/bin/avrdude" "-CC:\…/etc/avrdude.conf" -v -V -patmega328p -carduino "-PCOM3" -b115200 -D "-Uflash:w:C:\…/first-blink.ino.hex:i"
…
-patmega328p がマイコン、-PCOM3 がポート、-b115200 が書き込みの通信速度、-Uflash:w: の後ろが書き込む .hex ファイルです。IDE の「より詳細な情報を表示する」で、書き込みにチェックを入れたときに出るものに当たります。
monitor でシリアルモニタを開く
monitor は、IDE のシリアルモニタに当たるコマンドです。-p でポートを指定し、ボーレートは --config baudrate=115200 の形で渡します。
> arduino-cli monitor -p COM3 --config baudrate=115200
Port monitor error: command 'open' failed: Serial port not found
ボードが無いと、このようにポートを開けずに終わります。ボーレートは、スケッチの Serial.begin() で指定した値に合わせます。monitor でボーレートを指定しないときの初期値は 9600 なので、Serial.begin(9600) の first-blink なら、--config は要りません。選べる値と初期値は、--describe で確かめられます。
> arduino-cli monitor -p COM3 --describe
ID Setting 初期値 Values
baudrate Baudrate 9600 300, 600, 750, 1200, 2400, 4800, 9600, 19200, 31250, 38400, 57600, 74880, 115200, 230400, 250000, 460800, 500000, 921600, 1000000, 2000000
dtr DTR on on, off
bits Data bits 8 5, 6, 7, 8, 9
parity Parity none none, even, odd, mark, space
rts RTS on on, off
stop_bits Stop bits 1 1, 1.5, 2
--describe は、ボードが無くても設定の一覧を出力します。--config の書式は、monitor --help に <ID>=<value> と書いてあり、ID の列の名前を使います。
古い記事のコマンドがエラーになるとき
- 「シリアルモニタは無い」と書いてある
- 0.20.0(2021年11月)から、
monitorコマンドでシリアルモニタを開くこともできます(monitor でシリアルモニタを開く)。 - コンパイルしても、スケッチのフォルダに build フォルダや .hex ができない
- 0.14.0 から、
compileは既定ではスケッチのフォルダに出力しません。-eを付けます(.hex ファイルを出力するには -e を付ける)。 - カレントディレクトリ(今いるフォルダ)に置いた arduino-cli.yaml や .cli-config.yml が読み込まれない
- 0.32.0 から、カレントディレクトリの arduino-cli.yaml は探さなくなりました。
--config-fileオプションで arduino-cli.yaml を指定すると、読み込まれます。.cli-config.yml は 0.7.0 より前の仕様の設定ファイル(sketchbook_pathなどの書き方)で、1.x ではそのままでは使えません。 - config init の2回目が「Config file already exists, use –overwrite to discard the existing one.」で止まる
- 0.14.0 から、設定ファイルがすでにあると失敗します。作り直すには、
--overwriteを付けます。 - –format yaml が「Invalid output format: yaml」になる
- 1.0.0 で yaml の出力は無くなりました。
--format jsonは 1.5.1 でも通りますが、公式は非推奨にしているので、--jsonを使います(1.0.0 のリリースノート)。 - board attach serial://COM3 が「Error: accepts at most 1 arg(s), received 2」になる
- ポートは
-p、ボードは-bで渡します(board attach -p COM3 -b arduino:avr:uno スケッチ)。設定はsketch.jsonではなく、スケッチのフォルダのsketch.yamlに保存されます。 - –build-cache-path で「The flag –build-cache-path has been deprecated.」と出る
- コンパイルは通りますが、非推奨の警告です。キャッシュの場所は、設定の
build_cache.pathで設定します。 - board details arduino:avr:uno が「Error: unknown command」になる
- FQBN は
-bで渡します(board details -b arduino:avr:uno)。 - board list –timeout が「Error: unknown flag: –timeout」になる
- 0.20.0 で
--discovery-timeoutに変わりました。
エラーにオプションの名前が出たときは、そのコマンドに --help を付けて、いまの版で使えるオプションを確かめます。版ごとの変更は、公式の UPGRADING にまとめられています。
まとめ|IDEの操作とコマンドの対応
Arduino IDE の操作と、arduino-cli のコマンドの対応です。
| IDE の操作 | arduino-cli のコマンド |
|---|---|
| 検証 | compile –fqbn FQBN スケッチ |
| 書き込み | compile のあと upload -p ポート、または compile -u -p ポート |
| ボードマネージャ | core install |
| ライブラリマネージャー | lib install |
| シリアルモニタ | monitor -p ポート |
| コンパイル済みバイナリをエクスポート | compile -e |
| コンパイラの警告 | compile –warnings |
compile の出力では、2行目のローカル変数の残りを見ます。RAM が足りないと、data section exceeds available space in board と出て、終了コード 1 で止まります。警告などのオプションを変えたあとは、--clean で作り直します。