ADC でセンサーを読む光センサー・ボリュームの電圧を数値にする
ボタンは 0 か 1 ですが、明るさや温度は「どれくらい」という連続した量です。センサーはそれを電圧に変え、マイコンの ADC(アナログ-デジタル変換器)が電圧を数値に変えます。ここでは CdS 光センサーとボリューム(可変抵抗)を ESP32-S3 で読みます。
- ESP32-S3
- M5Stack CoreS3
CONTENTSこの記事の目次+
01 — ADC
ADC とは
- 0〜3.3V の電圧を 12bit(0〜4095)の整数にする。3.3V ÷ 4096 ≒ 0.8mV が 1 目盛り
- ESP32-S3 では GPIO1〜10 が ADC1、GPIO11〜20 が ADC2。Wi-Fi を使うと ADC2 が読めないので ADC1 を使う
- Raspberry Pi 5 には ADC がない。アナログを読むなら ADS1115 などの I2C ADC モジュールか、ESP32 に読ませて送る
02 — POTENTIOMETER
ボリューム(可変抵抗)を読む
ボリュームは分圧回路そのもの。つまみを回すとワイパーの位置が動き、0〜3.3V の間の連続した電圧を取り出せます。
両端の足は逆につないでもかまいません(回す向きが逆になるだけ)。10kΩ のボリュームが標準です。
const int POT_PIN = 1; // GPIO1(ADC1)
void setup() {
Serial.begin(115200);
}
void loop() {
int raw = analogRead(POT_PIN); // 0〜4095
float volts = raw * 3.3 / 4095.0;
Serial.printf("raw=%4d %.2fV\n", raw, volts);
delay(200);
}シリアルモニタで、つまみを回すと数値が 0〜4095 の間で動くのを確認します。ツール → シリアルプロッタにすると波形で見えます。
ESP32 の ADC は両端(0V 付近と 3.1V 以上)で精度が落ちます。正確な電圧が必要なら、補正済みの analogReadMilliVolts(pin) を使います。
03 — LIGHT SENSOR
CdS 光センサーを読む
CdS セルは「明るいと抵抗が小さく、暗いと大きくなる」抵抗です。抵抗値は直接読めないので、固定抵抗と直列にして分圧回路にし、電圧の変化として読みます。
CdS と 10kΩ の分圧回路。明るいほど CdS の抵抗が下がり、GPIO2 にかかる電圧が 3.3V に近づきます。
- 明るい → CdS の抵抗が小さい → GPIO の電圧が上がる → 数値が大きい
- 暗い → CdS の抵抗が大きい → 電圧が下がる → 数値が小さい
- 固定抵抗は CdS の「普段の明るさでの抵抗値」に近い値にすると変化が大きく出る。10kΩ から始めて調整する
- CdS と固定抵抗を入れ替えると、明るいときに数値が小さくなる(どちらでもよい)
const int LIGHT_PIN = 2; // GPIO2(ADC1)
const int LED_PIN = 4;
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int light = analogRead(LIGHT_PIN);
Serial.println(light);
digitalWrite(LED_PIN, light < 1500 ? HIGH : LOW); // 暗くなったら点灯
delay(100);
}しきい値の 1500 は環境で変わります。まずシリアルで「明るいとき」「手で覆ったとき」の数値を見て、その中間を入れます。
04 — NOISE
値がふらつくとき
- 何回か読んで平均する(10 回読んで ÷10)
- 移動平均:
value = value * 0.9 + raw * 0.1のように前回の値と混ぜるとなめらかになる - ADC ピンと GND の間に 0.1μF のコンデンサ
- 配線を短くする。ブレッドボードの接触不良も原因になる
05 — CORES3
CoreS3 で読む
CoreS3 の Port B(G8 / G9)は ADC1 なので、Wi-Fi と同時に読めます。M5Stack の Light Unit や Angle Unit(ボリューム)を Port B に挿し、analogRead(8) で読みます(入力側が G8。ユニットによってはピン配置図で確認)。値は M5.Display.printf("%d", value) で画面に出せます。
06 — WATCH OUT
注意点
5V 出力のセンサーは分圧で 3.3V 以下に落としてから入れます。
ESP32-S3 は GPIO1〜20 のみ。Wi-Fi と併用するなら 1〜10。
意味のある単位にするには換算式か較正が必要です。「明るい / 暗い」のような相対的な判断なら生の数値で十分です。
07 — CHECK YOURSELF
理解チェック
Q13.3V の ADC で 2048 が読めた。電圧は?答えを見る
約 1.65V(3.3 × 2048 ÷ 4096)。
Q2CdS を 3V3 側、10kΩ を GND 側にした。明るくなると数値は?答えを見る
大きくなる。CdS の抵抗が下がり、GPIO の電圧が 3.3V に近づく。
