无线电轨智能车校内赛 | 基于ESP32主控板是如何控制车模转向的?

  • Ask/Aim:
  • Principle:
  • Practice:
  • Linkage:
  • Exercise/Experiment:

01 线电轨


一、问题/目标

  无线电轨车模精确沿着赛道运行, 不仅仅可以放置冲出赛道, 更重要的是能够以最懂功率接收到无线电能。 这个车模如何拐弯循迹的呢?   下面介绍一下这个车模运动方向控制的基本原理, 以及在 ESP32中的编程方法。

GM1690426819_1280_720.MPG|_-4

二、基本原理

  无线电轨车模是一个四轮结构的车模, 它依靠后轮驱动, 前轮转向控制车模的运动。  这种结构也称为 阿克曼车辆转向机构, 只是车模上进行了简化。  前轮转向使用了小型的舵机,  它转动轴通过机械连接,  可以控制车模前轮的同时转动。

GM1690429136_1280_720.MPG|_-5

  这种小型舵机的结构大体相同,  它们在供电情况下, 结构控制脉冲指令,  通过内部的电机驱动转轴运动, 并使得转轴输出角度与给定脉冲宽度成比例。 它是一个内部有位置反馈的随动系统。  舵机的引线通常包括 电源线, 地线 以及脉冲信号线。   脉冲时间宽度 从1ms 到 2ms 分别对应舵机转动角度从最左边转移到最右边。 脉冲频率一般取 50Hz 左右。 它可以通过 ESP32 中的定时器产生电脉冲来进行驱动。

GM1690429659_1280_720.MPG|_-5

  在主控板上,  连接舵机的端口在电源接口左边, 从左到右分别是 信号线, 5V电源线, 以及地线。  电路原理图显示, 信号线名称定义为 Servo, 通过电阻 R9 进行隔离之后与外界相连。  在 ESP32 管脚上,  Servo 连接到 IO27 , 这个端口可以定义为 内部 PWM 输出端口。 下面应用举例中, 通过编程来测试舵机的控制。

GM1690430396_1280_720.MPG|_-5

三、应用举例

1、测试程序

  首先看一下测试程序,  前面三个语句分别导入 MicroPython 内部软件包, 包括管脚模块和PWM模块。  利用time 进行软件延时。  这儿是定义了三个全局变量, 实际上存储了三个整形常量。 最后介绍这三个变量的取值原理。  接下来是定一个 PWM 接口, 也就是脉冲宽度调制接口, 输出舵机控制命令脉冲。  第一个参数是 PWM 对应的管脚, 原理图上给出对应的 IO27 管脚,  第二个是脉冲频率, 对应50Hz,  第三个是脉冲的占空比, 利用前面对应的常量 Servo_Center, 对应着 1.5ms。  这里声明一个控制板上LED的管脚, 用于显示程序执行状态。   主程序是一个有 while 定义的无限循环程序。  这是程序主题部分。 包括有两个几乎相同的部分。  第一部分有四句话。  print 语句是通过 REPL 输出信息 Servo Left, 表示舵机转轴摆向最左边。   LED 管脚置为 0, 对应的低电平, 板上 D1 对应的LED点亮。  第三句话是核心, 设定 PWM 输出信号的占空比。 这里使用了 Servo_Left 对应的常量, 对应输出脉冲宽度为 1ms。  接下来是利用 time 延时0.5秒。 第二部分的作用与前面部分几乎相同, 只是分别输出 Serve Right, LED 熄灭。  设置 PWM 输出脉冲宽度 为两毫秒。 对应占空比常量是 Servo_Right。  程序循环运行之后, 输出 PWM 控制信号可以控制舵机左右摆动。

