本文へ移動
そのエラー文、
検索してここにたどり着いたはずです。
Arduino IDEの出力欄に真っ赤な文字が並んだ時、ほとんどの人は表示されたエラー文をそのまま検索します。この記事は、その検索でよく見つかる代表的なエラーを1つずつ個別の見出しにまとめた、リファレンス(辞書)タイプのガイドです。コードの書き間違いによるコンパイルエラーから、コピペで紛れ込む文字化け、メモリ不足の警告、ライブラリ・ボード設定、書き込み(アップロード)エラー、そして「書き込めたのに動かない」という最後の落とし穴まで、原因とコード付きの直し方を順番に確認していきましょう。
エラーが起きたら最初にすること
Arduino IDEでコードを検証(Verify)または書き込む(Upload)と、出力欄に赤い文字でエラーが表示されることがあります。1行だけのこともあれば、画面いっぱいに大量の文字が流れることもありますが、慌てる必要はありません。
エラーが何行も表示されている時は、一番上に表示されている最初のエラーだけに注目してください。最初のエラーが原因で、その後ろに連鎖的なエラーが大量に表示されていることが非常に多く、1つ目を直すと残りが一気に消えることがよくあります。
この記事では、検索で見つかりやすい代表的なエラー文をそのまま見出しにしています。今表示されているエラーに近いものを、目次または下記のCtrl+F(Macは⌘+F)で探して読み進めてください。エラーの読み方の全体像は、Arduino公式サポートの「If your sketch doesn’t compile」↗にもまとまっています。
構文エラー編(書き間違いで起きるもの)
ここで紹介する6つは、いずれもコードの書き方そのものが原因で起きるコンパイルエラーです。ボードや配線とは関係なく、コードの中だけで解決できます。
expected ‘;’ before …
コンパイルエラー
最も頻繁に見かけるエラーの1つです。「ここまでの文の終わりに、セミコロン(;)があるはずなのに見当たりません」という意味です。実際にエラーが指す行ではなく、その1行前にセミコロンの書き忘れがあるケースがほとんどです。
void loop() {
int ledPin = 8
digitalWrite(ledPin, HIGH); // ← ここがエラー行として指摘される
}
FIX ↓
void loop() {
int ledPin = 8; // 行末にセミコロンを追加
digitalWrite(ledPin, HIGH);
}
expected ‘}’ at end of input
コンパイルエラー
波かっこ{ }の数が合っていない時に出るエラーです。「ファイルの最後まで来たのに、閉じるはずの } が見つかりません」という意味で、どこかで{だけ書いて}を書き忘れています。
sketch.ino:8:1: error: expected ‘}’ at end of input
void loop() {
if (digitalRead(2) == LOW) {
digitalWrite(8, HIGH);
// ← if文を閉じる } が1つ足りない
digitalWrite(8, LOW);
}
FIX ↓
void loop() {
if (digitalRead(2) == LOW) {
digitalWrite(8, HIGH);
} // if文を閉じる } を追加
digitalWrite(8, LOW);
}
Arduino IDEでは、いずれかの{や}にカーソルを合わせると、対応する側がハイライト表示されます。上から順に対応関係を追っていくと、足りない場所を見つけやすくなります。
‘xxx’ was not declared in this scope
コンパイルエラー
「xxxという名前は、このあたりでは宣言されていません」という意味です。変数名やライブラリのクラス名のスペルミス、変数を使う前に宣言し忘れている、必要な#includeを書き忘れている、といったケースで発生します。
const int ledPin = 8;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPn, HIGH); // ← ledPin のスペルミス(nが抜けている)
}
FIX ↓
digitalWrite(ledPin, HIGH); // 正しいスペルに修正
#include <Servo.h>の書き忘れ、またはライブラリ自体が未インストールであることが多いです。ライブラリのインストール方法はArduino公式の「Installing a Library」ガイド ↗で確認できます。redefinition of ‘xxx’
コンパイルエラー
同じ名前の変数や関数を、同じ場所で2回定義してしまった時に出るエラーです。コードをコピペで組み合わせた時に発生しやすく、「さっき定義したxxxを、もう一度定義しようとしています」という意味です。
sketch.ino:3:6: note: ‘void blinkLed()’ previously defined here
void blinkLed() {
digitalWrite(8, HIGH);
delay(200);
digitalWrite(8, LOW);
}
// ...途中のコードを省略...
void blinkLed() { // ← 同じ名前の関数がもう1つある
digitalWrite(9, HIGH);
delay(200);
digitalWrite(9, LOW);
}
FIX ↓
void blinkLed8() { /* ... */ } // 名前を分ける
void blinkLed9() { /* ... */ }
別々のサンプルコードから2つの関数や変数をコピペで持ってきた時、両方に同じ名前(setupやloop以外の自作関数、countのような一般的すぎる変数名など)が使われていて衝突するケースが典型的です。エラーの2行目に表示される「previously defined here」の行番号が、最初に定義した場所を教えてくれます。
two or more data types in declaration of ‘xxx’
コンパイルエラー
これも実はセミコロン抜けが原因になる、少し変わった見え方をするエラーです。「1つの宣言の中に、型(int・Servoなど)が2つ以上混ざっています」という意味ですが、実際には前の行のセミコロンが抜けていて、2行が1つの文として合体してしまっているだけのことがほとんどです。
int ledPin = 8
int buttonPin = 2; // ← 前の行にセミコロンがないため
// 「int ... int」が1つの宣言として読まれてしまう
FIX ↓
int ledPin = 8; // セミコロンを追加
int buttonPin = 2;
1つ目の「expected ‘;’ before」と原因はまったく同じ「セミコロン忘れ」です。ただし、抜けている行の直後に次の行も型の名前(int・Servoなど)から始まっている場合、コンパイラの受け取り方が変わって、こちらのメッセージで出てくることがあります。
stray ‘\xxx’ in program(コピペ起因の文字化け)
コンパイルエラー
特に日本語環境でとても多い原因不明エラーです。「プログラムの中に、見慣れない文字(迷い込んだ文字)があります」という意味で、多くはブログやWord文書からコードをコピペした時に、半角のクォーテーション(” や ‘)が全角・スマート引用符(“ ” や ‘ ’)に自動変換されてしまっていることが原因です。見た目はほとんど同じなので、目視では気づきにくいのが厄介な点です。
sketch.ino:2:20: error: stray ‘\200’ in program
sketch.ino:2:21: error: stray ‘\234’ in program
void loop() {
Serial.println("Hello"); // ← 見た目は普通の引用符に見えるが
} // 実際は全角のスマート引用符になっている場合がある
FIX ↓
void loop() {
Serial.println("Hello"); // 半角のダブルクォートに打ち直す
}
エラーが指す行の、引用符(’ や “)とセミコロン、全角スペースを一度すべて削除し、Arduino IDE上で半角文字として打ち直してみてください。ブログやPDF、Wordのコピペが原因になっている時は、この方法でほぼ解決します。
型・関数の使い方編
コード自体は概ね正しくても、値の種類(型)やライブラリの関数名の扱い方で起きるエラーです。
invalid conversion from ‘const char*’ to ‘char’
コンパイルエラー
ダブルクォート(”)とシングルクォート(’)を取り違えた時に出るエラーです。ダブルクォートで囲むと「文字列(複数文字の並び)」、シングルクォートで囲むと「1文字だけの文字(char型)」という、まったく別のデータになります。
char grade = "A"; // ← ダブルクォートは「文字列」を作ってしまう
FIX ↓
char grade = 'A'; // 1文字だけならシングルクォート
char型と文字列(クォートの使い分け)の正式な仕様は、Arduino公式のchar言語リファレンス ↗で確認できます。
‘class xxx’ has no member named ‘yyy’
コンパイルエラー
使っているライブラリのクラス(Servoなど)に、指定した名前の関数が存在しない時に出るエラーです。関数名のスペルミス、または参考にしたコードと実際にインストールしたライブラリのバージョンが違う、というケースが典型的です。
Servo myServo;
void setup() {
myServo.attache(9); // ← attach のスペルミス
}
FIX ↓
myServo.attach(9);
ライブラリ・ファイル関連編
ここからは、コードそのものよりも「必要なファイルやライブラリが揃っているか」に関わるエラーです。
No such file or directory
コンパイルエラー
#includeで指定したファイル(多くはライブラリのヘッダファイル)が見つからない時に出るエラーです。原因はおおむね2つ、「ライブラリがインストールされていない」か「ファイル名のスペルミス・大文字小文字の違い」です。
compilation terminated.
#include <Servo.h> // Servoライブラリが未インストールだとここでエラー
Servo myServo;
void setup() {
myServo.attach(9);
}
ファイル名の大文字・小文字も区別されます。servo.hとServo.hは別物として扱われる環境があるため、ライブラリのドキュメントに書かれた通りの表記でincludeしているか確認しましょう。
Multiple libraries were found for “xxx.h”
警告(多くはエラーではない)
同じ名前のライブラリが複数の場所にインストールされている時に表示されるメッセージです。実はこれ自体はエラーではなく、情報として表示されているだけのことが多いです。「Used:」の行に書かれているライブラリが実際に使われるので、それが正しければ問題ありません。
Used: /Users/you/Documents/Arduino/libraries/Servo
Not used: /Users/you/Library/…/hardware/servo
この後に別の本物のエラー(No such file or directoryや関数名の不一致など)が続けて表示されている場合は、意図しない方のライブラリ(同名の別バージョン、別メーカーの同名ライブラリなど)が使われている可能性があります。詳しい判別方法は公式の「Error: Multiple libraries were found」↗で解説されています。
ボード・容量設定編
コード自体に問題がなくても、Arduino IDE側の設定や、ボードの容量オーバーが原因でエラー・警告になることがあります。
Missing FQBN (Fully Qualified Board Name)
コンパイルエラー
FQBN(Fully Qualified Board Name)とは、「どの会社の、どのシリーズの、どのボード向けにコンパイルするか」を表す識別子です。このエラーは、ボードが1つも選択されていない時に出ます。ボードを接続していなくても、検証(Verify)だけであってもボードの選択自体は必要です。
Low memory available, stability problems may occur
警告(エラーではない)
これはエラーではなく警告です。コードは正常に書き込めますが、変数を保存しておくメモリ(SRAM/動的メモリ)の残りが少ないという知らせです。SRAMがほぼ埋まると、動作中に予期しないリセットや値化けなど、不安定な動きにつながることがあります。
Global variables use 1,826 bytes (89%) of dynamic memory, leaving 222 bytes for local variables.
Maximum is 2,048 bytes.
Low memory available, stability problems may occur.
| 用語 | 意味 |
|---|---|
| program storage space | コード本体が保存される容量(フラッシュメモリ) |
| dynamic memory(Global variables use …) | 変数を保存しておく容量(SRAM)。Arduino Unoでは2,048バイトしかない |
使っていない変数を削除する
変数の型を必要以上に大きくしない(floatで足りるのにdoubleを使っていないかなど)
Serial.printlnで固定の文字列を送る時はF("文字列")のようにF()マクロで囲み、SRAMではなくフラッシュ側に保存する
より詳しい削減方法は、公式の「Reduce the size and memory usage of your sketch」↗にまとまっています。
does not fit in available space(容量オーバー)
コンパイルエラー
今度はフラッシュメモリ(コード本体を保存する容量)が足りない時に出る、正真正銘のエラーです。コードやライブラリが大きすぎて、選んでいるボードの容量に収まらないという意味です。
text section exceeds available space in board
使っていないライブラリの#includeを削除する
デバッグ用に大量に書いたSerial.printlnを整理する
それでも収まらない場合は、より容量の大きいボード(Arduino Megaなど)への変更を検討する
こちらも同じ公式の「Reduce the size and memory usage of your sketch」↗で、削減のテクニックが詳しく紹介されています。
exit status 1 / Error compiling for board …
コンパイルエラー(総称メッセージ)
これは具体的な原因を示すメッセージではなく、「とにかくコンパイルに失敗しました」という総称のラッパーメッセージです。この1行だけを見ても原因は分かりません。この行より上に表示されている、具体的なエラー(今回紹介したような内容)を探すのが正しい読み方です。
Error compiling for board Arduino Uno.
ごくまれに、Windowsのユーザー名が日本語(全角文字)になっていることが原因で、コンパイラ内部のツールがファイルパスをうまく処理できず、avr-g++: no such file or directoryのような形でこのエラーが出ることがあります。心当たりがある場合は、Arduino公式の「file does not exist / no such file or directory」の解説 ↗や、半角英数字のユーザー名で新しいWindowsアカウントを作成する対処法を確認してください。
書き込み(アップロード)トラブル編

