2025年1月9日
017-1.SPIKEプライム入門-第5回「ライントレースロボットを作る(その2)」
この連載では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」を使ったプログラミングの方法を紹介します。SPIKEは2020年1月にレゴ エデュケーションが発売したSTEAM教材です。マイコン搭載のブロックをプログラミングすることで、科学・技術・工学・アート・数学を学ぶことができます。プログラミングを行うにはWindowsかMacのパソコン、Androidタブレット、iPad、Chromebookのいずれかが必要です。(文/松原拓也)
◆ 比例制御を使う

今回は、前回のライントレースロボットを改良してみたいと思います。
前回のライントレースロボットはラインをトレースするという目的はきちんと果たすことができました。ただし、ラインの上をジグザグに進んでしまうので、動きにムダがありすぎます。このムダをなくしてみましょう。

「比例制御」を使えばジグザグの走りをなくすことができます。ただし、ここで答えを書きすぎると、勉強にはなりません。
これを読むみなさんに、できるだけ頭を使って考えて、チャレンジしてもらえるように説明したいと思います。

「比例制御」というのは入力との差に対して「比例」して出力する制御のことです。、、、少しずつ説明しましょう。
ここでいう「入力」はセンサーが検出する「反射光」のことです。「出力」はモーターのことです。
ライントレースロボットは、白と黒の境界を目標として進みます。今回の場合は進行方向に対して、左側=黒、右側=白とします。前回のプログラムは反射光を比較して「白」か「黒」かの2種類に判断していましたが、今回の比例制御では反射光を0~100の値として入力します。

ロボットのカラーセンサーにはラインがどう見えているのか? 実験をしてみましょう。
実験結果がこちらです。センサーが「黒色」、「白色と黒色が半々(中心)」、「白色」を測定した場合、このような値を示しました。

結果をグラフにすると、こうなるはずです。
ラインに対してのセンサーの位置によって、反射光の値が18~95%の範囲で変化します。これを応用すれば、反射光の値を元にして、ラインの位置を予想することができます。

ちなみに、センサーの感度は一定ではありません。この図のようにグラフがS字のカーブを描きます。この問題については、手間を省くために今回は無視することにします。余力のある人は対策方法を考えてみましょう。
◆ プログラム作り

それでは、プログラムを作ってみましょう。
今回は「移動拡張」の中にある「~~%のパワーで移動開始する」というブロックを使います。 このブロックは「パワー」を使ってモーターを回転させることができます。今までは「スピード」を使っていましたが、何が違うのでしょうか?
スピードを使った場合、モーター内の回転センサー(ロータリーエンコーダ)を検出して、ハブ内のマイコンが自動的に必要なパワーを調節してくれます。パワーを使った場合は、回転センサーを検出しないでモーターを回します。回転速度がわからなくなるという欠点はありますが、モーターを素早く動かすことができます。

変数を作ります。
「diff」「left」「right」「target」という4種類の変数を作りましょう。

このようにブロックを並べます。これで完成です。

4つの変数の役割を図にしてみました。
変数「target」には、ロボットがラインの中心に位置する時の反射光の値を格納します。先ほどの実験から考えて、値は「60」くらいになると思います。この値は床面とセンサーとの距離や、照明の明るさなどで変化します。
変数「diff」には、ラインの中心とセンサーとの差を格納します。値の差は「引き算」のブロックを使えば、求めることができます。このプログラムでは「かけ算」のブロックを使って、さらに差を0.3倍しています。「0.3」がゲインです。ここで「ゲイン」の意味を説明してしまうと勉強にならないので、できるだけ自分で考えてみましょう。ここが比例制御における一番重要な部分です。
変数「left」「right」は、モーターのパワーの値を格納します。「30」というのは基本として設定するパワーです。

それでは、プログラムを動かしてみましょう。
最初にロボットをラインの白色と黒色の中間に置きます。できるだけ正確な位置に置きましょう。 プログラムを実行すると、ロボットがラインをトレースします。前回のようにジグザグに走らず、スムーズに走れば成功です。
◆ 使いやすいように改良する

プログラムが使いやすくなるように、 少し修正してみましょう。「gain」「power」という2つの変数を追加します。

このように修正します。
これで、プログラムの先頭でgain(ゲイン)とpower(パワー)を設定できるようになりました。
たとえば、写真のようにgainの値を「0.3」から「0.4」に変更したとします。 ロボットの動きはどのように変わるでしょうか? 実物を使って実験してみましょう。
今回作成したプログラム(SPIKEアプリ用)
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。