GM1690459810_1280_720.MPG|_-20

  下面解释一下前面定义的三个变量,  它们实际上定义了 PWM 输出三种脉冲宽度对应的 PWM 占空比常量。  在定义PWM对象时,  设置的频率为 50Hz,  对应周期为 20毫秒。  在ESP32中, 设置PWM占空比使用一个 16位无符号整形数表示整个周期,  因此如果输出1.5毫秒的时间脉冲,  就使用 1.5 除以 20 , 再乘以0xffff, 使用这个常数设置 PWM 的占空比, 对应输出便是 1.5毫秒。  由于设置占空比的函数 duty 只接受整形数, 所以最终利用 int 将计算结果转换成整数数。  同样的道理,  可以分别得到 1毫秒, 2毫秒 PWM 脉冲宽度所对应的常量。   利用这些常量,  可以设置 PWM 输出脉冲时间宽度,  1.5毫秒, 1毫秒, 2毫秒 通常情况下使得舵机输出轴处在中间, 左边以及右边。 这三个常量在后面的程序中被使用。

GM1690460661_1280_720.MPG|_-14

from machine                import Pin,PWM
import machine
import time

Servo_Center = int(1.5*0xffff/20)
Servo_Left = int(1*0xffff/20)
Servo_Right = int(2*0xffff/20)

servo = PWM(Pin(27), freq=50, duty_u16=Servo_Center)

LED0 = Pin(2, Pin.OUT)
LED0.value(1)

while True:
    print('Servo Left')
    LED0.value(0)
    servo.duty_u16(Servo_Left)
    time.sleep(0.5)

    print('Servo Right')
    LED0.value(1)
    servo.duty_u16(Servo_Right)
    time.sleep(0.5)

2、测试结果

  将程序拷贝到 Thonny 环境之内,  运行之后, 可以看到 Shell 窗口内交替出现 Servo Left, Servo Right 。 这说明 程序运行正常。  在电路板上, 可以看到 LED1 大约 1 Hz 的频率闪烁。

GM1690441398_1280_720.MPG|_-3

  使用示波器,  测量ESP32主控板舵机的控制信号波形,  可以看到输出幅值为3V的脉冲, 它的宽度呈现周期变化。  缩小示波器时基频率, 看到舵机控制信号的频率为 50Hz,  这与软件设定的 PWM 频率是一致的。  拉宽示波器时基, 可以看到输出脉冲信号时间宽度,  两种时间宽度分别是 1毫秒 以及 两毫秒。 这是前面测试程序对应的输出信号波形。

GM1690461017_1280_720.MPG|_-8

  将一个舵机的控制引线接入主控板的舵机接口。  大家注意到舵机引线的颜色分别是 白、红、黑。 对应着信号线、 电源线以及地线。  这个顺序与舵机接口是对应的。  舵机接入后, 便开始 每隔 一秒钟来回摆动一次。  这与软件给定的指令是对应的。  大家需要知道, 具体摆动的角度, 在相同的控制信号作用下, 与舵机的具体型号有关系。   因此, 需要通过修改软件来改变舵机转动的角度。

GM1690458181_1280_720.MPG|_-7

▲ 图1.3.1  舵机运动

▲ 图1.3.1 舵机运动

四、知识联系

  需要说明的是,  舵机控制信号所使用的 PWM 对象,  与后面控制电机速度的 PWM 是相同的, 都属于脉冲宽度调制信号。  只是他们各自使用不同的ESP32 的输出管脚,  电机控制信号的频率往往是在几千赫兹,  使用不同的占空比 来控制电机运行的不同速度。 占空比越大, 等效施加在电机上的电压就越大, 电机转速就越高。  因此掌握 PWM 的用途, 可以控制不同的对象。

GM1690462491_1280_720.MPG|_-7

五、练习/实验

  本文介绍了 ESP32控制车模转向的基本原理,  基于上面给出的例程, 大家可以尝试控制车模舵机按照不同的幅度和周期进行转动。  基于此为之后的车模控制奠定基础。

GM1690462733_1280_720.MPG|_-3

  下面是使用功率测量模块测量控制板在舵机 运动情况下的电流消耗, 可以看到舵机所消耗的电流是非常大的。 因此在控制舵机的时候需要尽可能减少对其角度的改动。

▲ 图1.5.1  驱动舵机是工作电流

▲ 图1.5.1 驱动舵机是工作电流

02 座资料


一、讲座视频

基于ESP32主控板是如何控制车模转向的?

二、讲座资料


■ 相关文献链接:

● 相关图表链接:

猜你喜欢

转载自blog.csdn.net/zhuoqingjoking97298/article/details/131955094