PCA9865 模块使用

news2025/4/8 8:10:56

本来是用来控制灯的,若用来控制舵机等,需外接电源

arduino  arduino stm32

引脚A4为SDA,引脚A5为SCL

asrpro

使用softiic库,使用arduino的 Adafruit_PWMServoDriver驱动库 进行修改

若要封装,需将Adafruit_PWMServoDriver.c文件内容复制到Adafruit_PWMServoDriver.h头文件中

PCA9685代码
 使用asrpro自带的asr_softiic.h 和 arduino Adafruit_PWMServoDriver驱动库
修改处
softiic.start(_i2caddr<<1|0); // 写 0 ,读 1 (地址要左移一位
注释requestfrom ; return 0
#include "asr.h"
extern "C"{ void * __dso_handle = 0 ;}
#include "setup.h"
#include "HardwareSerial.h"
#include "asr_softiic.h"
uint32_t snid;
void hardware_init();
void LED();
void ASR_CODE();
#define PCA9685_SUBADR1 0x2
#define PCA9685_SUBADR2 0x3
#define PCA9685_SUBADR3 0x4
#define PCA9685_MODE1 0x0
#define PCA9685_PRESCALE 0xFE
#define LED0_ON_L 0x6
#define LED0_ON_H 0x7
#define LED0_OFF_L 0x8
#define LED0_OFF_H 0x9
#define ALLLED_ON_L 0xFA
#define ALLLED_ON_H 0xFB
#define ALLLED_OFF_L 0xFC
#define ALLLED_OFF_H 0xFD
class Adafruit_PWMServoDriver {
 public:
  Adafruit_PWMServoDriver(uint8_t addr = 0x40);
  void begin(void);
  void reset(void);
  void setPWMFreq(float freq);
  void setPWM(uint8_t num, uint16_t on, uint16_t off);
  void setPin(uint8_t num, uint16_t val, bool invert=false);
 private:
  uint8_t _i2caddr;
  uint8_t read8(uint8_t addr);
  void write8(uint8_t addr, uint8_t d);
};
// class MySoftIIC
// {
//   public:
//   void begin(){softiic.begin(0,1);}
//   void stop(){softiic.stop();}
//   void write(uint8_t d){softiic.write(d);}
//   uint8_t read(bool b ){softiic.read(b);}
//   void requestFrom(uint8_t addr,uint8_t d){};
//   int start(uint8_t addr){return softiic.start(addr<<1|0);}
//   void beginTransmission(uint8_t addr){start(addr);}
//   void stop(){softiic.stop();}
// };
// MySoftIIC WIRE;
// Set to true to print some debug messages, or false to disable them.
#define ENABLE_DEBUG_OUTPUT false
Adafruit_PWMServoDriver::Adafruit_PWMServoDriver(uint8_t addr) {
  _i2caddr = addr;
}
void Adafruit_PWMServoDriver::begin(void) {
 softiic.begin(0,1);
 reset();
}
void Adafruit_PWMServoDriver::reset(void) {
 write8(PCA9685_MODE1, 0x0);
}
void Adafruit_PWMServoDriver::setPWMFreq(float freq) {
  //Serial.print("Attempting to set freq ");
  //Serial.println(freq);
  freq *= 0.9;  // Correct for overshoot in the frequency setting (see issue #11).
  float prescaleval = 25000000;
  prescaleval /= 4096;
  prescaleval /= freq;
  prescaleval -= 1;
  if (ENABLE_DEBUG_OUTPUT) {
    Serial.print("Estimated pre-scale: "); Serial.println(prescaleval);
  }
  uint8_t prescale = floor(prescaleval + 0.5);
  if (ENABLE_DEBUG_OUTPUT) {
    Serial.print("Final pre-scale: "); Serial.println(prescale);
  }
  uint8_t oldmode = read8(PCA9685_MODE1);
  uint8_t newmode = (oldmode&0x7F) | 0x10; // sleep
  write8(PCA9685_MODE1, newmode); // go to sleep
  write8(PCA9685_PRESCALE, prescale); // set the prescaler
  write8(PCA9685_MODE1, oldmode);
  delay(5);
  write8(PCA9685_MODE1, oldmode | 0xa1);  //  This sets the MODE1 register to turn on auto increment.
                                          // This is why the beginTransmission below was not working.
  //  Serial.print("Mode now 0x"); Serial.println(read8(PCA9685_MODE1), HEX);
}
void Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on, uint16_t off) {
  //Serial.print("Setting PWM "); Serial.print(num); Serial.print(": "); Serial.print(on); Serial.print("->"); Serial.println(off);
  softiic.start(_i2caddr<<1|0);
  softiic.write(LED0_ON_L+4*num);
  softiic.write(on);
  softiic.write(on>>8);
  softiic.write(off);
  softiic.write(off>>8);
  softiic.stop();
}
// Sets pin without having to deal with on/off tick placement and properly handles
// a zero value as completely off.  Optional invert parameter supports inverting
// the pulse for sinking to ground.  Val should be a value from 0 to 4095 inclusive.
void Adafruit_PWMServoDriver::setPin(uint8_t num, uint16_t val, bool invert)
{
  // Clamp value between 0 and 4095 inclusive.
  if(val > 4095)
    val = 4095;
  if (invert) {
    if (val == 0) {
      // Special value for signal fully on.
      setPWM(num, 4096, 0);
    }
    else if (val == 4095) {
      // Special value for signal fully off.
      setPWM(num, 0, 4096);
    }
    else {
      setPWM(num, 0, 4095-val);
    }
  }
  else {
    if (val == 4095) {
      // Special value for signal fully on.
      setPWM(num, 4096, 0);
    }
    else if (val == 0) {
      // Special value for signal fully off.
      setPWM(num, 0, 4096);
    }
    else {
      setPWM(num, 0, val);
    }
  }
}
uint8_t Adafruit_PWMServoDriver::read8(uint8_t addr) {
  softiic.start(_i2caddr<<1|0);
  softiic.write(addr);
  softiic.stop();
  //softiic.requestFrom((uint8_t)_i2caddr, (uint8_t)1);
  //return softiic.read();
  return 0;
}
void Adafruit_PWMServoDriver::write8(uint8_t addr, uint8_t d) {
  softiic.start(_i2caddr<<1|0);
  softiic.write(addr);
  softiic.write(d);
  softiic.stop();
}
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
//--------------------------------------------------------
///**************************************************************
bool bl = 0;
int i=0;
void LED(){
  while (1) {
   
    //扫描设备
    for(int i = 1;i<0x7f;i++)
    {
      // int val = softiic.start(i<<1 | 0);
      // softiic.stop();
      // Serial.print(i,HEX);
      // Serial.print("ox ");
      // Serial.println(val,HEX);
      pwm.begin();
      pwm.setPWMFreq(1600);
      pwm.setPin(4,i*46,0);
      delay(100);
     
    }
   
  }
  vTaskDelete(NULL);
}
//------------------------------------------------
void setup()
{
  Serial.begin(9600);
   delay(100);
  //softiic.begin(0,1);
    pinMode(4,output);
  setPinFun(4,FIRST_FUNCTION);
  digitalWrite(4,0);
  //{speak:小蝶-清新女声,vol:10,speed:10,platform:haohaodada}
  //{playid:10001,voice:欢迎使用语音助手,用天问五幺唤醒我。}
  //{playid:10002,voice:我退下了,用天问五幺唤醒我}
  //{ID:0,keyword:"唤醒词",ASR:"天问五幺",ASRTO:"我在"}
  //{ID:1,keyword:"命令词",ASR:"打开灯光",ASRTO:"好的,马上打开灯光"}
  //{ID:2,keyword:"命令词",ASR:"关闭灯光",ASRTO:"好的,马上关闭灯光"}
  xTaskCreate(hardware_init,"hardware_init",256,NULL,100,NULL);
}
//--------------------------------------------------------
//{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}
//{ID:251,keyword:"命令词",ASR:"中等音量",ASRTO:"音量调整到中等"}
//{ID:252,keyword:"命令词",ASR:"最小音量",ASRTO:"音量调整到最小"}
void hardware_init(){
  xTaskCreate(LED,"LED",256,NULL,4,NULL);
  vTaskDelete(NULL);
}
/*描述该功能...
*/
void ASR_CODE(){
  switch (snid) {
   case 1:
    //digitalWrite(4,0);
    break;
   case 2:
    //digitalWrite(4,1);
    break;
  }
}

