- 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:
- if key1.value()==0 :
- print("k1=",key1.value())
- if H<13 :
- H=H+1
- print(H)
- mov_h(H)
- if key2.value()==0 :
- print("k2=",key2.value())
- if H>3 :
- H=H-1
- print(H)
- mov_h(H)
- if key3.value()==0 :
- print("k3=",key3.value())
- if V<13 :
- V=V+1
- print(V)
- mov_v(V)
- if key4.value()==0 :
- print("k4=",key4.value())
- if V>3 :
- V=V-1
- print(V)
- mov_v(V)
- if key5.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 运行状态
该云台控制程序,除适用于云台控制外,也适用于基于舵机驱动的各种机械臂、麦克纳姆轮
智能车方向控制和调速等,其用途是非常广泛的。
演示视频: