文章目录

  • 连接
  • 代码
    • 控制单个舵机的旋转
    • pc8596.py
    • servo.py
    • main.py
    • 利用两个舵机拓展板控制16个舵机

今天我们来学习下 OpenMV的舵机拓展板来控制多个舵机同时使用

如果我们想控制三个以上的舵机,就需要用到舵机拓展板PCA9685

PCA9685使用的是I2C协议,我们可以直接使用PCA9685舵机拓展板来控制八个舵机

舵机的供电采用的是4.8V-6V的电源,我们可以用四节~五节干电池来进行供电(一节干电池就是1.2V的电压) ——不能使用3.7V的锂离子电池供电!

对于电源的供电,我们直接将电源连接到OpenMV的VCC和GND两个引脚即可

连接

将电机拓展板PCA9685插到OpenMV上,电源(4.8V~6V)连接到右侧的VCC和GND上

一个有八个引脚,可以控制八个舵机,每排引脚从上往下是:PWM(信号线)、VCC(电源线)、GND(地线)


舵机的编号从左到右编号为0-7


代码

控制单个舵机的旋转

核心代码:servo.position(i, x) # 控制第i号舵机旋转x°

pc8596.py


import utime
import ustructclass PCA9685:def __init__(self, i2c, address=0x40):self.i2c = i2cself.address = addressself.reset()def _write(self, address, value):self.i2c.writeto_mem(self.address, address, bytearray([value]))def _read(self, address):return self.i2c.readfrom_mem(self.address, address, 1)[0]def reset(self):self._write(0x00, 0x00) # Mode1def freq(self, freq=None):if freq is None:return int(25000000.0 / 4096 / (self._read(0xfe) - 0.5))prescale = int(25000000.0 / 4096.0 / freq + 0.5)old_mode = self._read(0x00) # Mode 1self._write(0x00, (old_mode & 0x7F) | 0x10) # Mode 1, sleepself._write(0xfe, prescale) # Prescaleself._write(0x00, old_mode) # Mode 1utime.sleep_us(5)self._write(0x00, old_mode | 0xa1) # Mode 1, autoincrement ondef pwm(self, index, on=None, off=None):if on is None or off is None:data = self.i2c.readfrom_mem(self.address, 0x06 + 4 * index, 4)return ustruct.unpack('<HH', data)data = ustruct.pack('<HH', on, off)self.i2c.writeto_mem(self.address, 0x06 + 4 * index,  data)def duty(self, index, value=None, invert=False):if value is None:pwm = self.pwm(index)if pwm == (0, 4096):value = 0elif pwm == (4096, 0):value = 4095value = pwm[1]if invert:value = 4095 - valuereturn valueif not 0 <= value <= 4095:raise ValueError("Out of range")if invert:value = 4095 - valueif value == 0:self.pwm(index, 0, 4096)elif value == 4095:self.pwm(index, 4096, 0)else:self.pwm(index, 0, value)

servo.py


import pca9685
import mathclass Servos:def __init__(self, i2c, address=0x40, freq=50, min_us=600, max_us=2400, degrees=180):self.period = 1000000 / freqself.min_duty = self._us2duty(min_us)self.max_duty = self._us2duty(max_us)self.degrees = degreesself.freq = freqself.pca9685 = pca9685.PCA9685(i2c, address)self.pca9685.freq(freq)def _us2duty(self, value):return int(4095 * value / self.period)def position(self, index, degrees=None, radians=None, us=None, duty=None):span = self.max_duty - self.min_dutyif degrees is not None:duty = self.min_duty + span * degrees / self.degreeselif radians is not None:duty = self.min_duty + span * radians / math.radians(self.degrees)elif us is not None:duty = self._us2duty(us)elif duty is not None:passelse:return self.pca9685.duty(index)duty = min(self.max_duty, max(self.min_duty, int(duty)))self.pca9685.duty(index, duty)def release(self, index):self.pca9685.duty(index, 0)

main.py


