【Raspberry Pi Pico】ライントレースロボットを作ろう ①センサー1つ

【Raspberry Pi Pico】ライントレースロボット

こんにちは! けい(Twitter)です。

今回は、Raspberry Pi Picoでライントレースロボットを作ってみました。

ロボットの製作

必要な物

Raspberry Pi Pico

タミヤ ユニバーサルプレート

ロボットの土台となるパーツです。

タミヤ ダブルギヤボックス

created by Rinker
タミヤ(TAMIYA)
¥665 (2024/03/28 06:11:08時点 Amazon調べ-詳細)

タミヤ 

タイヤ部分はキャタピラで作ってみました。

created by Rinker
タミヤ(TAMIYA)
¥506 (2024/03/28 06:11:09時点 Amazon調べ-詳細)

モータードライバ

2つのHブリッジ回路を備えたモータードライバです。
安価で小型なのでおすすめです。

フォトリフレクター(ライントレースセンサー)

ライントレースの要となるセンサーです。
ラインの白と黒を判別します。

HiLetgo 10pcs TCRT5000赤外線反射センサーIR光電スイッチバリアライン障害物回避モジュールトレースセンサートレースモジュール
HiLetgo

スペーサー

ユニバーサルプレートとライントレースセンサーを固定するのに用います。

ブレッドボード&ジャンパワイヤー

created by Rinker
Sintron
¥343 (2023/05/26 13:50:35時点 Amazon調べ-詳細)

ロボットの組み立て

タミヤの3点セットを順番に組み立てていきます。

ギヤボックスの組み立て

ダブルギヤボックスを組み立てることが一番時間がかかると思います。
意外と難しいので、説明書をしっかり読んでやってみて下さい。
私は沼って1時間以上かかりました(笑)

ダブルギヤボックスの説明書に複数のタイプを選択できるようになっています。

タイプギヤ比回転トルク[gf・cm]回転数 [rpm]
A12.7:1941039
B38.2:1278345
C114.7:1809115
D344.2:1227638

ライントレース用のモーターはスピードよりも正確性が欲しかったので、一番回転数が低いDタイプを選択しました。

ロボットの上側

ライントレース用のロボットとして、コンパクトにしたかったため、キャタピラは短くしました。

また、ユニバーサルプレートもそのままでは長いためカットしました。
ブレッドボードが丁度乗る程度の大きさなので、かなり小さく感じます。

ロボットの下側

ロボットの下側にモーターを固定しました。
そうすることで、ミニマムな構成にすることが可能です。

ライントレースセンサーは1つ使用するので、中心部にスペーサーでセンサーを固定しました。

回路図

図では単三電池が2本ですが、実際には3本の4.5Vで全ての電力を供給しています。

電源

Raspberry Pi Picoも4.5Vの外部電源で動作させています。
以前の記事で外部電源による動作についてまとめています。

モータードライバの電源は3~10Vの範囲、ライントレースセンサーの電源は3.3~5Vの範囲なので、どちらの電源仕様も満たしています。

プログラム

センサー1つのライントレース

今回使うのはライントレースセンサー1つだけです。

そのため、黒と白の境界線上を走るプログラムが一般的となっています。

センサーが白を認識したら左に、黒を認識したら右に進むようにプログラムを書きます。

プログラム

電源が入ると自動でプログラムが実行されるように、「main.py」というファイル名でRaspberry Pi Picoにファイルを保存します。

from machine import PWM, Pin
import utime

class Robot:
    def __init__(self):
        self.IN1 = Pin(1, Pin.OUT)
        self.IN2 = Pin(2, Pin.OUT)
        self.IN3 = Pin(3, Pin.OUT)
        self.IN4 = Pin(4, Pin.OUT) 
    def forward(self):
        self.IN1.value(1)
        self.IN2.value(0)
        self.IN3.value(1)
        self.IN4.value(0)
    def right(self):
        self.IN1.value(1)
        self.IN2.value(1)
        self.IN3.value(1)
        self.IN4.value(0)
    def left(self):
        self.IN1.value(1)
        self.IN2.value(0)
        self.IN3.value(1)
        self.IN4.value(1)
    def back(self):
        self.IN1.value(0)
        self.IN2.value(1)
        self.IN3.value(0)
        self.IN4.value(1)
    def stop(self):
        self.IN1.value(1)
        self.IN2.value(1)
        self.IN3.value(1)
        self.IN4.value(1)    
    def release(self):
        self.IN1.value(0)
        self.IN2.value(0)
        self.IN3.value(0)
        self.IN4.value(0)
        
class Photo_sensor:
    def __init__(self):
        self.sensor_1 = Pin(6, Pin.IN)
    
    def read_sensor(self):
        return self.sensor_1.value()

robot = Robot()
sensor = Photo_sensor()
utime.sleep(1)

while True:
    if sensor.read_sensor() == 0:
        robot.left()
    else:
        robot.right()

実行結果

やはりセンサー1つだけでは急なカーブなどに対応することが難しいようです。
また、今回作ったコースのように十字がある場合にも、センサー1つでは超えられません。

センサー1つでも、超信地旋回を組み合わせることによって急なカーブに対応できると思いますが、やはり限界があると思うので、次回はセンサーを3個組み合わせて挑戦したいと思います。