PR

【mBotプログラミング例⑦】超音波センサーで障害物回避(Arduino編)|C言語

Arduino(C/C++)
この記事は約7分で読めます。

今回は、mBotプログラミングシリーズ(Arduino編)の第7回です。

この回では、mBotに搭載されている超音波センサーを使って、障害物を検知し、それを回避するプログラムを作成します。
障害物を検知して回避する動きは、ロボット工学自動運転技術にも通じる重要なトピックです。ぜひ一緒に学んでいきましょう!

目標

  • 超音波センサーの仕組みを理解する
  • 超音波センサーの値を取得するプログラムを作る
  • 障害物を検知して回避する動きをプログラミングする

Arduinoプログラムファイルの作成

ここでは、プログラムファイルをイチから作成していきます。
Arduino IDEを立ち上げ、ファイル -> 新規スケッチで真っ新なプロジェクトを用意しましょう。

事前にmBotのArduinoライブラリを導入しておいてください。
ライブラリの導入に関しては、次の記事を参考にしてください。

mBotの超音波センサーの基本

超音波センサーとは

超音波センサーは、mBotの目になっている部分で、音波を使って物体までの距離を測ることができます。
前方にある障害物の距離をセンチメートル単位で計測でき、測定範囲は3cm~400cm(4m)です。

右目の下に『T』、左目には『R』が記載されています。
これは、Transmitter(送信機)とReceiver(受信機)を意味しています。

超音波センサーの仕組みを次に示します。

  1. 送信機(T)から超音波を出す
  2. 何かに反射して超音波が跳ね返ってくる
  3. 受信機(R)で跳ね返ってきた超音波を受信する
  4. 送信から受信までの時間を測定し、距離を計算する

同じような仕組みで、コウモリやイルカは超音波を発して、その反射音から物の形や距離を測っています。

超音波センサーに関するAPI

APIとは

API(Application Programming Interface)は、ソフトウェアやハードウェアが外部のプログラムとやり取りをするためのインターフェース(接点)です。
簡単に言うと、『決められたルールに従って機能を利用するための仕組み』です。

mBotのArduinoライブラリを使用すると、mBotのモーターLEDブザーセンサーなどの各機能を簡単に利用できます。

mBotの超音波センサーを使用するためには、MeUltrasonicSensorクラスを利用します。
このクラスを使うことで、超音波センサーの距離データを簡単に取得できます。

超音波センサーの距離データの読み出しには、以下の関数を使用します。

MeUltrasonicSensor ultr(PORT_3);   // 超音波センサー用のインスタンス(オブジェクト)を作成する
int distance = ultr.distanceCm();  // 障害物までの距離の値を取得

APIを利用した簡単なプログラム

APIを用いて、次のような簡単なプログラムが作成できます。
超音波センサーの値を読み出して、読み出した値(距離)に応じたブザー音を出します。

#include <MeMCore.h>

MeUltrasonicSensor ultr(PORT_3);          // 超音波センサーのオブジェクトを作成
MeBuzzer buzzer;                          // ブザーのオブジェクトを作成

void setup() {}

void loop() {
  int distance = ultr.distanceCm();       // 超音波センサーの値をdistanceに格納する
  buzzer.tone(distance * 10 , 50);        // 超音波センサーの値の周波数を 50ms再生
}

Arduino IDEからmBotへ書き込みして、動作を確認してみましょう。

クラスとインスタンス(オブジェクト)について

このコードを理解するためには、「クラス」と「インスタンス(オブジェクト)」の概念を知ることが重要です。

クラスとインスタンス(オブジェクト)については、こちらで説明しています。

MeUltrasonicSensorとは?

MeUltrasonicSensorは、mBotの超音波センサーを制御するためのクラスです。
このクラスは、Makeblockのライブラリ(MeUltrasonicSensor.h)に含まれており、mBotの超音波センサーの値を読み出すことができます。

class MeUltrasonicSensor : public MePort
{
public:
  MeUltrasonicSensor(void);
  MeUltrasonicSensor(uint8_t port);
  void setpin(uint8_t SignalPin);
  double distanceCm(uint16_t = 400);
  double distanceInch(uint16_t = 180);
  long measure(unsigned long = 30000);
private:
  volatile uint8_t  _SignalPin;
  volatile bool _measureFlag;
  volatile long _lastEnterTime;
  volatile float _measureValue;
};

ultr(PORT_3)とは?

MeUltrasonicSensor ultr(PORT_3);

このコードは、mBotの超音波センサーを制御するためのインスタンス(オブジェクト)を作成しています。

  • MeUltrasonicSensorクラス(設計図)
  • ultr(PORT_3)はそのクラスから作られたインスタンス(オブジェクト)
    • PORT_3はmBotの超音波センサーが接続されるポート
MeUltrasonicSensor ultr(PORT_3);    // 超音波センサーを制御するインスタンス(オブジェクト)を作成
int distance = ultr.distanceCm();   // 超音波センサーの値を読み出して変数に格納

このコードを書くことで、
①mBotの超音波センサーを制御できるオブジェクトが生成され、
distanceCm() メソッドを使って超音波センサーの値をセンチメートル単位で読み出すことができます。

mBotの超音波センサーを使った障害物回避プログラム

以下のコードは、『超音波センサーを使って障害物を回避させる』プログラムです。

#include <MeMCore.h>

MeUltrasonicSensor ultr(PORT_3);
MeDCMotor MoterL(M1);
MeDCMotor MoterR(M2);
int distance;
int speed = 150;

void setup() {}

void loop() {
  distance = ultr.distanceCm();   // 超音波センサーの値(障害物までの距離)を取得

  if(distance >= 15){        // 障害物との距離が15cm以上は前進
    MoterL.run(-speed);
    MoterR.run(speed);
  }
  else{                      // 障害物との距離が15cm未満は方向転換
    MoterL.run(-speed);
    MoterR.run(-speed);
    delay(800);              // 800ms回転を継続
  }
}

Arduino IDEからmBotへ書き込みして、動作を確認してみましょう。

超音波センサーで障害物との距離を読み出し、15cm以上の場合はmBotを前進、15cm未満の場合はmBotを0.8秒間右回転させます。

まとめ

今回は、超音波センサーの動作原理と、超音波センサーを使ったmBotの基本的なプログラムを学びました。
さらに、mBotが自律的に障害物を回避するプログラミングについて学びました。
この機能を活用して、迷路を通り抜けるチャレンジなど、さらに面白いプログラムに挑戦してみてください。

次回は、ライントレースセンサーを用いた自動運転プログラムを作成します。

mBlockを使ったmBotのプログラミング方法を丁寧に解説していておススメです。

mBotを使用した拡張的な遊びは『mBotでものづくりをはじめよう』が参考になります。mBotのパーツを段ボールと組み合わせてオリジナルのロボットを作るといったような拡張的な遊びが楽しめます。

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