# 舵机控制示例。
#
# 这个例子演示了舵机扩展板。请按照以下步骤操作:
#
#   1. 连接舵机到任何PWM输出。
#   2. 将3.7v电池(或5V电源)连接到VIN和GND。
#   3. 将pca9685.py和servo.py复制到OpenMV并重置。
#   4. 在IDE中连接并运行此脚本。import time # 导入时钟
from servo import Servos    # 导入舵机类
from machine import I2C, Pin    # 导入I2C协议和Pin引脚定义# 创建一个I2C对象(I2C是一个类)
i2c = I2C(sda=Pin('P5'), scl=Pin('P4')) # 设置I2C的sda地址为P5引脚,scl地址为P4引脚   这是不需要更改的# 创建一个舵机对象
servo = Servos(i2c, address=0x40, freq=50, min_us=500, max_us=2500, degrees=180)# 参数1:"i2c"表示我们采用I2C协议  参数2:"address=0x40"表示I2C的地址是0x40(0x40是由拓展板的参数决定的,如果要焊接背面的焊点要改成0x60,具体见官网)# 参数3:"freq"表示舵机的频率,与我们使用的舵机有关  参数4、5:"min_us和max_us"分别表示最小脉宽和最大脉宽,需要更改为和舵机一样的参数(具体见官网)# 参数6:"degress"表示角度# 循环八个舵机
while True:# i指舵机的编号for i in range(0, 8):servo.position(i, 0)    # 控制每个舵机先转到0°time.sleep_ms(500)  # 延迟500msfor i in range(0, 8):servo.position(i, 180)  # 控制每个舵机转到180°time.sleep_ms(500)  # 延迟500ms

利用两个舵机拓展板控制16个舵机


# 舵机控制示例。
#
# 这个例子演示了舵机扩展板。请按照以下步骤操作:
#
#   1. 连接舵机到任何PWM输出。
#   2. 将3.7v电池(或5V电源)连接到VIN和GND。
#   3. 将pca9685.py和servo.py复制到OpenMV并重置。
#   4. 在IDE中连接并运行此脚本。import time # 导入时钟
from servo import Servos    # 导入舵机类
from machine import I2C, Pin    # 导入I2C协议和Pin引脚定义# 创建一个I2C对象(I2C是一个类)
i2c = I2C(sda=Pin('P5'), scl=Pin('P4')) # 设置I2C的sda地址为P5引脚,scl地址为P4引脚   这是不需要更改的# 创建两个舵机对象
servo1 = Servos(i2c, address=0x40, freq=50, min_us=500, max_us=2500, degrees=180)# 参数1:"i2c"表示我们采用I2C协议  参数2:"address=0x40"表示I2C的地址是0x40(0x40是由拓展板的参数决定的,如果要焊接背面的焊点要改成0x60,具体见官网)# 参数3:"freq"表示舵机的频率,与我们使用的舵机有关  参数4、5:"min_us和max_us"分别表示最小脉宽和最大脉宽,需要更改为和舵机一样的参数(具体见官网)# 参数6:"degress"表示角度# 二号舵机需要更改地址为0x60   由于使用的是同一款舵机,因此其他参数不需要更改
servo2 = Servos(i2c, address=0x60, freq=50, min_us=500, max_us=2500, degrees=180)  # 循环十六个舵机
while True:# i指舵机的编号    可分别指定是servo1的舵机运动还是servo2的舵机运动for i in range(0, 8):servo1.position(i, 0)    # 控制每个舵机先转到0°        time.sleep_ms(500)  # 延迟500msfor i in range(0, 8):servo1.position(i, 180)  # 控制每个舵机转到180°        time.sleep_ms(500)  # 延迟500msfor i in range(0, 8):servo2.position(i, 0)    # 控制每个舵机先转到0°        time.sleep_ms(500)  # 延迟500msfor i in range(0, 8):servo2.position(i, 180)  # 控制每个舵机转到180°        time.sleep_ms(500)  # 延迟500ms

