スタジオ ミュウ

賢いライントレースロボットの製作(RS-232C版)

赤外線センサー2個使用したライントレースロボット

◆反射型赤外線センサー(MYU-506 ミュウロボ赤外線センサー)
床に引かれたラインを検知するため反射型赤外線センサーを使います。
2個のセンサーを使いコースアウトしても自分で考えコース復帰します。

<使用パーツ>
●MYU-527 ミュウロボ基本セット(RS-232C) 3,456円(8%税込)
●MYU-506 ミュウロボ赤外線センサー 540円(8%税込) 2個使用
●LED 2個

★動画(230KB)はこちら

◆賢いライントレースロボット
多数のセンサーを使えば別ですが少数のセンサーだけでライントレースロボットを作った場合、ロボットの動きが早いとコースから外れてしまい困ってしまいます。
右図をみてください。コースアウトしてもロボットが直前のコースを覚えてその方向に小回りすることが出来ればコースに戻ることができます。結果として高速でトレース可能なロボットを作ることができます。
※ミュウロボの変数演算機能を利用すれば賢いロボットのプログラムが可能です。

<センサーとLEDの取り付けと配線>

センサーの信号線である白コードは右センサーをIn2に、左センサーをIn3に接続します。また赤コードは+Vに黒コードは-Vに配線します。
2個のLEDはアノード(長い方)をRC3とRC4に、反対側を基板のLED端子にハンダ付けします。

●計測/リモートボタン(ミュウロボ転送ソフトMYU BASIC)
基板とPCを転送ケーブルで接続、計測/リモートボタンを押すと右のダイヤログが現れます。
出力ポートのRC3とRC4にチェックを入れると上図で配線したLEDが光ります。
デジタル計測ボタンを押すとリアルタイム計測が始まり赤外線センサーの状態がわかります。※床が黒は○、白は●になる。
左のプルダウンメニューからAN3を選び、AN3計測ボタンを押すとIn3側の赤外線センサーのアナログ値がリアルタイムで表示されます。その値を参考にしきい値を設定します。同様にAN2を選ぶとIn2側のアナログ計測が可能になります。
※アナログ計測は入力電圧を8BIT(0-255)または10BIT(0-1023)の値として返します。

//構造化ドリトルでアナログ計測(In3)
値表示=フィールド!作る。
ロボ太=MYU!"com1"作る。
ロボ太:計測=「ロボ太! ひらけごま
  74 出力 0.01 待つ  //AN命令CODE
  3 出力 0.01 待つ  //In3のアナログ値をAレジスタにセット
  221 出力 0.1 待つ。 //DECRS命令CODE
  値表示!(ロボ太!(ロボ太!データ数?)値?)書く。
  ロボ太!とじろごま。」。
計測ボタン=ボタン!"計測" 作る -200 220 位置。
計測ボタン:動作=「ロボ太!計測」。

●LED制御プログラム
LEDは、ポートCのRC3とRC4のビットを1にすると光り、0にすると消えます。
下のプログラムは0.1秒ごとにLEDを交互に点灯します。

//LEDを交互に点滅する(ミュウロボ転送ソフト)
繰り返す{
  PC,B'1000'  //RC3を1にする
  待つ,1     //0.1秒の待ち
  PC,B'10000'   //RC4を1にする
  待つ,1
}

//LEDを交互に点滅する(MYU BASIC)
Do
  PC=B'1000'  //RC3を1にする
  Wait 1     //0.1秒の待ち
  PC=B'10000'   //RC4を1にする
  Wait 1
Loop

//LEDを交互に点滅する(構造化ドリトル)
ロボ太=MYU!"com1"作る。
ロボ太:転送命令=「!はじめロボット
 「!0b1000 PC   //RC3を1にする
   1 時間     //0.1秒の待ち
   0b10000 PC  //RC4を1にする
   1 時間」繰り返す
おわりロボット」。
ロボ太!転送命令。

●赤外線センサーチェックプログラム
センサーは床との距離は6-10mmぐらいに2つのセンサー間の距離はラインの幅以下に取り付けます。
下のプログラムはラインの有る無しをLEDの点灯で確認できます。これを利用してセンサーの動作確認を行います。センサーの感度はトリマで調節できます。

//赤外線センサー調整用プログラム (ミュウロボ転送ソフト)
繰り返す{
  入力あり(2){      //右センサーが黒なら
    入力あり(3){    //左右とも黒
      PC,B'11000' //LED両方点灯
    }
    そうでなければ{  //右:黒、左:白
      PC,B'1000'
    }
  }
  そうでなければ{
    入力なし(3){     //左右とも白
      PC,0       //LED両方消灯
    }
    そうでなければ{   //右:白、左:黒
      PC,B'10000'
    }
  }
}
//※最新の2012/11/24版をお使いください
//赤外線センサー調整用プログラム (MYU BASIC)
Do
  If In(2)=0 Then     //右センサーが黒なら
    If In(3)=0 Then    //左右とも黒
      PC=B'11000' //LED両方点灯
    Else         //右:黒、左:白
      PC=B'1000'
    EndIf
  Else
    If In(3)=1 Then     //左右とも白
      PC=0       //LED両方消灯
    Else          //右:白、左:黒
      PC=B'10000'
    EndIf
  EndIf
