# -*- coding:utf-8 -*-
import time
#引入pca9685的原始代码
import machine
#这里加入了灯光展示
from light import Light
#引入mqtt的paho
import paho.mqtt.client as mqtt#本地ip
MQTTHOST = "127.0.0.1"
#mqtt的端口号
MQTTPORT = 1883
#初始化mqttClient
mqttClient = mqtt.Client()#初始化pwm
pwm = machine.PCA9685(0x40, debug=False)
#设置pwm的频率
pwm.setPWMFreq(50)#设置初始上下位置为中间,(500+2500)/2 = 1500
up = 1500
#设置初始左右位置为中间
dw = 1500
#设置灯的接口位置
led = Light(17)# 消息处理函数
def on_message_come(client, userdata, msg):topicmsg = str(msg.payload.decode("utf-8"))msgList = topicmsg.split(',', 1)#evalFunc的作用是将接受的命令字符串变成对应的方法进行执行evalFunc(msgList[0], msgList[1])# 连接MQTT服务器
def on_mqtt_connect():mqttClient.connect(MQTTHOST, MQTTPORT, 60)    # subscribe 消息订阅
def on_subscribe(top):mqttClient.subscribe(top, 1)  # 主题为"mqtt"mqttClient.on_message = on_message_come  # 消息到来处理函数mqttClient.loop_forever()def evalFunc(func, n):#例如获取到了mqtt消息,right,1 ,这个表示执行向右1个单位,一共10个单位 print(str(func) + '(' + str(n) + ')')#eval可以调用方法进行执行eval(str(func) + '(' + str(n) + ')')#这个是恢复到初始位置
def reset(n):led.blink()global upglobal dwfor i in range(1400,1500,1):pwm.setServoPulse(0,i)time.sleep(0.00025)for i in range(1400,1500,1):pwm.setServoPulse(1,i)time.sleep(0.00025)up = 1500dw = 1500#这个是向前进的代码
def front(n):n = int(n)#这里我自定义n乘以5,是因为我之前每次执行一个单位,我想一次性执行5个单位的向下n = n * 5#灯光闪烁led.blink()global up#这里会判断是否已经到了阈值范围,如果到了则不执行下一步if up != 2500:#开启循环进行,从up到up+100*n,每次走100 * n个距离,当然这里你可以10 * n,这样舵机移动的角度非常小非常小#我这里500~2500一共是2000个,分20下100 * n,当n为1时,则移动20下从最前边到最后边,角度大概是从0度到180度这样,具体度数描述不太准确,请见谅#现在n = n * 5,意味着我只需要4下就从最前边到最后面,具体根据你的度数范围来,还有根据你移动的角度大小来决定舵机的速度for i in range(up,up+100*n,1*n):pwm.setServoPulse(0,i)time.sleep(0.00025)#每次执行完毕后,up都会变化up += 100*n#这里防止up变大超过2500,则变为2500if up > 2500:up = 2500def back(n):n = int(n)n = n * 5led.blink()global upif up != 500:for i in range(up,up-100*n,-1*n):pwm.setServoPulse(0,i)time.sleep(0.00025)up -= 100*nif up < 500:up = 500def left(n):n = int(n)n = n * 2led.blink()global dwif dw != 2500:for i in range(dw,dw+100*n,1*n):pwm.setServoPulse(1,i)time.sleep(0.00025)dw += 100*nif dw > 2500:dw = 2500def right(n):n = int(n)n = n * 2led.blink()global dwif dw != 500:for i in range(dw,dw-100*n,-1*n):pwm.setServoPulse(1,i)time.sleep(0.00025)dw -= 100*nif dw < 500:dw = 500if __name__ == '__main__':topic='mqtt'on_mqtt_connect()on_subscribe(topic)

下面是machine的代码,也就是PCA9685的python3测试代码

