OpenMV:21控制多个舵机(需要模块PCA9685)
文章目录
- 连接
- 代码
- 控制单个舵机的旋转
- 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)相关推荐
- 树莓派python控制舵机_使用树莓派控制16路舵机驱动板(pca9685)
使用树莓派控制16路舵机驱动板(pca9685) 在树莓派上,可以通过RPI.GPIO方便地输出PWM进行舵机控制. 使用RPI.GPIO 创建一个 PWM 实例: 1 p =GPIO.PWM(cha ...
- 树莓派控制16路PWM输出的PCA9685模块
树莓派控制16路PWM输出的PCA9685模块 1.PCA9685 1.1简介 采用I2C通信,内置了PWM驱动器和一个时钟,不需要不断发送信号占用单片机资源 支持16路PWM输出,每路12位分辨率( ...
- 立创梁山派GD32F450ZGT6--通过PCA9685控制16路舵机
PCA9685芯片,每一路LED输出端均可自由调节PWM波的频率 (40~1000Hz) 和占空比 (0%~100%) .这款芯片主要通过输出不同占空比的PWM脉冲信号来控制舵机转动的角度.是16通道 ...
- 51单片机PCA9685控制16路舵机(代码可直接使用)
51单片机PCA9685控制16路舵机 /**************************************************************************PCA96 ...
- 《树莓派项目实战》第十二节 使用PCA9685驱动板控制多个舵机
目录 11.1 引脚介绍 11.2 打开I2C接口 11.3 连接到树莓派 11.4 编写代码获取温度 因为树莓派无法同时生成多个稳定的PWM信号,所以也就无法控制多个舵机,我们需要借助PCA9685 ...
- ESP8266 12F 点灯科技APP 控制两个舵机
第一次写博客,有什么不足,希望大家指正. 文章目录 1.基本功能描述 2.程序 3.接线图 4.配置方法 5.注意事项 custom wifimanager 这个库在云盘在中呢 链接:https:// ...
- LabVIEW控制Arduino实现舵机联控(基础篇—9)
目录 1.控制单个舵机 1.1.实验目的 1.2.实验环境 1.3.程序设计 1.4.实验演示 2.控制多个舵机 2.1.实验目的 2.2.实验环境 2.3.程序设计 2.4.实验演示 本篇博文将通过 ...
- stm32按键控制mg90s数字舵机、pwm调节舵机转动角度
昨天做了一个简答的小实验,我感觉挺有意思的跟大家分享一下. 我用了按键控制mg90s数字舵机,前不久一直研究模拟舵机,数字舵机与模拟舵机的控制方式是一样的pwm时序. 数字舵机接线方面: 与模拟舵机一 ...
- 使用PCA9685控制多个舵机
todolist 要单独去找舵机的两个极值的大小,然后去该前文的映射的初始值 把角度值打印出来 0.准备 0.1.硬件设备 0.2.软件安装 1.安装好Arduino IDE 可以前往Arduino官 ...
最新文章
- Resource entery xx is already defined
- springMVC整合shiro权限框架示例与实践
- python Day5
- java 多网卡ip_java获取双网卡ip地址
- Qt Designer手册
- DWZ (JUI) 教程 navTab 刷新分析
- 打造轻量级可视化数据爬取工具-菩提
- 一台路由器实现电信ITV与宽带共享上网
- Hadoop生态hive(二)安装
- react学习(39)----react中的Hello World
- 基于MeanShift的目标跟踪算法及实现(转载)
- java反序列化时区,Jackson使用Java 8将Elasticsearch反序列化为LocalDateTime
- Vue实现pdf、docx、jpg在线预览功能
- 【CSS】制作ICO图标
- Android获取基带版本
- 【百度地图api】之获取当前用户地理位置-浏览器定位
- attempting to bokeyaunrun eclipse useing the jre instead of jdk,to run eclipse using
- 美容店信息管理系统与小程序设计与实现
- CANoe和CANoe.DiVa关于通信测试的简略汇总
- android屏幕截屏
热门文章
- 区块链协议新方向-图灵奖得主Macali开发Algorand
- chrome android 分屏,谷歌调整安卓系统:分屏多任务同时支持两款以上APP
- 崔卫平:作恶还是反抗?——邪恶体制…
- 一组数据,已知总和,求是哪几个数据的和
- 台达服务器怎么把绝对位置初始化,台达plc上电时参数的自动初始化实例
- 考研英语写作素材:常用特色词汇
- 计算机多媒体艺术导论,计算机多媒体艺术导论-01.ppt
- 字符集与编码五之代码单元及length方法
- template的用法(超详细)
- 对图片进行各种样式裁对图片进行各种样式裁剪:圆形、星形、心形、花瓣形等剪:圆形、星形、心形、花瓣形等--第三方开源--CustomShapeImageView