Loop

//赤外線センサー調整用プログラム (構造化ドリトル)
ロボ太=MYU!"com1"作る。
ロボ太:転送命令=「!はじめロボット
「!
  「!2 入力あり」なら      //右センサーが黒なら
    「!「!3 入力あり」なら //左右とも黒
      「!0b11000 PC」     //LED両方点灯
    そうでなければ
      「!0b1000 PC」実行
    」
  そうでなければ
    「!「!3 入力なし」なら //左右とも白
      「!0 PC」        //LED両方消灯
    そうでなければ        //右:白、左:黒
      「!0b10000 PC」実行
    」実行
」繰り返す
おわりロボット」。
ロボ太!転送命令。

●賢いライントレースロボットプログラム1
センサーの動作を確認したらライントレースのプログラムを作ってみます。直前の動きを覚えるためAレジスタや変数を使います。

//ライントレースロボット (ミュウロボ転送ソフト)
繰り返す{
  入力あり(2){      //右センサーが黒なら
    入力あり(3){    //左右とも黒
      前進
    }
    そうでなければ{  //右:黒、左:白
      左前
      A,1       //左前の動きをAレジスタに1として保存
    }
  }
  そうでなければ{
    入力なし(3){     //コースアウトの場合
      もし(A = 1){   //直前が左前なら
        右後
      }
      そうでなければ{
        左後
      }
    }
    そうでなければ{   //右:白、左:黒
      右前
      A,0       //右前の動きをAレジスタに0として保存
    }
  }
}
//※最新の2012/11/24版をお使いください
//ライントレースロボット (MYU BASIC)
Byte C           //Byte型変数Cを宣言
Do
  If In(2)=0 Then      //右センサーが黒なら
    If In(3)=0 Then    //左右とも黒
      前進
    Else         //右:黒、左:白
      左前
      C=1      //左前の動きを変数Cに1として保存
    EndIf
  Else
    If In(3)=1 Then   //コースアウトの場合
      If C=1 Then    //直前が左前なら
        右後
      Else
        左後
      EndIf
    Else          //右:白、左:黒
      右前
      C=0      //右前の動きを変数Cに0として保存
    EndIf
  EndIf
Loop

//ライントレースロボット (構造化ドリトル)
ロボ太=MYU!"com1"作る。
ロボ太:転送命令=「!はじめロボット
「!
  「!2 入力あり」なら        //右センサーが黒なら
    「!「!3 入力あり」なら  //左右とも黒
      「!前進」
    そうでなければ         //右:黒、左:白
      「!左前 1 A」実行     //左前の動きをAレジスタに1として保存
    」
  そうでなければ
    「!「!3 入力なし」なら   //コースアウトの場合
      「!「!1 等しいA」なら   //直前が左前なら
        「!右後」
      そうでなければ       //右:白、左:黒
        「!左後」実行
      」
    そうでなければ
      「!右前 0 A」実行     //右前の動きをAレジスタに0として保存
    」実行
」繰り返す
おわりロボット」。
ロボ太!転送命令。

●賢いライントレースロボットプログラム2
前のプログラムにLEDを点灯する動作を追加します。下の表を参考にポートCに値をセットします。


※"前進"とRC4のLEDを点灯するには上の表からRC4,RC2,RC0のビットを'1'にすることで可能になります。

//ライントレースロボット (ミュウロボ転送ソフト)
A,0            //Aレジスタを0にする
繰り返す{
  入力あり(2){      //右センサーが黒なら
    入力あり(3){     //左右とも黒
      PC,B'11101' //前進LED両方点灯
    }
    そうでなければ{   //右:黒、左:白
      PC,B'1100'    //左前RC3点灯
      A,1         //左前の動きをAレジスタに1として保存
    }
  }
  そうでなければ{
    入力なし(3){        //コースアウトの場合
      もし(A = 1){      //直前が左前なら
        PC,B'100000' //右後LED両方消灯
      }
      そうでなければ{
        PC,B'10'   //左後LED両方消灯
      }
    }
    そうでなければ{   //右:白、左:黒
      PC,B'10001'  //右前RC6点灯
      A,0        //右前の動きをAレジスタに0として保存
    }
  }
}
//※最新の2012/11/24版をお使いください
//ライントレースロボット (MYU BASIC)
Byte C           //Byte型変数Cを宣言
Do
  If In(2)=0 Then      //右センサーが黒なら
    If In(3)=0 Then    //左右とも黒
      PC=B'11101' //前進LED両方点灯
    Else          //右:黒、左:白
      PC=B'1100'    //左前RC3点灯
      C=1        //左前の動きを変数Cに1として保存
    EndIf
  Else
    If In(3)=1 Then      //コースアウトの場合
      If C=1 Then      //直前が左前なら
        PC=B'100000' //右後LED両方消灯
      Else
        PC=B'10'   //左後LED両方消灯
      EndIf
    Else           //右:白、左:黒
      PC=B'10001'  //右前RC6点灯
      C=0         //右前の動きを変数Cに0として保存
    EndIf
  EndIf
Loop

//ライントレースロボット (構造化ドリトル)
ロボ太=MYU!"com1"作る。
ロボ太:転送命令=「!はじめロボット
「!
  「!2 入力あり」なら      //右センサーが黒なら
    「!「!3 入力あり」なら  //左右とも黒
      「!0b11101 PC」     //前進LED両方点灯
    そうでなければ        //右:黒、左:白
      「!0b1100 PC 1 A」実行 //左前の動きをAレジスタに1として保存
    」
  そうでなければ
    「!「!3 入力なし」なら   //コースアウトの場合
      「!「!1 等しいA」なら  //直前が左前なら
        「!0b100000 PC」   //右後LED両方消灯
      そうでなければ
        「!0b10 PC」実行   //左後LED両方消灯
      」
    そうでなければ
      「!0b10001 PC 0 A」実行 //右前の動きをAレジスタに0として保存実
    」実行
」繰り返す
おわりロボット」。
ロボ太!転送命令。

●賢いライントレースロボットプログラム3
いままでのプログラムはデジタル入力によるものでした。デジタル入力の場合、しきい値の調整は赤外線センサーのトリマで行います。
これに対してアナログ入力を使うとプログラム側でしきい値を設定できます。
基板とPCを転送ケーブルで接続し計測/リモートボタン>AN3計測ボタンを押すとアナログ計測が行われます。この値を参考にプログラムします。
※アナログ入力はAN命令を使います。(In2がAN2、In3がAN3になる)

//ライントレースロボット (ミュウロボ転送ソフト)
繰り返す{
  AN,2          //AN2のアナログ値をAレジスタにセット
  もし(A < 75){      //AN2の値が75以下(黒)なら
    AN,3        //AN3のアナログ値をAレジスタにセット
    もし(A < 75){    //AN3の値が75以下(左右とも黒)なら
      PC,B'11101' //前進LED両方点灯
    }
    そうでなければ{  //右:黒、左:白
      PC,B'1100'  //左前RC3点灯
      IX,1      //左前の動きをIXレジスタに1として保存
    }
  }
  そうでなければ{
    AN,3        //AN3のアナログ値をAレジスタにセット
    もし(A > 75){    //コースアウトの場合
      IXA       //IXの値をAレジスタにセット
      もし(A = 1){   //直前が左前なら
        PC,B'100000' //右後LED両方消灯
      }
      そうでなければ{
        PC,B'10'   //左後LED両方消灯
      }
    }
    そうでなければ{   //右:白、左:黒
      PC,B'10001'  //右前RC6点灯
      IX,0      //右前の動きをIXレジスタに0として保存
    }
  }
}
//※最新の2012/11/24版をお使いください
//ライントレースロボット (MYU BASIC)
Byte C           //Byte型変数Cを宣言
Do
  If AN(2) < 75 Then   //AN2の値が75以下(黒)なら
    If AN(3) < 75 Then //AN3の値が75以下(左右とも黒)なら
      PC=B'11101' //前進LED両方点灯
    Else           //右:黒、左:白
      PC=B'1100'   //左前RC3点灯
      C=1         //左前の動きを変数Cに1として保存
    EndIf
  Else
    If AN(3) > 75 Then   //コースアウトの場合
      If C=1 Then    //直前が左前なら
        PC=B'100000' //右後LED両方消灯
      Else
        PC=B'10'    //左後LED両方消灯
      EndIf
    Else           //右:白、左:黒
      PC=B'10001'  //右前RC6点灯
      C=0         //右前の動きを変数Cに0として保存
    EndIf
  EndIf
Loop

//ライントレースロボット (構造化ドリトル)
ロボ太=MYU!"com1"作る。
ロボ太:転送命令=「!はじめロボット
「!2 AN              //AN2のアナログ値をAレジスタにセット
  「!75 以下のA」なら    //AN2の値が75以下(黒)なら
    「!3 AN          //AN3のアナログ値をAレジスタにセット
    「!75 以下のA」なら   //AN3の値が75以下(左右とも黒)なら
      「!0b11101 PC」     //前進LED両方点灯
    そうでなければ        //右:黒、左:白
      「!0b1100 PC 1 IX」実行 //左前の動きをIXレジスタに1として保存
    」
  そうでなければ
    「!3 AN           //AN3のアナログ値をAレジスタにセット
      「!75 以上のA」なら   //コースアウトの場合
      「!IXA         //IXの値をAレジスタにセット
      「!1 等しいA」なら  //直前が左前なら
        「!0b100000 PC」   //右後LED両方消灯
      そうでなければ
        「!0b10 PC」実行   //左後LED両方消灯
      」
    そうでなければ
      「!0b10001 PC 0 IX」実行 //右前の動きをIXレジスタに0として保存
    」実行
」繰り返す
おわりロボット」。
ロボ太!転送命令。