6. 超音波モジュールで遊ぼう

5. 障害物回避モジュールを使って遊ぼう のプロジェクトでは、2つの赤外線障害物回避モジュールを使用して障害物を避けていますが、赤外線障害物回避モジュールの検出距離は短いため、車が障害物を避けるのが遅くなる可能性があります。

このプロジェクトでは、車が遠くの障害物を感知して判断を下すために、超音波モジュールを使用して長距離の検出を行います。

必要な部品

このプロジェクトには、以下の部品が必要です。

一式を購入すると非常に便利です。リンクはこちら:

名前

このキットのアイテム

リンク

3 in 1 Starter Kit

380+

3 in 1 Starter Kit

以下のリンクから個別に購入することもできます。

コンポーネントの紹介

購入リンク

Arduino Uno R4 Minima

BUY

L9110 モータードライバーモジュール

-

TTモーター

-

超音波モジュール

BUY

配線図

超音波センサーモジュールは、超音波を使用してオブジェクトまでの距離を測定する器具です。 2つのプローブがあります。一つは超音波を送信するためのもの、もう一つは送受信の時間を距離に変換し、装置と障害物との距離を検出するためのものです。

以下の図に従って回路を組み立ててください。

超音波モジュール

R4ボード

Vcc

5V

Trig

3

Echo

4

Gnd

GND

../_images/car_6.png

コード

注釈

  • 3in1-kit\car_project\6.ultrasonic_module のパス下で 6.ultrasonic_module.ino ファイルを開いてください。

  • または、このコードを Arduino IDE にコピーしてください。

  • あるいは、 Arduino Web Editor を使用してコードをアップロードしてください。

コードが正常にアップロードされたら、車を壁の方向に向けてください。距離が遠すぎる場合は前進し、近すぎる場合は後退し、安全な距離であれば停止します。

どのように動作するのか?

このプロジェクトは、超音波モジュールから読み取った距離に基づいて車を動かすものです。

  1. 超音波モジュールのピン定義を追加します。 trigPin は超音波を送信するために使用されるため、 OUTPUT に設定します。 echoPin は超音波を受信するために INPUT に設定されます。

    ...
    const int trigPin = 3;
    const int echoPin = 4;
    
    void setup() {
    ...
    
    //超音波
        pinMode(echoPin, INPUT);
        pinMode(trigPin, OUTPUT);
    }
    
  2. 超音波モジュールから得られた距離の値をまず読み取ります。距離が25より大きい場合、車を前進させます。距離が2-10cmの間であれば、車を後退させます。それ以外(10~25の間)の場合は、停止します。

    void loop() {
        float distance = readSensorData();
        if (distance > 25) {
            moveForward(200);
        }
        else if (distance < 10 && distance > 2) {
            moveBackward(200);
        } else {
            stopMove();
        }
    }
    
  3. readSensorData() 関数について。

    超音波モジュールの送信機は、2usごとに10usの矩形波信号を送信し、受信機は範囲内に障害物がある場合に高レベルの信号を受信します。 pulseIn() 関数を使用して送信から受信までの時間を記録し、音速340m/sで割った後、2で割ります。その結果、このモジュールと障害物との間の距離(単位:cm)が得られます。

    float readSensorData() {
        digitalWrite(trigPin, LOW);
        delayMicroseconds(2);
        digitalWrite(trigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigPin, LOW);
        float distance = pulseIn(echoPin, HIGH) / 58.00; // (340m/s*1us)/2と同等
        return distance;
    }
    
  • pulseIn(pin, value)

    • pin: パルスを読み取りたいArduinoのピンの番号。許可されているデータ型:int。

    • value: 読み取りたいパルスのタイプ:HIGHまたはLOW。許可されているデータ型:int。

    ピン上のパルス(HIGHまたはLOW)を読み取ります。たとえば、valueがHIGHの場合、 pulseIn() はピンがLOWからHIGHに変わるのを待ち、タイミングを開始し、ピンがLOWになるのを待ってタイミングを停止します。