Beauto Chaserでスムーズなライントレースをする方法について連載形式で説明していきます。対象はBeauto ChaserやBeauto RoverでC言語プログラミングを始めた人を主に想定します。目標は、直線では左右に振れずに走り、カーブは半径200mmくらいまでは止まらずスムーズに通過することとします。ただし直角コーナーやコースから外れたときの復帰処理などは扱わない予定です。プログラミングにはC言語、開発環境にはHEWとH8S,H8/300 Standard Toolchainを用い、センサーやモーターを駆動する関数はVstoneにより公開されているサンプルプログラムの関数を使って説明します。
本講座は私が個人の趣味として書いている文書であり、ヴイストン株式会社とは関係ありません。本講座の内容、プログラム、画像についてはできるだけ良いものにするように努めていきますが、これらを利用したことによる損害については私は一切の責任を負いません。またリンク先の情報、サンプルプログラムは情報提供元による注意書きに同意した上で利用してください。
Beautoでライントレースをする場合、一般的には赤外線センサーを使って反射光の強さを読み取り、床の白黒を見分けます。反射光は床が白だと強く、黒だと弱くなるわけですが、同じ白でも次のような要因によって変化します。
走行中に床が上下したり床の汚れによって色が微妙に異なったりするのは対処が難しいですが、センサーの取り付け方を変更した場合の再調整=3と4、コース全体に共通する1と2にはある程度対処できるような仕組みを作ります。
まず走行前に2種類の床の色(ライン上のときと、ラインのない床面上のとき)に応じたセンサーの値を記録します。その上で実際の走行時、ラインの上にセンサーがあるかどうかの判定等をする際、直接A/D変換で得られた値を使わず次の式で計算される値yを使います。
F=(ライン上のときのA/D変換結果) B=(ラインのない床面上のときのA/D変換結果) x=(現在得られたA/D変換結果)
yはライン上のとき1.0に近い値、そうでないときに0.0に近い値になります。
プログラムの例を示します。初期化、A/D変換、シリアル通信などはVstoneのサポートページで公開されているVS-WRCのサンプルプログラムで提供されている関数を利用することを想定しています。「無線コントローラVS-C1での操縦 」ソース一式のプロジェクトを利用し、メインのソース(GamePad_A.c)と入れ替えると簡単にビルドできます。
プログラムを書き込み、電源を入れなおしてプログラムを実行開始します。PCのターミナルソフトでCPUボードと通信できる状態にします(115200bps、8bit、パリティeven)。センサーが完全に線の上になるようにロボットを置いてPCのスペースキーを押します。ブザーが高い音で鳴り、ラインの色を記憶したことを知らせます。次にロボットを移動させてセンサーを床の地の色部分に置き、再度スペースキーを押します。ブザーが低い音で鳴ります。以上でセンサー調整モードが終了し、LED1がセンサーの状態を表示するようになります。また、何かキーを押すと現在のセンサー出力のA/D変換結果と正規化後の値が並べて表示されます。やり直すときはCPUボードの電源再投入、ターミナルソフトの再接続を行ってください。
なお実際の競技会ではPCを持ちこんで調整できない場合もありますので、押しボタンスイッチでセンサー調整の指示をできるようにするのが良いでしょう。私の場合は長押しでセンサーの値を記憶、短く押すとスタートというようにしています。YouTubeに載せたTributeの映像の最初の方でその様子が見られます。長押しの判定等はまた別に機会があれば説明します。
上でセンサー調整と書いた操作はよくセンサーのキャリブレーションと呼ばれます。キャリブレーション(calibration)というのはセンサーの性質を表す何らかの数値(parameter)を実測によって求めることです。床ラインセンサーに限らず一般的な用語です。たとえばガラス管に水銀を入れた温度計を作ったとします。水銀の柱が温度の1次関数にしたがって伸び縮みすると仮定します。この温度計にはまだ目盛りをつけていないので、どこが何℃かわかりません。そのためまず温度が正確にわかる状態にして目盛りをつけます。たとえば氷水に漬けたときを0℃、沸騰している湯に漬けたときを100℃というふうに。この作業がキャリブレーションに相当します。この測定によって1℃あたりの目盛幅(比例係数)と0℃の位置(切片)がわかります。
山口辰久