今回はArduinoの互換製品である「ELEGOO UNO R3」に、赤外線センサーモジュールを接続して動作の確認及び試行錯誤をしてみる。使用する赤外線センサーモジュールは「GP2Y0A21YK」であるが、こちらは測距範囲が比較的に短く手元で反応させやすい。目的が異なれば同シリーズの測距範囲が異なるものを選ぶと良い。基本的な使い方は同じである。プログラムに関してははこちらを参考にさせてもらった。
測定距離を数値化
まずUNOと赤外線センサーモジュールを以下のように接続する。
下図は実際に繋いでみた様子である。
プログラムを以下のように書き
----------------------------------------------------
float Vcc = 5.0;
float dist1;
float dist2;
void setup(){
Serial.begin(9600);
}
void loop(){
dist1 = Vcc*analogRead(A0)/1023;
dist2 = 26.549*pow(dist1,-1.2091);
Serial.println(dist2);
delay(300);
}
----------------------------------------------------
UNOに書き込んでみるが、目に見える変化は一見ない。そこでArduino IDEのシリアルモニタを確認すると、
このように止め処なく数値が羅列されていることが分かる。これは赤外線センサーの前に何かがあり、その物との距離を数値化している。数値が大きければ距離が離れていることを表し、逆に小さければ距離が近い事を表している。実際に手をかざしたり、センサーの前に何かを置けば数値が小さくなる様子が確認できるはずである。
測定した数値を利用する
ここまでで計った距離を数値化することができたが、このままでは何にも利用する事ができない。そのため「どの距離に来たのか」を判定するプログラムを作る。それには実際に手をかざして判定したい距離を見定めることが必要になる。理想となる判定してほしい距離と反応してほしくない距離の境界となる位置に手をかざし、その際の数値を記録しておく。
今回は近距離で手をかざす事を目的とするため、その値は極めて小さめの「9」とする。
プログラムを少し書き換えて以下のようにしてみた
----------------------------------------------------
float Vcc = 5.0;
float dist1;
float dist2;
void setup(){
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
}
void loop(){
dist1 = Vcc*analogRead(A0)/1023;
dist2 = 26.549*pow(dist1,-1.2091);
if(dist2 < 9){
digitalWrite(LED_BUILTIN, HIGH);
}else{
digitalWrite(LED_BUILTIN, LOW);
};
Serial.println(dist2);
delay(100);
}
----------------------------------------------------
変更している箇所は2か所で、1つ目はif文の箇所で「特定の距離範囲に物が入ったら、LEDを点灯させる&そうでないときには消灯する」というプログラムを追加したことで、2つ目はdelayの値を300から100に減らしている点である。理由としてはdelayが300だと1回1回の測定の間隔がすこし長く、素早く手をかざされた際には反応しきれない場合があるためである。
実際に手をかざしてみると下図のように橙色のLEDが点灯することが確認できる。
今回はLEDを光らせただけだが、他のものに反映すれば幅広い事に活用できるのではないだろうか。



