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を有線でつなげて試してみます。
【スケッチ】
送信側から「12345」と「-12345」の2種類のデータを交互に送り、受信側でどちらのデータがきたかチェックして13番ピンに繋がっているLEDをON/OFFします。500ms間隔でLEDが点滅すればOKです。
また、受信側に接続したシリアルモニタで数値を表示します。←追加
<送信側>
・int型のデータを上位バイトと下位バイトに分けて送信する
・データを正しい順序で受信するためにヘッダをつけて送信する
<受信側>
・3バイト(ヘッダ+int)以上のデータが着ているか確認
・データが着てたらまずヘッダがあるか確認
・ヘッダがあったら、下位バイトと上位バイトを読み取り、その値を合体してint型のデータを復元
測定した距離をバイナリデータとして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を有線でつなげて試してみます。
【スケッチ】
送信側から「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); } }
2020-07-11 14:46
nice!(0)
コメント(0)
コメント 0