本文へ移動
Arduinoで「読み取る」全部。
定番センサー16種を基礎から応用まで。
光、温度、距離、動き、音、ガス、磁気、姿勢、圧力……Arduinoの電子工作でよく使われるセンサーを16種類、配線図・コピペ可能なコード・メリット/デメリット・限界・代替部品・活用アイデアまでまとめて解説します。前回の「動かす・表示する」コード20選と合わせて読めば、入力(読み取る)と出力(動かす・伝える)の両方をカバーできます。
センサー選びの基本の考え方

Arduinoのセンサーは「何を」「どんな精度で」「どのくらいの速さで」知りたいかによって選び方が変わります。同じ「温度を測る」目的でも、簡易な工作なら安価なサーミスタで十分ですが、精度が必要な測定にはDHT22やBME280のような専用ICセンサーが向いています。まずは目的(何をしたいか)を決め、それに見合った精度・価格・配線の手間のセンサーを選ぶのが失敗しないコツです。
各センサーの正式な仕様や電気的特性は、購入店やメーカーのデータシート、およびArduino公式ドキュメント ↗で必ず確認してください。


- 目的から逆算する:「暗くなったら光る」なら照度センサー、「人が来たら反応」ならPIRセンサー
- 出力形式を確認する:アナログ値か、デジタルON/OFFか、I2C/SPIのデジタル通信か
- 電源電圧を確認する:Arduino Unoは5V駆動が基本だが、3.3V専用のモジュールも多い
- 更新頻度・応答速度を確認する:DHT系は数秒に1回しか読めないなど、センサーごとに制約がある
アナログ入力とデジタル入力の違い
Arduino Unoにはアナログ入力ピン(A0〜A5)とデジタル入出力ピン(D0〜D13)があります。センサーのデータシートに書かれている出力形式に合わせてピンを選びます。
| 方式 | 特徴 | 読み取り関数 | 代表例 |
|---|---|---|---|
| アナログ出力 | 0〜1023の連続値。光量・温度など「量」を細かく取得できる | analogRead() |
CdS照度センサー、サーミスタ、MQ-2ガスセンサー |
| デジタル出力(2値) | HIGH/LOWのON/OFFのみ。しきい値はセンサー側の可変抵抗で調整 | digitalRead() |
PIR人感センサー、傾斜スイッチ、多くの障害物検知モジュール |
| デジタル通信(1-Wire/I2C/SPI) | 専用プロトコルで複数の値をまとめて取得。ライブラリが必須 | 各ライブラリ関数 | DHT11/22、MPU6050、BME280、HX711 |
迷ったら、まずはアナログ出力かデジタルON/OFFの単純なセンサーから始めると、動作原理が理解しやすく失敗も少なくなります。

