e-NOXProject#005ESP32は嘘をつかない ― PIRセンサーが動くまでの長い一日

ESP32は嘘をつかない ― PIRセンサーが動くまでの長い一日

はじめに

前回、ESP32によるブザー制御に成功した。

LEDを点灯させ、ブザーを鳴らすことができた時点で、ESP32が「出力」を持つことは理解できた。

しかしロボットやAIドローンを作る上で、本当に重要なのは入力である。

外界を認識できなければ、どれほど優秀なCPUを搭載していても単なる箱に過ぎない。

そこで今回は、PIR人感センサーを用いてESP32に最初の感覚器官を与えることにした。

PIRとは何か

PIRとは

Passive Infrared Sensor

の略である。

一般には

人感センサー

として販売されている。

ただし正確には、

人を検知する

のではない。

検知しているのは、

赤外線の変化

である。

人体や動物は体温を持つため赤外線を放射している。

PIRはその変化を検出する。

そのため、

人が横切る

には反応するが、

じっと立っている

だけでは反応しないこともある。

今回の構成

今回の回路構成は以下の通りである。

PIRセンサー

      │

      │ OUT

      ▼

ESP32 GPIO13

      │

      ▼

シリアルモニタ

まずは動作確認を優先し、

LEDやブザーは接続しなかった。

GPIOとは

ESP32のピンは

GPIO

と呼ばれる。

General Purpose Input Output

の略である。

GPIOは

入力

にも

出力

にも使える。

今回使用したGPIO13は入力として利用した。

コードは非常に単純である。

C++

const int pirPin = 13;

void setup() {

  Serial.begin(115200);

  pinMode(pirPin, INPUT);

}

void loop() {

  int state = digitalRead(pirPin);

  Serial.print(“PIR=”);

  Serial.println(state);

  delay(500);

}

このコードは

0

または

1

を表示しているだけである。

しかしこれが重要だった。

地獄の始まり

配線を終え、

コードを書き込み、

シリアルモニタを開いた。

すると、

PIR=1

PIR=1

PIR=1

PIR=1

と延々表示され続けた。

人が動こうが動くまいが、

変化しない。

最初に疑ったのはコードだった。

しかしコードは単純である。

次に疑ったのはGPIO番号。

GPIO13ではなくGPIO2なのか?

説明書を見るとArduinoのD2へ接続されていた。

しかしそれはArduino UNOの例であり、

ESP32とは無関係だった。

テスター投入

ここで感覚的な推測をやめた。

まず電圧を測定した。

結果は

VCC = 5V

GND = 0V

OUT = 約4V

だった。

つまりESP32は嘘をついていない。

PIRセンサーは確かにHIGHを出力していた。

だから

Plain text

PIR=1

が表示される。

ESP32は正しかった。

センサー故障説

次に疑ったのはセンサー故障。

幸いPIRセンサーは2個入っていた。

そこで交換した。

結果。

同じだった。

PIR=1

固定。

故障説は消えた。

説明書を疑え

ここでようやく真犯人にたどり着いた。

説明書と実物が違うのである。

調べてみると、

実物は

VCC

OUT

GND

の並びが説明図と逆だった。

さらに、

感度調整ボリュームも逆方向だった。

そして極めつけは、

トリガーモード変更用のジャンパーピンとジャンパーキャップが実装されていなかった。

初心者向けキットとしてはかなり厳しい。

なぜESP32は嘘をつかなかったのか

今回の最大の収穫はここである。

最初は

ESP32が間違っている

と思った。

しかし違った。

ESP32は

C++

digitalRead()

で入力された状態を正直に返していただけだった。

つまり、

PIR=1

という表示は、

ESP32の故障ではなく、

センサー側の状態を忠実に示していた。

電子工作では、

コンピュータは意外と嘘をつかない。

人間の思い込みの方がよほど危険である。

そして初めての入力成功

問題を修正すると、

ようやく

PIR=0

が表示された。

そしてセンサー前を横切ると、

PIR=1

へ変化する。

ついにESP32が外界を認識した瞬間だった。

e-NOX Mk1にとっての意味

LEDは表情だった。

ブザーは声だった。

しかしPIRは違う。

PIRは感覚器官である。

今回完成した回路は、

外界

 ↓

PIR

 ↓

ESP32

 ↓

判断

という、

e-NOX Mk1最初の神経回路そのものだった。

次回予告

次の目標は、

PIR

 ↓

ESP32

 ↓

ブザー

である。

人を検知したら反応する。

その次はカメラ。

その先にはAIがある。

そして最終的には、

PIR

 ↓

ESP32

 ↓

AI

 ↓

MAVLink

 ↓

Flight Controller

 ↓

ドローン行動

へ繋がっていく。

今日の成功は小さい。

しかしAIドローン開発において、

最初の感覚器官を獲得した意味は決して小さくない。

コード解説


GPIO13の設定
C++
const int pirPin = 13;
PIRセンサーのOUT端子を接続したGPIO番号。
今回はGPIO13を使用した。

シリアル通信開始
C++
Serial.begin(115200);
ESP32とPCの通信速度を設定。
シリアルモニタへ測定結果を表示するために必要。

GPIOを入力モードへ
C++
pinMode(pirPin, INPUT);
GPIO13を入力として設定。
ESP32はここで
「このピンはセンサーから情報を受け取る」
と認識する。

PIRの状態取得
C++
int state = digitalRead(pirPin);
GPIO13の電圧状態を読み取る。
PIRセンサーはデジタル出力なので、
LOW = 0

HIGH = 1
のどちらかしか返さない。

シリアルモニタへ表示
C++
Serial.print(“PIR=”);
Serial.println(state);
状態を表示。
例えば、
PIR=0
なら待機状態。
PIR=1
なら人体の動きを検知している。

500ms待機
C++
delay(500);
0.5秒ごとに測定を繰り返す。

実際の動作


待機時
PIR=0
PIR=0
PIR=0

人が横切る
PIR=1
PIR=1
PIR=1

一定時間後
PIR=0
へ戻る。

このコードで学んだこと
LED編では、
ESP32

LED
という出力を学んだ。
ブザー編では、
ESP32


という出力を学んだ。
しかしPIR編では初めて、
外界

PIR

ESP32
という入力を扱った。
e-NOX Mk1にとっては、
「光る」「鳴る」ではなく、
初めて外界を感じた日
だった。


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です