PR

【mBotプログラミング例⑧】ライントレースセンサーで自動運転(Arduino編)|C言語

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

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

この回では、ライントレースセンサーを活用して、ラインに沿って自動運転するプログラムを作成します。
ライントレースの動きは、倉庫内の仕分けロボット配送ロボットの仕組みにも似ており、実社会での応用例をイメージしながら学ぶことができます。

初心者でも無理なく取り組めるよう、具体的な手順をわかりやすく解説しますので、ぜひ最後までお付き合いください!

目標

  • ライントレースセンサーの仕組みを理解する。
  • ライントレースセンサーに関するAPIを学ぶ。
  • ラインを検知して自動運転するプログラムを作成する。

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

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

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

mBotのライントレースセンサーの基本

ライントレースとは

ライントレースとは、地面に描かれたライン(通常は黒や白)をセンサーを使って検知し、そのラインに沿ってロボットを走らせる技術です。
mBotのような教育用ロボット自動車の高速道路での自動運転や、物流システムの自動化などの分野で広く利用されています。

ライントレースセンサーとは

ライントレースセンサーは、地面の色の違いを検知するセンサーです。
mBotには、を識別できるセンサーが2つ搭載されており、ラインの左右位置を判定できます。

mBot左下に位置するセンサーが『sensor1』、右下が『sensor2』となります。

また、各センサーには素子が2つ付いています。
1つはLEDライト、もう一つがフォトダイオード(光センサー)です。

ライントレースセンサーの仕組みを次に示します。

  1. LEDライトの光が地面に当たる
  2. 光が反射する量は、「白い地面=多い」「黒い地面=少ない」
  3. 光センサーで検出する光の量に応じて、『白』または『黒』と判断する

『お掃除ロボット』が階段から落ちないのも、同様の仕組みです。

ライントレースセンサーに関するAPI

APIとは

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

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

mBotのライントレースセンサーを使用するためには、MeLineFollowerクラスを利用します。
このクラスを使うことで、ライントレースセンサーの値を簡単に取得できます。

ライントレースセンサーの値の読み出しには、以下の関数を使用します。

MeLineFollower line(PORT_2);       // ライントレースセンサー用のインスタンス(オブジェクト)を作成する
uint8_t val = line.readSensors();  // ライントレースセンサーの値を取得

読み出し値の意味は次の通りです。

センサー値左センサー右センサー意味
000両方とも黒
101左:黒
右:
210左:白
右:
311両方とも白

各センサーの値は、黒の認識で『0』、白の認識で『1』です。
左右のセンサー値を0,1で並べて、2進数としてみた時の値が0~3となります。

2進数とは、0と1の2つの数字だけを使って数を表現する方法のことです。
コンピュータやデジタルシステムで使われる数値表現であり、非常に重要な概念です。

ここでは簡単に10進数と2進数の対応表を示します。

10進数2進数
0000
1001
2010
3011
4100
5101

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

APIを用いて、次のような簡単なプログラムが作成できます。
ライントレースセンサーの値を読み出して、読み出し値に応じてLEDライトの色を変化させます。

#include <MeMCore.h>

MeLineFollower line(PORT_2);    // ライントレースセンサーのオブジェクトを作成
MeRGBLed rgb(7,2);              // LED制御用のオブジェクトを作成する

uint8_t val;                    // ライントレースセンサー読み出し値格納用変数

void setup() {}

void loop() {
  val = line.readSensors();       // ライントレースセンサーの値をvalに格納する

  if(val == 0){
    rgb.setColor(0, 255, 0, 0);  // 赤
    rgb.show();                  // 設定した色を反映する
  }
  else if(val == 1){
    rgb.setColor(0, 0, 255, 0);  // 緑
    rgb.show();                  // 設定した色を反映する
  }
  else if(val == 2){
    rgb.setColor(0, 0, 0, 255);  // 青
    rgb.show();                  // 設定した色を反映する
  }
  else{
    rgb.setColor(0, 255, 255, 255);  // 白
    rgb.show();                  // 設定した色を反映する
  }
}

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

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

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

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

MeLineFollowerとは?

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

class MeLineFollower : public MePort
{
public:
  MeLineFollower(void);
  MeLineFollower(uint8_t port);
  void setpin(uint8_t Sensor1,uint8_t Sensor2);
  uint8_t readSensors(void);
  bool readSensor1(void);
  bool readSensor2(void);
private:
  volatile uint8_t  _Sensor1;
  volatile uint8_t  _Sensor2;
};

line(PORT_2)とは?

MeLineFollower line(PORT_2);

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

  • MeLineFollowerクラス(設計図)
  • line(PORT_2)はそのクラスから作られたインスタンス(オブジェクト)
    • PORT_2はmBotのライントレースセンサーが接続されるポート
MeLineFollower line(PORT_2);        // ライントレースセンサーを制御するインスタンス(オブジェクト)を作成
uint8_t val = line.readSensors();   // ライントレースセンサーの値を読み出して変数に格納

このコードを書くことで、
①mBotのライントレースセンサーを制御できるオブジェクトが生成され、
readSensors() メソッドを使ってライントレースセンサーの値(0,1,2,3)を読み出すことができます。

mBotのライントレースセンサーを使った自動走行プログラム

以下のコードは、『ライントレースセンサーを使って自動走行させる』プログラムです。

#include <MeMCore.h>

MeLineFollower line(PORT_2);    // ライントレースセンサーのオブジェクトを作成
MeDCMotor MoterL(M1);
MeDCMotor MoterR(M2);

uint8_t val;                    // ライントレースセンサー読み出し値格納用変数
int speed = 150;

void setup() {}

void loop() {
  val = line.readSensors();     // ライントレースセンサーの値をvalに格納する

  if(val == 0){                 // 両方とも黒
    MoterL.run(-speed);         // 前進
    MoterR.run(speed);
  }
  else if(val == 1){            // 左が黒、右が白
    MoterL.run(speed);          // 左回転
    MoterR.run(speed);
  }
  else if(val == 2){            // 左が白、右が黒
    MoterL.run(-speed);         // 右回転
    MoterR.run(-speed);
  }
  else{                         // 両方とも白
    MoterL.run(speed);          // 後退
    MoterR.run(-speed);
  }
}

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

黒色のライン上を走行するようプログラムしています。

ライントレースセンサーの読み取り値から、現在の状態が「ライン上」「右に外れている」「左に外れている」「両方外れている」のどれであるかを確認して、mBotの動作を切り替えています。

まとめ

ライントレースセンサーを使った自動運転プログラムを作成することで、センサーとモーターの連携について深く学ぶことができます。
このような知識は、単なるロボットの操作にとどまらず、現実世界の様々な場面で応用する力となります。
さらに、今回学んだ技術は他のセンサーや新しいロジックとの組み合わせで、より複雑なプログラムを作成する土台になります。

次回は、赤外線センサーを使った協調制御プログラムを作成します。

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

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

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