树莓派

打开树莓派I2C接口

2.安装I2C工具

# sudo apt-get install i2c-tools
# sudo i2cdetect 1

3.查看IIC设备

4.安装PCA9865库

sudo apt-get install git build-essential python-dev
  cd ~
  git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git
  cd Adafruit_Python_PCA9685
  sudo python3 setup.py install

或是直接进入 GitHub - adafruit/Adafruit_Python_PCA9685: Python code to use the PCA9685 PWM servo/LED controller with a Raspberry Pi or BeagleBone black. 下载后传给树莓派 然后使用 pip install Adafruit_Python_PCA9685.zip 安装

安装完成后,解压Adaruit_Python_PCA9685 进入examples文件夹

执行 python simpletest.py 

树莓派使用PCA9685舵机控制板控制舵机_树莓派pca9685控制舵机-CSDN博客

树莓派使用 Python 驱动 SSD1306(IIC/SPI 通信) - 提莫的神秘小站

树莓派i2c通讯 设置 和 查看 i2c通信地址方法_树莓派读取i2c寄存器-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1149208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实现文件压缩和解压功能

目录 一、常见的压缩格式 1、ZIP格式 2、RAR格式 3、7Z格式 二、压缩算法 1、Huffman编码 2、LZ77算法 3、Bzip2算法 三、解压算法 1、解压zip文件 2、解压rar文件 3、解压7z文件 总结 Python是一种功能强大的编程语言&#xff0c;具有易学易用的特点。它提供了许…

