検索コード

コース レッスン8/10: Raspberry Pi Pico スマートカー – レッスン8: サーボモーターと物体追従

このレッスンはの一部です: Raspberry Pi Pico 4WDスマートカー

コース レッスン8/10: Raspberry Pi Pico スマートカー – レッスン8: サーボモーターと物体追従

このRobojaxによるRaspberry Pi Picoスマートカーコースのレッスンでは、サーボモーターの機能と、それを使って物体追従、つまり「手に追従する」ロボットを作る方法を探ります。このプロジェクトは単純なモーター制御を超え、サーボ駆動の超音波センサーとインテリジェントなPythonロジックを組み合わせて、範囲内の物体を積極的に探して追従する車を作る方法を示しています。これはロボット工学の基本概念であり、人に追従するロボット、ボールを取ってくるスマートペット、動きを追跡する自律型セキュリティカメラなどのインタラクティブなプロジェクトを構築できます。このレッスンでは、特定の距離ゾーン内の物体に自動的に近づき、押し、後退する車という、よりシンプルな2つ目のプロジェクトも扱います。

pi_pico_4WD_follow-hand

ハードウェアと部品

このプロジェクトはSunFounder Raspberry Pi Pico 4WDカーキットに基づいています。このレッスンで使用する主要部品は以下の通りです。

  • Raspberry Pi Picoボード
  • モーター付き4WDスマートカーシャーシ
  • サーボモーター(耐久性のため、理想的にはメタルギアサーボ)
  • 超音波距離センサー(HC-SR04)
  • モータードライバーボード(カーキットの一部)
  • RGB LED(視覚的フィードバック用)
  • 電源(車用バッテリーパック)
PICOBOARDWHITEANGLE2_1200x857

サーボモーターはこのレッスンの機能の中核です。連続回転する標準的なDCモーターとは異なり、サーボモーターは特定の角度位置(通常0度から180度)に回転して保持するように設計されています。これにより、超音波センサーを正確に向けるのに最適です。サーボの品質は、ギアの材質(プラスチックか金属か)とトルクによって決まることが多く、トルクは強度と耐久性を左右します。

動作原理

以下のチャートはコードの動作を説明しています。

pi_pico_4WD_follow-hand_flow_chart

配線ガイド

このレッスンの配線は、組み立て済みのカーキットを基にしているため簡単です。重要な接続はサーボモーターで、Picoの特定のGPIOピンに接続する必要があります。

ビデオでは、インストラクターがサーボをRaspberry Pi Picoのピン番号18に接続しています。超音波センサーはサーボホーンの上に取り付けられ、左右に回転して周囲をスキャンできます。モーター、RGB LED、電源に関するその他の配線は、コースの以前のレッスンから事前に接続されているものと想定されています。

詳細な視覚的ガイドについては、以下の配線図を参照してください。

Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction

コードの説明

このレッスンのPythonコードは、複雑なハードウェア操作を簡素化するカスタムpico_4wdライブラリを中心に構築されています。ユーザーが設定可能な部分はスクリプトの上部にあり、車の動作を制御します。

ロボットの「手に追従する」動作をカスタマイズするために調整できる主要な変数は以下の通りです。

  • car.RADAR_REFERENCE = 25: これはセンサーが「認識」する最大距離(センチメートル)です。この距離を超える物体は無視されます。この値を大きくすると車の感度が上がり、小さくするとより近い物体が必要になります。
  • car.RADAR_MAX_ANGLE = 45 および car.RADAR_MIN_ANGLE = -45: これらはサーボがスキャンする最左角度(45)と最右角度(-45)を定義します。これにより、車の前方に90度の視野が作成されます。
  • car.RADAR_STEP_ANGLE = 10: これはサーボがスキャンポイント間を移動する際の増分(度)です。ステップを小さく(例:5)すると解像度が細かくなりますが、完全なスキャンに時間がかかります。ステップを大きく(例:15)するとスキャンは速くなりますが、精度は低くなります。
  • MOTOR_FORWARD_POWER = 40: これは検出された物体に向かって車が前進する際に使用されるモーターパワー(0〜100)を設定します。これを調整して車の追跡速度を変更できます。
  • MOTOR_TURNING_POWER = 40: これは車が物体に向きを変える際に使用されるモーターパワーを設定します。値を高くすると、車はより積極的に旋回します。

