【2024年】F题和E题——基于声传播的智能定位系统 运动目标控制与自动追踪系统——舵机云台方案

拥有12位分辨率(4096步)固定频率的单独PWM控制器

可编程频率从典型的40hz到1000hz,占空比为

从0%到100%可调,以允许LED设置到特定的亮度值。

所有输出设置为相同的PWM频率。

每个LED输出可以关闭或打开(无PWM控制),或设置在其单独的PWM控制器

价值。LED输出驱动器被编程为开漏,电流为25毫安

吸收能力在5v或图腾柱与25毫安的吸收,10毫安的源能力在5v。的

PCA9685工作电源电压范围为2.3 V至5.5 V,输入和

输出容忍5.5 V。可直接连接LED输出(最多可达

25 mA, 5.5 V)或控制与外部驱动器和离散的最小量

组件用于更大电流或更高电压的led。

PCA9685是新的快速模式Plus (Fm+)系列。Fm+设备提供更高

频率(高达1mhz)和更密集的总线操作(高达4000pf)
驱动代码为:

#!/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
  __MODE2              = 0x01
  __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)
    self.write(self.__MODE2, 0x04)

  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))
    
  def setRotationAngle(self, channel, Angle): 
    if(Angle >= 0 and Angle <= 180):
        temp = Angle \* (2000 / 180) + 501
        self.setServoPulse(channel, temp)
    else:
        print("Angle out of range")
        
  def start\_PCA9685(self):
    self.write(self.__MODE2, 0x04)
    #Just restore the stopped state that should be set for exit\_PCA9685
    
  def exit\_PCA9685(self):
    self.write(self.__MODE2, 0x00)#Please use initialization or \_\_MODE2 =0x04



JetsonNano

舵机云台代码为:

#!/usr/bin/python
import time
import RPi.GPIO as GPIO
from PCA9685 import PCA9685

# try:
#print "This is an PCA9685 routine"
pwm = PCA9685()
pwm.setPWMFreq(50)
#pwm.setServoPulse(1,500) 
pwm.setRotationAngle(1, 0)
while True:
    # setServoPulse(2,2500)
    for i in range(10,170,1): 
        pwm.setRotationAngle(1, i)   
        if(i<80):
            pwm.setRotationAngle(0, i)   
        time.sleep(0.1)

    for i in range(170,10,-1): 
        pwm.setRotationAngle(1, i)   
        if(i<80):
            pwm.setRotationAngle(0, i)            
        time.sleep(0.1)

# except:
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/067409200347cf3cc3fb5aebef5ec192.png)

![img](https://img-blog.csdnimg.cn/img_convert/0ff4a00921e5e4947025e6c43349ed04.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/c04cda21c3826b40c77027a9157fa2f8.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/2af1abf6909812c190d59d407ffc3c14.png)

![img](https://img-blog.csdnimg.cn/img_convert/8f8a6831fa3ae7334a6a88118fab7ea8.png)

![img](https://img-blog.csdnimg.cn/img_convert/1778919ca2642197c57dff85b6ed01ed.png)

![](https://img-blog.csdnimg.cn/img_convert/50d0be3f4fee2e121cafc9b320fe397f.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值