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

2023-05-16

文章目录

  • 连接
  • 代码
    • 控制单个舵机的旋转
    • 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 ustruct

class PCA9685:
    def __init__(self, i2c, address=0x40):
        self.i2c = i2c
        self.address = address
        self.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) # Mode1

    def 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 1
        self._write(0x00, (old_mode & 0x7F) | 0x10) # Mode 1, sleep
        self._write(0xfe, prescale) # Prescale
        self._write(0x00, old_mode) # Mode 1
        utime.sleep_us(5)
        self._write(0x00, old_mode | 0xa1) # Mode 1, autoincrement on

    def 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 = 0
            elif pwm == (4096, 0):
                value = 4095
            value = pwm[1]
            if invert:
                value = 4095 - value
            return value
        if not 0 <= value <= 4095:
            raise ValueError("Out of range")
        if invert:
            value = 4095 - value
        if 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 math

class Servos:
    def __init__(self, i2c, address=0x40, freq=50, min_us=600, max_us=2400, degrees=180):
        self.period = 1000000 / freq
        self.min_duty = self._us2duty(min_us)
        self.max_duty = self._us2duty(max_us)
        self.degrees = degrees
        self.freq = freq
        self.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_duty
        if degrees is not None:
            duty = self.min_duty + span * degrees / self.degrees
        elif 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:
            pass
        else:
            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)  # 延迟500ms
    
    for 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)  # 延迟500ms
    
    for i in range(0, 8):
        servo1.position(i, 180)  # 控制每个舵机转到180°        
    time.sleep_ms(500)  # 延迟500ms


    for i in range(0, 8):
        servo2.position(i, 0)    # 控制每个舵机先转到0°        
    time.sleep_ms(500)  # 延迟500ms
    
    for i in range(0, 8):
        servo2.position(i, 180)  # 控制每个舵机转到180°        
    time.sleep_ms(500)  # 延迟500ms

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenMV:21控制多个舵机(需要模块PCA9685) 的相关文章

  • openmv与其他单片双向串口通信

    Openmv与其他单片双向串口通信 目的 为了让openmv进行阈值切换或者只运行某一部分代码 xff0c 因此需要openmv与其他单片建立双向通信进行更改内部参数 起因 openmv自带接收函数uart read 进行接收 xff0c
  • Openmv+STM32F103C8T6视觉巡线小车

    Openmv巡线 机器视觉巡线处理是参考openmv官方代码 Openmv官网源代码 xff1a book openmv cc project follow lines html 根据官网视频及教程将源码注入openmv中 小车巡的是黑线
  • ESP32设备驱动-PCA9685 LED控制器驱动

    PCA9685 LED控制器驱动 文章目录 PCA9685 LED控制器驱动 1 PCA9685介绍 2 硬件准备 3 软件准备 4 驱动实现 1 PCA9685介绍 PCA9685 是一款 I C 总线控制的 16 通道 LED 控制器
  • openmv中模块解析

    模块解析 1 sensor摄像头模块 xff1a 包含了感光芯片与图像预处理的各项操作 sensor reset 重置并初始化OpenMV sensor set pixformat sensor RGB565 选择颜色空间与像素格式RGB5
  • 2021电赛F题之openmv巡线(附代码)

    效果展示 xff1a 出错解决方法 openmv数字识别源代码 gitee 通过使用不同阈值的方法可以得到当前区域中什么区域有红线 xff0c 对于电控而言作用类似于红外对管 xff0c 之后电控通过逻辑判断如何运动 xff0c 这就是我们
  • 蓝牙 舵狗 openmv通信相关

    总的思路是以openmv 接收蓝牙的指令 xff0c 如果是自动选项 xff0c 就在openmv 运行识别红球进行固定距离跟踪的程序 xff1b 如果是手动选项 xff0c openmv就直接把所得到的数据传给STM xff13 xff1
  • pixhawk无人机结合openmv之精准降落

    pixhawk飞控与openmv之精准降落 一 精准降落概述二 精准降落流程三 代码逻辑流程四 总结反思改进 一 精准降落概述 1 概述 无人机在生产生活中逐渐获得更大的用途 xff0c 京东的物流无人机有望解决用户快递最后一分钟的问题 x
  • OPENMV巡线

    将openmv图片划分成三个ROI区域 import sensor image time lcd from pyb import UART from pyb import LED ROIS 61 0 0 160 40 0 6 0 40 16
  • Jetson nano i2c教程(MPU6050 + PCA9685)

    首先介绍nano板子上的i2c相关的硬件信息 xff1a 安装所需要的i2c库 sudo apt get install l y i2c tools 完成nano中io与i2c设备的硬件接线 本次案例使用的是PCA9685和MPU6050
  • openmv的串口传输

    import sensor image time from pid import PID from pyb import Servo from pyb import UART uartCP 61 UART 1 115200 用于电脑与OPe
  • 【DIY】基于OpenMV的STM32追球小车

    目录 xff1a 总体设计1 基础硬件DIY设计1 xff09 整体原理图2 xff09 PCB电路 2 OpenMV简单识别程序设计 与 STM32控制程序设计1 xff09 OpenMV简单识别程序设计 microPython 2 xf
  • 2019电赛--无人机题目OpenMV总结

    此文章在我的博客链接 xff1a https sublimerui top archives d508d500 html NOTES xff1a 上一篇相关博文 xff0c 准备阶段OpenMV学习笔记链接 xff1a https blog
  • Openmv色块追踪

    Openmv 拿到后第一次进行开发 xff08 颜色追踪 xff09 Openmv本身是具有很多的内置函数的 xff0c 基本都是别人给我们写好了 xff0c 需要我们自己去调用 xff0c 并给函数传递参数以实现我们需要的效果 但是很多初
  • 【OpenMV小车——第1.2篇】OpenMV主控板的简介与入门使用

    前言 xff1a 视觉小车最重要的是视觉功能 xff0c 其实现方式主要有 xff1a Opencv 43 外置计算机摄像头 需要计算机作为上位机 Stm32 43 OV7670 较难 xff0c 大师级 OpenMV摄像头 较简单 xff
  • 【串口通信】K210与STM32串口通信、K210与OpenMV串口通信

    串口通信 K210与STM32串口通信 K210与OpenMV串口通信 串口通信前言为何需要串口通信 K210如何进行串口通信K210串口配置K210串口发送相关定义K210串口发送测试K210串口接收相关定义K210串口接收测试 STM3
  • OPENMV结合PIX飞控实现四轴定点 循迹 2017电赛

    本文章代码已上传Github xff1a https github com Kevincoooool 2017 Follow 有兴趣的可以加个STAR 自从17年国赛之后 xff0c 自己做了openmv xff0c 加了很多群 xff0c
  • OpenMV:19OpenMV4 Plus训练神经网络进行口罩识别

    文章目录 1 采集2 连接3 训练复制API KEY上传照片模型创建生成神经网络训练神经网络测试神经网络备份保存 4 下载代码分析 注意 xff1a 只有 OpenMV4 Plus可以自己训练神经网络 xff0c 其他版本的性能不够 本节讲
  • 【OpenMv小车】OpenMv追小球的小车之pid调用

    pid py gt gt https github com wagnerc4 flight controller blob master pid py openmv 官网 xff1a http book openmv cc project
  • OpenMV4开发笔记4-舵机控制

    OpenMV4的舵机控制脚有3个 P7 P8 P9 即可以控制3个舵机 Servo 1 gt P7 PD12 Servo 2 gt P8 PD13 OpenMV3 M7 OpenMV4 H7上增加 Servo 3 gt P9 PD14 注意
  • 2021全国电设(F题)openmv的图像识别之数字识别

    基于openmv的图像识别 通过参加全国电子设计大赛F题总结出openmv4的数字识别 其它版本暂时没试过 欢迎交流 openmv简介 OpenMV是一个开源 低成本 功能强大的机器视觉模块 以STM32F427CPU为核心 集成了OV77

