news 2026/1/22 22:07:28

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[python] BPI-CanMV-K230D-Zero的舵机云台的操控实现

对于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开发板来提供,其程序的基本框架为:

复制

  1. from machine import PWM
  2. from machine import FPIOA
  3. # 实例化FPIOA
  4. fpioa = FPIOA()
  5. # 设置PIN60为PWM通道0
  6. fpioa.set_function(60, fpioa.PWM0)
  7. # 实例化PWM通道0,频率为50Hz,占空比可调x: 2 ~ 13,默认使能输出
  8. x=2
  9. pwm0 = PWM(0, 50, x, enable = True)
  10. # 关闭通道0输出
  11. pwm0.enable(0)
  12. # 调整通道0频率为50Hz
  13. pwm0.freq(50)
  14. # 调整通道0占空比为40%
  15. pwm0.duty(40)
  16. # 打开通道0输出

在不同的占空比下,舵机的摆角会处于不同的状态。

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


图2 五向导航按键模块


图3引脚作用


图4 器件连接

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

将所用引脚设置为输入模式的语句为:

复制

  1. fpioa.set_function(3, FPIOA.GPIO3)
  2. Pin1 = Pin(3,Pin.IN, pull=Pin.PULL_UP, drive=7) //L
  3. fpioa.set_function(4, FPIOA.GPIO4)
  4. Pin2 = Pin(4,Pin.IN, pull=Pin.PULL_UP, drive=7) //R
  5. fpioa.set_function(5, FPIOA.GPIO5)
  6. Pin3 = Pin(5,Pin.IN, pull=Pin.PULL_UP, drive=7) //U
  7. fpioa.set_function(6, FPIOA.GPIO6)
  8. Pin4 = Pin(6,Pin.IN, pull=Pin.PULL_UP, drive=7) //D
  9. fpioa.set_function(2, FPIOA.GPIO2)
  10. Pin4 = Pin(2,Pin.IN, pull=Pin.PULL_UP, drive=7) //M
  11. print(pin1.value())


2)占空比调节与舵机控制
实现键控舵机运动的程序为:

复制

  1. from machine import Pin
  2. from machine import FPIOA
  3. from machine import PWM
  4. import time
  5. # 实例化FPIOA
  6. fpioa = FPIOA()
  7. # 设置Pin2为GPIO2
  8. # 设置Pin6为GPIO6
  9. fpioa.set_function(3, FPIOA.GPIO3)
  10. fpioa.set_function(4, FPIOA.GPIO4)
  11. fpioa.set_function(5, FPIOA.GPIO5)
  12. fpioa.set_function(6, FPIOA.GPIO6)
  13. fpioa.set_function(2, FPIOA.GPIO2)
  14. # 实例化Pin2~Pin6为输入
  15. key1 = Pin(3, Pin.IN, pull=Pin.PULL_UP, drive=7)
  16. key2 = Pin(4, Pin.IN, pull=Pin.PULL_UP, drive=7)
  17. key3 = Pin(5, Pin.IN, pull=Pin.PULL_UP, drive=7)
  18. key4 = Pin(6, Pin.IN, pull=Pin.PULL_UP, drive=7)
  19. key5 = Pin(2, Pin.IN, pull=Pin.PULL_UP, drive=7)
  20. H=0
  21. V=0
  22. fpioa = FPIOA()
  23. # 设置PIN60为PWM通道0
  24. fpioa.set_function(60, fpioa.PWM0)
  25. # 设置PIN61为PWM通道1
  26. fpioa.set_function(61, fpioa.PWM1)
  27. # 实例化PWM通道0,频率为50Hz,占空比可调x: 2 ~ 13,默认使能输出
  28. x=2
  29. pwm0 = PWM(0, 50, x, enable = True)
  30. pwm1 = PWM(1, 50, x, enable = True)
  31. def mov_h(n) :
  32. # 关闭通道0输出
  33. pwm0.enable(0)
  34. # 调整通道0占空比为n%
  35. pwm0.duty(n)
  36. # 打开通道0输出
  37. pwm0.enable(1)
  38. def mov_v(m) :
  39. # 关闭通道1输出
  40. pwm1.enable(0)
  41. # 调整通道0占空比为m%
  42. pwm1.duty(m)
  43. # 打开通道0输出
  44. pwm1.enable(1)
  45. while True:
  46. if key1.value()==0 :
  47. print("k1=",key1.value())
  48. if H<13 :
  49. H=H+1
  50. print(H)
  51. mov_h(H)
  52. if key2.value()==0 :
  53. print("k2=",key2.value())
  54. if H>3 :
  55. H=H-1
  56. print(H)
  57. mov_h(H)
  58. if key3.value()==0 :
  59. print("k3=",key3.value())
  60. if V<13 :
  61. V=V+1
  62. print(V)
  63. mov_v(V)
  64. if key4.value()==0 :
  65. print("k4=",key4.value())
  66. if V>3 :
  67. V=V-1
  68. print(V)
  69. mov_v(V)
  70. if key5.value()==0 :
  71. print("k5=",key5.value())
  72. H=8
  73. V=8
  74. print(H)
  75. print(V)
  76. mov_h(H)
  77. mov_v(V)
  78. time.sleep(0.5)


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


