Arduino IDEのインストールとボードの接続が完了したら、次はいよいよ実際にモノを動かす番です。しかし「セットアップは終わったけど、何を作ればいいのか分からない」という壁にぶつかる方は少なくありません。YouTubeやブログで見かけるプロジェクトはいきなり難しそうに見えて、最初の一歩をどこから踏み出せばいいか迷ってしまうのです。
この記事では、Arduino初心者が段階的にスキルアップできるよう、難易度順に10個のプロジェクトを厳選しました。LED1個を光らせる最も簡単なプロジェクトから始まり、ボタン入力、各種センサーの読み取り、モーター制御を経て、最終的にはWiFi経由でデータを送信するIoTプロジェクトまでたどり着けます。
各プロジェクトは前のプロジェクトで学んだ知識を土台にしているので、順番に進めるのが最も効果的です。1つのプロジェクトにかかる時間は30分〜1時間程度で、週末だけの作業でも1〜2ヶ月あれば全プロジェクトをクリアできます。すべて完了する頃には、Arduinoの基本的な入出力をひと通り使いこなせるようになっているはずです。
まだ初期セットアップが済んでいない方はArduino入門ガイドから始めてください。Arduino IDEのインストール、ボードの認識設定、最初のスケッチ書き込みまでを詳しく解説しています。
プロジェクトを始める前に(必要な部品リスト)
10個のプロジェクトすべてで使う共通部品と、各プロジェクト固有の部品があります。最初にすべてを揃える必要はなく、まずは共通部品とプロジェクト1〜2の分だけ購入し、進捗に合わせて追加していくのが無駄のない方法です。ただし、センサーキットを最初に1つ買っておくと、後半のプロジェクトでその都度注文する手間が省けます。
共通で必要な部品
| 部品 | 数量 | 用途 |
|---|---|---|
| Arduino Uno R4(WiFiまたはMinima) | 1台 | メインボード |
| ブレッドボード | 1個 | 部品の仮配線 |
| ジャンパーワイヤー(オス-オス) | 20本以上 | 配線用 |
| 抵抗(220Ω、1kΩ、10kΩ各10本) | 各10本 | 電流制限・プルアップ用 |
| LED(赤・緑・黄) | 各3個以上 | 出力の可視化 |
| USBケーブル(USB-C) | 1本 | PC接続・給電 |
プロジェクト別の追加部品
| プロジェクト | 追加部品 |
|---|---|
| 3:ボタンLED | タクトスイッチ |
| 4:メロディ | 圧電ブザー |
| 5:光センサー | CdSセル(光依存抵抗) |
| 6:温度センサー | DHT11モジュール |
| 7:距離センサー | HC-SR04超音波モジュール |
| 8:サーボモーター | SG90マイクロサーボ |
| 9:LCDディスプレイ | I2C対応1602 LCD |
| 10:WiFiデータ送信 | Arduino Uno R4 WiFi(本体に内蔵) |
センサーキットを1つ購入すれば、プロジェクト4〜9の部品がほぼすべて含まれています。個別に買い集めるよりコスパが良く、届いたらすぐに複数のプロジェクトに取りかかれるのでおすすめです。37種類のセンサーが入ったキットなら、この記事のプロジェクトを終えた後もさまざまな実験に使えます。
また、回路のデバッグにはデジタルマルチメーター(テスター)があると非常に便利です。電圧や抵抗値を実測できるので、「配線は合っているはずなのに動かない」というときの原因特定が格段に速くなります。特に「ブレッドボードの接触不良」や「抵抗値の読み間違い」はよくあるミスで、テスターがあれば数秒で確認できます。2,000円前後で購入できるので、早めに用意しておくことをおすすめします。
それでは、最初のプロジェクトから始めましょう。
プロジェクト1:LED点滅(Lチカ) - 難易度★☆☆☆☆
電子工作の世界における「Hello World」がこのLED点滅、通称「Lチカ」です。プログラミングの世界で最初に画面に「Hello World」と表示するように、電子工作では最初にLEDを光らせるのが定番中の定番です。たった数行のコードでLEDが点いたり消えたりする瞬間は、自分の書いたプログラムが物理世界を動かしているという感動を味わえます。Arduino IDEのサンプルスケッチにも「Blink」として収録されているほど基本的なプロジェクトです。
必要な部品
- LED(赤)1個
- 220Ω抵抗 1個
- ジャンパーワイヤー 2本
回路の説明
Arduinoの13番ピンからジャンパーワイヤーを引き、220Ω抵抗を経由してLEDのアノード(長い足)に接続します。LEDのカソード(短い足)はGNDピンにつなぎます。抵抗はLEDに流れる電流を制限する役割を果たし、これがないとLEDが焼けてしまいます。Arduinoの出力は5Vなので、赤色LED(順方向電圧約2V)の場合、220Ω抵抗で約13.6mAに制限されます。
コードの核心部分
void setup() {
pinMode(13, OUTPUT); // 13番ピンを出力に設定
}
void loop() {
digitalWrite(13, HIGH); // LEDオン(5V出力)
delay(1000); // 1秒待つ
digitalWrite(13, LOW); // LEDオフ(0V出力)
delay(1000); // 1秒待つ
}
学べること
pinMode()でピンの入出力方向を設定する基本digitalWrite()でデジタル出力をHIGH/LOWに切り替える方法delay()で時間制御を行う方法- 抵抗によるLEDの電流制限の考え方
delayの値を変えて点滅速度を変えたり、複数のLEDを交互に光らせたりして実験してみましょう。例えばdelay(200)にすれば高速点滅、delay(3000)にすればゆっくり点滅になります。さらにLEDを3個使って信号機を再現してみるのも良い練習です。赤・黄・緑のLEDをそれぞれ別のピンに接続し、実際の信号機のタイミングを再現してみてください。この小さな変更だけで、複数ピンの制御とタイミング設計を学べます。
なお、Arduino Unoの13番ピンには基板上に小さなLED(通称「L」LED)が直結されているため、外付けLEDなしでもプログラムの動作確認ができます。外付けLEDが正しく点滅しない場合は、まず基板上のLEDで回路の問題かプログラムの問題かを切り分けましょう。
プロジェクト2:LED明るさ調整(PWM) - 難易度★☆☆☆☆
プロジェクト1ではLEDのON/OFFの2段階しかできませんでしたが、PWM(Pulse Width Modulation:パルス幅変調)を使えば明るさを256段階で自由に変えられます。LEDがじわっと明るくなり、ふわっと暗くなるフェードイン・フェードアウトは、イルミネーションや呼吸ランプ(スリープインジケーター)の基本技術です。スマートフォンの画面の明るさ調整も、実はこのPWMの原理が使われています。
必要な部品
- LED(赤)1個
- 220Ω抵抗 1個
- ジャンパーワイヤー 2本
回路の説明
回路はプロジェクト1とほぼ同じですが、接続先をPWM対応ピン(Unoでは~マークが付いた3, 5, 6, 9, 10, 11番)に変更します。ここでは9番ピンを使います。PWMは5Vの電圧を高速にON/OFFすることで、見かけ上の電圧を0〜5Vの間で自在に変えられる技術です。
コードの核心部分
void setup() {
pinMode(9, OUTPUT);
}
void loop() {
for (int i = 0; i <= 255; i += 5) {
analogWrite(9, i); // 0〜255で明るさ指定
delay(30);
}
for (int i = 255; i >= 0; i -= 5) {
analogWrite(9, i);
delay(30);
}
}
学べること
analogWrite()によるPWM出力の使い方- PWMの値(0〜255)と明るさの関係
forループによる段階的な値の変化- デジタル出力とPWM出力の違い
LEDの抵抗値計算にはLED抵抗計算ツールが便利です。
analogWriteの値を変えるステップ幅(上の例では5)やdelayを調整すると、フェードの速度や滑らかさが変わります。値を1刻みにするとより滑らかに、20刻みにすると段階的に変化する様子が視認できます。RGBフルカラーLEDを使えば3つのPWMピンでそれぞれ赤・緑・青の明るさを制御し、1677万色の色表現が可能です。例えばanalogWrite(赤, 255)・analogWrite(緑, 128)・analogWrite(青, 0)でオレンジ色を作れます。
プロジェクト3:ボタンでLEDをON/OFF - 難易度★★☆☆☆
ここまでのプロジェクトはArduinoが一方的に出力するだけでした。このプロジェクトでは初めて「入力」を扱います。ボタンを押したらLEDが点灯し、離すと消えるという、ユーザーの操作に応答するインタラクティブな回路を作ります。家電のスイッチや自動販売機のボタンなど、身の回りの電子機器はすべてこの「入力を読み取って出力を変える」という仕組みで動いています。
必要な部品
- LED(赤)1個
- 220Ω抵抗 1個
- タクトスイッチ 1個
- 10kΩ抵抗 1個(プルダウン抵抗用)
- ジャンパーワイヤー 5本
回路の説明
タクトスイッチの一端を5Vに、もう一端を2番ピンに接続します。2番ピンとGNDの間に10kΩのプルダウン抵抗を入れます。プルダウン抵抗がないと、ボタンを押していないときのピンの電圧が不安定になり、意図しない動作を引き起こします。ボタンを押すと2番ピンがHIGHになり、離すとプルダウン抵抗によってLOWに安定します。LED側はプロジェクト1と同じ配線です。
コードの核心部分
void setup() {
pinMode(2, INPUT); // ボタン入力
pinMode(13, OUTPUT); // LED出力
}
void loop() {
int state = digitalRead(2); // ボタン状態を読み取り
digitalWrite(13, state); // LEDに反映
}
学べること
digitalRead()でデジタル入力を読み取る方法- プルアップ抵抗・プルダウン抵抗の必要性と役割
- 入力と出力を組み合わせたインタラクティブ回路
- タクトスイッチの物理的な仕組み
応用として、ボタンを押すたびにLEDのON/OFFが切り替わる「トグル動作」に挑戦してみましょう。変数に現在の状態を記憶させ、ボタンが押されたタイミングで状態を反転させます。ただしチャタリング(ボタンのバウンス)対策として、短いdelayを入れる必要がある点が新たな学びになります。チャタリングとは、機械式スイッチが接点を閉じる瞬間に高速で数回ON/OFFを繰り返す現象で、対策をしないと1回のボタン押下が複数回として認識されてしまいます。
さらにArduinoにはINPUT_PULLUPという便利なモードがあり、これを使うと外付けのプルアップ抵抗が不要になります。pinMode(2, INPUT_PULLUP)と書くだけで内蔵プルアップ抵抗が有効になり、配線を1本減らせます。ただしこの場合、ボタンを押したときにLOW、離したときにHIGHになるので、論理が反転する点に注意してください。
プロジェクト4:圧電ブザーでメロディ演奏 - 難易度★★☆☆☆
視覚的な出力だけでなく、聴覚にも訴えるプロジェクトです。圧電ブザーを使って「きらきら星」のメロディを演奏してみましょう。Arduinoに内蔵されたtone()関数を使えば、指定した周波数の矩形波を簡単に出力できます。音楽理論と電子工作が交差するプロジェクトで、子どもと一緒に取り組むのにもぴったりです。
必要な部品
- 圧電ブザー(パッシブタイプ)1個
- ジャンパーワイヤー 2本
回路の説明
圧電ブザーの+端子を8番ピンに、-端子をGNDに接続するだけです。パッシブブザーは外部から周波数信号を与えて鳴らすタイプで、Arduinoのtone()関数で任意の音階を出せます。アクティブブザーは電源を入れると固定音しか出ないので、メロディ演奏にはパッシブタイプを選んでください。
コードの核心部分
// ド=262Hz, レ=294Hz, ミ=330Hz, ファ=349Hz, ソ=392Hz
int melody[] = {262, 262, 392, 392, 440, 440, 392};
int duration[] = {400, 400, 400, 400, 400, 400, 800};
void loop() {
for (int i = 0; i < 7; i++) {
tone(8, melody[i], duration[i]); // ピン, 周波数, 長さ
delay(duration[i] + 50); // 音の間に少し間隔
}
delay(2000);
}
学べること
tone()関数で指定周波数の音を出す方法- 配列を使った音符データの管理
- 音階と周波数の関係(物理と音楽のつながり)
- パッシブブザーとアクティブブザーの違い
メロディの配列を書き換えれば好きな曲を演奏できます。インターネットで「Arduino メロディ 周波数表」と検索すると、各音階に対応する周波数の一覧が見つかります。自分の好きな曲を打ち込んでみると、配列やループへの理解がぐっと深まります。Arduino IDEのサンプルスケッチ「toneMelody」にも基本的な実装例が含まれているので参考にしてください。
プロジェクト3のボタンと組み合わせると、ボタンを押すたびに異なる音階を鳴らす「簡易ピアノ」も作れます。ボタンを4個に増やして「ドレミファ」の4音だけのピアノにすれば、配列と条件分岐の良い練習になります。
プロジェクト5:光センサーで明るさ計測 - 難易度★★☆☆☆
このプロジェクトではアナログ入力を初めて扱います。プロジェクト3のデジタル入力が「押された/押されていない」の2値だったのに対し、アナログ入力は0〜1023の1024段階で値を読み取れます。CdSセル(光依存抵抗、フォトレジスター)を使って周囲の明るさを数値として読み取り、シリアルモニタに表示します。さらにその値に応じてLEDを自動点灯させる、街灯のような「暗くなったら自動で光る」回路を作ります。
必要な部品
- CdSセル(光依存抵抗)1個
- 10kΩ抵抗 1個
- LED(赤)1個
- 220Ω抵抗 1個
- ジャンパーワイヤー 5本
回路の説明
CdSセルと10kΩ抵抗を直列に接続して分圧回路を構成します。CdSセルの一端を5Vに、もう一端を10kΩ抵抗と接続し、抵抗のもう一端をGNDにつなぎます。CdSセルと抵抗の接続点をA0ピンに接続します。明るい環境ではCdSの抵抗値が下がるのでA0の電圧が上がり、暗い環境ではCdSの抵抗値が上がるのでA0の電圧が下がります。これにより0〜1023の数値で明るさを読み取れます。
コードの核心部分
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop() {
int light = analogRead(A0); // 0〜1023の値を取得
Serial.println(light); // シリアルモニタに表示
if (light < 300) {
digitalWrite(13, HIGH); // 暗いときLEDオン
} else {
digitalWrite(13, LOW);
}
delay(500);
}
学べること
analogRead()によるアナログ入力の読み取り(0〜1023)- 分圧回路の基本原理
Serial.begin()とSerial.println()でシリアル通信if文による条件分岐の基本- センサー値に基づいた自動制御の考え方
シリアルモニタで値を見ながらCdSセルを手で覆ったり、ライトで照らしたりして数値の変化を確認しましょう。if文のしきい値(上の例では300)を環境に合わせて調整するのも大切な学びです。しきい値は部屋の明るさによって最適な値が変わるので、まずシリアルモニタで現在の環境の数値を確認してから決定しましょう。Arduino IDEの「シリアルプロッタ」を使えば、値の変化をグラフでリアルタイムに可視化することもできます。
さらにプロジェクト2のPWMと組み合わせると、明るさに応じてLEDの光量が滑らかに変化する「自動調光ライト」も実現できます。map()関数を使ってセンサー値(0〜1023)をPWM値(0〜255)に変換するテクニックは、今後のプロジェクトでも頻繁に使います。
プロジェクト6:温度センサーでシリアルモニタ表示 - 難易度★★★☆☆
センサーの読み取り値を実際の物理量(温度や湿度)に変換するプロジェクトです。プロジェクト5ではアナログ値をそのまま表示しましたが、ここでは「25.3℃」「48.2%」のように人間が理解できる単位に変換します。DHT11温湿度センサーモジュールを使うと、温度と湿度の両方を手軽に計測できます。このプロジェクトでは外部ライブラリのインストールも初めて体験します。ライブラリを使うことで、複雑なセンサー通信処理をたった数行のコードで扱えるようになります。
必要な部品
- DHT11温湿度センサーモジュール 1個
- ジャンパーワイヤー 3本
回路の説明
DHT11モジュール(3ピンタイプ)のVCCを5Vに、GNDをGNDに、DATAを7番ピンに接続します。モジュールタイプにはプルアップ抵抗が内蔵されているので、外付け抵抗は不要です。もし4ピンの単体センサーを使う場合は、DATAピンとVCCの間に10kΩのプルアップ抵抗が必要です。DHT11はデジタル信号で温度と湿度のデータを送ってくるので、専用ライブラリで解読します。
コードの核心部分
#include <DHT.h>
DHT dht(7, DHT11); // ピン7, センサー型番
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
float temp = dht.readTemperature(); // 摂氏温度を取得
float humi = dht.readHumidity(); // 湿度を取得
Serial.print("温度: "); Serial.print(temp);
Serial.print("℃ 湿度: "); Serial.println(humi);
delay(2000); // DHT11は2秒間隔が必要
}
学べること
- Arduino IDEでの外部ライブラリのインストール方法
#includeによるライブラリの読み込みfloat型(小数)の扱い方- センサーのデータシートの読み方の入門
- ハードウェアの制約(2秒間隔のサンプリング制限)への対応
ライブラリのインストールはArduino IDEの「ライブラリマネージャー」から「DHT sensor library」(Adafruit製)を検索してインストールするだけです。同時に「Adafruit Unified Sensor」も必要になるので、依存ライブラリのインストール確認が出たらまとめてインストールしましょう。ライブラリマネージャーの使い方に慣れておくと、今後さまざまなセンサーやモジュールをすぐに使えるようになります。
DHT11は精度が温度±2℃・湿度±5%とそれほど高くありませんが、入門用としては十分です。より高精度が必要な場合はDHT22(温度±0.5℃・湿度±2%)にアップグレードできます。コードの変更はセンサー型番の指定をDHT22に変えるだけなので、将来の拡張も容易です。
温度の値を使ってプロジェクト4のブザーを鳴らせば「高温アラーム」に、プロジェクト2のLED制御と組み合わせれば「温度に応じた明るさ変化」にと、過去のプロジェクトと組み合わせる楽しさが広がります。
プロジェクト7:超音波距離センサー - 難易度★★★☆☆
HC-SR04超音波センサーを使って、物体までの距離をセンチメートル単位で計測するプロジェクトです。超音波(人間の耳には聞こえない高い周波数の音)を発射し、物体に当たって戻ってくるまでの時間から距離を計算します。コウモリが暗闇で飛び回れるのも同じ原理(エコーロケーション)です。身近なところでは、自動車のバックセンサーやロボット掃除機の障害物回避にも使われています。物理法則をプログラムに落とし込む経験が得られる、理科の学びとしても優れたプロジェクトです。
必要な部品
- HC-SR04超音波距離センサー 1個
- ジャンパーワイヤー 4本
回路の説明
HC-SR04には4本のピンがあります。VCCを5Vに、GNDをGNDに、Trigピン(超音波発射のトリガー)を10番ピンに、Echoピン(反射波の受信信号)を11番ピンに接続します。Trigピンに10μsのパルスを送ると超音波が発射され、物体に反射して戻ってくるまでの時間がEchoピンに返ります。この時間と音速(約340m/s)から距離を計算します。
コードの核心部分
void loop() {
digitalWrite(10, LOW);
delayMicroseconds(2);
digitalWrite(10, HIGH);
delayMicroseconds(10); // 10μsのトリガーパルス
digitalWrite(10, LOW);
long duration = pulseIn(11, HIGH); // 反射時間を計測
float distance = duration * 0.034 / 2; // cm変換
Serial.print("距離: ");
Serial.print(distance);
Serial.println(" cm");
delay(500);
}
学べること
pulseIn()関数でパルス幅を計測する方法delayMicroseconds()によるマイクロ秒単位の時間制御- 物理法則(音速 x 時間 = 距離)のプログラムへの応用
- センサーの測定範囲と精度の限界(HC-SR04は2cm〜400cm)
計算式の0.034は音速340m/sをcm/μsに変換した値(340 x 100 / 1,000,000 = 0.034)で、/ 2は超音波が物体まで行って戻ってくる往復分を補正しています。厳密には音速は温度によって変化しますが(気温20℃で約343m/s)、室内での簡易計測では0.034で十分な精度が得られます。
HC-SR04の測定範囲は約2cm〜400cmで、測定角度は約15度です。柔らかい布のように音を吸収する素材や、斜めに傾いた面では正しく測定できないことがあります。こうしたセンサーの特性と限界を実体験できるのもこのプロジェクトの価値です。
距離に応じてLEDを複数段階で点灯させたり、一定距離以下になるとブザーを鳴らしたりと、これまでのプロジェクトを組み合わせた応用が豊富にあります。シリアルプロッタで距離の変化をリアルタイムにグラフ化すると、センサーの反応速度や精度が視覚的に理解できます。
プロジェクト8:サーボモーター制御 - 難易度★★★☆☆
ここまでのプロジェクトは光・音・画面表示といった出力でしたが、サーボモーターを使えば「物理的な動き」を生み出せます。電子工作がロボティクスに一歩近づく瞬間です。SG90マイクロサーボは0〜180度の範囲で角度を正確に指定でき、ロボットアームの関節、カメラの首振り機構、自動ドアの開閉などに使われる基本的なアクチュエーター(駆動装置)です。小型で安価(1個200〜300円程度)ながら、角度制御の基本を学ぶには十分な性能を持っています。
必要な部品
- SG90マイクロサーボ 1個
- ジャンパーワイヤー 3本
回路の説明
SG90のリード線は3本で、茶色がGND、赤が5V電源、オレンジが信号線です。信号線を9番ピン(PWM対応)に接続します。サーボモーター1個であればArduinoの5Vピンから直接給電できますが、複数のサーボを同時に動かす場合はArduinoの電源容量を超えてしまうため、外部電源が必要になります。Servo.hライブラリが角度指定の複雑な信号制御を隠蔽してくれるので、コードはシンプルです。
コードの核心部分
#include <Servo.h>
Servo myServo;
void setup() {
myServo.attach(9); // 9番ピンにサーボ接続
}
void loop() {
myServo.write(0); // 0度に移動
delay(1000);
myServo.write(90); // 90度(中央)に移動
delay(1000);
myServo.write(180); // 180度に移動
delay(1000);
}
学べること
- 標準ライブラリ
Servo.hの使い方 attach()とwrite()によるサーボの基本制御- PWM信号がモーター制御に使われる仕組み
- モーターの電源要件と消費電流の考え方
モーターの消費電力が心配な方は電源容量計算ツールで確認しましょう。
プロジェクト7の超音波センサーと組み合わせれば「障害物を避ける方向にサーボが動く」仕組みが作れます。また、プロジェクト5の光センサーと連携すれば「太陽の方向を追尾するソーラートラッカー」の簡易版も実現可能です。forループでwrite()の角度を1度ずつ変えればスムーズな回転になり、角度とdelayの組み合わせでモーションの表現力が広がります。
プロジェクト9:LCDディスプレイに情報表示 - 難易度★★★★☆
これまでのプロジェクトではシリアルモニタにデータを表示してきましたが、シリアルモニタはPCに接続していないと見られません。LCDディスプレイを接続すればArduino単体で情報を表示でき、PCから切り離してバッテリー駆動の独立したデバイスとして使えるようになります。I2C(アイ・スクエア・シー)インターフェースを使うことで、わずか4本の配線で16文字x2行のLCDを制御できます。これまでのセンサーで取得した値をLCDに表示すれば、持ち運び可能な実用的な計測器が完成します。
必要な部品
- I2C対応1602 LCDモジュール 1個
- ジャンパーワイヤー 4本
回路の説明
I2C対応LCDは4本の配線だけで済みます。VCCを5Vに、GNDをGNDに、SDAをA4ピンに、SCLをA5ピンに接続します。I2C(Inter-Integrated Circuit)はクロック線(SCL)とデータ線(SDA)の2本で複数のデバイスと通信できるプロトコルで、配線がシンプルになるメリットがあります。LCDモジュール背面のポテンショメータ(小さな青い可変抵抗)でコントラストを調整できます。画面が表示されない場合はまずこの調整を試してください。
コードの核心部分
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // アドレス, 列, 行
void setup() {
lcd.init();
lcd.backlight(); // バックライト点灯
}
void loop() {
lcd.setCursor(0, 0); // 1行目の先頭
lcd.print("Temp: 25.3 C");
lcd.setCursor(0, 1); // 2行目の先頭
lcd.print("Humi: 48.2 %");
delay(1000);
}
学べること
- I2C通信の基本概念(アドレス指定、SDA/SCL)
- 外部ライブラリ
LiquidCrystal_I2Cのインストールと使用 lcd.setCursor()による表示位置の制御- ハードウェアアドレス(0x27など)の概念とI2Cスキャナーの活用
I2Cアドレスはモジュールによって0x27または0x3Fの場合があります。画面に何も表示されないときは、まず背面のポテンショメータでコントラストを調整してください。それでも表示されない場合はI2Cスキャナーのスケッチ(Arduino公式サイトの「Wire」ライブラリの例に含まれています)を実行して、正しいアドレスを確認しましょう。I2Cの魅力は、同じSDA/SCLの2本の線に複数のデバイスを並列接続できることです。LCDと温度センサー(I2C対応のもの)を同時につなぐことも可能です。
プロジェクト6のDHT11と組み合わせれば、リアルタイム温湿度モニターが完成します。プロジェクト7の超音波センサーと連動させれば簡易距離計になります。LCDに表示することでPCなしで使える独立した計測器として、実用的な作品に仕上がります。
プロジェクト10:WiFiでデータ送信(IoT入門) - 難易度★★★★☆
いよいよ最後のプロジェクトです。Arduino Uno R4 WiFiに内蔵されたWiFi機能を使い、センサーデータをネットワーク経由で閲覧できるようにします。これはIoT(Internet of Things:モノのインターネット)の第一歩です。IoTとは、あらゆるモノがインターネットに接続されてデータをやり取りする仕組みのことで、スマートホーム、農業の環境モニタリング、工場の設備監視など、幅広い分野で活用されています。このプロジェクトを通じて、離れた場所からセンサーデータを監視するという、IoTの基本的なアーキテクチャを体験できます。
必要な部品
- Arduino Uno R4 WiFi 1台
- DHT11温湿度センサーモジュール 1個(プロジェクト6で使用済み)
- ジャンパーワイヤー 3本
回路の説明
回路はプロジェクト6と同じくDHT11を7番ピンに接続するだけです。WiFiアンテナはArduino Uno R4 WiFiの基板上に内蔵されています。このプロジェクトではまずArduinoをローカルWebサーバーとして動作させ、同じWiFiネットワーク内のPCやスマートフォンのブラウザからセンサーデータを確認できるようにします。
コードの核心部分
#include <WiFiS3.h>
#include <DHT.h>
char ssid[] = "あなたのSSID";
char pass[] = "あなたのパスワード";
WiFiServer server(80);
DHT dht(7, DHT11);
void setup() {
Serial.begin(9600);
dht.begin();
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) delay(1000);
server.begin();
Serial.println(WiFi.localIP()); // IPアドレス確認
}
学べること
WiFiS3.hライブラリによるWiFi接続- ArduinoをWebサーバーとして動かす基本
- HTTP通信の仕組み(リクエストとレスポンス)
- ネットワークプログラミングの基礎概念(IPアドレス、ポート番号)
- IoTシステムの基本アーキテクチャ
WiFi接続後にシリアルモニタに表示されるIPアドレス(例:192.168.1.15)をブラウザのアドレスバーに入力すると、温度と湿度がWebページとして表示されます。Arduinoがサーバーになり、PCやスマートフォンがクライアントとしてデータを取得する構成です。HTMLを組み込むことでページのデザインを整えたり、JavaScriptで自動更新を追加したりと拡張の幅は広大です。
さらに発展させるなら、Ambientなどの無料IoTデータ可視化サービスにHTTPリクエストでデータを定期送信する方法があります。これにより、外出先からでもスマートフォンで自宅の温湿度を確認でき、グラフで推移を見ることも可能になります。自宅のWiFiルーターのポート転送を設定すれば、外部ネットワークからも直接アクセスできますが、セキュリティの観点から初心者にはクラウドサービス経由の方法をおすすめします。
このプロジェクトには、ここまでの9個のプロジェクトで学んだデジタル入出力、アナログ入力、PWM、シリアル通信、外部ライブラリの活用、そしてWiFi通信のすべてが集約されています。10個のプロジェクトを順番に進めてきた方は、Arduinoの基本的な入出力とネットワーク通信をひと通り経験したことになります。
次のステップ
10個のプロジェクトを完了した方は、Arduinoの基本スキルがしっかりと身についています。デジタル入出力、アナログ入力、PWM制御、シリアル通信、I2C通信、WiFi通信という、電子工作の主要な技術要素をすべて経験しました。ここから先は、これらの技術を組み合わせたオリジナル作品に挑戦する段階です。
スキルアップの方向性
ハードウェアを深める方向としては、ステッピングモーターやDCモーター(モータードライバ経由)の制御、リレーモジュールによるAC機器の制御、OLEDディスプレイへの画像表示などがあります。はんだ付けの技術を身につければ、ブレッドボードからユニバーサル基板やプリント基板への実装に進めます。
ソフトウェアを深める方向としては、割り込み処理(interrupt)による効率的なイベント検出、EEPROMによるデータの永続保存、マルチタスク的な処理の実現などがあります。
IoT・ネットワーク方向に進むなら、MQTTプロトコルによるデータ送受信、クラウドサービス(AWS IoTやAmbientなど)との連携、LINEやSlackへの通知送信などに挑戦できます。
おすすめの学習リソース
回路設計の基本となる電気の法則を理解しておくと、センサー回路の設計やトラブルシューティングが格段に楽になります。回路計算の基礎を学ぶならオームの法則完全ガイドがおすすめです。
また、ArduinoだけでなくRaspberry PiやESP32にも触れてみると、マイコンボードの選択肢と使い分けの理解が深まります。それぞれのボードに得意分野があるため、プロジェクトの要件に合わせて最適なボードを選べるようになることが次のステップです。
大切なのは、完璧を目指さず「動くもの」を作り続けることです。最初から美しいコードや完璧な回路設計を目指す必要はありません。プロのエンジニアでも、まずはプロトタイプ(試作品)を作り、動作確認をしてから改良を重ねていきます。まずは動くものを作り、少しずつ改善していくプロセスそのものが最大の学びになります。
この記事の10個のプロジェクトで培った基礎力があれば、インターネット上の多くのArduinoプロジェクトを理解し、自分の環境に合わせて改変できるはずです。困ったときはArduino公式フォーラムや、日本語のArduinoコミュニティで質問してみてください。回路図とコードを添えて質問すれば、経験豊富なメンバーが助けてくれるでしょう。自分だけのオリジナル作品を完成させた瞬間の達成感は、電子工作を続ける最大のモチベーションになります。