搜索代码

课程 第8课,共10课:树莓派Pico智能车——第8课:舵机与物体跟随

本课是……的一部分: Raspberry Pi Pico 四驱智能车

课程 第8课,共10课:树莓派Pico智能车——第8课:舵机与物体跟随

本课来自Robojax的Raspberry Pi Pico智能小车课程,探讨了舵机的功能,以及如何利用它来制作一个物体跟随或“跟手”机器人。该项目超越了简单的电机控制,演示了如何将舵机驱动的超声波传感器与智能Python逻辑相结合,打造出一辆能够主动寻找并跟随其范围内物体的小车。这是机器人技术中的一个基本概念,使您能够构建交互式项目,例如跟随人的机器人、玩接球游戏的智能宠物,或追踪移动物体的自主安防摄像头。本课还涵盖了一个更简单的第二个项目:一辆能够自动接近、推动并后退离开特定距离区域内物体的小车。

pi_pico_4WD_follow-hand

硬件与组件

本项目基于SunFounder Raspberry Pi Pico 4WD小车套件。本课使用的关键组件有:

  • Raspberry Pi Pico开发板
  • 带电机的4WD智能小车底盘
  • 舵机(为耐用起见,最好使用金属齿轮舵机)
  • 超声波距离传感器(HC-SR04)
  • 电机驱动板(小车套件的一部分)
  • RGB LED(用于视觉反馈)
  • 电源(小车电池组)
PICOBOARDWHITEANGLE2_1200x857

舵机是本课功能的核心。与持续旋转的标准直流电机不同,舵机设计为旋转到并保持特定的角度位置,通常在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 = 45car.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度。这对于理解舵机的转动范围以及正确安装超声波传感器至关重要。

安装传感器后,展示了“跟随手”功能。当讲师将手在车前移动时,安装在舵机上的传感器左右扫描。小车的逻辑处理传感器数据,并转动车轮朝检测到的手的方向转向,从而有效地在地面上跟随手移动。演示突出了小车如何在物体移动时追踪它,并相应地调整方向。还展示了第二个项目,其中小车被编程为:如果检测到物体在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()

资源与参考

尚无可用资源。

文件📁

没有可用的文件。