OpenMV:21控制多个舵机(需要模块PCA9685)相关推荐

  1. 树莓派python控制舵机_使用树莓派控制16路舵机驱动板(pca9685)

    使用树莓派控制16路舵机驱动板(pca9685) 在树莓派上,可以通过RPI.GPIO方便地输出PWM进行舵机控制. 使用RPI.GPIO 创建一个 PWM 实例: 1 p =GPIO.PWM(cha ...

  2. 树莓派控制16路PWM输出的PCA9685模块

    树莓派控制16路PWM输出的PCA9685模块 1.PCA9685 1.1简介 采用I2C通信,内置了PWM驱动器和一个时钟,不需要不断发送信号占用单片机资源 支持16路PWM输出,每路12位分辨率( ...

  3. 立创梁山派GD32F450ZGT6--通过PCA9685控制16路舵机

    PCA9685芯片,每一路LED输出端均可自由调节PWM波的频率 (40~1000Hz) 和占空比 (0%~100%) .这款芯片主要通过输出不同占空比的PWM脉冲信号来控制舵机转动的角度.是16通道 ...

  4. 51单片机PCA9685控制16路舵机(代码可直接使用)

    51单片机PCA9685控制16路舵机 /**************************************************************************PCA96 ...

  5. 《树莓派项目实战》第十二节 使用PCA9685驱动板控制多个舵机

    目录 11.1 引脚介绍 11.2 打开I2C接口 11.3 连接到树莓派 11.4 编写代码获取温度 因为树莓派无法同时生成多个稳定的PWM信号,所以也就无法控制多个舵机,我们需要借助PCA9685 ...

  6. ESP8266 12F 点灯科技APP 控制两个舵机

    第一次写博客,有什么不足,希望大家指正. 文章目录 1.基本功能描述 2.程序 3.接线图 4.配置方法 5.注意事项 custom wifimanager 这个库在云盘在中呢 链接:https:// ...

  7. LabVIEW控制Arduino实现舵机联控(基础篇—9)

    目录 1.控制单个舵机 1.1.实验目的 1.2.实验环境 1.3.程序设计 1.4.实验演示 2.控制多个舵机 2.1.实验目的 2.2.实验环境 2.3.程序设计 2.4.实验演示 本篇博文将通过 ...

  8. stm32按键控制mg90s数字舵机、pwm调节舵机转动角度

    昨天做了一个简答的小实验,我感觉挺有意思的跟大家分享一下. 我用了按键控制mg90s数字舵机,前不久一直研究模拟舵机,数字舵机与模拟舵机的控制方式是一样的pwm时序. 数字舵机接线方面: 与模拟舵机一 ...

  9. 使用PCA9685控制多个舵机

    todolist 要单独去找舵机的两个极值的大小,然后去该前文的映射的初始值 把角度值打印出来 0.准备 0.1.硬件设备 0.2.软件安装 1.安装好Arduino IDE 可以前往Arduino官 ...

最新文章

  1. Resource entery xx is already defined
  2. springMVC整合shiro权限框架示例与实践
  3. python Day5
  4. java 多网卡ip_java获取双网卡ip地址
  5. Qt Designer手册
  6. DWZ (JUI) 教程 navTab 刷新分析
  7. 打造轻量级可视化数据爬取工具-菩提
  8. 一台路由器实现电信ITV与宽带共享上网
  9. Hadoop生态hive(二)安装
  10. react学习(39)----react中的Hello World
  11. 基于MeanShift的目标跟踪算法及实现(转载)
  12. java反序列化时区,Jackson使用Java 8将Elasticsearch反序列化为LocalDateTime
  13. Vue实现pdf、docx、jpg在线预览功能
  14. 【CSS】制作ICO图标
  15. Android获取基带版本
  16. 【百度地图api】之获取当前用户地理位置-浏览器定位
  17. attempting to bokeyaunrun eclipse useing the jre instead of jdk,to run eclipse using
  18. 美容店信息管理系统与小程序设计与实现
  19. CANoe和CANoe.DiVa关于通信测试的简略汇总
  20. android屏幕截屏

热门文章

  1. 区块链协议新方向-图灵奖得主Macali开发Algorand
  2. chrome android 分屏,谷歌调整安卓系统:分屏多任务同时支持两款以上APP
  3. 崔卫平:作恶还是反抗?——邪恶体制…
  4. 一组数据,已知总和,求是哪几个数据的和
  5. 台达服务器怎么把绝对位置初始化,台达plc上电时参数的自动初始化实例
  6. 考研英语写作素材:常用特色词汇
  7. 计算机多媒体艺术导论,计算机多媒体艺术导论-01.ppt
  8. 字符集与编码五之代码单元及length方法
  9. template的用法(超详细)
  10. 对图片进行各种样式裁对图片进行各种样式裁剪:圆形、星形、心形、花瓣形等剪:圆形、星形、心形、花瓣形等--第三方开源--CustomShapeImageView