#!/usr/bin/pythonimport time
import math
import smbus# ============================================================================
# Raspi PCA9685 16-Channel PWM Servo Driver
# ============================================================================class PCA9685:# Registers/etc.__SUBADR1            = 0x02__SUBADR2            = 0x03__SUBADR3            = 0x04__MODE1              = 0x00__PRESCALE           = 0xFE__LED0_ON_L          = 0x06__LED0_ON_H          = 0x07__LED0_OFF_L         = 0x08__LED0_OFF_H         = 0x09__ALLLED_ON_L        = 0xFA__ALLLED_ON_H        = 0xFB__ALLLED_OFF_L       = 0xFC__ALLLED_OFF_H       = 0xFDdef __init__(self, address=0x40, debug=False):self.bus = smbus.SMBus(1)self.address = addressself.debug = debugif (self.debug):print("Reseting PCA9685")self.write(self.__MODE1, 0x00)def write(self, reg, value):"Writes an 8-bit value to the specified register/address"self.bus.write_byte_data(self.address, reg, value)if (self.debug):print("I2C: Write 0x%02X to register 0x%02X" % (value, reg))def read(self, reg):"Read an unsigned byte from the I2C device"result = self.bus.read_byte_data(self.address, reg)if (self.debug):print("I2C: Device 0x%02X returned 0x%02X from reg 0x%02X" % (self.address, result & 0xFF, reg))return resultdef setPWMFreq(self, freq):"Sets the PWM frequency"prescaleval = 25000000.0    # 25MHzprescaleval /= 4096.0       # 12-bitprescaleval /= float(freq)prescaleval -= 1.0if (self.debug):print("Setting PWM frequency to %d Hz" % freq)print("Estimated pre-scale: %d" % prescaleval)prescale = math.floor(prescaleval + 0.5)if (self.debug):print("Final pre-scale: %d" % prescale)oldmode = self.read(self.__MODE1);newmode = (oldmode & 0x7F) | 0x10        # sleepself.write(self.__MODE1, newmode)        # go to sleepself.write(self.__PRESCALE, int(math.floor(prescale)))self.write(self.__MODE1, oldmode)time.sleep(0.005)self.write(self.__MODE1, oldmode | 0x80)def setPWM(self, channel, on, off):"Sets a single PWM channel"self.write(self.__LED0_ON_L+4*channel, on & 0xFF)self.write(self.__LED0_ON_H+4*channel, on >> 8)self.write(self.__LED0_OFF_L+4*channel, off & 0xFF)self.write(self.__LED0_OFF_H+4*channel, off >> 8)if (self.debug):print("channel: %d  LED_ON: %d LED_OFF: %d" % (channel,on,off))def setServoPulse(self, channel, pulse):"Sets the Servo Pulse,The PWM frequency must be 50HZ"pulse = pulse*4096/20000        #PWM frequency is 50HZ,the period is 20000usself.setPWM(channel, 0, int(pulse))if __name__=='__main__':pwm = PCA9685(0x40, debug=False)pwm.setPWMFreq(50)while True:# setServoPulse(2,2500)for i in range(500,2500,10):  pwm.setServoPulse(0,i)   time.sleep(0.02)     for i in range(2500,500,-10):pwm.setServoPulse(0,i) time.sleep(0.02)

Python2的代码在此

