94|1

424

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【Follow me第二季第4期】Arduino Nano Connect 作业提交 [复制链接]

  本帖最后由 我的学号 于 2024-12-30 00:07 编辑

一.视频展示

1.1 物料展示

1 ARDUINO NANO RP2040 CONNECT  
2 RASPBERRY PI PICO 2 RP2350  
3 64 MBIT FLASH MODULE  
4 MICROSD MODULE  

 

1.2 视频演示

Total

 

二.任务实现详情

2.1 入门任务(必做):搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!

2.1.1 物料准备

Arduino IDE /Arduino Nano Connect 开发板/ USB 连接线

设计思路

初始化 RGB 模块和串口模块,在loop 中用状态机切换不同颜色显示;通过串口打印上传 Hello DigiKey & EEWorld!

 

硬件详解:【Follow me第二季第4期】1.Nano RP2040 Connect 硬件分析 

任务详解:【Follow me第二季第4期】2.必做任务之点灯+串口打印

 

2.1.2 软件流程

 

2.1.3 代码片段

#include "WiFiNINA.h"

//宏定义数据
#define LED1 LEDR
#define LED2 LEDG
#define LED3 LEDB


//全局变量
byte u8RedColor_i =0;
byte u8GreenColor_i =0;
byte u8BlueColor_i =0;

byte u8Step =1;

// the setup function runs once when you press reset or power the board
void setup() 
{
  //LED 初始化
  pinMode(LED_BUILTIN, OUTPUT);
  
  //RGB 初始化
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);

  //串口初始化
  Serial.begin(9600);
}

// the loop function runs over and over again forever
void loop() 
{
  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(500);                      // wait for a second
  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
  delay(500);                      // wait for a second

  Serial.println("Hello DigiKey & EEWorld!");

//状态机形式点灯
  switch(u8Step)
  {
    case 1:
    {
      u8RedColor_i =255;
      u8GreenColor_i =0;
      u8BlueColor_i =0;
      u8Step =2;
      break;
    }
    case 2:
    {
      u8RedColor_i =0;
      u8GreenColor_i =255;
      u8BlueColor_i =0;
      u8Step =3;
      break;
    }
    case 3:
    {
      u8RedColor_i =0;
      u8GreenColor_i =0;
      u8BlueColor_i =255;
      u8Step =4;
      break;
    }
    case 4:
    {
      u8RedColor_i =0;
      u8GreenColor_i =255;
      u8BlueColor_i =255;
      u8Step =5;
      break;
    }
    case 5:
    {
      u8RedColor_i =255;
      u8GreenColor_i =0;
      u8BlueColor_i =255;
      u8Step =6;
      break;
    }
    case 6:
    {
      u8RedColor_i =255;
      u8GreenColor_i =255;
      u8BlueColor_i =0;
      u8Step =1;
      break;
    }

    default:
    {
      u8RedColor_i =0;
      u8GreenColor_i =0;
      u8BlueColor_i =0;
    }

  }

  RgbSetColor(u8RedColor_i,u8GreenColor_i,u8BlueColor_i);
}

//////////////////////////////////////////////////////////
//函数名称:RgbSetColor
//函数功能:设置RGB 颜色亮度
//传入参数:红色数值, 绿色数值, 蓝色数值
//传出参数:无
//特别说明:数据范围 0~255
//////////////////////////////////////////////////////////
void RgbSetColor(byte u8RedValue, byte u8GreenValue, byte u8BlueValue)
{
  analogWrite(LEDR,  (255-u8RedValue));
  analogWrite(LEDG,  (255-u8GreenValue));
  analogWrite(LEDB,  (255-u8BlueValue));
}

 

2.2 入门任务(必做):学习IMU基础知识,调试IMU传感器,通过串口打印六轴原始数据

2.2.1 物料准备

Arduino IDE /Arduino Nano Connect 开发板/ USB 连接线 

设计思路

setup 函数中初始化串口模块和 IMU 模块,然后在 loop 函数中查询 IMU 是否有新数据产生,通过串口打印

 

2.2.2 软件流程

 

2.2.3 代码片段

#include "WiFiNINA.h"
#include "Arduino_LSM6DSOX.h"

//宏定义数据
#define LED1 LEDR
#define LED2 LEDG
#define LED3 LEDB


//全局变量
byte u8RedColor_i =0;
byte u8GreenColor_i =0;
byte u8BlueColor_i =0;

byte u8Step =1;

float Ax, Ay, Az;
float Gx, Gy, Gz;

// the setup function runs once when you press reset or power the board
void setup() 
{
  //LED 初始化
  pinMode(LED_BUILTIN, OUTPUT);
  
  //RGB 初始化
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);

  //串口初始化
  Serial.begin(9600);

  //IMU 初始化
  if(!IMU.begin())
  {
    Serial.println("Fail to initialize IMU!");
  }

  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();
}

void loop() 
{
  //打印加速度数据
  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);

}

 

2.3 入门任务(必做):学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形

2.3.1 物料准备

Arduino IDE /Arduino Nano Connect 开发板/ USB 连接线 

设计思路

setup 函数中初始化串口模块和 PDM 模块,然后在 loop 函数中查询 PDM 新数据,通过串口打印

 

2.3.2 软件流程

 

2.3.3 代码片段

#include <WiFiNINA.h>
#include <PDM.h>

bool LED_SWITCH = false;

// 设置输出通道数, 1 为单声道, 2 为立体声
static const char channels = 1;

// 设置采样频率, 单位 Hz
static const int frequency = 20000;

// 缓存采样数据,数据长度为 16bit
short sampleBuffer[512];

// 读取个数
volatile int samplesRead;

