左手阿飞

  • 2024-12-15
  • 加入了学习《FollowMe 第二季:3 - EK_RA6M5 开发板入门》,观看 EK-RA6M5 开发板入门

  • 2024-12-12
  • 发表了主题帖: 【Follow me第二季第3期】任务1:搭建环境,下载调试示例程序,Blink,按键

    1,环境搭建: 本次安装的的是5.6.0版本。安装完成之后,无法开启连接器。重新安装,需要勾选连接器安装。如下图3所示,红色方框标出的勾选。         2、打开快速开始程序_quickstart。 3、跟视频学习Blink,按键程序。 1)、找到LED闪烁频率和 呼吸灯占空比的函数,在原来基础上 增加 一个状态:   2)运行显示主菜单,通过键盘进入Kit Information。     3)通过两个蓝色按键,控制LED1和LED2的闪烁频率和占空比。  但是显示有个问题,已经用红框标出来:温度显示两行,造成闪烁频率和占空比错位。      

  • 2024-10-31
  • 发表了主题帖: 【2024 DigiKey创意大赛】会议声源追踪器

    会议声源追踪器 作者:左手阿飞   作品简介 随着网络直播技术的发展,许多线下活动转移到线上,比如线上会议、网络课堂等。为进一步提高线上会议或网络课堂的收音质量,本设计提出一种会议声源追踪系统,主要功能如下: 1、声源定位,识别声音方向; 2、声源追踪,用步进电机控制麦克风方向,追踪声源,减少干扰噪声;(未完成) 3、检测会议室环境,上传云端,可以提醒工作人员提前开启空调等设备。   图1 作品照片 用到的物料及想用的作用如下: 1、sipeed麦克风阵列(MIC_ARRAY):用于声音的收集; 2、K210开发板:用于声音数据分析,识别声音方向,并发送相应数据给STM32F411; 3、STM32F411开发板:接收K210数据,并控制步进电机,改变麦克风阵列的方向,使麦克风正面对应声源; 4、SGP30&DHT11:SGP30为空气质量传感器,可检测空气中挥发性有机物(TVOC)和CO2的含量;DHT11为温湿度传感器,可检测温度和湿度; 5、ESP32S3开发板:将检测到的空气质量(TVOC、CO2、温度和湿度)数据上传到云端(阿里云),通过手机APP查看,在会议开始前,提前打开空调等设备。 二、系统框图 硬件设计包含硬件设计框图如图2所示:   图2 系统框图 声源方向检测部分,由麦克风阵列和K210卡发版完成。麦克风方向由STM32提供控制信号,控制两个步进电机调整。两个步进电机分别调整X轴方向和Y轴方向。空气质量检测部分,由传感器SGP30和DHT11检测,并通过ESP32连接WIFI上传阿里云,实现远程检测和控制。 三、各部分功能说明 第一部为声源方向检测部分,由麦克风阵列和K210卡发版完成。   图3 声源方向检测 麦克风阵列为sipeed厂家出厂,由6+1个麦克风,圆周均匀分布6个,中央1个。传输方式为I2S传输方式,可检测不同方向的声音强度。圆周上有12个串行LED,可显示声源方向。LED控制方式为串行数字控制,串行控制协议类似于SPI。 K210开发板资源丰富,自带LCD屏幕(480*320)和麦克风阵列接口,可直接与麦克风阵列连接。开发语言为microPython。microPython开发方便,有丰富的三方库可供使用,开发方便。 K210接收麦克风阵列检测到的声音数据,通过对6个麦克风的数据差值,计算出声源的方向及距离,并控制LED显示出相应方向,并将数据通过串口发送给STM32F411。 第二部分为方向控制部分。由STM32F411和2个步进电机组成。   图4 麦克风方向控制 STM32通过串口,接收声音方向数据,控制2个步进电机。2个步进电机分别控制x轴方向和Y轴方向的运动,使麦克风阵列正对声源方向,达到声音降噪的目的。 第三部分为会议室环境检测部分。由SPG30、DHT11和ESP32S3组成。   图5 会议室空气质量检测 SPG30可检测空气中TVOC、CO2的浓度。通过I2C通信协议传输,传输数据格式为6个字节一组数据,前三个字节传送TVOC浓度,后三字节传送CO2浓度。每个分组数据,有两个字节为数据字节(16位),第三字节位CRC校验位。 DHT11为温湿度检测传感器,通过单总线协议传输。每帧数据5个字节,前2个字节为湿度数据,紧接着2个字节为温度数据,最后一个字节为校验位。 ESP32S3接收SPG30和DHT11检测到的空气质量数据,上传阿里云平台。可在阿里云平台和手机APP上查看。APP上设置有开关,可远程控制一个LED。在实际应用中,LED可替换为空调、新风风扇、空气净化器等设备。如有必要,可增加开关,控制更多设备。 四、作品源码 https://download.eeworld.com.cn/detail/%E5%B7%A6%E6%89%8B%E9%98%BF%E9%A3%9E/634860 五、作品功能演示视频   六、项目总结 这是第一次参加得捷主办的创新设计大赛。经过这次大赛的练习,对嵌入式开发有了更深的理解。感谢得捷提供的这次难得的机会。 本次设计完成了一个会议声源追踪器。该设备可完成会议室声源方向追踪、空气环境检测以及空气质量改善等功能。由于时间较为紧迫,所选方案为开发时间最短、最容易实现的方案,存在一些问题。最大的问题就是成本太高。一共用到3个控制器:K210、STM32、ESP32。控制器功能有重复,后续可从降成本方向考虑,用ESP32+STM32方案或者单独使用其中一个控制器方案。其次,方案多采用库函数,对底层研究不够深入,设备运行效率较低。后续可试试从底层开发,提升自己手册阅读能力与开发能力。 总之,经过这次训练,个人的嵌入式开发水平有了很大提升,开阔了眼界,为后续工作提供更多思路。再次感谢得捷提供的机会,祝愿大赛越办越好!!! 开箱贴:https://bbs.eeworld.com.cn/thread-1294810-1-1.html 温湿度检测:https://bbs.eeworld.com.cn/thread-1296460-1-1.html TVOC和CO2检测:https://bbs.eeworld.com.cn/thread-1294810-1-1.html

  • 上传了资料: 声源定位

  • 2024-10-23
  • 回复了主题帖: 【2024 DigiKey 创意大赛】会议声源追踪器 会议室环境检测(2)

    Jacktang 发表于 2024-10-23 07:29 这次测试增加了SGP30,进行TVOC和CO2检测,看起来是成功的 重点在声源定位,能找到的例程不多,还需要努力。

  • 2024-10-22
  • 发表了主题帖: 【2024 DigiKey 创意大赛】会议声源追踪器 会议室环境检测(2)

    本帖最后由 左手阿飞 于 2024-10-22 15:44 编辑 这次打算做一个会议拾音系统,主要功能如下: 1、声源定位,识别声音方向;(麦克风阵列,控制器) 2、声源追踪,用步进电机控制麦克风方向,追踪声源,减少干扰噪声;(麦克风阵列,控制器) 3、检测会议室环境,上传云端,可以提醒工作人员提前开启空调等设备。(传感器、ESP32)。   上一次发帖,通过DHT11进行温湿度检测,并上传到阿里云,通过手机可以查看。 本次增加了SGP30,进行TVOC和CO2检测并上传阿里云。 一、SGP30基本参数: SGP30通过I2C通信,并且可以采集的数据有CO2和TVOC的含量。TVOC是“Total Volatile Organic Compounds”,意思是总挥发性有机化合物。 1、TVOC输出范围  0~·60000,CO2输出范围400~60000,IIC地址0x58。 2、数据格式:6个字为一组,每3个字为一个数据:前两个字为数据内容,第三个字为CRC校验。       二、软件实现: 代码如下: 1、包含库函数:   2、IIC引脚定义:   3、声明一个类:   4、初始化:   5;检测TVOC和CO2:   6、上传到阿里云:   三、效果展示: 1、硬件连接:内部已经有上拉电阻,使用IIC连接时,不再外加上拉电阻,也可以正常工作。     2、阿里云后台数据显示: (1)正常数据显示:     (2)吹气后,数据显示:   (3)手机APP数据显示:   附代码: #include <Arduino.h> #include <WiFi.h> #include "PubSubClient.h" #include "DHT.h" #include "ArduinoJson.h" #include "Adafruit_SGP30.h" #define DHTPIN 4 #define LED 38 #define DHTTYPE DHT11 #define SCL 20 #define SDA 21 DHT dht(DHTPIN,DHTTYPE) ; #define WIFI_SSID "HONOR 200 Pro" #define WIFI_PASSWORD "87654321" #define PRODUCT_KEY "a1H4kfnF05D" #define DEVICE_NAME "ESP32S3Test" #define DEVICE_SECRET "c0fcb349106f4730b6358b62320f4aab" #define REGION_ID "cn-shanghai" #define MQTT_SERVER PRODUCT_KEY".iot-as-mqtt."REGION_ID ".aliyuncs.com" #define MQTT_PORT 1883 #define MQTT_USERNAME DEVICE_NAME"&"PRODUCT_KEY #define CLIENT_ID "a1H4kfnF05D.ESP32S3Test|securemode=2,signmethod=hmacsha256,timestamp=1729067953966|" #define MQTT_PASSWD "252b17f2417acf371e14d0d1f3ac85d070ea49960db96f001ff33b1eafbe1bc0" #define ALINK_BODY_FORMAT "{\"id\":\"ESP32S3Test\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}" #define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post" const char* topic="/sys/a1H4kfnF05D/ESP32S3Test/thing/service/property/set"; unsigned long lastMs=0; Adafruit_SGP30 sgp; /* return absolute humidity [mg/m^3] with approximation formula * @param temperature [°C] * @param humidity [%RH] */ uint32_t getAbsoluteHumidity(float temperature, float humidity) { // approximation formula from Sensirion SGP30 Driver Integration chapter 3.15 const float absoluteHumidity = 216.7f * ((humidity / 100.0f) * 6.112f * exp((17.62f * temperature) / (243.12f + temperature)) / (273.15f + temperature)); // [g/m^3] const uint32_t absoluteHumidityScaled = static_cast<uint32_t>(1000.0f * absoluteHumidity); // [mg/m^3] return absoluteHumidityScaled; } WiFiClient espClient; PubSubClient client(espClient); float soil_data; float tep; float TVOC_data; uint32_t CO2_data; void TVOC_CO2() { int counter = 0; if (! sgp.IAQmeasure()) { Serial.println("Measurement failed"); return; } Serial.print("TVOC "); Serial.print(sgp.TVOC); Serial.print(" ppb\t"); Serial.print("eCO2 "); Serial.print(sgp.eCO2); Serial.println(" ppm"); if (! sgp.IAQmeasureRaw()) { Serial.println("Raw Measurement failed"); return; } Serial.print("Raw H2 "); Serial.print(sgp.rawH2); Serial.print(" \t"); Serial.print("Raw Ethanol "); Serial.print(sgp.rawEthanol); Serial.println(""); delay(1000); counter++; if (counter == 30) { counter = 0; uint16_t TVOC_base, eCO2_base; if (! sgp.getIAQBaseline(&eCO2_base, &TVOC_base)) { Serial.println("Failed to get baseline readings"); return; } Serial.print("****Baseline values: eCO2: 0x"); Serial.print(eCO2_base, HEX); Serial.print(" & TVOC: 0x"); Serial.println(TVOC_base, HEX); } } void wifiInit() { WiFi.begin(WIFI_SSID,WIFI_PASSWORD); while(WiFi.status()!=WL_CONNECTED) { delay(500); Serial.println("WiFi not Connect"); } } void mqttCheckConnect() { while(!client.connected()) { Serial.println("Connect to MQTT Server..."); if(client.connect(CLIENT_ID,MQTT_USERNAME,MQTT_PASSWD)) { Serial.println("MQTT Connected!"); } else{ Serial.print("MQTT Connect err.."); Serial.println(client.state()); delay(5000); } } } void mqttIntervalPost() { char param[32]; char jsonBuf[128]; //upload humidity soil_data = dht.readHumidity(); sprintf(param, "{\"humidity\":%2f}", soil_data); sprintf(jsonBuf, ALINK_BODY_FORMAT, param); Serial.println(jsonBuf); boolean b = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf); if(b){ Serial.println("publish Humidity success"); }else{ Serial.println("publish Humidity fail"); } // Upload temperature tep =dht.readTemperature(); sprintf(param, "{\"temperature\":%2f}",tep); sprintf(jsonBuf, ALINK_BODY_FORMAT, param); Serial.println(jsonBuf); boolean c = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf); if(c){ Serial.println("publish Temperature success"); }else{ Serial.println("publish Temperature fail"); } // Upload TVOC TVOC_data =sgp.TVOC; sprintf(param, "{\"tvocCurrent\":%2f}",TVOC_data); sprintf(jsonBuf, ALINK_BODY_FORMAT, param); Serial.println(jsonBuf); boolean d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf); if(d){ Serial.println("publish tvocCurrent success"); }else{ Serial.println("publish tvocCurrent fail"); } // Upload CO2 CO2_data =sgp.eCO2; sprintf(param, "{\"coCurrent\":%2d}",CO2_data); sprintf(jsonBuf, ALINK_BODY_FORMAT, param); Serial.println(jsonBuf); boolean e = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf); if(e){ Serial.println("publish coCurrent success"); }else{ Serial.println("publish coCurrent fail"); } } //回调函数 void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); // 打印主题信息 Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); // 打印主题内容 } Serial.println(); DynamicJsonDocument doc(1024); //创建了一个名为 doc 的动态 JSON 文档 deserializeJson(doc, String((char *)payload)); //从一个名为 payload 的数据中解析 JSON 数据并将其填充到 doc 中 // DynamicJsonDocument params = doc["params"]; if(doc["params"].containsKey("deng")) { Serial.println("GOT DENG CMD"); digitalWrite(LED, doc["params"]["deng"]); } } void setup() { pinMode(LED,OUTPUT); Serial.begin(115200); dht.begin(); wifiInit(); Wire.begin(SDA,SCL); client.setServer(MQTT_SERVER, MQTT_PORT); /* 连接MQTT服务器 */ client.setCallback(callback); digitalWrite(LED,LOW); if (! sgp.begin()) { while (1); } Serial.print("Found SGP30 serial #"); Serial.print(sgp.serialnumber[0], HEX); Serial.print(sgp.serialnumber[1], HEX); Serial.println(sgp.serialnumber[2], HEX); } void loop() { TVOC_CO2(); if (millis() - lastMs >= 5000) { lastMs = millis(); mqttCheckConnect(); /* 上报 */ mqttIntervalPost(); } client.loop(); delay(2000); }  

  • 2024-10-18
  • 回复了主题帖: 【2024 DigiKey 创意大赛】会议声源追踪器 会议室环境检测(1)

    wangerxian 发表于 2024-10-18 13:06 追踪到声源方位之后,用于什么场景? 准备用于麦克风转动,追踪声源,减少声音干扰,提高声音接受质量。

  • 发表了主题帖: 【2024 DigiKey 创意大赛】会议声源追踪器 会议室环境检测(1)

    本帖最后由 左手阿飞 于 2024-10-18 11:24 编辑   这次打算做一个会议拾音系统,主要功能如下: 1、声源定位,识别声音方向;(麦克风阵列,控制器) 2、声源追踪,用步进电机控制麦克风方向,追踪声源,减少干扰噪声;(麦克风阵列,控制器) 3、检测会议室环境,上传云端,可以提醒工作人员提前开启空调等设备。(传感器、ESP32)。   由于功能1、2较难,先进行了任务3。   任务3 主要使用的模块是ESP32 和传感器,结合阿里云物联网平台。 使用的开发环境是VSCode+Platformio。   由易到难: 1、首先连接WIFI,先确定要连接WIFI的ID和密码,然后利用库函数连接WIFI,并打印连接信息: (1)库函数头文件   (2)设置WIFI的ID和密码   (3)利用库函数连接WIFI,若链接不成功,则打印信息。 2、物联网平台连接:本次使用的是阿里云生活物联网平台(飞燕平台)。 在物联网平台中,先设置3个功能,2个用于检测会议室温湿度,1个开关,控制会议室灯(可以改为其他设备,比如空调等,本次用LED演示)   人机交互界面示例:     代码部分,通过库函数,连接物联网平台,并上传温湿度。温湿度传感器用的是DHT11。 (1)头文件:   (2)物联网平台连接的参数:   (3)连接物联网   (4)上传温湿度   (5)接收Json信息,控制LED   3、效果演示: (1)后台显示温湿度:   (2)APP显示温湿度:   (3)APP控制LED亮灭(视频):   附代码: #include <Arduino.h> #include <WiFi.h> #include "PubSubClient.h" #include "DHT.h" #include "ArduinoJson.h" #define DHTPIN 4 #define LED 38 #define DHTTYPE DHT11 DHT dht(DHTPIN,DHTTYPE) ; #define WIFI_SSID "HONOR 200 Pro" #define WIFI_PASSWORD "87654321" #define PRODUCT_KEY "a1H4kfnF05D" #define DEVICE_NAME "ESP32S3Test" #define DEVICE_SECRET "c0fcb349106f4730b6358b62320f4aab" #define REGION_ID "cn-shanghai" #define MQTT_SERVER PRODUCT_KEY".iot-as-mqtt."REGION_ID ".aliyuncs.com" #define MQTT_PORT 1883 #define MQTT_USERNAME DEVICE_NAME"&"PRODUCT_KEY #define CLIENT_ID "a1H4kfnF05D.ESP32S3Test|securemode=2,signmethod=hmacsha256,timestamp=1729067953966|" #define MQTT_PASSWD "252b17f2417acf371e14d0d1f3ac85d070ea49960db96f001ff33b1eafbe1bc0" #define ALINK_BODY_FORMAT "{\"id\":\"ESP32S3Test\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}" #define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post" const char* topic="/sys/a1H4kfnF05D/ESP32S3Test/thing/service/property/set"; unsigned long lastMs=0; WiFiClient espClient; PubSubClient client(espClient); float soil_data; float tep; void wifiInit() { WiFi.begin(WIFI_SSID,WIFI_PASSWORD); while(WiFi.status()!=WL_CONNECTED) { delay(500); Serial.println("WiFi not Connect"); } } void mqttCheckConnect() { while(!client.connected()) { Serial.println("Connect to MQTT Server..."); if(client.connect(CLIENT_ID,MQTT_USERNAME,MQTT_PASSWD)) { Serial.println("MQTT Connected!"); } else{ Serial.print("MQTT Connect err.."); Serial.println(client.state()); delay(5000); } } } void mqttIntervalPost() { char param[32]; char jsonBuf[128]; //upload humidity soil_data = dht.readHumidity(); sprintf(param, "{\"humidity\":%2f}", soil_data); sprintf(jsonBuf, ALINK_BODY_FORMAT, param); Serial.println(jsonBuf); boolean b = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf); if(b){ Serial.println("publish Humidity success"); }else{ Serial.println("publish Humidity fail"); } // Upload temperature tep =dht.readTemperature(); sprintf(param, "{\"temperature\":%2f}",tep); sprintf(jsonBuf, ALINK_BODY_FORMAT, param); Serial.println(jsonBuf); boolean c = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf); if(c){ Serial.println("publish Temperature success"); }else{ Serial.println("publish Temperature fail"); } } //回调函数 void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); // 打印主题信息 Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); // 打印主题内容 } Serial.println(); DynamicJsonDocument doc(1024); //创建了一个名为 doc 的动态 JSON 文档 deserializeJson(doc, String((char *)payload)); //从一个名为 payload 的数据中解析 JSON 数据并将其填充到 doc 中 // DynamicJsonDocument params = doc["params"]; if(doc["params"].containsKey("deng")) { Serial.println("GOT DENG CMD"); digitalWrite(LED, doc["params"]["deng"]); } } void setup() { pinMode(LED,OUTPUT); Serial.begin(115200); dht.begin(); wifiInit(); client.setServer(MQTT_SERVER, MQTT_PORT); /* 连接MQTT服务器 */ client.setCallback(callback); digitalWrite(LED,LOW); } void loop() { if (millis() - lastMs >= 5000) { lastMs = millis(); mqttCheckConnect(); /* 上报 */ mqttIntervalPost(); } client.loop(); delay(2000); }        

  • 2024-09-27
  • 回复了主题帖: 【2024 DigiKey 创意大赛】会议声源追踪器 物料开箱

    秦天qintian0303 发表于 2024-9-26 12:19 估计得用多个进行角度定位,一般都是这样进行定位的,毕竟没有回波 多角度定位原理是什么样的?有没有参考的文章资料推荐一下?

  • 2024-09-26
  • 回复了主题帖: 【2024 DigiKey 创意大赛】会议声源追踪器 物料开箱

    秦天qintian0303 发表于 2024-9-26 10:46 难点在于声源定位,这样最好是阵列角度好才行,还有一个问题,声源确定后能干什么呢 声源定位,能查到的资料比较少,慢慢来,先做简单的。 准备是用步进电机控制麦克风角度,让麦克风正对着声源,减少干扰。

  • 发表了主题帖: 【2024 DigiKey 创意大赛】会议声源追踪器 物料开箱

    本帖最后由 左手阿飞 于 2024-9-26 10:15 编辑 感谢EE World 感谢得捷,第一次获得DigiKey 创意大赛资格,心情有点小激动呢! 这次打算做一个会议拾音系统,主要功能如下: 1、声源定位,识别声音方向;(麦克风阵列,控制器) 2、声源追踪,用步进电机控制麦克风方向,追踪声源,减少干扰噪声;(麦克风阵列,控制器) 3、检测会议室环境,上传云端,可以提醒工作人员提前开启空调等设备。(传感器、ESP32) 个人感觉难点在于声源定位,拿到物料后,准备先着手会议室环境检测及上传云端。   先看看快递外包装吧。 打开快递包装,还有一层包装,器件保护的很好。照片放反了啊。       再打开一层包装。   第一个器件,STM32F411,跟其他STM32开发板外型差不多。 第二个器件,ESP32S3开发板,这精致的包装。。。 第三个器件,室内环境传感器,检测室内空气质量。 第四个器件,麦克风阵列,看起来不错。 物料已经齐了,后面开干!!!  

学过的课程

最近访客

< 1/1 >

统计信息

已有3人来访过

  • 芯积分:82
  • 好友:--
  • 主题:5
  • 回复:4

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言