无线电轨智能车校内赛 | 在电池供电下测试车模转向测试

测试无线电轨车模前轮转向

01 线电轨


一、问题/目标

  在前面博文中已经介绍了如何通过 ESP32中的 PWM 端口控制车模上的舵机。  这个程序功能比较简单, 只是来回摆动舵机, 车模前轮也是每隔 1 秒钟来回摆动一周。   下面, 就利用测试电机运行的程序, 稍加改动, 实现利用键盘改动前轮转向角度,  也就是设定舵机输出信号的取值,   通过这种方式, 大家可以体会如何调整舵机的中心位置数值,  将来能够更好的控制车模精确的运行在赛道中心。

GM1690687395_1280_720.MPG|_-6

二、基本原理

  首先,大家先阅读和练习关于车模电机运动实验,  以及如何控制车模转向中安排的舵机实验。 下面将它们的代码进行融合。  说得简单一点, 就是把 PWM 控制舵机的代码增加到电机控制实验代码中。  只要增加这一行, 便可以声明出控制舵机对应的 PWM 对象, servo。  它通过 IO27 管脚连接外部的舵机控制信号。  PWM 频率为 50Hz,  使用 duty_16 函数来设置输出脉冲时间宽度。

GM1690687909_1280_720.MPG|_-7

  在车模电机实验中, 程序通过 key 函数处理控制板按键动作,  一个按键增加 duty 数值,  一个按键减少 duty 数值,  数值的取值范围从 -1023 到 1023。  在舵机控制中, 它对应的占空比数值范围是 3276 到6553,  简单起见, 这里将 duty 数值加上 4915 之后, 基本上就处于 前面对应的数值范围之内。 这样对程序改动最小。

GM1690688582_1280_720.MPG|_-7

三、应用举例

  先打开 Test Motor 程序,   将 前面测试舵机的部分代码拷贝进来,   再修改主程序中关于 duty 输出部分, 将原来电机控制部分注释起来,  增加 舵机 PWM 占空比设置语句。  输出 duty + 4915。

GM1690690520_1280_720.MPG|_-8

  点击程序运行, 可以看到软件执行正常。   这是执行后的界面,  ESP32控制电路板上的 OLED 界面和 电机测试实验中显示的是一样的。  按动 两个按键, 可以观察到前轮会随着按动逐渐改变方向。

GM1690691316_1280_720.MPG|_-4

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)

四、练习/实验

  本文讨论了利用 电机测试程序, 经过简单修改之后,  用于控制舵机的偏置, 基于此大家练习在车模控制任务中如何调整车模在赛道上的位置。  为下面进一步软件开发打下基础。

GM1690692278_1280_720.MPG|_-3

02 座资料


一、讲座视频

测试无线电轨车模前轮转向

二、讲座资料


■ 相关文献链接:

猜你喜欢

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