スタジオ ミュウ

賢いライントレースロボットの製作(USB版)

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

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

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

★動画(1.2M)はこちら

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

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

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

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

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

//LEDを交互に点滅する(MYU-USB転送ソフト)
繰り返す{
  PC,B'1000000'  //RC6を1にする
  待つ,1     //0.1秒の待ち
  PC,B'1000'   //RC3を1にする
  待つ,1
}

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

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

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

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

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

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

命令 RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 10進値 2進値
停止                 0 B'0'
左前               1 B'1'
前進             5 B'101'
右前               4 B'100'
モーター3左               64 B'1000000'
モーター3右               8 B'1000'
左後               2 B'10'
後退             130 B'10000010'
右後               128 B'10000000'
右回り             129 B'10000001'
左回り             6 B'110'
モーター4左               16 B'10000'
モーター3右               32 B'100000'
※"前進"とRC6のLEDを点灯するには上の表からRC6,RC2,RC0のビットを'1'にすることで可能になります。

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

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

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