Arduino完全入門ガイド
文法・関数・エラー対処まで一気にわかる
「Arduinoを始めてみたいけど、コードを見るとカッコや記号だらけで頭が真っ白になる」——そんな方のために、この記事は書きました。開発環境の準備から、プログラムの基本構造、変数、条件分岐、繰り返し、関数、そして入出力の基本命令、さらによくあるエラーの読み方と直し方まで、専門用語ゼロの比喩と実際に動くコード例を使って、順番に一気に理解できるようにまとめています。リハビリの現場で「難しいことを、その人にわかる言葉に置き換えて伝える」ことを仕事にしてきた理学療法士の視点も交えながら、電子工作がまったく初めての方でも迷わないように解説します。
| 知りたいこと | この記事でわかる場所 |
|---|---|
| Arduinoって結局何?何ができる? | 第1章 |
| まず何をパソコンに入れればいい? | 第2章 |
| コードのどこが「準備」でどこが「繰り返し」? | 第3章 |
| 数字や状態はどこにしまっておく? | 第4章 |
| 「もし〜なら」の書き方は? | 第5章 |
| 同じ処理を何度も繰り返すには? | 第6章 |
| 処理をひとまとめにして使い回すには? | 第7〜8章 |
| エラーが出た時、どこを見ればいい? | 第9章 |
Arduinoとは何か、何ができるのか
Arduino(アルドゥイーノ)とは、名刺サイズほどの小さな基板に、簡単なプログラムを書き込んで動かすことができる「マイコンボード」の一種です。パソコンだと考えると難しく感じますが、実際には「決まった手順を、決まったタイミングで繰り返す、とても小さな司令塔」だとイメージすると近いです。
この司令塔にLEDやセンサー、モーターなどの部品をつなぎ、「センサーの値がある基準を超えたらLEDを光らせる」「ボタンが押されたらモーターを回す」といった指示をプログラムとして書き込むことで、身の回りの小さな自動化・電子工作を実現できます。
Arduinoで書くプログラムは「スケッチ」とも呼ばれ、文法はC言語・C++というプログラミング言語をベースにしています。難しく聞こえますが、実際に使う命令の種類はかなり限られているため、この記事で紹介する型を1つずつ覚えていけば十分に対応できます。
Arduinoの学習で大切なのは「全部の文法を丸暗記すること」ではなく、「よく使う数種類の型(setup/loop、変数、if文、for文、関数、入出力命令)を、意味とセットで覚えること」です。この記事はその型を順番に並べています。
開発環境を整える:IDEのインストールと最初の書き込み
プログラムを書いてArduinoに送るには、Arduino IDE(開発環境)という専用ソフトを使います。IDEは「Integrated Development Environment(統合開発環境)」の略で、コードを書く場所と、それをボードに転送(書き込み)する機能がひとつになったソフトだと考えてください。
最初の動作確認には、Arduino IDEにあらかじめ用意されている「Blink」というサンプルコードを使うのがおすすめです。ボード上のLEDが1秒ごとに点滅すれば、環境構築は成功です。
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // 基板に内蔵されたLEDを「送る係」に設定
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // LED点灯
delay(1000); // 1000ミリ秒=1秒待つ
digitalWrite(LED_BUILTIN, LOW); // LED消灯
delay(1000);
}
多くのArduinoボードには、基板上にあらかじめLEDが1つ内蔵されています。LED_BUILTINはそのLEDにつながっているピン番号を、機種を問わず自動的に指してくれる特別な名前です。
正式なダウンロード先や対応OSはArduino公式のArduino IDEダウンロードページ ↗で確認できます。
プログラムの基本構造:setup()とloop()
Arduinoのプログラムは、必ずsetup()とloop()という2つの箱(関数)から成り立っています。この2つの役割の違いを理解することが、Arduino学習の最初の一歩です。
setup()(準備係)
- 電源を入れた時に1回だけ実行される
- ピンの役割設定(pinMode)
- 通信の開始準備(Serial.begin)など
loop()(繰り返し係)
- setup()が終わった後、永遠に繰り返される
- センサーの読み取り
- LEDの点滅、判定処理など
void setup() {
// ここは電源投入時に1回だけ実行される「準備」
}
void loop() {
// ここは電源が入っている間、延々と繰り返される「本番」
}
{ }の中に書いた処理が、その関数の中身になります。setup()に書くべき「一度だけでいい設定」をloop()に書いてしまうと、1秒間に何十回、何百回とその設定をやり直すことになり、動作が不安定になったり無駄な処理時間がかかったりします。「一度だけでいいものはsetup()、繰り返したいものはloop()」と覚えておきましょう。
変数とデータ型:情報を入れる「箱」
変数とは、数字や状態を一時的にしまっておく「名前つきの箱」です。センサーで測った値や、ボタンが押されたかどうかの状態などを、あとで使うためにしまっておく場所だと考えてください。
int ledPin = 8; // 整数(小数点なしの数)を入れる箱
float temperature = 25.4; // 小数を入れる箱
bool isPressed = false; // true/falseの2択だけを入れる箱
char grade = 'A'; // 1文字だけを入れる箱
変数を使う時は「この箱にはどんな種類の値が入るのか」を最初に決める必要があります。これをデータ型と呼びます。よく使うデータ型を一覧にまとめました。
| 型 | 入れられるもの | 使用例 |
|---|---|---|
int |
整数(小数点なし) | ピン番号、カウント数 |
float |
小数を含む数 | 温度、電圧の計算結果 |
bool |
true(はい)かfalse(いいえ)の2択 |
ボタンが押されたか、フラグ管理 |
char |
1文字 | 1文字だけの記号や状態管理 |
String |
複数の文字(文字列) | シリアルモニタへの表示文 |
変数名の前に型を書くのは、「この箱にはこの種類のものだけ入れてください」という宣言です。整数用の箱(int)に無理やり小数を入れると、小数点以下が切り捨てられてしまうので注意しましょう。
演算子と条件分岐:if文で判断する
プログラムに「もし〜なら、こうする」という判断をさせたい時に使うのがif文です。日常生活での「もし雨が降っていたら、傘を持っていく」という考え方と同じ形をしています。
int sensorValue = 650;
if (sensorValue > 600) {
Serial.println("明るいです");
} else {
Serial.println("暗いです");
}
条件を書く時によく使う「比較演算子」と、複数の条件を組み合わせる「論理演算子」を一覧にまとめました。
| 記号 | 意味 | 例 |
|---|---|---|
== |
等しい | state == HIGH |
!= |
等しくない | state != HIGH |
> / < |
より大きい/より小さい | value > 100 |
>= / <= |
以上/以下 | value <= 50 |
&& |
かつ(両方とも正しい) | a > 0 && b > 0 |
|| |
または(どちらかが正しい) | a == 1 || b == 1 |
「等しい」を表すつもりで=を1つだけ書いてしまうミスが非常に多く見られます。=は「代入(値を入れる)」、==は「比較(等しいか確認する)」という、まったく違う意味なので注意してください。
繰り返し処理:for文とwhile文
同じ処理を何度も繰り返したい時には、for文やwhile文を使います。「同じことを手作業で何行も書く」代わりに、「これをN回繰り返してください」とまとめて指示できる便利な仕組みです。
for (int i = 0; i < 5; i++) {
Serial.println(i); // 0,1,2,3,4を順番に表示
}
int count = 0;
while (count < 3) {
Serial.println("実行中");
count++; // count = count + 1 と同じ意味
}
while文の条件が永遠にtrueのままだと、プログラムがそこから抜け出せなくなります。これを「無限ループ」と呼びます。意図しない無限ループは、ボードが反応しなくなる原因の代表格です。カッコの中の条件がいつか必ずfalseになるように書けているか、確認する習慣をつけましょう。
「繰り返す回数が最初から決まっている」時はfor文、「ある条件を満たすまで繰り返したい」時はwhile文、と使い分けるのが基本です。
関数の基本:処理をひとまとめにする
関数とは、複数の処理をひとまとめにして、名前をつけておくための箱です。setup()やloop()もこの「関数」の一種ですが、自分で好きな名前の関数を作ることもできます。
const int LED_PIN = 8;
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
blinkLed(3); // blinkLedという自作関数を呼び出す
delay(2000);
}
// LEDをtimes回だけ点滅させる自作関数
void blinkLed(int times) {
for (int i = 0; i < times; i++) {
digitalWrite(LED_PIN, HIGH);
delay(200);
digitalWrite(LED_PIN, LOW);
delay(200);
}
}
timesのように、関数が外から受け取る値のことを「引数(ひきすう)」と呼びます。同じ点滅処理を毎回同じコードで書く代わりに、blinkLed(3)やblinkLed(5)のように1行呼び出すだけで済むようになります。これが関数の最大のメリットです。
「同じような処理を2回以上コピペしていることに気づいたら、関数にまとめられないか考える」——これはコードを整理する上での重要な習慣です。
入出力の基本命令:デジタル・アナログ・シリアル
Arduinoでよく使う入出力の命令を、目的別に整理しました。それぞれの役割の違いを押さえておくと、部品の使い分けがぐっとスムーズになります。
デジタル入出力:HIGH/LOWの2択で扱う
const int LED_PIN = 8;
const int BUTTON_PIN = 2;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
int buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW) { // 押されている時はLOW
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
}
アナログ入出力:もっと細かい段階で扱う
const int SENSOR_PIN = A0; // アナログ入力ピン
const int LED_PIN = 9; // PWM対応ピン
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int sensorValue = analogRead(SENSOR_PIN); // 0〜1023の範囲で読み取る
int brightness = map(sensorValue, 0, 1023, 0, 255); // 0〜255に変換
analogWrite(LED_PIN, brightness); // 明るさを段階的に変える
}
~マークがついているピンで使えます。シリアル通信:パソコンと会話する
void setup() {
Serial.begin(9600); // パソコンとの通信を9600bpsで開始
}
void loop() {
int value = analogRead(A0);
Serial.print("センサー値: ");
Serial.println(value); // シリアルモニタに表示
delay(500);
}
Serial.println()で値をパソコン側の画面(シリアルモニタ)に表示できます。「今どんな値になっているか見えない」時の確認手段として非常によく使われるので、覚えておくとデバッグが一気に楽になります。
ピンの役割設定の詳しい違いについてはArduinoのpinmodeとは?INPUT・OUTPUT・INPUT_PULLUPの違いで、より深く解説しています。
よくあるエラーと対処法チェックリスト
Arduino IDEで「マイコンボードに書き込む」を押した時に出るエラーメッセージは、赤い文字と一緒に「何行目で、どんな種類のエラーか」が表示されます。慣れないうちは英語の羅列に見えて怖く感じますが、パターンはある程度決まっています。よくあるものを一覧にまとめました。
| エラーメッセージの特徴 | 主な原因 | 対処法 |
|---|---|---|
expected ';' before ... |
行末のセミコロン(;)の付け忘れ | エラー箇所の1行前を確認し、;を追加する |
expected '}' at end of input |
波カッコ{ }の数が合っていない |
開いたカッコと閉じたカッコの数を数える |
'xxx' was not declared in this scope |
変数名や関数名のスペルミス、宣言忘れ | 綴りが完全に一致しているか確認する |
redefinition of ... |
同じ名前の変数や関数を2回定義している | 変数名・関数名が重複していないか確認する |
| 書き込みはできるが動作しない | pinModeの設定ミス、配線違い、値の取り違え | OUTPUT/INPUTの向き、配線、if文の条件を見直す |
エラーの一番上の行だけを見る。複数のエラーが同時に表示される場合、一番上のエラーを直すと残りも連鎖的に消えることがよくあります。
直前の行のセミコロンを疑う。「〇行目でエラー」と出ても、原因は1つ前の行に隠れていることが非常に多いです。
波カッコの対応を目で追う。開いた{と閉じた}の数を、インデント(字下げ)を頼りに1つずつ確認しましょう。
大文字・小文字、全角・半角を確認する。特に日本語入力から半角に戻し忘れた記号(;や()など)は見落としやすい原因です。
「動くのに正しくない」時は型と条件式を疑う。エラーが出ないのに期待通りに動かない場合は、変数の型やif文の条件(==とHIGH/LOWの向きなど)を見直しましょう。
エラーメッセージを見て「全部読んで理解しなきゃ」と身構える必要はありません。まずは「何行目か」「どのキーワードが含まれているか」の2点だけを拾い読みし、上記の表と照らし合わせる——この習慣だけで、原因の多くはすぐに見つかります。
FAQ・まとめ
プログラミング未経験でもArduinoを学べますか?
はい、問題ありません。Arduinoで使う文法はC言語をもとにしていますが、実際に使う命令の種類は限られており、決まった「型」に沿って書いていくことがほとんどです。この記事のようにsetup()とloop()の役割、変数、if文、for文、関数という基本を1つずつ押さえれば、未経験からでも十分に読み書きできるようになります。
Arduino IDEはどこでダウンロードできますか?
Arduino公式サイトの一般提供ページから、Windows・Mac・Linuxそれぞれに対応したインストーラーを無料でダウンロードできます。近年はブラウザだけで使えるArduino Cloud Editor(Web版)も用意されており、インストール不要で試すことも可能です。
エラーが出たとき、まず何を確認すればいいですか?
エラーメッセージの一番上の行に書かれている「何行目で」「どんなエラーか」をまず確認してください。特に多いのはセミコロン(;)の付け忘れ、波カッコ{}の対応漏れ、変数名のスペルミスの3つです。第9章にある対処表と照らし合わせるだけで、原因の8割前後は見つけられます。
変数の型(int・floatなど)を間違えるとどうなりますか?
すぐにエラーになるとは限らないのが厄介な点です。例えば小数を扱いたいのにintで宣言してしまうと、小数点以下が切り捨てられてしまい、計算結果がおかしくなるといった「動くのに正しくない」状態になります。扱う値の性質(整数か、小数か、オン/オフの2択かなど)に合わせて型を選ぶことが大切です。
Arduinoの学習は、一度に全部を覚えようとすると挫折しやすい分野です。この記事で紹介した「setup/loopの役割」「変数という箱」「if文の判断」「for/whileの繰り返し」「関数によるまとめ方」「入出力命令」「エラーの読み方」という7つの型は、どんなに複雑に見えるコードでも、必ずこの組み合わせでできています。最初は意味がわからなくても、実際にコードを打ち込んで、少し数字を変えて動かしてみる——その繰り返しが、いちばんの近道です。まずは第2章のBlinkコードから、自分の手で1つずつ試してみてください。
コメント