随机推荐

  • Linux--UDP编程

    目录 一 实现的过程 二 代码 xff1a 1 ser c 2 cli c 三 运行结果 四 服务器端断开重运行 xff0c 客户端还能发送吗 xff1f xff08 可以 xff09 五 可以同时运行两个客户端吗 xff1f xff08
  • 51单片机串行通信奇偶校验的设置方法

    51单片机串行通信奇偶校验的设置方法 悬赏分 xff1a 10 解决时间 xff1a 2009 12 5 10 21 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 6
  • pycharm连接VMware

    一 上传目录的配置 1 打开虚拟机 xff0c 进入终端查看host ip addr 输出此命令 记住下面会用到 2 打开pycharm新建一个py文件 3 点击ok后会出现如下图 设置好后先点击1 xff0c 测试是否连接成功 xff0c
  • 请确保您已登录客户机操作系统。在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools。

    解决Ubuntu安装VM Tools请确保您已登录客户机操作系统 在客户机中装载CD驱动器启动终端 xff0c 使用tar解压缩安装程序 xff0c 然后执行vmware insall pl安装VMware Tools whafal的博客
  • 使用SSH远程连接工具(MOBAXTERM)连接虚拟机时输入中文乱码问题

    使用SSH远程连接工具连接虚拟机时输入中文乱码问题 一 xff1a 出现的中文输入问题 二 xff1a 造成的可能原因和出现原因的环境 出现原因的环境 xff1a 本机环境win10 xff0c 虚拟机环境centos7 出现这样情况的可能
  • vscode的alt+b失效解决

    1 先安装插件 xff0c 如下 2 一共有两种方式打开浏览器 xff0c 一个是alt 43 b xff0c 还有一个是alt 43 shift 43 b 但是对于刚安装上open in browser插件 xff0c alt 43 b是
  • 解决ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)

    如何解决ERROR 2003 HY000 Can t connect to MySQL server on localhost 10061 1 登录到安装Mysql的主机 xff0c 打开cmd命令行工具 xff0c 执行命令mysql u
  • vscode中converting to execution character set: Illegal byte sequence

    我的这个问题是由于之前跟博主安装的时候在tasks json文件中添加了 34 fexec charset 61 GBK 34 删除后便可以正常运行了 当时即使我没添加这个代码控制台也没出现乱码的情况 xff0c 但还是加上了 xff0c
  • 工作日志day04

    再次安装虚拟机时常见的不确定点 软件选择 安装位置 点击完成 设置用户名的时候可能与数字 xff0c 以及强度有关 注销以管理员身份登录填写root用户名和自己设的密码 网络设置之后可以ping通 sudo yum y install tr
  • linux

    目录 基本命令 文件和用户管理 用户 创建用户 删除用户 修改用户属性 用户组 创建组 组的类型 提权 用户的权限 基本权限UGO 权限的三类对象 权限的三种类型 设置权限 编写程序 增加执行权限 更改属主 xff0c 属组 基本权限ACL
  • 机器学习.

    目录 一 机器学习概述 1 1人工智能概述 1 2什么是机器学习 1 2 1定义 1 2 2解释 1 2 3数据集的构成 1 3机器学习算法分类 1 3 1总结 1 3 2机器学习算法分类 1 4机器学习开发流程 1 5学习框架和资料介绍
  • NMEA-0813协议报文解析(QT/C++)

    文章目录 一 协议说明 二 具体实现 1 GNRMC 2 GNGGA 总结 一 协议说明 34 GN 34 联合模式协议头 xff1b 34 GP 34 GPS模式协议头 xff1b 34 GL 34 GLONASS模式协议头 xff1b
  • 寄存器位设置

    作为嵌入式工程师 xff0c 一定要掌握寄存器的控制 xff0c 想要了解基本的寄存器控制 xff0c 最简单的方法就是使用单片机练手 xff0c 51 xff0c stm0 xff0c stm8 xff0c MSP430等 xff0c 与
  • STM32 —— STM32 的串口通信

    STM32 STM32 的串口通信 STM32的串口通信接口有两种 xff0c 分别是 xff1a UART 通用异步收发器 USART 通用同步异步收发器 而对于大容量 STM32F10x 系列芯片 xff0c 分别有 3 个 USART
  • STM32 —— 串口数据接收

    STM32 串口接收数据 我们已经在前面的博客中讲过了串口通信中发送数据和中断的一些基本原理 xff0c 这里主要介绍串口接收数据的相关内容 定长字符串的接收 当接收单字节时 xff0c 我们就可以使用最简单的接收方式即可 xff0c 这种
  • 远距离WiFi模块,无人机传输技术,无线通信视频传输技术

    随着科技的发展 xff0c 无人机应用范围的不断扩展且愈加广泛 无人机的起飞 xff0c 航行 xff0c 悬停 xff0c 返回的任何一个阶段 xff0c 都需要进行无线遥控 xff0c 这就需要很高的灵敏度了 同时在无人机飞行的过程中
  • OpenMV:14巡线小车

    文章目录 追小球的小车巡线小车 这个例子展示了在OpenMV Cam上使用get regression xff08 xff09 方法获得ROI的线性回归 使用这种方法 xff0c 可以轻松让机器人跟踪所有指向相同大致方向的线 本例程可以用于
  • OpenMV:16神经网络

    文章目录 导论利用神经网络进行特征识别 已停用 神经网络检测函数检测函数 96 tf classify 96 返回值加载神经网络函数 96 tf load 返回值 96 例程1 图像中央人检测例程2 整幅图像人脸检测 导论 OpenMV内置
  • OpenMV:19OpenMV4 Plus训练神经网络进行口罩识别

    文章目录 1 采集2 连接3 训练复制API KEY上传照片模型创建生成神经网络训练神经网络测试神经网络备份保存 4 下载代码分析 注意 xff1a 只有 OpenMV4 Plus可以自己训练神经网络 xff0c 其他版本的性能不够 本节讲
  • OpenMV:21控制多个舵机(需要模块PCA9685)

    文章目录 连接代码控制单个舵机的旋转pc8596 pyservo pymain py利用两个舵机拓展板控制16个舵机 今天我们来学习下 OpenMV的舵机拓展板来控制多个舵机同时使用 如果我们想控制三个以上的舵机 xff0c 就需要用到舵机