SSブログ

Arduinoで距離を測る(1)【2バイトのシリアル通信】 [Arduino]

超音波測距センサの「SEN136B5B」の測定レンジは3cm~4m(400cm)です。
測定した距離をバイナリデータとしてXBee間でシリアル通信して、PCのシリアルモニタに表示をさせたいのですが、ここで問題があります。
Serial.write(val)では送信する値(val)は1バイトなのです。
これでは測定レンジの最大値4m(400cm)は送ることができません。。。実際、テストスケッチで試してみても255はシリアルモニタに表示されましたが、256は0となってしまいました。

"それでは1バイトを超えたバイナリデータを送信するためには?"とネットを探し回ってみたところ、
kougaku (id:kougaku-navi)さんの『Imaginary Code』というタイトルのブログから「Arduinoのシリアル通信でint型のデータをやりとりする」のページが分かりやすかったので、参考にしたいと思います。
"https://kougaku-navi.hatenablog.com/entry/20140501/p1"
このページでは「12345」と「-12345」の2バイトのバイナリデータを交互に送信します。

【配線図】
最初はXBeeを使わずに、シリアルポートのTX/RXを有線でつなげて試してみます。
Arduino_シリアル通信_ブレッドボード.jpg

【スケッチ】
送信側から「12345」と「-12345」の2種類のデータを交互に送り、受信側でどちらのデータがきたかチェックして13番ピンに繋がっているLEDをON/OFFします。500ms間隔でLEDが点滅すればOKです。
また、受信側に接続したシリアルモニタで数値を表示します。←追加

<送信側>
 ・int型のデータを上位バイトと下位バイトに分けて送信する
 ・データを正しい順序で受信するためにヘッダをつけて送信する
/*******************************************************************************
テスト用シリアル通信プログラム2byte(送信側)

++++++ note ++++++
・テスト用シリアル通信プログラム(2byte送信)
 TX→RX→PCモニタの一連の流れを確認する。
・下記URLのサイトからサンプルプログラムをコピー
 https://kougaku-navi.hatenablog.com/entry/20140501/p1

*******************************************************************************/
void setup() {
  Serial.begin(9600);
}

void loop() {
  sendIntData(12345); // int型データの送信
  delay(500);
  
  sendIntData(-12345); // int型データの送信
  delay(500); 
}

// int型のデータを送信する関数
void sendIntData(int value) {
  Serial.write('H'); // ヘッダの送信
  Serial.write(lowByte(value)); // 下位バイトの送信
  Serial.write(highByte(value)); // 上位バイトの送信
}


<受信側>
 ・3バイト(ヘッダ+int)以上のデータが着ているか確認
 ・データが着てたらまずヘッダがあるか確認
 ・ヘッダがあったら、下位バイトと上位バイトを読み取り、その値を合体してint型のデータを復元
/*******************************************************************************
テスト用シリアル通信プログラム2byte(受信側)

++++++ note ++++++
・テスト用シリアル通信プログラム(2byte送信)
 TX→RX→PCモニタの一連の流れを確認する。
・下記URLのサイトからサンプルプログラムをコピー
 https://kougaku-navi.hatenablog.com/entry/20140501/p1
・recv_dataの値をハード・シリアルへ出力する(Arduino→PCモニタ)

*******************************************************************************/
int recv_data; // 受信データ

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

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型データを復元
      Serial.println(recv_data);      //recv_dataの値をハード・シリアルへ出力する(Arduino→PCモニタ)←追加
    }
  }

  // 受信したデータに基づいてLEDをON/OFF
  if ( recv_data == 12345 ) {
    digitalWrite(13, HIGH);
  }
  if ( recv_data == -12345 ) {
    digitalWrite(13, LOW);
  }
}




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

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

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