测试无线电轨车模前轮转向
01 无线电轨
一、问题/目标
在前面博文中已经介绍了如何通过 ESP32中的 PWM 端口控制车模上的舵机。 这个程序功能比较简单, 只是来回摆动舵机, 车模前轮也是每隔 1 秒钟来回摆动一周。 下面, 就利用测试电机运行的程序, 稍加改动, 实现利用键盘改动前轮转向角度, 也就是设定舵机输出信号的取值, 通过这种方式, 大家可以体会如何调整舵机的中心位置数值, 将来能够更好的控制车模精确的运行在赛道中心。
二、基本原理
首先,大家先阅读和练习关于车模电机运动实验, 以及如何控制车模转向中安排的舵机实验。 下面将它们的代码进行融合。 说得简单一点, 就是把 PWM 控制舵机的代码增加到电机控制实验代码中。 只要增加这一行, 便可以声明出控制舵机对应的 PWM 对象, servo。 它通过 IO27 管脚连接外部的舵机控制信号。 PWM 频率为 50Hz, 使用 duty_16 函数来设置输出脉冲时间宽度。
在车模电机实验中, 程序通过 key 函数处理控制板按键动作, 一个按键增加 duty 数值, 一个按键减少 duty 数值, 数值的取值范围从 -1023 到 1023。 在舵机控制中, 它对应的占空比数值范围是 3276 到6553, 简单起见, 这里将 duty 数值加上 4915 之后, 基本上就处于 前面对应的数值范围之内。 这样对程序改动最小。
三、应用举例
先打开 Test Motor 程序, 将 前面测试舵机的部分代码拷贝进来, 再修改主程序中关于 duty 输出部分, 将原来电机控制部分注释起来, 增加 舵机 PWM 占空比设置语句。 输出 duty + 4915。
点击程序运行, 可以看到软件执行正常。 这是执行后的界面, ESP32控制电路板上的 OLED 界面和 电机测试实验中显示的是一样的。 按动 两个按键, 可以观察到前轮会随着按动逐渐改变方向。
1、修改后的程序
import LQ_Motor_Servo
import time
from machine import Pin,PWM,SoftSPI
from LQ_OLED096 import OLED096_SPI
LED0 = Pin(2,Pin.OUT) #创建LED对象
k0 = Pin(25, Pin.IN) # create input pin on GPIO25
k1 = Pin(26, Pin.IN) # create input pin on GPIO26
motor1 = LQ_Motor_Servo.Motor(4,16) #创建电机对象1
motor2 = LQ_Motor_Servo.Motor(17,5) #创建电机对象2
duty = 0 # set duty cycle ,范围0-1023 ,1023时为满占空比,512为50%
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)
spi=SoftSPI(baudrate=100000,polarity=1,phase=0,sck=Pin(18),mosi=Pin(23),miso=Pin(19)) #创建软件模拟spi
dc=Pin(15,Pin.OUT)
res=Pin(13,Pin.OUT)
cs=Pin(19,Pin.OUT)
oled=OLED096_SPI(128,64,spi,dc,res,cs) #创建oled对象
motor1.Crol(duty)
motor2.Crol(duty)
def Show(): #显示
txt = ""
oled.fill(0) #清屏
txt = (" Motor_Test ")
oled.text(txt, 6*0, 8*0 ,1)
txt = ("duty: %d ") % (duty)
oled.text(txt, 6*0, 8*2 ,1)
oled.show()
def Key(): #按键扫描实现函数
global duty
if k0.value() is 0:
duty = duty+50
if duty > 1024: #限幅
duty = 1024
while (k0.value() is 0):
time.sleep(0.001)
if k1.value() is 0:
duty = duty-50
if duty < -1024: #限幅
duty = -1024
while (k1.value() is 0):
time.sleep(0.001)
while True:
Show()
Key()
# motor1.Crol(duty)
# motor2.Crol(duty)
servo.duty_u16(duty+4915)
if LED0.value() is 0:
LED0.value(1)
else:
LED0.value(0)
四、练习/实验
本文讨论了利用 电机测试程序, 经过简单修改之后, 用于控制舵机的偏置, 基于此大家练习在车模控制任务中如何调整车模在赛道上的位置。 为下面进一步软件开发打下基础。
02 讲座资料
一、讲座视频
测试无线电轨车模前轮转向
二、讲座资料
- 清华云盘资料下载 : https://cloud.tsinghua.edu.cn/d/7471180bdb0f4d1ebbc7/
- 无线电轨智能车校内赛 | 如何学习无线电轨车模?
- 基础Python学习网站 Learn Python : https://www.learnpython.org/
■ 相关文献链接: