asrpro 使用pca9685 模块

2023-10-10 17:12
文章标签 模块 使用 asrpro pca9685

本文主要是介绍asrpro 使用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 0xFDclass 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 falseAdafruit_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; // sleepwrite8(PCA9685_MODE1, newmode); // go to sleepwrite8(PCA9685_PRESCALE, prescale); // set the prescalerwrite8(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;}}

这篇关于asrpro 使用pca9685 模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/181910

相关文章

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地