jinglixixi 发表于 2025-7-1 12:26

BPI-CanMV-K230D-Zero的舵机云台的操控实现

本帖最后由 jinglixixi 于 2025-7-1 12:41 编辑

#申请原创#
@21小跑堂

对于BPI-CanMV-K230D-Zero开发板来讲,其主要的应用方向是视觉识别处理。而在视觉处理方面,除了AI方面的处理,也离不开辅助工具的配合,即常言所说红花还需绿叶配。舵机云台就是这样的绿叶,它可以帮助摄像头进行大范围的摆动,从而运行地扩展摄像头的视野,使处理的对象更多样,也更全面。

1. 舵机云台
舵机云台是一种由舵机和相应的机械结构所组成,见图1所示。由于它配有2个舵机,故可对水平方向和垂直方向的两个维度进行转动。

图1 舵机云台

对于舵机来讲它是一种位置伺服性驱动器,主要适用于需要对角度进行调节的变化环境。其工作原理是:控制信号由接收机的输入通道进入信号调制芯片,从而获得直流偏置电压。因其内部有一个基准电路,可产生周期为20ms,宽度为1.5ms的基准信号。经直流偏置电压与电位器的电位比较,从而获得电压差的输出。在该电压差的正负输出到达电机驱动芯片后,就决定了电机的正反转。在电机转速一定时,通过级联减速齿轮可带动电位器旋转,使得电压差为0,来使电机停止转动而获得相应的摆角。
对于不同的舵机来讲,有着不同的角度范围,如90、180及360度。
对于180度的舵机,其导通时间与摆角的关系为:
0.5ms----------------0度
1ms -----------------45度
1.5ms----------------90度
2ms -----------------135度
2.5ms ---------------180度

由于舵机的工作周期为20ms,换算成频率来说就50Hz。
通过对PWM占空比的调节,就可产生相应的摆角。

2. PWM调节
对于PWM脉冲来讲,它是由BPI-CanMV-K230D-Zero开发板来提供,其程序的基本框架为:
from machine import PWM
from machine import FPIOA
# 实例化FPIOA
fpioa = FPIOA()
# 设置PIN60为PWM通道0
fpioa.set_function(60, fpioa.PWM0)
# 实例化PWM通道0,频率为50Hz,占空比可调x: 2 ~ 13,默认使能输出
x=2
pwm0 = PWM(0, 50, x, enable = True)
# 关闭通道0输出
pwm0.enable(0)
# 调整通道0频率为50Hz
pwm0.freq(50)
# 调整通道0占空比为40%
pwm0.duty(40)
# 打开通道0输出在不同的占空比下,舵机的摆角会处于不同的状态。

3. 五向导航按键模块
为在良好的随动情况下,控制云台的摆动,可采用五向导航按键模块来进行人机交互,即通过左右键来控制水平方向的摆动控制;而上下键则控制垂直方向的摆动控制;中心键则是让云台复位到中心位置。在摆动控制过程中,每触动一次按键,就会发出一个沿转动方向的摆角移动脉冲。
向导航按键模块的外观如图2所示,相应引脚的作用见图3所示。


图2 五向导航按键模块


图3引脚作用


图4 器件连接

在BPI-CanMV-K230D-Zero开发板上,实现云台的随动性操控。
1)按键状态检测
五向导航按键模块的引脚连接关系为:
LEF------GPIO3
RHT------GPIO4
UP ------GPIO5
DWN------GPIO6
MID------GPIO2

将所用引脚设置为输入模式的语句为:
fpioa.set_function(3, FPIOA.GPIO3)
Pin1 = Pin(3,Pin.IN, pull=Pin.PULL_UP, drive=7) //L
fpioa.set_function(4, FPIOA.GPIO4)
Pin2 = Pin(4,Pin.IN, pull=Pin.PULL_UP, drive=7) //R
fpioa.set_function(5, FPIOA.GPIO5)
Pin3 = Pin(5,Pin.IN, pull=Pin.PULL_UP, drive=7) //U
fpioa.set_function(6, FPIOA.GPIO6)
Pin4 = Pin(6,Pin.IN, pull=Pin.PULL_UP, drive=7) //D
fpioa.set_function(2, FPIOA.GPIO2)
Pin4 = Pin(2,Pin.IN, pull=Pin.PULL_UP, drive=7) //M
print(pin1.value())
2)占空比调节与舵机控制
实现键控舵机运动的程序为:
from machine import Pin
from machine import FPIOA
from machine import PWM
import time

# 实例化FPIOA
fpioa = FPIOA()
# 设置Pin2为GPIO2
# 设置Pin6为GPIO6
fpioa.set_function(3, FPIOA.GPIO3)
fpioa.set_function(4, FPIOA.GPIO4)
fpioa.set_function(5, FPIOA.GPIO5)
fpioa.set_function(6, FPIOA.GPIO6)
fpioa.set_function(2, FPIOA.GPIO2)

# 实例化Pin2~Pin6为输入
key1 = Pin(3, Pin.IN, pull=Pin.PULL_UP, drive=7)
key2 = Pin(4, Pin.IN, pull=Pin.PULL_UP, drive=7)
key3 = Pin(5, Pin.IN, pull=Pin.PULL_UP, drive=7)
key4 = Pin(6, Pin.IN, pull=Pin.PULL_UP, drive=7)
key5 = Pin(2, Pin.IN, pull=Pin.PULL_UP, drive=7)
H=0
V=0

fpioa = FPIOA()
# 设置PIN60为PWM通道0
fpioa.set_function(60, fpioa.PWM0)
# 设置PIN61为PWM通道1
fpioa.set_function(61, fpioa.PWM1)
# 实例化PWM通道0,频率为50Hz,占空比可调x: 2 ~ 13,默认使能输出
x=2
pwm0 = PWM(0, 50, x, enable = True)
pwm1 = PWM(1, 50, x, enable = True)

def mov_h(n) :
    # 关闭通道0输出
    pwm0.enable(0)
    # 调整通道0占空比为n%
    pwm0.duty(n)
    # 打开通道0输出
    pwm0.enable(1)

def mov_v(m) :
    # 关闭通道1输出
    pwm1.enable(0)
    # 调整通道0占空比为m%
    pwm1.duty(m)
    # 打开通道0输出
    pwm1.enable(1)

while True:
    ifkey1.value()==0 :
      print("k1=",key1.value())
      if H<13 :
            H=H+1
            print(H)
            mov_h(H)
    ifkey2.value()==0 :
      print("k2=",key2.value())
      if H>3 :
            H=H-1
            print(H)
            mov_h(H)
    ifkey3.value()==0 :
      print("k3=",key3.value())
      if V<13 :
            V=V+1
            print(V)
            mov_v(V)
    ifkey4.value()==0 :
      print("k4=",key4.value())
      if V>3 :
            V=V-1
            print(V)
            mov_v(V)
    ifkey5.value()==0 :
      print("k5=",key5.value())
      H=8
      V=8
      print(H)
      print(V)
      mov_h(H)
      mov_v(V)
    time.sleep(0.5)


经测试,键控操作下其输出信息如图5所示,说明按键的判别处理是正确的。

图5 输出信息


图6 运行状态

该云台控制程序,除适用于云台控制外,也适用于基于舵机驱动的各种机械臂、麦克纳姆轮
智能车方向控制和调速等,其用途是非常广泛的。

演示视频:
https://www.bilibili.com/video/BV1UHgUzZE2w/?vd_source=f302fc0cc3a0425328db53a3b92082ca





页: [1]
查看完整版本: BPI-CanMV-K230D-Zero的舵机云台的操控实现