main()関数のメインロジックは連続ループです。まずcar.radar_scan()を呼び出し、各スキャン角度で物体が検出されたかどうかを表す'1'と'0'の文字列を返します('1'は物体が基準距離内にあることを意味します)。次にコードはこの文字列を分析して、連続する'1'の最大グループを見つけます。これは検出された物体の中心を示します。スキャンフィールド内でこの中心がどこにあるかに基づいて、車は物体に合わせて左折、右折、または前進するように命令され、物体を追従します。

ライブプロジェクトデモ

この動画では、プロジェクトの動作を明確に実演しています。講師はまずテストスクリプトを実行し、サーボモーターを90度、0度、-90度といった正確な角度に動かせることを示します。これはサーボの可動範囲を理解し、超音波センサーを正しく取り付けるために重要です。

センサーを取り付けた後、「手に追従する」機能が紹介されます。講師が車の前で手を動かすと、サーボに取り付けられたセンサーが左右にスキャンします。車のロジックがセンサーデータを処理し、検出した手の方向へ車輪を回転させて操舵し、床の上で効果的に手を追跡します。このデモでは、物体が移動する際に車がそれを追跡し、それに応じて進行方向を調整する様子が強調されています。また、2つ目のプロジェクトも紹介されており、物体が10〜20センチメートルの距離で検出された場合に車が接近して押し出し、物体が近すぎる場合(10センチメートル未満)には後退するようにプログラムされています。

重要なポイント

このレッスンは、インタラクティブなロボット動作を作成するためのサーボモーターの使用法を学ぶ優れた入門編です。サーボと距離センサーを組み合わせることで、環境を積極的に追跡し応答できる「視覚」を持つロボットを構築できます。スキャン角度、ステップサイズ、モーター出力などのパラメーターを調整できることで、ロボットの動作を細かく制御でき、これはあらゆるロボットプロジェクトにおいて重要なスキルです。

チャプター

  • [00:00] サーボモーターと物体追従の紹介
  • [01:48] コースキットの特徴と機能
  • [03:08] サーボモーターの動作の理解
  • [06:08] Pythonコードによるサーボモーターのテスト
  • [09:59] 「手に追従する」機能の説明
  • [10:49] 「手に追従する」機能の実演
  • [15:37] プロジェクト:物体の押し出しと後退
  • [18:40] 物体押し出しプロジェクトの実演
  • [19:25] まとめと次のステップ

画像

pico-4wd_main
pico-4wd_main
PICOBOARDWHITEANGLE2_1200x857
PICOBOARDWHITEANGLE2_1200x857
pi_pico_4WD_follow-hand
pi_pico_4WD_follow-hand
pi_pico_4WD_follow-hand_flow_chart
pi_pico_4WD_follow-hand_flow_chart
Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction
Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction
905-Lesson 8/10 Pi Pico 4WD card Python code: follow hand
言語: C++
# Lesson 8/10 Pi Car Pico 4WD: Follow hand
# Download and resource page https://robojax.com/RJT630

import pico_4wd as car

car.RADAR_REFERENCE = 25
car.RADAR_MAX_ANGLE = 45
car.RADAR_MIN_ANGLE = -45
car.RADAR_STEP_ANGLE = 10
MOTOR_FORWARD_POWER = 40
MOTOR_TURNING_POWER = 40

def main():
    while True:
        radar_data = car.radar_scan()
        if isinstance(radar_data, int):
            continue
        radar_data = [str(i) for i in radar_data]
        radar_data = "".join(radar_data)
        paths = radar_data.split("1")
        length_list = []
        for path in paths:
            length_list.append(len(path))
        if max(length_list) == 0:
            car.move("stop") 
        else:
            i = length_list.index(max(length_list))
            pos = radar_data.index(paths[i])
            pos += (len(paths[i]) - 1) / 2
            delta = len(radar_data) / 3
            if pos < delta:
                car.move("right", MOTOR_TURNING_POWER)
            elif pos > 2 * delta:
                car.move("left", MOTOR_TURNING_POWER)
            else:
                #if radar_data[int(len(radar_data)/2-1)] == "0":
                #    car.move("stop")
                #else:
                car.move("forward", MOTOR_FORWARD_POWER)

try:
    main()
finally:
    car.move("stop")
    car.set_light_off()

リソースと参考文献

まだリソースはありません。

ファイル📁

ファイルは利用できません。