#!/usr/bin/pythonimport time
import math
import smbus# ============================================================================
# Raspi PCA9685 16-Channel PWM Servo Driver
# ============================================================================class PCA9685:# Registers/etc.__SUBADR1            = 0x02__SUBADR2            = 0x03__SUBADR3            = 0x04__MODE1              = 0x00__PRESCALE           = 0xFE__LED0_ON_L          = 0x06__LED0_ON_H          = 0x07__LED0_OFF_L         = 0x08__LED0_OFF_H         = 0x09__ALLLED_ON_L        = 0xFA__ALLLED_ON_H        = 0xFB__ALLLED_OFF_L       = 0xFC__ALLLED_OFF_H       = 0xFDdef __init__(self, address=0x40, debug=False):self.bus = smbus.SMBus(1)self.address = addressself.debug = debugif (self.debug):print("Reseting PCA9685")self.write(self.__MODE1, 0x00)def write(self, reg, value):"Writes an 8-bit value to the specified register/address"self.bus.write_byte_data(self.address, reg, value)if (self.debug):print("I2C: Write 0x%02X to register 0x%02X" % (value, reg))def read(self, reg):"Read an unsigned byte from the I2C device"result = self.bus.read_byte_data(self.address, reg)if (self.debug):print("I2C: Device 0x%02X returned 0x%02X from reg 0x%02X" % (self.address, result & 0xFF, reg))return resultdef setPWMFreq(self, freq):"Sets the PWM frequency"prescaleval = 25000000.0    # 25MHzprescaleval /= 4096.0       # 12-bitprescaleval /= float(freq)prescaleval -= 1.0if (self.debug):print("Setting PWM frequency to %d Hz" % freq)print("Estimated pre-scale: %d" % prescaleval)prescale = math.floor(prescaleval + 0.5)if (self.debug):print("Final pre-scale: %d" % prescale)oldmode = self.read(self.__MODE1);newmode = (oldmode & 0x7F) | 0x10        # sleepself.write(self.__MODE1, newmode)        # go to sleepself.write(self.__PRESCALE, int(math.floor(prescale)))self.write(self.__MODE1, oldmode)time.sleep(0.005)self.write(self.__MODE1, oldmode | 0x80)def setPWM(self, channel, on, off):"Sets a single PWM channel"self.write(self.__LED0_ON_L+4*channel, on & 0xFF)self.write(self.__LED0_ON_H+4*channel, on >> 8)self.write(self.__LED0_OFF_L+4*channel, off & 0xFF)self.write(self.__LED0_OFF_H+4*channel, off >> 8)if (self.debug):print("channel: %d  LED_ON: %d LED_OFF: %d" % (channel,on,off))def setServoPulse(self, channel, pulse):"Sets the Servo Pulse,The PWM frequency must be 50HZ"pulse = pulse*4096/20000        #PWM frequency is 50HZ,the period is 20000usself.setPWM(channel, 0, int(pulse))if __name__=='__main__':pwm = PCA9685(0x40, debug=False)pwm.setPWMFreq(50)while True:# setServoPulse(2,2500)for i in range(500,2500,10):  pwm.setServoPulse(0,i)   time.sleep(0.02)     for i in range(2500,500,-10):pwm.setServoPulse(0,i) time.sleep(0.02)

具体的代码在此,包括python2和python3还有C的代码都在此,想多了解的可以下载一下,也可以不下载,代码也贴出来了,点击下载

