SSブログ

Arduinoで距離を測る(2)【赤外線測距センサ with XBee(動作確認)】 [Arduino]

せっかくなので、超音波測距センサのときと同じように、測定したアナログ値をバイナリデータとしてXBee間でシリアル通信して、PCのシリアルモニタに表示をさせます。

赤外線測距センサの「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");
    }
  }
}

赤外線測距センサ with XBee.JPG



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

Arduinoで距離を測る(2)【赤外線測距センサ】 [Arduino]

Arduinoで距離を測る(1)で超音波測距センサを使ってみました。XBee経由で遠隔からデータを取得することもできました。
次は、赤外線距離センサの「GP2Y0A21YK0F」を使います。
とりあえず、赤外線の距離センサと言ったらコレ!、というくらいネットでもヒットしますので定番なんでしょうね。これです↓
シャープ測距モジュール GP2Y0A21YK0F
GP2Y0A21YK.JPG
"http://akizukidenshi.com/catalog/g/gI-02551/"

今回は単純に動作させてみるだけなので、Arduino UNOに接続してPCのシリアルモニタで表示できるようにしたいと思います。

【配線図】
赤外線測距センサ_ブレッドボード.jpg
【スケッチ】
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にて累乗近似式で求めました。
GP2Y0A21YK0F 出力電圧-距離換算.jpg

距離が離れれば離れるほど計測結果はだいぶ怪しくなってきます。理由は距離に対する出力電圧の変化が小さいためだと思います。実用的には50cm未満のところで使うのが良いと思います。測定中の数値のバラつきもかなりありますので、距離を正確に計測するという用途よりも”ざっくりと20cm以下になったらブレーキをかけたい”とか、だいたいの近い距離まで接近したら何か処理をさせる、というような使い方が良いと思います。
#超音波測距センサとしてメジャーであれば、これから使う機会もあるのでしょうけど、個人的にはちょっと使いづらいデバイスだなー、とは思っています。。。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。