センサーカテゴリ早見表
この記事で扱う16種類のセンサーを、大まかなカテゴリで分類しました。目的から探したい場合の参考にしてください。
| カテゴリ | センサー | 主な用途 |
|---|---|---|
| 光・環境 | CdS照度センサー | 明暗判定、自動点灯 |
| DHT11/DHT22 温湿度センサー | 室温・湿度モニタリング | |
| 距離・動き | HC-SR04 超音波距離センサー | 距離測定、障害物回避 |
| PIR人感センサー | 人の動き検知、防犯灯 | |
| 赤外線障害物検知センサー | ライントレース、簡易距離検知 | |
| 化学・安全 | MQ-2ガスセンサー | 可燃性ガス・煙の検知 |
| 土壌水分センサー | 植物の自動水やり判定 | |
| 音・振動 | サウンドセンサー(マイクモジュール) | 音量・拍手検知 |
| 振動・傾斜センサー | 衝撃検知、転倒検知 | |
| 磁気・接触 | ホールセンサー(磁気) | ドア開閉検知、回転数計測 |
| タッチセンサー(TTP223) | ボタン代替の非接触スイッチ | |
| 色・光学 | カラーセンサー(TCS3200) | 色識別、色ソート機構 |
| 姿勢・気圧 | 加速度・ジャイロセンサー(MPU6050) | 傾き検知、モーション制御 |
| 気圧・気温センサー(BME280/BMP280) | 気圧変化、簡易高度計 | |
| 重量 | ロードセル+HX711 | 重さの計測、簡易キッチンスケール |
| 通信・受信 | 赤外線リモコン受信モジュール | 家電リモコン信号の受信・解析 |
センサー完全ガイド16選
すべてArduino Uno/一般的なNano互換機を想定した独立スケッチです。検索欄に「距離」「温度」「ガス」「振動」などと入力すると対象センサーだけに絞り込めます。
| No. | センサー | 方式 | 難易度 |
|---|---|---|---|
| 01 | CdS照度センサー | アナログ | 入門 |
| 02 | DHT11/DHT22 温湿度センサー | デジタル通信 | 入門+ |
| 03 | HC-SR04 超音波距離センサー | デジタル(パルス) | 入門+ |
| 04 | PIR人感センサー | デジタル | 入門 |
| 05 | 土壌水分センサー | アナログ/デジタル | 入門 |
| 06 | 赤外線障害物検知センサー | デジタル | 入門 |
| 07 | サウンドセンサー(マイクモジュール) | アナログ/デジタル | 入門+ |
| 08 | MQ-2ガスセンサー | アナログ | 基礎+ |
| 09 | 振動・傾斜センサー | デジタル | 入門 |
| 10 | ホールセンサー(磁気) | デジタル/アナログ | 入門+ |
| 11 | タッチセンサー(TTP223) | デジタル | 入門 |
| 12 | カラーセンサー(TCS3200) | デジタル(パルス) | 基礎+ |
| 13 | 加速度・ジャイロセンサー(MPU6050) | I2C | 基礎+ |
| 14 | 気圧・気温センサー(BME280/BMP280) | I2C | 基礎+ |
| 15 | ロードセル+HX711 | デジタル通信 | 基礎+ |
| 16 | 赤外線リモコン受信モジュール | デジタル(パルス) | 基礎+ |
CdS照度センサー(光センサー)
光の強さに応じて抵抗値が変わる、最も基本的なアナログセンサーです。
CdSセル(硫化カドミウムセル)、抵抗10kΩ
5V→CdS→A0(分圧点)→抵抗10kΩ→GND の分圧回路
コードを表示・コピー
// CdS照度センサーで明るさを読み取り、暗くなったらLEDを点灯
const int SENSOR_PIN = A0;
const int LED_PIN = 8;
const int DARK_THRESHOLD = 400; // 環境に合わせて要調整
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
int lightLevel = analogRead(SENSOR_PIN); // 0〜1023
Serial.print("Light: ");
Serial.println(lightLevel);
digitalWrite(LED_PIN, lightLevel < DARK_THRESHOLD ? HIGH : LOW);
delay(200);
}
| メリット | 配線が単純、安価(数十円)、ライブラリ不要で扱いやすい |
|---|---|
| デメリット | 正確な照度(lux)は測れず、抵抗値のばらつきで個体差が出やすい |
| 限界 | 応答速度がやや遅く、急な明暗変化の追従には向かない。屋外の強い直射日光では飽和しやすい |
| 代替 | 正確なlux値が必要ならTSL2561/TSL2591デジタル照度センサー ↗(I2C)がおすすめ |
| 活用アイデア | 自動点灯ライト、カーテン開閉の自動化、植物の日照量ロガー、暗室の光漏れ検知 |
DHT11/DHT22 温湿度センサー
1本の信号線でデジタル通信し、温度と湿度をまとめて取得できる定番モジュールです。
DHT11またはDHT22モジュール
VCC→5V、GND→GND、DATA→D2(モジュール基板は多くの場合プルアップ抵抗内蔵)
コードを表示・コピー
// DHT11/DHT22で温度と湿度を取得
#include <DHT.h>
#define DHT_PIN 2
#define DHT_TYPE DHT11 // DHT22の場合はDHT22に変更
DHT dht(DHT_PIN, DHT_TYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
float humidity = dht.readHumidity();
float tempC = dht.readTemperature();
if (isnan(humidity) || isnan(tempC)) {
Serial.println("Read failed");
} else {
Serial.print("Temp: ");
Serial.print(tempC);
Serial.print(" C, Humidity: ");
Serial.print(humidity);
Serial.println(" %");
}
delay(2000); // DHT11は最短2秒間隔でしか読み取れない
}
| メリット | 温度・湿度が1本の配線で同時取得でき、ライブラリで扱いが簡単 |
|---|---|
| デメリット | 読み取り間隔がDHT11で約2秒、DHT22で約2秒必要と遅い。DHT11は精度が低め(±2℃程度) |
| 限界 | 結露や急激な湿度変化への追従が弱く、屋外の長期使用では劣化しやすい。連続高速サンプリングには不向き |
| 代替 | 高精度・高速応答が必要ならSHT31/SHT35(Sensirion) ↗や、気圧も同時に測れるBME280 ↗ |
| 活用アイデア | 室内環境モニター、熱中症警告灯、温室・飼育ケースの自動換気、サーバールームの簡易監視 |
HC-SR04 超音波距離センサー
超音波の反射時間から距離を計算する、ロボット工作の定番センサーです。
HC-SR04超音波距離センサー
VCC→5V、GND→GND、TRIG→D9、ECHO→D10
コードを表示・コピー
// 超音波センサーで距離(cm)を測定
const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(9600);
}
long readDistanceCm() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long durationUs = pulseIn(ECHO_PIN, HIGH, 30000); // タイムアウト30ms
if (durationUs == 0) return -1; // 反射なし・範囲外
return durationUs / 58; // 音速から距離(cm)へ変換
}
void loop() {
long distance = readDistanceCm();
if (distance >= 0) {
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
} else {
Serial.println("Out of range");
}
delay(200);
}
| メリット | 数百円と安価で、2〜400cm程度の距離を比較的高精度に測定できる |
|---|---|
| デメリット | 柔らかい素材や斜めの面では反射が乱れて誤検知しやすい。複数個の同時使用は音波干渉に注意が必要 |
| 限界 | 吸音材(布・スポンジなど)はほぼ検知できない。応答速度は毎秒数十回程度が上限 |
| 代替 | より高精度・狭指向性が必要なら赤外線測距のSharp GP2Y0A21 ↗や、ToF方式のVL53L0X ↗も検討 |
| 活用アイデア | 障害物回避ロボット、駐車アシスト、非接触ゴミ箱の自動開閉、水位の非接触測定 |
PIR人感センサー
赤外線量の変化を検知し、人や動物の動きにだけ反応するセンサーです。
HC-SR501などのPIRモジュール
VCC→5V、GND→GND、OUT→D3
コードを表示・コピー
// PIRセンサーで人の動きを検知しLEDを点灯
const int PIR_PIN = 3;
const int LED_PIN = 8;
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
delay(30000); // センサー安定化のためのウォームアップ待機(推奨)
}
void loop() {
bool motionDetected = digitalRead(PIR_PIN) == HIGH;
digitalWrite(LED_PIN, motionDetected ? HIGH : LOW);
if (motionDetected) {
Serial.println("Motion detected!");
}
delay(100);
}
| メリット | 配線が単純で、検知感度・保持時間をモジュール上の可変抵抗で調整可能 |
|---|---|
| デメリット | 電源投入直後は数十秒のウォームアップが必要で誤検知しやすい。窓越しの検知はガラスが赤外線を遮るため不安定 |
| 限界 | 「動いている物体」しか検知できず、静止した人は検知できない。検知範囲・角度はレンズ形状に固定される |
| 代替 | より正確な人数カウントや静止検知にはミリ波レーダー方式のmmWaveセンサー ↗を検討 |
| 活用アイデア | 防犯センサーライト、来客通知チャイム、省エネ照明の自動消灯、ペットの活動量モニター |
土壌水分センサー
土に差し込んで水分量を測定し、植物の自動水やりなどに使われるセンサーです。
静電容量式または抵抗式の土壌水分センサー
VCC→5V、GND→GND、AOUT→A0(DOUTがある場合はD4等へ)
コードを表示・コピー
// 土壌水分センサーで乾燥を検知
const int SOIL_PIN = A0;
const int DRY_THRESHOLD = 550; // 使用センサーと土質に合わせ要調整
void setup() {
Serial.begin(9600);
}
void loop() {
int moisture = analogRead(SOIL_PIN); // 値が大きいほど乾燥(センサーにより逆の場合あり)
Serial.print("Soil raw: ");
Serial.println(moisture);
if (moisture > DRY_THRESHOLD) {
Serial.println("-> 水やりが必要です");
} else {
Serial.println("-> 十分に湿っています");
}
delay(1000);
}
| メリット | 安価で仕組みが分かりやすく、DIYの自動水やりシステムの入門に最適 |
|---|---|
| デメリット | 安価な抵抗式は電気分解により金属部分が腐食しやすい(静電容量式は劣化しにくく推奨) |
| 限界 | 土質・塩分濃度により基準値が大きく変わるため、絶対的な水分量ではなく相対的な変化として使うのが現実的 |
| 代替 | 長期屋外運用には腐食に強い静電容量式土壌水分センサー ↗が推奨 |
| 活用アイデア | 自動水やり装置、家庭菜園の水分ロガー、鉢植えの水切れアラート |
赤外線障害物検知センサー
赤外線の反射を利用して近距離の障害物や黒線を検知する、ライントレーサー定番の部品です。
IR障害物検知モジュール(送受光素子+比較回路)
VCC→5V、GND→GND、OUT→D4
コードを表示・コピー
// 赤外線障害物検知センサーでLEDを点灯
const int IR_PIN = 4;
const int LED_PIN = 8;
void setup() {
pinMode(IR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
// 多くのモジュールは障害物ありでLOWを出力(要データシート確認)
bool obstacleDetected = digitalRead(IR_PIN) == LOW;
digitalWrite(LED_PIN, obstacleDetected ? HIGH : LOW);
Serial.println(obstacleDetected ? "Obstacle!" : "Clear");
delay(100);
}
| メリット | 応答が非常に速く、安価で複数個並べてライントレースなどにも使いやすい |
|---|---|
| デメリット | 検知距離は数cm〜30cm程度と短く、色や素材(黒色・光沢面)で反射率が変わり誤検知しやすい |
| 限界 | 外光(特に太陽光の赤外線成分)の影響を強く受けるため屋外の安定動作は難しい |
| 代替 | より長距離・安定した検知には超音波のHC-SR04や、ToF方式の距離センサーを検討 |
| 活用アイデア | ライントレースカー、自動ドアの人検知、カウンター(通過人数カウント)、簡易ライン外れ検知 |
サウンドセンサー(マイクモジュール)
周囲の音量の変化を検知し、拍手や音による操作を実現するセンサーです。
コンデンサマイク搭載サウンドセンサーモジュール
VCC→5V、GND→GND、AOUT→A0(DOUTがある場合は感度しきい値超えでD4等がHIGH)
コードを表示・コピー
// 拍手のような急な音の変化を検知する
const int SOUND_PIN = A0;
const int LED_PIN = 8;
const int CLAP_THRESHOLD = 700; // 環境ノイズに応じて要調整
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
int level = analogRead(SOUND_PIN);
if (level > CLAP_THRESHOLD) {
digitalWrite(LED_PIN, HIGH);
Serial.println("Clap detected!");
delay(300); // 連続検知を防ぐための簡易デバウンス
} else {
digitalWrite(LED_PIN, LOW);
}
}
| メリット | 音の有無・大まかな音量変化を安価かつシンプルに検知できる |
|---|---|
| デメリット | 音の高さ(周波数)や内容(言葉)は判別できず、単なる音量変化しか取得できない |
| 限界 | 周囲の環境ノイズにより誤検知しやすく、屋外や騒がしい部屋では実用精度を出しにくい |
| 代替 | 周波数解析まで行いたい場合はI2S接続のMEMSマイク+FFT処理 ↗など、より高度な構成が必要 |
| 活用アイデア | 拍手で点灯するライト、音センサー式アラーム、防犯用の異音検知、簡易サウンドVUメーター |
MQ-2ガスセンサー
可燃性ガスや煙の濃度変化を検知する、半導体式のガスセンサーです。
MQ-2ガスセンサーモジュール
VCC→5V、GND→GND、AOUT→A0
コードを表示・コピー
// MQ-2でガス濃度の相対値を監視
const int GAS_PIN = A0;
const int BUZZER_PIN = 8;
const int GAS_THRESHOLD = 400; // ウォームアップ後に要キャリブレーション
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
Serial.begin(9600);
Serial.println("Warming up sensor (about 60s)...");
delay(60000); // ヒーター安定化のためのウォームアップ(推奨)
}
void loop() {
int gasLevel = analogRead(GAS_PIN);
Serial.print("Gas level: ");
Serial.println(gasLevel);
if (gasLevel > GAS_THRESHOLD) {
tone(BUZZER_PIN, 1000);
} else {
noTone(BUZZER_PIN);
}
delay(500);
}
| メリット | LPガス・プロパン・煙など複数の可燃性ガスに幅広く反応し、安価に導入できる |
|---|---|
| デメリット | 内部にヒーターがあり常時数十mA〜百数十mAを消費、動作前に数十秒〜数分のウォームアップが必要 |
| 限界 | ガスの種類を特定できず「何らかの可燃性ガスがある」という相対値しか出せない。安全機器・法定用途としての使用は不可 |
| 代替 | 特定ガスの精密測定が必要な用途では、認証済みの専用ガス検知器やフィガロ技研の産業用センサー ↗を検討 |
| 活用アイデア | 学習用のガス漏れ検知デモ、キッチンの簡易換気扇連動、実験用のガス濃度ロガー |
MQ-2は学習・実験用の簡易センサーであり、実際の火災報知器やガス漏れ警報器の代替にはなりません。安全に関わる用途には必ず法令に適合した専用の検知器を使用してください。
振動・傾斜センサー
揺れや傾きを単純なON/OFFで検知する、防犯・転倒検知向けの部品です。
SW-420振動センサーまたはボール式チルトスイッチ
VCC→5V、GND→GND、DOUT→D3
コードを表示・コピー
// 振動を検知したらブザーを鳴らす簡易防犯アラーム
const int VIB_PIN = 3;
const int BUZZER_PIN = 8;
volatile bool triggered = false;
void onVibration() {
triggered = true;
}
void setup() {
pinMode(VIB_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(VIB_PIN), onVibration, CHANGE);
}
void loop() {
if (triggered) {
Serial.println("Vibration detected!");
tone(BUZZER_PIN, 1500, 200);
triggered = false;
}
}
| メリット | 超低価格で配線も単純、割り込み処理と組み合わせれば見逃しが少ない |
|---|---|
| デメリット | 振動の「強さ」は判別できず、ON/OFFの2値しか得られない機種が多い |
| 限界 | 感度調整はモジュールの可変抵抗頼みで、微細な振動と大きな衝撃を区別する用途には不向き |
| 代替 | 振動の大きさ・方向まで解析したい場合はMPU6050加速度センサーで加速度の変化量から判定する方法が有効 |
| 活用アイデア | 簡易防犯アラーム、郵便受けの投函検知、洗濯機の振動異常検知、地震の簡易検知デモ |
ホールセンサー(磁気センサー)
磁石の接近を非接触で検知するセンサーで、ドアセンサーや回転数計測に使われます。
A3144などのデジタルホールセンサー、磁石
VCC→5V、GND→GND、OUT→D3
コードを表示・コピー
// ホールセンサーで磁石の接近を検知し回転数をカウント
const int HALL_PIN = 3;
volatile unsigned long pulseCount = 0;
void onMagnetDetected() {
pulseCount++;
}
unsigned long lastReportTime = 0;
void setup() {
pinMode(HALL_PIN, INPUT);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(HALL_PIN), onMagnetDetected, FALLING);
}
void loop() {
if (millis() - lastReportTime >= 1000) {
lastReportTime = millis();
Serial.print("Pulses/sec: ");
Serial.println(pulseCount);
pulseCount = 0; // 1秒ごとにリセットして回転速度の目安にする
}
}
| メリット | 非接触なので機械的な摩耗がなく、高速回転の検知にも耐久性がある |
|---|---|
| デメリット | 磁石を対象物に取り付ける必要があり、検知距離は数mm〜1cm程度と近い |
| 限界 | 磁石以外は検知できず、強い外部磁場があると誤検知の原因になる |
| 代替 | 磁石を使いたくない回転検知には、光を遮る仕組みのフォトインタラプタ ↗が有効 |
| 活用アイデア | ドア・窓の開閉検知(防犯)、自転車の速度計、モーターの回転数測定、水道メーターの回転検知 |
タッチセンサー(TTP223)
指で触れるだけで反応する静電容量式スイッチで、物理ボタンの代替として使えます。
TTP223静電容量式タッチセンサーモジュール
VCC→5V、GND→GND、SIG(I/O)→D2
コードを表示・コピー
// タッチセンサーでLEDのON/OFFをトグルする
const int TOUCH_PIN = 2;
const int LED_PIN = 8;
bool ledState = false;
bool lastTouch = false;
void setup() {
pinMode(TOUCH_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
bool touched = digitalRead(TOUCH_PIN) == HIGH;
if (touched && !lastTouch) {
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
lastTouch = touched;
delay(30); // 簡易デバウンス
}
| メリット | 機械的な接点がないため劣化しにくく、防水加工したパネル越しにも反応させやすい |
|---|---|
| デメリット | 金属製の筐体やノイズ源の近くでは誤動作しやすい。手袋をした状態では反応しにくい場合がある |
| 限界 | 押し込み感(クリック感)がなく、暗所や視覚障害を考慮したUIには不向き |
| 代替 | 確実な操作感が必要な場面では通常のタクトスイッチ(押しボタン)を使う方が誤操作を防ぎやすい |
| 活用アイデア | スタイリッシュな照明スイッチ、防水パネルの操作ボタン、電子ピアノ風の鍵盤インターフェース |
カラーセンサー(TCS3200)
RGB各色の反射光をパルス周波数として読み取り、色を識別するセンサーです。
TCS3200カラーセンサーモジュール
S0→D4、S1→D5、S2→D6、S3→D7、OUT→D8、VCC→5V、GND→GND
コードを表示・コピー
// TCS3200でRGB各色の周波数(≒強さ)を取得
const int S0 = 4, S1 = 5, S2 = 6, S3 = 7, OUT_PIN = 8;
void setup() {
pinMode(S0, OUTPUT); pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT); pinMode(S3, OUTPUT);
pinMode(OUT_PIN, INPUT);
digitalWrite(S0, HIGH); digitalWrite(S1, LOW); // 出力周波数スケール20%
Serial.begin(9600);
}
unsigned long readColor(bool s2, bool s3) {
digitalWrite(S2, s2);
digitalWrite(S3, s3);
return pulseIn(OUT_PIN, LOW, 50000); // パルス幅=色の強さの逆比例
}
void loop() {
unsigned long red = readColor(LOW, LOW);
unsigned long green = readColor(HIGH, HIGH);
unsigned long blue = readColor(LOW, HIGH);
Serial.print("R:"); Serial.print(red);
Serial.print(" G:"); Serial.print(green);
Serial.print(" B:"); Serial.println(blue);
delay(300);
}
| メリット | RGB各色の反射強度を数値として取得でき、簡易的な色識別・色ソートが実現できる |
|---|---|
| デメリット | 周辺の照明環境(明るさ・色温度)に強く影響を受け、キャリブレーションが必須 |
| 限界 | 光沢のある面や透明な物体、非常に近距離・遠距離では正確な色判定が難しい |
| 代替 | より安定した色判定にはキャリブレーション機能付きのTCS34725(I2C接続) ↗が扱いやすい |
| 活用アイデア | 色による部品の仕分け機、簡易カラーマッチングゲーム、RGB LEDテープの色再現、印刷物の色検査デモ |
加速度・ジャイロセンサー(MPU6050)
3軸加速度と3軸角速度を1つのICで取得できる、姿勢制御の定番モジュールです。
MPU6050 6軸加速度・ジャイロセンサーモジュール
SDA→A4、SCL→A5、VCC→5V(またはモジュールにより3.3V)、GND→GND
コードを表示・コピー
#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
Adafruit_MPU6050 mpu;
void setup() {
Serial.begin(9600);
if (!mpu.begin()) {
Serial.println("MPU6050 not found");
while (true) {}
}
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
}
void loop() {
sensors_event_t accel, gyro, temp;
mpu.getEvent(&accel, &gyro, &temp);
Serial.print("AccelX:"); Serial.print(accel.acceleration.x);
Serial.print(" AccelY:"); Serial.print(accel.acceleration.y);
Serial.print(" AccelZ:"); Serial.println(accel.acceleration.z);
delay(200);
}
| メリット | 1つのモジュールで傾き・揺れ・回転速度をまとめて取得でき、応用範囲が非常に広い |
|---|---|
| デメリット | 生の角速度データを積分して角度にすると誤差が蓄積する「ドリフト」が発生する |
| 限界 | 正確な絶対角度が必要な用途にはセンサーフュージョン(相補フィルタ・カルマンフィルタ)による補正が必須 |
| 代替 | より高精度・高安定な姿勢推定が必要ならセンサーフュージョン内蔵のBNO055 ↗が扱いやすい |
| 活用アイデア | セルフバランシングロボット、ジェスチャー操作コントローラー、転倒検知ウェアラブル、ドローンの姿勢制御学習 |
気圧・気温センサー(BME280/BMP280)
気圧・気温(BME280はさらに湿度も)をI2Cで取得でき、簡易的な高度計にも使えます。
BME280またはBMP280気圧センサーモジュール
SDA→A4、SCL→A5、VCC→3.3Vまたは5V(モジュールによる)、GND→GND
コードを表示・コピー
#include <Wire.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 bme;
const float SEA_LEVEL_HPA = 1013.25; // 地域と季節で変動するため目安値
void setup() {
Serial.begin(9600);
if (!bme.begin(0x76)) { // アドレスは0x76または0x77
Serial.println("BME280 not found");
while (true) {}
}
}
void loop() {
Serial.print("Temp: "); Serial.print(bme.readTemperature());
Serial.print(" C, Pressure: "); Serial.print(bme.readPressure() / 100.0F);
Serial.print(" hPa, Altitude: ");
Serial.print(bme.readAltitude(SEA_LEVEL_HPA));
Serial.println(" m");
delay(1000);
}
| メリット | 気圧・気温・湿度を高精度・低消費電力で取得でき、天候変化の予測にも使える |
|---|---|
| デメリット | 高度計算は海面気圧の基準値に依存するため、基準値がずれると誤差が大きくなる |
| 限界 | 単体では絶対高度をcm単位で測るような精密測定はできない。急激な気圧変化(ドアの開閉など)にもわずかに反応する |
| 代替 | 湿度が不要で気圧・温度のみで十分な場合は安価なBMP280 ↗で代替可能 |
| 活用アイデア | 簡易天気予測デバイス、登山・ドローン用の高度計、気圧変化を利用したドア開閉検知、気象データロガー |
ロードセル+HX711
微弱なひずみをHX711アンプで増幅し、重さをデジタル値として取得します。
ロードセル(重量センサー)、HX711アンプモジュール
ロードセル4線→HX711の各端子、HX711のDT→D2、SCK→D3、VCC→5V、GND→GND
コードを表示・コピー
#include <HX711.h>
const int DT_PIN = 2;
const int SCK_PIN = 3;
HX711 scale;
// 実測でキャリブレーションが必要な係数(既知の重りで調整)
const float CALIBRATION_FACTOR = 2280.0;
void setup() {
Serial.begin(9600);
scale.begin(DT_PIN, SCK_PIN);
scale.set_scale(CALIBRATION_FACTOR);
scale.tare(); // 起動時に0点をリセット(何も載せない状態で実行)
Serial.println("Place a known weight to calibrate if needed.");
}
void loop() {
if (scale.is_ready()) {
float grams = scale.get_units(5); // 5回平均で読み取り
Serial.print("Weight: ");
Serial.print(grams);
Serial.println(" g");
}
delay(300);
}
| メリット | 安価な構成でありながらグラム単位の重量測定が可能で、市販の電子秤に近い精度が出せる |
|---|---|
| デメリット | 正確な測定には既知の重りを使ったキャリブレーションが必須で、温度変化にもわずかに影響を受ける |
| 限界 | ロードセルの定格荷重(例:1kg、5kg、20kgなど)を超えると破損・精度劣化するため、用途に合った定格選定が必要 |
| 代替 | より高精度・高安定な計測が必要な業務用途では、認証済みのロードセル+専用ADCを使った市販の計量モジュールを検討 |
| 活用アイデア | 簡易キッチンスケール、郵便物の重さ計測、ペットフードの自動給餌量管理、在庫の重量ベース管理 |
赤外線リモコン受信モジュール
家電リモコンの赤外線信号を受信・解析し、Arduinoからの機器操作に応用できます。
VS1838BなどのIR受信モジュール、市販の赤外線リモコン
OUT→D11、VCC→5V、GND→GND
コードを表示・コピー
// IRremoteライブラリ(v3系)でリモコン信号を受信して表示
#include <IRremote.hpp>
const int IR_RECV_PIN = 11;
void setup() {
Serial.begin(9600);
IrReceiver.begin(IR_RECV_PIN, ENABLE_LED_FEEDBACK);
Serial.println("Ready to receive IR signals");
}
void loop() {
if (IrReceiver.decode()) {
Serial.print("Protocol: ");
Serial.print(IrReceiver.decodedIRData.protocol);
Serial.print(" / Code: 0x");
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
IrReceiver.resume(); // 次の信号を受信できるようにする
}
}
| メリット | 市販のリモコンをそのまま流用でき、家にある家電操作の学習・自作リモコンハブに応用しやすい |
|---|---|
| デメリット | 直射日光や蛍光灯・LED照明のノイズで誤受信することがあり、受信角度・距離にも制限がある |
| 限界 | メーカー独自のプロトコルは解析できない場合があり、暗号化された高度な通信(一部の防犯機器等)には対応できない |
| 代替 | Bluetooth・Wi-Fi対応の機器を直接制御したい場合は、赤外線ではなくネットワーク経由の制御(ESP32等での実装)が現実的 |
| 活用アイデア | 複数リモコンの統合ハブ、音声アシスタント連携の家電操作、リモコン信号のログ収集・再現学習 |
複数センサーを組み合わせる時の注意
1つのセンサーが動いたら、次はいくつか組み合わせて「複合的な判断」をさせたくなるはずです。その際に気をつけたいポイントをまとめます。
アナログピン(A0〜A5)は6本しかありません。アナログセンサーを増やしすぎる場合は、アナログマルチプレクサIC(例:CD4051)の利用や、I2C接続のセンサーへの置き換えを検討してください。
I2C接続のセンサー(DHT系以外の多くのデジタルセンサー)は、複数個を同時使用するとアドレスが重複してエラーになることがあります。データシートで変更可能なアドレスを確認しましょう。
MQ-2のようにヒーターで電流を多く消費するセンサーと、サーボなど別の電流食いの部品を同時に使う場合は、Arduinoのレギュレーターの発熱・電圧降下に注意し、外部電源の利用を検討してください。
AIにセンサーコードを書かせるコツ
センサー系のコードをAIに生成してもらう際は、「センサーの型番」「読み取り方式(アナログ/デジタル/I2C)」「判定条件」「後段でどう使うか」を具体的に伝えると、実際に組み込みやすいコードが返ってきます。
「何秒動かすか」「次にいつまで動かさないか(クールダウン)」まで指定すると、誤作動しにくい実用的なコードになります。第2弾の「動かす・表示するコード集」記事 ↗で紹介したstate管理の考え方も、そのままセンサー連動の出力制御に応用できます。
よくある質問とまとめ
最初に買うべきセンサーはどれですか?
配線が単純でライブラリ不要なCdS照度センサーか、値が体感しやすいHC-SR04超音波距離センサーがおすすめです。どちらも数百円で入手でき、失敗しにくい部品です。
デジタル出力とアナログ出力のセンサーの違いは何ですか?
デジタル出力はON/OFFの2値(またはパルス)しか返さず、しきい値はセンサー側の可変抵抗で調整します。アナログ出力は0〜1023の連続値をArduinoのADCで読み取れるため、細かい判定やグラフ化に向いています。
センサーが安定しない・値がばらつく時はどうすればいいですか?
多くの場合、電源ノイズ、配線の緩み、センサー特有のウォームアップ時間不足が原因です。移動平均やコンデンサによる平滑化、データシート記載のウォームアップ時間の確保を試してください。
複数のセンサーを同時に使う時の注意点は?
I2C接続のセンサーはアドレスの重複に注意し、アナログセンサーはADCピン(A0〜A5)を使い切らないよう配分します。消費電流が大きいセンサーが複数ある場合はArduinoのUSB電源だけでは不足することがあります。
まずは配線が単純な1〜2種類のセンサーで「値がちゃんと読める」ことを確認し、そこにしきい値判定やLED・ブザーなどの出力を組み合わせていくと、無理なくステップアップできます。読み取った値をどう「動かす・表示する」につなげるかは、こちらのコード集記事 ↗も参考にしてください。
コメント