void setup() 
{
  //串口初始化
  Serial.begin(9600);

  //LED 灯初始化
  pinMode(LEDB, OUTPUT);

  // 设置 PDM 检测到新数据时的回调函数
  PDM.onReceive(onPDMdata);

  // 设置 PDM 增益,数据在 0 到 255 之间,默认为 20
  PDM.setGain(30);

  // 初始化 PDN 模块:
  // - 单声道模式
  // - 采样率 20KHz
  // 等待 PDM 初始化完成
  if (!PDM.begin(channels, frequency)) 
  {
    Serial.println("Failed to start PDM!");
    while (1);
  }
}

void loop() 
{
  // 有新数据产生
  if (samplesRead)
  {
    // 串口打印接收数据
    for (int i = 0; i < samplesRead; i++)
    {
      Serial.println(sampleBuffer[i]);
      
      if (sampleBuffer[i] > 5000 || sampleBuffer[i] <= -5000)  //数据大于 5000 或小于 -5000, 闪灯 
      {
        LED_SWITCH = !LED_SWITCH;
        if (LED_SWITCH) 
        {
          digitalWrite(LEDB, HIGH);
          delay(1000);
        }
        else 
        {
          digitalWrite(LEDB, LOW);
          delay(1000);
        }
      }
    }
    // 清零数据,等待下一次数据
    samplesRead = 0;
  }
}

//   处理 PDM 模块的回调函数,底层用 ISR 实现,因此不可在其中使用串口打印数据
void onPDMdata() 
{
  // 读取 PDM 缓存数据
  int bytesAvailable = PDM.available();

  // 将 PDM 缓存数据存入定义数组中
  PDM.read(sampleBuffer, bytesAvailable);

  // 每次采样 2Byte 数据
  samplesRead = bytesAvailable / 2;
}

 

2.3 选做任务:通过RGB LED不同颜色、亮度显示PDM麦克风收到的声音大小

2.3.1 物料准备

Arduino IDE /Arduino Nano Connect 开发板/ USB 连接线 

设计思路

setup 函数中初始化 RGB 模块、串口模块和 PDM 模块,然后在 loop 函数中查询 PDM 新数据,通过 map 函数映射为 RGB 数值

 

2.3.2 软件流程

 

2.3.3 代码片段

#include <WiFiNINA.h>
#include <PDM.h>

//宏定义数据
#define LED1 LEDR
#define LED2 LEDG
#define LED3 LEDB

// 设置输出通道数, 1 为单声道, 2 为立体声
static const char channels = 1;

// 设置采样频率, 单位 Hz
static const int frequency = 20000;

// 缓存采样数据,数据长度为 16bit
short sampleBuffer[512];

// 读取个数
volatile int samplesRead;

byte PDM_DataRemap =0;

void setup() 
{
  //串口初始化
  Serial.begin(4800);

  //LED 灯初始化
  pinMode(LEDB, OUTPUT);

  // 设置 PDM 检测到新数据时的回调函数
  PDM.onReceive(onPDMdata);

  // 设置 PDM 增益,数据在 0 到 255 之间,默认为 20
  PDM.setGain(30);

  // 初始化 PDN 模块:
  // - 单声道模式
  // - 采样率 20KHz
  // 等待 PDM 初始化完成
  if (!PDM.begin(channels, frequency)) 
  {
    Serial.println("Failed to start PDM!");
    while (1);
  }
}

void loop() 
{
  // 有新数据产生
  if (samplesRead)
  {
    PDM_DataRemap =map(sampleBuffer[0],-500, 500, 0, 255);
    RgbSetColor(0, 0, PDM_DataRemap);
    // Serial.println(sampleBuffer[0]);
    delay(100);
    // 清零数据,等待下一次数据
    samplesRead = 0;
  }
}

//   处理 PDM 模块的回调函数,底层用 ISR 实现,因此不可在其中使用串口打印数据
void onPDMdata() 
{
  // 读取 PDM 缓存数据
  int bytesAvailable = PDM.available();

  // 将 PDM 缓存数据存入定义数组中
  PDM.read(sampleBuffer, bytesAvailable);

  // 每次采样 2Byte 数据
  samplesRead = bytesAvailable / 2;
}

//////////////////////////////////////////////////////////
//函数名称:RgbSetColor
//函数功能:设置RGB 颜色亮度
//传入参数:红色数值, 绿色数值, 蓝色数值
//传出参数:无
//特别说明:数据范围 0~255,数值越小,亮度越小
//////////////////////////////////////////////////////////
void RgbSetColor(byte u8RedValue, byte u8GreenValue, byte u8BlueValue)
{
  analogWrite(LEDR,  (255-u8RedValue));
  analogWrite(LEDG,  (255-u8GreenValue));
  analogWrite(LEDB,  (255-u8BlueValue));
}

 

三.可下载代码

20241229231141134.7z (2.2 KB, 下载次数: 0)

 

四.心得体会

感谢 EE和 DigiKey 再一次提供的玩板子的机会。很久前就有听过 RP2040 的高i性价比,特别是今年官方还出了升级版本的 2350;本次的 Nano 板卡也称得上是麻雀虽小五脏俱全,尤其板载 ST 的 MESE 加速度和陀螺仪传感器,以及 PDM 录音模块,可联动机器学习和语音引擎,加上小尺寸体积,十分适合用在可穿戴设备上。遗憾的一点是年尾事多时间有限,本次活动只能匆匆掠过,更出彩的玩法还得补课学学机器学习和惯性导航内容,毕竟学无止境,趁年轻,多折腾。

最新回复

选了这么多模块吗?     详情 回复 发表于 3 天前
点赞 关注
个人签名君应有语,渺万里层云,千山暮雪,知向谁边?
 
 

回复
举报

6345

帖子

10

TA的资源

版主

沙发
 

选了这么多模块吗?  

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/5 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表