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

# -*- 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 up
    global dw
    for 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 = 1500
    dw = 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,则变为2500
        if up > 2500:
            up = 2500

def back(n):
    n = int(n)
    n = n * 5
    led.blink()
    global up
    if up != 500:
        for i in range(up,up-100*n,-1*n):
            pwm.setServoPulse(0,i)
            time.sleep(0.00025)
        up -= 100*n
        if up < 500:
            up = 500

def left(n):
    n = int(n)
    n = n * 2
    led.blink()
    global dw
    if dw != 2500:
        for i in range(dw,dw+100*n,1*n):
            pwm.setServoPulse(1,i)
            time.sleep(0.00025)
        dw += 100*n
        if dw > 2500:
            dw = 2500

def right(n):
    n = int(n)
    n = n * 2
    led.blink()
    global dw
    if dw != 500:
        for i in range(dw,dw-100*n,-1*n):
            pwm.setServoPulse(1,i)
            time.sleep(0.00025)
        dw -= 100*n
        if dw < 500:
            dw = 500

if __name__ == '__main__':
    topic='mqtt'
    on_mqtt_connect()
    on_subscribe(topic)

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

#!/usr/bin/python

import 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       = 0xFD

  def __init__(self, address=0x40, debug=False):
    self.bus = smbus.SMBus(1)
    self.address = address
    self.debug = debug
    if (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 result
	
  def setPWMFreq(self, freq):
    "Sets the PWM frequency"
    prescaleval = 25000000.0    # 25MHz
    prescaleval /= 4096.0       # 12-bit
    prescaleval /= float(freq)
    prescaleval -= 1.0
    if (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        # sleep
    self.write(self.__MODE1, newmode)        # go to sleep
    self.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 20000us
    self.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/python

import 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       = 0xFD

  def __init__(self, address=0x40, debug=False):
    self.bus = smbus.SMBus(1)
    self.address = address
    self.debug = debug
    if (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 result
	
  def setPWMFreq(self, freq):
    "Sets the PWM frequency"
    prescaleval = 25000000.0    # 25MHz
    prescaleval /= 4096.0       # 12-bit
    prescaleval /= float(freq)
    prescaleval -= 1.0
    if (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        # sleep
    self.write(self.__MODE1, newmode)        # go to sleep
    self.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 20000us
    self.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的代码都在此,想多了解的可以下载一下,也可以不下载,代码也贴出来了,点击下载

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
为了使用训练集进行人脸识别的训练,您需要遵循以下步骤: 1. 下载并安装适当的机器学习库,如TensorFlow或PyTorch等。 2. 导入所需的库和模块,如numpy、pandas、sklearn、cv2等。 3. 加载所需的数据集并进行数据预处理,如图像增强、数据标准化等。 4. 划分数据集为训练集和验证集。 5. 定义模型架构,如卷积神经网络(CNN)或循环神经网络(RNN)等。 6. 编译模型并设置优化器和损失函数。 7. 训练模型并保存模型权重。 8. 对于新的图像进行预测并评估模型的性能。 下面是一个简单的Python代码示例,用于对人脸识别数据集进行训练: ```python import numpy as np import pandas as pd import cv2 from sklearn.model_selection import train_test_split from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense # Load the dataset data = pd.read_csv('face_data.csv') # Preprocess the data images = [] labels = [] for i in range(len(data)): img = cv2.imread(data['image'][i]) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img = cv2.resize(img, (100, 100)) images.append(img) labels.append(data['label'][i]) images = np.array(images) images = images.reshape(images.shape[0], 100, 100, 1) labels = np.array(labels) # Split the dataset into training and validation sets X_train, X_val, y_train, y_val = train_test_split(images, labels, test_size=0.2, random_state=42) # Define the model architecture model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 1))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dense(1, activation='sigmoid')) # Compile the model model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # Train the model model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_val, y_val)) # Save the model weights model.save_weights('face_recognition_model.h5') ``` 请注意,此处提供的代码仅供参考,并且具体实现可能因数据集和模型架构而异。您需要根据自己的需求和数据集进行调整和修改。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值