树莓派PCA9685的舵机MG996R二度自由云台操控代码,搭配mqtt进行远程操控相关推荐

  1. 树莓派云台舵机怎么用_基于树莓派的多舵机控制的定位拍照云台

    在本教程中,我们将探讨如何在树莓派上使用Python控制多个舵机. 我们的目标是制作一个支持多自由度定位拍照的云台.在这里,你可以看到我们的成品是如何工作的. 主要材料 1.树莓派3 X1 2.摄像头 ...

  2. 树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码

    树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码 文章目录 树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码 一. Servo Driver ...

  3. 树莓派4B使用PCA9685控制舵机

    一.IIC通信 在raspi-config中的interface选项打开IIC通信 二.下载Adafruit_PCA9685包 pip3 install Adafruit_PCA9685 也可以去gi ...

  4. 树莓派远程4G遥控车教程(二)-相机云台舵机初步调试

    树莓派远程4G遥控车教程(二)-相机云台舵机初步调试 树莓派远程4G遥控车教程(一)-准备工作 树莓派远程4G遥控车教程(三)-摄像头安装及实现局域网实时监控 树莓派远程4G遥控车教程(四)-实时监控 ...

  5. 树莓派+PCA9685+舵机控制:wiringPi实现

    树莓派+PCA9685+舵机控制 1舵机控制 1.1舵机介绍 淘宝直接搜索舵机,有90° 180° 270° 360°舵机,通过PWM来进行控制,如下所示: 1.2控制原理 如下图所示:一个脉冲周期为 ...

  6. stm32中如何使用PCA9685控制舵机(详解)

    这里写自定义目录标题 一.PCA9685简介 二.硬件 1.电压 2.i2c地址 3.使能脚 4. 频率 5.地址定义表 6. 舵机角度 最近在公司实习,都说跨入职场是让人进步最快的方式,记录一下我自 ...

  7. python舵机控制程序_树莓派PWM控制舵机的两种方式

    PWM控制舵机简介 通常情况下,伺服电机(舵机)是由一个标准的直流系统和一个内部反馈控制装置(一个减速齿轮和电位计)来组成的.伺服电机(舵机)的主要作用是将齿轮轴旋转到一个预定义的方向上.伺服电机(舵 ...

  8. 【STM32】实战2—用STM32产生PWM信号驱动舵机MG996R(一)

    目录 0 参考资料出处 参考博客 1 实验预期效果 2 硬件学习 2.1 舵机MG996R 3 STM32CubeMX的相关配置与接线 3.1 配置定时器TIM3 3.2 stm32原理图 3.3 舵 ...

  9. 实例4:树莓派GPIO控制舵机转动

    实例4:树莓派GPIO控制舵机转动 实验目的 通过背景知识学习,了解舵机的外观及基本运动方式. 了解四足机器人mini pupper腿部单个舵机的组成结构. 通过GPIO对舵机进行转动控制,熟悉PWM ...

最新文章

  1. qii, sopc, nios ii 10.1 IP核设计,LED验证死活不行,感觉很神奇
  2. 线程:创建--【J2SE】
  3. iosclient暑期“动画屋“活动项目总结
  4. 【原创】DevExpress控件GridControl中的布局详解
  5. Struts2和Struts1.x的全面比较
  6. 获取iview中表单组件Table的选中数据
  7. Key/Value之王Memcached初探:一、掀起Memcached的盖头来
  8. 从 JVM 层面理解 i++ 和 ++i 的真正区别!
  9. 部署ASP.Net 2.0应该注意的问题
  10. 【ASP.NET Web API教程】1 ASP.NET Web API入门
  11. 投影仪融合、拼接处理系统
  12. 中兴服务器默认用户名密码是什么,中兴路由器登录地址默认用户名密码
  13. 安信可A9G二次开发的准备工作
  14. codesmith mysql 模板_CodeSmith代码自动生成器 JAVA模版的制作---CodeSmith+MySQL+MyEclipse 10...
  15. 软件开发职业发展路径
  16. 输入中文错误:\xE4\xBB\x8E\xE5\x85\xA5...‘ for column ‘detail‘ at row 1
  17. 软件构架实践 第2版 学习笔记
  18. 【计算机视觉处理5】阈值处理
  19. matlab 2018b 下载 (for Windows/Linux/Mac)
  20. 【图像处理】像素坐标系、像平面坐标系、相机坐标系、世界坐标系、内参矩阵、外参矩阵

热门文章

  1. 大规模集群全网数据备份解决方案
  2. python excelwriter保存路径_Python自动化处理Excel报表,我的工作更轻松了!
  3. 淘宝店铺流量来源有哪些?
  4. [还不会搭建博客吗?]centos7系统部署hexo博客新手入门-进阶,看这一篇就够了
  5. ISPRS2018/云检测:Cloud/shadow detection based on spectral indices for multi/hyp基于光谱指数的多/高光谱光学遥感成像仪云/影检测
  6. HTML做跳转另一个页面链接,html中如何链接到另一个页面
  7. Oracle BEGIN END 【整理】
  8. 论文笔记-LSD: a Line Segment Detector线特征提取
  9. pigz 快速压缩命令详解
  10. opencv-qt大津算法(Otsu)