Arduinoで距離を測る(2)【赤外線測距センサ with XBee(動作確認)】 [Arduino]
せっかくなので、超音波測距センサのときと同じように、測定したアナログ値をバイナリデータとしてXBee間でシリアル通信して、PCのシリアルモニタに表示をさせます。
赤外線測距センサの「GP2Y0A21YK」の測定レンジは10cm~80cmですので、測定レンジを外れたら"Out of Range"と表示します。
【スケッチ】
<送信側>
<受信側>
赤外線測距センサの「GP2Y0A21YK」の測定レンジは10cm~80cmですので、測定レンジを外れたら"Out of Range"と表示します。
【スケッチ】
<送信側>
/******************************************************************************* 赤外線距離センサ(GP2Y0A21YK)用XBeeトランスミッタ ++++++ note ++++++ シャープ測距モジュール(GP2Y0A21YK)用にArduinoProMini-XBee送信機 *******************************************************************************/ // These constants won't change. They're used to give names to the pins used: const int analogInPin = A0; //A0をアナログ入力ピンに指定 int sensorValue = 0; // the setup routine runs once when you press reset:初期化(電源投入/リセット時1回のみ実行) void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); //9600bpsでシリアルポートを開く } // the loop routine runs over and over again forever: main loop void loop() { sensorValue = analogRead(analogInPin); //アナログ入力ピン(A0)の値を読む sendIntData(sensorValue); delay(100); } // int型のデータを送信する関数 void sendIntData(int value) { Serial.write('H'); // ヘッダの送信 Serial.write(lowByte(value)); // 下位バイトの送信 Serial.write(highByte(value)); // 上位バイトの送信 }
<受信側>
/******************************************************************************* 赤外線距離センサ(GP2Y0A21YK)用XBeeレシーバ ++++++ note ++++++ シャープ測距モジュール(GP2Y0A21YK)用にArduinoUNO-XBee受信機 *******************************************************************************/ int recv_data; //受信データ const float Vcc = 5.0; //電源電圧(定数) float range_volt; //出力電圧 float range_data; //距離 // 初期化(電源投入/リセット時1回のみ実行): void setup() { Serial.begin(9600); //9600bpsでシリアルポートを開く } // main loop: void loop() { // 受信バッファに3バイト(ヘッダ+int)以上のデータが着ているか確認 if ( Serial.available() >= sizeof('H') + sizeof(int) ) { // ヘッダの確認 if ( Serial.read() == 'H' ){ int low = Serial.read(); //下位バイトの読み取り int high = Serial.read(); //上位バイトの読み取り recv_data = makeWord(high,low); //上位バイトと下位バイトを合体させてint型データを復元 } // 受信データから表示させる距離データを作成 range_volt = Vcc * recv_data / 1023; //アナログピンから読み取った値を元の出力電圧値に戻す // 出力電圧から距離データを作成 //range_data = 27.289 * pow(range_volt, -1.202); //【データシート】距離を計算(累乗近似) pow:べき乗 range_data = 26.123 * pow(range_volt, -1.106); //【実測】距離を計算(累乗近似) pow:べき乗 // 距離データの表示 range_dataの値をハード・シリアルへ出力する(Arduino→PCモニタ) if((range_data >= 10) && (range_data <= 80)){ //range_dataが10以上80以下ならば、距離を表示する Serial.print("Range= "); Serial.print(range_data); //距離を表示 Serial.println("[cm]"); //単位はcm } else{ //range_dataがそれ以外ならば、Out of Rangeと表示する Serial.println("Out of Range"); } } }
Arduinoで距離を測る(2)【赤外線測距センサ】 [Arduino]
Arduinoで距離を測る(1)で超音波測距センサを使ってみました。XBee経由で遠隔からデータを取得することもできました。
次は、赤外線距離センサの「GP2Y0A21YK0F」を使います。
とりあえず、赤外線の距離センサと言ったらコレ!、というくらいネットでもヒットしますので定番なんでしょうね。これです↓
シャープ測距モジュール GP2Y0A21YK0F
"http://akizukidenshi.com/catalog/g/gI-02551/"
今回は単純に動作させてみるだけなので、Arduino UNOに接続してPCのシリアルモニタで表示できるようにしたいと思います。
【配線図】
【スケッチ】
Arduino IDEから
ファイル>スケッチ例>01.Basics>AnalogReadSerial
のサンプルプログラムを改修して作成しました。
センサから出力されたアナログ値から距離を求める数式ですが、データシートのグラフと実測値を用いて、Excelにて累乗近似式で求めました。
距離が離れれば離れるほど計測結果はだいぶ怪しくなってきます。理由は距離に対する出力電圧の変化が小さいためだと思います。実用的には50cm未満のところで使うのが良いと思います。測定中の数値のバラつきもかなりありますので、距離を正確に計測するという用途よりも”ざっくりと20cm以下になったらブレーキをかけたい”とか、だいたいの近い距離まで接近したら何か処理をさせる、というような使い方が良いと思います。
#超音波測距センサとしてメジャーであれば、これから使う機会もあるのでしょうけど、個人的にはちょっと使いづらいデバイスだなー、とは思っています。。。
次は、赤外線距離センサの「GP2Y0A21YK0F」を使います。
とりあえず、赤外線の距離センサと言ったらコレ!、というくらいネットでもヒットしますので定番なんでしょうね。これです↓
シャープ測距モジュール GP2Y0A21YK0F
"http://akizukidenshi.com/catalog/g/gI-02551/"
今回は単純に動作させてみるだけなので、Arduino UNOに接続してPCのシリアルモニタで表示できるようにしたいと思います。
【配線図】
【スケッチ】
Arduino IDEから
ファイル>スケッチ例>01.Basics>AnalogReadSerial
のサンプルプログラムを改修して作成しました。
/* AnalogReadSerial Reads an analog input on pin 0, prints the result to the Serial Monitor. Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu). Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground. This example code is in the public domain. http://www.arduino.cc/en/Tutorial/AnalogReadSerial */ /******************************************************************************* 赤外線距離センサ(GP2Y0A21YK) サンプルプログラム ++++++ note ++++++ ・シャープ測距モジュール GP2Y0A21YK ・測定した距離をコンソール画面に表示するプログラム ・測距範囲:10~80cm *******************************************************************************/ const float Vcc = 5.0; //電源電圧(定数) float range_volt; //出力電圧 float range_data; //距離 // the setup routine runs once when you press reset:初期化(電源投入/リセット時1回のみ実行) void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); //9600bpsでシリアルポートを開く } // the loop routine runs over and over again forever: main loop void loop() { int sensorValue = analogRead(A0); //read the input on analog pin 0: range_volt = Vcc * sensorValue / 1023; //アナログピンから読み取った値を元の出力電圧値に戻す // 出力電圧から距離データを作成 //range_data = 27.289 * pow(range_volt, -1.202); //【データシート】距離を計算(累乗近似) pow:べき乗 range_data = 26.123 * pow(range_volt, -1.106); //【実測】距離を計算(累乗近似) pow:べき乗 // 距離データの表示 range_dataの値をハード・シリアルへ出力する(Arduino→PCモニタ) Serial.print("Output Voltage= "); Serial.print(range_volt); //出力電圧を表示 Serial.print("[V], "); Serial.print("Range= "); Serial.print(range_data); //距離を表示 Serial.println("[cm]"); //単位はcm delay(500); //シリアルポートを溢れさせないように ※delay():単位ms }
センサから出力されたアナログ値から距離を求める数式ですが、データシートのグラフと実測値を用いて、Excelにて累乗近似式で求めました。
距離が離れれば離れるほど計測結果はだいぶ怪しくなってきます。理由は距離に対する出力電圧の変化が小さいためだと思います。実用的には50cm未満のところで使うのが良いと思います。測定中の数値のバラつきもかなりありますので、距離を正確に計測するという用途よりも”ざっくりと20cm以下になったらブレーキをかけたい”とか、だいたいの近い距離まで接近したら何か処理をさせる、というような使い方が良いと思います。
#超音波測距センサとしてメジャーであれば、これから使う機会もあるのでしょうけど、個人的にはちょっと使いづらいデバイスだなー、とは思っています。。。