コンパイルが成功しても、実際にボードへ転送する「書き込み(アップロード)」の段階で止まることがあります。この段階のエラーにはavrdudeという文字がよく登場します。これはArduinoへの書き込みを担当する内部プログラムの名前です。
avrdude: ser_open(): can’t open device …
書き込みエラー
指定されたポート(COMポートや/dev/…)を開けなかった、という意味です。多くの場合、選んでいるポートに実際にはボードがつながっていないことが原因です。
Problem uploading to board.
ボードがUSBケーブルで正しく接続されているか確認する
ツール>ポートで、実際にボードが割り当てられているポートを選び直す
他のシリアルモニタやソフトがそのポートを使っていないか確認し、閉じてから再試行する
詳しい原因の切り分けは、公式の「’Error: avrdude’ when uploading」↗にまとまっています。CH340チップ搭載の互換ボードでcan't set com-stateという表示が出る場合は、ドライバ関連の専用ページ ↗も参考にしてください。
avrdude: stk500_getsync(): not in sync
書き込みエラー
ボードとの通信は始まったものの、想定していた合図(同期信号)が返ってこなかった、という意味です。ポート自体は開けているのに書き込みが失敗する時に出ます。
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
ツール>ボードで正しいボードの種類・プロセッサが選ばれているか確認する(特にNano互換機で起きやすい)
直前に書き込んだコードがデジタルピン0(RX)・1(TX)を使っていないか確認する(配線が残っているとリセットが妨げられます)
ケーブルを挿し直す、別のUSBポートやケーブルに変えてみる
より詳しいケースごとの対処は、上記と同じ公式の「’Error: avrdude’ when uploading」↗で確認できます。
avrdude: verification error; content mismatch
書き込みエラー
書き込み自体は完了したものの、書き込んだ後に内容を確認(ベリファイ)したところ、実際にボードに書き込まれた内容と送ったはずの内容が一致しなかった、という意味です。通信が途中でノイズなどにより乱れたことが多いです。
0x62 != 0x0c
avrdude: verification error; content mismatch
USBケーブルを別のもの、または別のUSBポートに変えて再試行する
ツール>プロセッサで、正しいブートローダー・プロセッサの種類が選ばれているか確認する(特に旧型のNano)
単純にもう一度書き込みボタンを押して、再試行してみる(一時的なノイズが原因のことも多いです)
こちらも公式の「’Error: avrdude’ when uploading」↗にavrdude関連のトラブルとしてまとめて掲載されています。
ポートが表示されない
書き込みエラー(設定)
ツール>ポートのメニューを開いても、そもそも一覧に何も表示されない、あるいはボードが見つからない状態です。エラーメッセージというより、書き込み以前の設定段階での代表的なつまずきです。
データ転送に対応したUSBケーブルを使っているか確認する(充電専用ケーブルではポートが認識されません)
USBハブを経由せず、パソコン本体のUSBポートへ直接接続してみる
互換ボード(CH340などのチップを使用)の場合、専用のUSBドライバがパソコンにインストールされているか確認する
ボードの電源LED(ONなどと書かれたLED)が点灯しているか確認する
症状別のチェック項目は、公式の「If your board does not appear in the port menu」↗にさらに詳しくまとまっています。ブレッドボードや配線そのものを見直したい場合はブレッドボード完全攻略ガイド ↗もあわせてご覧ください。
書き込み中に止まる(進捗バーが動かなくなる)
書き込みエラー
「アップロード中…」の表示や進捗バーのまま、何のエラーも出ずに止まってしまう症状です。エラーメッセージが出ないため原因が分かりにくく感じますが、確認する項目自体は他の書き込みトラブルとほぼ共通です。
シリアルモニタが開いたままになっていないか確認する(ポートが競合して止まることがあります)
Arduino IDEを一度完全に終了し、再起動してから再試行する
ボードのRESETボタンを押すタイミングを、書き込み開始の直後に合わせてみる(一部の互換ボードで有効)
しばらく待っても変化がない場合は、書き込みを中断してポートを選び直してから再試行する
アップロード全般のトラブルは、公式の「If your sketch doesn’t upload」↗に、症状別のチェックリストとしてまとめられています。
実行時トラブル編
コンパイルも書き込みも成功しているのに、期待通りの結果にならない2つのケースです。Arduino IDEはエラーとして教えてくれないため、自分で切り分ける必要があります。
シリアルモニタが文字化けする
実行時トラブル
シリアルモニタを開くと、意味のわからない記号や文字がずらずらと表示される症状です。ほぼ確実にボーレート(通信速度)の不一致が原因です。コード内のSerial.begin(9600)の数字と、シリアルモニタ画面右下(または右上)のボーレート選択の数字が一致していないと発生します。
void setup() {
Serial.begin(9600); // コード側は9600bpsで設定
}
void loop() {
Serial.println("Hello");
delay(1000);
}
// → シリアルモニタ側が115200になっていると文字化けする
シリアルモニタ画面の右下(Arduino IDE 2の場合)にあるボーレートのプルダウンを、コード内のSerial.begin()の数値と同じものに変更してください。詳しい仕様は公式のSerial.begin()言語リファレンス ↗で確認できます。
コードは書き込めたが動かない
実行時トラブル
コンパイルも書き込みも成功したのに、LEDが光らない、ボタンが反応しない、という状態です。原因はコードの外側、つまり配線と、コードの中のロジック(条件や計算の間違い)のどちらかにあります。
| チェック対象 | 確認すること |
|---|---|
| 配線 | ピン番号とコード内の定数が一致しているか。GNDや電源がきちんと接続されているか。 |
| pinMode | INPUTにすべきピンがOUTPUTのままになっていないか、その逆はないか。 |
| if文の条件 | 比較演算子の向き、しきい値の数字、=と==の取り違えがないか。 |
| 実際の値 | Serial.println()で、センサーやボタンの実際の値をシリアルモニタに表示して確認したか。 |
まずはシリアルモニタで「今、実際に何の値が来ているか」を目で確認するのが最短ルートです。値が想定通りなのに動かないならコードのロジックを、値自体がおかしいなら配線やpinModeを疑ってください。
エラー調査の共通ルール
最初のエラーだけを見る。2つ目以降は最初のエラーの余波であることが多いです。
エラーが指す行番号の、1〜2行前も確認する。セミコロン抜けや波かっこの数え間違いは、実際の原因箇所が表示行の少し前にあります。
エラー文をそのままコピーして検索する。ファイル名やピン番号などの固有の部分だけを省いて検索すると、同じエラーの解決事例が見つかりやすくなります。
直前に「動いていた」状態のコードと見比べる。新しく追加・変更した部分から先に疑うのが効率的です。
コンパイルエラーか、書き込みエラーかを切り分ける。出力欄にavrdudeという文字が出ていれば書き込み側、出ていなければコンパイル側の問題です。
エラーか警告かを区別する。Low memory availableやMultiple libraries were foundは多くの場合エラーではなく警告なので、書き込み自体は成功します。
FAQ・まとめ
Arduino IDEにエラーがたくさん表示された時、どこから見ればいいですか?
出力欄の一番上に表示されている、最初のエラーだけに注目してください。1つ目のエラーが原因で、その後ろに連鎖的なエラーが大量に表示されていることが非常に多く、最初の1つを直すと残りが一気に消えることがよくあります。
コンパイルエラーと書き込み(アップロード)エラーの違いは何ですか?
コンパイルエラーは、コードの文法や記述ミスが原因でコードをボード用のプログラムに変換する段階で起きるエラーです。書き込みエラーは、変換自体は成功したのに、実際にボードへ転送する段階(ポートや接続、ドライバなど)で起きるエラーです。出力欄の内容にavrdudeという文字が出てきたら、多くは書き込みエラーです。
「Low memory available」という表示が出ますが、エラーなのですか?
これはエラーではなく警告です。コード自体は問題なく書き込めますが、変数を保存しておくメモリ(SRAM)の残りが少なくなっているというお知らせで、放置すると動作が不安定になることがあります。文字列の使い方や変数の型を見直すことで改善できます。
ネットや本のコードをコピペしたら謎のエラーが出ます。原因は何ですか?
よくある原因は、コピー元がWordやブログの整形済みテキストで、ダブルクォートやシングルクォートが全角の「スマート引用符」に自動変換されてしまっていることです。見た目はほぼ同じでも、コンパイラは別の文字として扱うため、stray in programのようなエラーになります。該当箇所を半角の引用符に打ち直すと解決します。
コードが書き込めたのに動かない時は、何を疑えばいいですか?
コンパイルも書き込みも成功しているので、疑うべきは配線とロジックです。ピン番号とコードの定数が一致しているか、pinModeの入出力設定が合っているか、電源やGNDの配線が正しいか、if文の条件やしきい値が想定通りかを、シリアルモニタで実際の値を確認しながら順番に切り分けていきます。
Arduinoのエラーは、種類ごとに見ると「コードの書き間違い」「型・関数の使い方」「ライブラリやボードの設定」「メモリ・容量」「物理的な接続」「実行時の挙動」の、大きく6つのどこかに必ず分類できます。今どの段階でつまずいているのかさえ切り分けられれば、あとは該当する見出しの手順を順番に試すだけです。この記事をブックマークしておき、エラーが出るたびに該当する見出しへ戻ってくる使い方をおすすめします。
コメント