超音波測距モジュールを動かそう②

Arduino

前回は、最も単純な形で超音波測距モジュールとArduinoをつなげて動作させてみました。

今回は2個のArduinoを使って、超音波測距モジュールのデータを送信側Arduinoから受信側Arduinoへシリアル通信させて、PCのシリアルモニタに表示したいと思います。


イメージ図は、こんな感じ↑です。
今回は2個のArduinoのTXピン/RXピンをジャンパー線で直接つなぐのもOKですが、同じことをXBeeを使って実現したいと思います。


配線後の実物がこちら↑


次にスケッチ(プログラム)です。
送信側と受信側の2つのスケッチがあります。
※なお、スケッチの動作確認はしていますが、流用する場合は自己責任でお願いします。

■送信側

/*******************************************************************************
シリアル通信テスト用プログラム(SEN136B5B)

++++++ note ++++++
・送信側
・SEN136B5B
・TXRX直接接続とXBee接続の両方で動作確認済み

*******************************************************************************/

const int SIG_PIN = 7;

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

void loop() {
  // 1. トリガー信号の送信 (OUTPUT)
  pinMode(SIG_PIN, OUTPUT);
  digitalWrite(SIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(SIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(SIG_PIN, LOW);

  // 2. エコー信号の受信 (INPUT)
  pinMode(SIG_PIN, INPUT);
  
  // パルスの返答時間を測定 (タイムアウト: 30000us ≒ 約5m分)
  long duration = pulseIn(SIG_PIN, HIGH, 30000);

  // 3. 距離の計算 (cm)
  float distance = (duration * 0.034) / 2.0;

  // 4. 測定可能範囲(3cm ~ 400cm)の判定と送信
  if (distance >= 3.0 && distance <= 400.0) {
    // 範囲内の場合は距離を出力
    Serial.print("Distance: ");
    Serial.print(distance);
    Serial.println(" cm");
  } else {
    // 3cm未満、400cm超、またはタイムアウト(0)の場合はOut of Rangeを表示
    Serial.println("Out of Range");
  }

  delay(500);
}

■受信側

/*******************************************************************************
シリアル通信テスト用プログラム(SEN136B5B)

++++++ note ++++++
・受信側
・SEN136B5B
・TXRX直接接続とXBee接続の両方で動作確認済み
---
・Serial.available() > 0
 送信側から届いた未読のデータ(バイト)がシリアルバッファに1つ以上入っているかを
 チェックします。
・Serial.readStringUntil('\n')
 送信側が Serial.println() で送信したデータの末尾につく改行文字('\n')を検出する
 までデータを受け取り続けます。読み取った改行文字自体は取り除かれた状態で
 String 型変数へ格納されます。

*******************************************************************************/

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

void loop() {
  if (Serial.available() > 0) {
    // 1行分のデータを読み込む
    String receivedData = Serial.readStringUntil('\n');
    
    // PCのシリアルモニタに出力
    Serial.print("Received -> ");
    Serial.println(receivedData);
  }
}

動作確認はIDEのシリアルモニタで確認します。(RX側です)
部屋の中でモジュールの向きをいろいろ変えると、数値が変わっていきますので、XBeeを介したシリアル通信はうまく動作しているようです。

これで遠隔からのデータ通信ができるようになりましたので、今後いろいろと使い道がありそうです。


コメント

タイトルとURLをコピーしました