图5 输出信息


图6 运行状态

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

演示视频:






---------------------
作者:jinglixixi
链接:https://bbs.21ic.com/icview-3466666-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/17 20:15:01

从零开始:Docker Compose YAML 文件深度解析与最佳实践

在现代应用开发中&#xff0c;一个应用通常由多个服务组成&#xff1a;Web 服务器、数据库、缓存、消息队列等。手动启动和管理这些容器不仅繁琐&#xff0c;而且容易出错。 Docker Compose 正是解决这一痛点的利器。它允许你使用一个声明式的 YAML 文件来定义整个应用栈的结构…

作者头像 李华
网站建设 2026/1/20 16:40:18

29、Linux 系统的电源管理与进程线程模型解析

Linux 系统的电源管理与进程线程模型解析 1. CPUIdle 驱动 CPUIdle 与 CPUFreq 子系统类似,由属于板级支持包(BSP)的驱动和决定策略的调节器组成。但与 CPUFreq 不同的是,CPUIdle 的调节器在运行时不能更改,也没有用户空间调节器的接口。 CPUIdle 在 /sys/devices/syst…

作者头像 李华
网站建设 2026/1/17 22:03:01

Flutter应用嵌入鸿蒙智慧座舱数字孪生界面的实现

欢迎大家加入[开源鸿蒙跨平台开发者社区](https://openharmonycrossplatform.csdn.net)&#xff0c;一起共建开源鸿蒙跨平台生态。Flutter应用嵌入鸿蒙智慧座舱数字孪生界面的实现Flutter作为跨平台开发框架&#xff0c;结合鸿蒙系统的分布式能力&#xff0c;可以在智慧座舱场景…

作者头像 李华
网站建设 2026/1/18 17:00:30

33、深入理解内存管理:交换、映射与泄漏检测

深入理解内存管理:交换、映射与泄漏检测 1. 内存交换(Swapping) 内存交换的核心思想是预留一些存储空间,让内核可以将未映射到文件的内存页面放置其中,从而释放内存以供其他用途。通过交换文件的大小,有效增加了物理内存的大小。不过,这并非万能之策,将页面复制到交换…

作者头像 李华
网站建设 2026/1/19 19:49:32

34、Linux内存管理与GDB调试全解析

Linux内存管理与GDB调试全解析 1. 内存耗尽问题 在Linux系统中,标准的内存分配策略是过度提交(over - commit),即内核允许应用程序分配的内存超过实际物理内存。多数情况下,这一策略运行良好,因为应用程序通常会请求比实际所需更多的内存。同时,这也有利于 fork(2) …

作者头像 李华
网站建设 2026/1/20 12:20:21

【打印】默认长边装订

只要正面 背面&#xff0c;方向正常对齐&#xff0c;不需要翻转阅读 → 选“长边装订”即可。 下面我给你讲清楚为什么选这个。 ✅ 你现在的需求是什么&#xff1f; 你说&#xff1a; “只是把第二页放在第一页的背面”想要普通书本那种阅读方式不需要倒着翻、不需要侧着翻 …

作者头像 李华