2021-arxiv-GPT Understands, Too

2021-arxiv-GPT Understands, Too Paper&#xff1a; https://arxiv.org/abs/2103.10385 Code&#xff1a; https://github.com/THUDM/P-tuning Prompt 简单理解 举例来讲&#xff0c;今天如果有这样两句评论&#xff1a; 1. 什么苹果啊&#xff0c;都没有苹果味&#xff0c…

DevChat:VSCode中基于大模型的AI智能编程助手

文章目录 1. 前言2. 安装2.1 注册新用户2.2 在VSCode中安装DevChat插件2.3 设置Access Key 3. 实战使用4. 总结 1. 前言 DevChat是由Merico公司精心打造的AI智能编程助手。它利用了最先进的大语言模型技术&#xff0c;像人类开发者一样高效地理解需求&#xff0c;并提供最佳的代…

Star History 九月开源精选 |开源 GitHub Copilot 替代

虽然大火了近一年&#xff0c;但是截至目前 AI 唯一破圈的场景是帮助写代码&#xff08;谷歌云旗下的 DORA 年度报告也给 AI 泼了盆冷水&#xff09;。不过对于软件开发来说&#xff0c;生成式人工智能绝对已经是新的标配。 本期 Star History 收集了一些开源 GitHub Copilot …

双十一好物提前看!双十一买什么最省心、好用又实惠的好物推荐

双十一即将来临&#xff0c;你是否已经开始为购物车准备填满各种好物&#xff1f;一年一度大促购物节可千万要清点好需要买刚需好物有哪些&#xff0c;毕竟错过了这个促销活动的时间就要等下一年&#xff0c;辛苦一年了&#xff0c;就等着双十一大促的时候买点好东西讨好一下自…

一文读懂多云CDN

本文带你了解火山引擎边缘云推出的一款创新产品&#xff1a;多云CDN。如果你的业务同时由多家CDN厂商提供服务&#xff0c;而你作为多家CDN服务的购买者/使用者/运维人员&#xff0c;那么多云CDN是帮助你“降本增效”的不二利器&#xff01; 在不久前结束的“2023稀土掘金开发…

1400*B. Phoenix and Beauty(贪心构造)

Problem - 1348B - Codeforces 解析&#xff1a; 满足题意&#xff0c;会构成循环序列&#xff0c;其中循环节长度为 k&#xff0c;统计数列中不同元素的个数 cnt &#xff0c;如果cnt > k&#xff0c;显然无解。 否则&#xff0c;由于题意中已经证明&#xff0c;答案序列个…

用CHAT分析:为什么层次网络模型理论,不容易解释熟悉性效应?

今天小编带大家探索新的事物&#xff0c;这个问题对于小编来说也是未知~ 问Chat&#xff1a;试分析为什么层次网络模型理论不容易解释熟悉性效应&#xff1f; 熟悉性效应&#xff08;Familiarity Effect&#xff09;是指人们对于熟悉的事物、人或情境有更积极的评价和感知。这…

无人机自主航迹规划智能算法综述

源自&#xff1a;航空兵器 作者&#xff1a;郭启敏, 张鹏, 王应洋, 王石 “人工智能技术与咨询” 发布 摘 要 关键词 无人机; 航迹规划; 自主性; 智能优化算法; 机器学习算法 引 言 1 无人系统自主性及其内涵 1.1 无人系统自主性定义 1.2 无人系统自主性内涵 2 航迹…

个人美容与美容产业:TikTok上的双重趋势探索

当今数字时代&#xff0c;美容行业已不再局限于专业的化妆师和美容院。社交媒体平台如TikTok已经成为美容爱好者和业内专业人士的创新舞台。本文将深入探讨TikTok如何引领着美容产业和个人美容趋势&#xff0c;以及它是如何将这两者相互融合。 TikTok&#xff1a;美容产业的游戏…

8 模型查看

查看检查模型的方法 1 torchsummary2 netron3 tensorboardX参考 查看检查模型的方法&#xff1a; 1 torchsummary 仅仅只是打印模型&#xff0c;并不能检测模型是否准确。 summary 会计算参数量&#xff0c;等等信息&#xff0c;还会对尺寸不匹配进行报错。 1&#xff0c;安…

HTML+CSS+JS实现计算器

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

了解C#中Lambda表达式的用法

Lambda表达式是一个匿名函数&#xff0c;是一种高效的类似于函数式编程的表达式&#xff0c;Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句&#xff0c;并且可用于创建委托或表达式目录树类型&#xff0c;支持带有可绑定到委托或表达式树的输入参数的内联表达式…

贝叶斯变分方法:初学者指南--平均场近似

Eric Jang: A Beginners Guide to Variational Methods: Mean-Field Approximation (evjang.com) 一、说明 变分贝叶斯 (VB) 方法是统计机器学习中非常流行的一系列技术。VB 方法允许我们将 统计推断 问题&#xff08;即&#xff0c;给定另一个随机变量的值来推断随机变量的值&…

基本微信小程序的驾校宝典系统-驾照考试系统

项目介绍 系统模块分析是对系统的各个模块做出相应的说明以及解释。此系统的模块分别有用户模块、服务端模块和管理端模块这两大基本模块&#xff0c;其中服务端模块包括了首页、教练信息、教练咨讯、考试预约、我的等&#xff1b;而管理端模块则包括了个人中心、用户管理、教…

什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(2)

参考视频&#xff1a;https://www.youtube.com/watch?vE5Z7FQp7AQQ&listPLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频4&#xff1a;CNN 中 stride 的概念 如上图&#xff0c;stride 其实就是 ”步伐“ 的概念。 默认情况下&#xff0c;滑动窗口一次移动一步。而当 stride …

C# OpenCvSharp DNN 部署L2CS-Net人脸朝向估计

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_DNN_Demo …

(1)(1.10) JSN-SR04T声纳

文章目录 前言 1 连接到自动驾驶仪 2 参数说明 前言 JSN-SR04T 是一种超声波距离传感器。有两个版本 v2.0 和 v3.0。v2.0 的作用范围为 25 至 450cm&#xff0c;v3.0 的作用范围为 20 至 600cm。也更稳定。由于量程很短&#xff0c;因此使用范围有限。 1 连接到自动驾驶仪 …

TensorFlow学习笔记(未完待续)

文章目录 tf.Graph().as_default()sessiontensorflow.placeholder()tf.summary tf.Graph().as_default() with tf.Graph().as_default():with tf.device(/gpu:str(GPU_INDEX)):TensorFlow中所有计算都会被转化为计算图上的节点。是一个通过计算图的形式来表述计算的编程系统&a…

SAP软件如何查询销售订单的删除记录 <转载>

原文链接&#xff1a;https://mp.weixin.qq.com/s/SFC5enOcH1tizeU8N3JHXQ SAP软件中销售订单如果被删除是不能通过VA02和VA3或VA05查询的‍‍到相关记录的&#xff0c;系统会报错&#xff08;如图&#xff09; 销售订单不像某些凭证&#xff08;比如采购订单&#xff0c;采购…