本帖最后由 eew_kTvRL7 于 2025-1-12 21:25 编辑
任务介绍
本帖为Follow me第二季第4期的任务提交帖。
任务包含以下内容:
- 搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!
- 调试IMU传感器,通过串口打印数据;
- 调试PDM麦克风,通过串口打印收音数据和音频波形。
- 通过RGB LED不同颜色显示PDM麦克风收到的声音大小;
- 通过IMU数据结合机器学习算法,识别运动状态,并通过串口打印。
使用到的物料包括:
- Arduino Nano RP2040 Connect
- 无源蜂鸣器
- 面包板
设计思路:除发声单元使用蜂鸣器模块,其它任务可使用板载器件完成。
软件流程图
任务1
void rgbBlink(){
for(int i = 0; i < 100; i++){
digitalWrite(LEDR,HIGH);
digitalWrite(LEDG,LOW);
digitalWrite(LEDB,LOW);
delay(100);
digitalWrite(LEDR,LOW);
digitalWrite(LEDG,HIGH);
digitalWrite(LEDB,LOW);
delay(100);
digitalWrite(LEDR,LOW);
digitalWrite(LEDG,LOW);
digitalWrite(LEDB,HIGH);
delay(100);
}
}
void task1(){
Serial.println("********** Task 1 **********");
rgbBlink();
Serial.println("Hello DigiKey & EEWorld!");
Serial.println("********** Task 1 **********");
}
任务2
void task2(){
Serial.println("********** Task 2 **********");
static float Ax, Ay, Az;
static float Gx, Gy, Gz;
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Accelerometer sample rate = ");
Serial.print(IMU.accelerationSampleRate());
Serial.println("Hz");
Serial.println();
Serial.print("Gyroscope sample rate = ");
Serial.print(IMU.gyroscopeSampleRate());
Serial.println("Hz");
Serial.println();
for(int i = 0; i < 100; i++){
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(Ax, Ay, Az);
Serial.println("Accelerometer data: ");
Serial.print(Ax);
Serial.print('\t');
Serial.print(Ay);
Serial.print('\t');
Serial.println(Az);
Serial.println();
}
if (IMU.gyroscopeAvailable()) {
IMU.readGyroscope(Gx, Gy, Gz);
Serial.println("Gyroscope data: ");
Serial.print(Gx);
Serial.print('\t');
Serial.print(Gy);
Serial.print('\t');
Serial.println(Gz);
Serial.println();
}
delay(500);
}
IMU.end();
Serial.println("********** Task 2 **********");
}
任务3 & 4
void task3(){
Serial.println("********** Task 3 **********");
static const char channels = 1;
static const int frequency = 16000;
PDM.onReceive(onPDMdata);
if (!PDM.begin(channels, frequency)) {
Serial.println("Failed to start PDM!");
while (1);
}
setPWM(pwm, 13, 4000, 50);
for(int i = 0; i < 100; i++){
if (samplesRead) {
for (int i = 0; i < samplesRead; i++) {
if(channels == 2) {
Serial.print("L:");
Serial.print(sampleBuffer<i>);
Serial.print(" R:");
i++;
}
if(sampleBuffer<i> > 1000){
digitalWrite(LEDR,HIGH);
digitalWrite(LEDG,LOW);
digitalWrite(LEDB,LOW);
}else{
digitalWrite(LEDR,LOW);
digitalWrite(LEDG,HIGH);
digitalWrite(LEDB,LOW);
}
Serial.println(sampleBuffer<i>);
}
samplesRead = 0;
static int fq=4000;
if(fq>=10000) fq=2000;
fq+=1000;
}
delay(500);
}
setPWM(pwm, 13, 100, 0);
Serial.println("********** Task 3 **********");
}
视频演示:任务演示汇总
任务源码:https://download.eeworld.com.cn/detail/eew_kTvRL7/635462
心得体会:Arduino快速实现一个功能(在有现成库的情况下)与传统基于MCU进行裸机开发的便利程度几乎不可同日而语,加上Arduino IDE提供了一个开箱即用的开发环境,可以说Arduino对于电子爱好者或者希望实现某种特定功能的用户来说是一个非常实用的工具。很高兴能参与EEworld和得捷举行的本次活动,体验到Arduino这个高效的开发平台。