73|0

655

帖子

30

TA的资源

版主

楼主
 

【Follow me第二季第4期】汇总提交帖:全部任务 [复制链接]

  本帖最后由 lb8820265 于 2024-12-29 15:33 编辑

项目演示视频

物料展示

    整个学习的过程只需要一个Arduino RP2040 开发板即可,开发板上自带有许多的传感器。

   

前期准备工作

    Arduino® Nano RP2040 Connect这个开发板是Arduino公司生产的产品,用的是树莓派Pico中的RP2040,树莓派有针对该芯片有专门的专门的SDK,是用C语言写的,我之前有学习过,但这次Arduino公司有对其进行封装,让其上手变得特别简单,使用Arduino IDE可以非常简单的完成一些简单的任务,完全不需要关注底层的驱动和相关的配置。但是也有许多不便的地方,比如定时器需要另外的安装库,PIO的功能甚至连库也没找到,而且许多的库也没法看到源码。最后还是决定用Arduino IDE来完成本次的任务。

先在Arduino官网上将IDE软件下载下来然后安装,使用USB线连接好电脑与开发板,正常情况会默认识别出硬件与端口号,如下图所示。

 

    而且提示安装对应的库文件,没安装也可以在后期搜索Arduino Mbed OS Nano Boards安装,如下图所示。

 

任务成果展示

任务一:

    搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!;

    三色LED灯的原理是通过三个引脚来控制的,引脚拉低,对应颜色的灯就发光。

 

    但是,三个引脚是从Wifi芯片上引出的,这点和官方树莓派Pico的做法一样。

 

    因此,需要安装WiFi芯片的库文件,在库文件搜索处,搜索WifiNINA,然后安装,如下图所示。

 

 

程序全部源码如下:

#include "WiFiNINA.h"
void setup() {
Serial.begin(9600);
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
}
void loop() {

  Serial.println("Hello DigiKey & EEWorld!");
  // Red
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  delay(500);
  // Green
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, LOW);
  digitalWrite(LEDB, HIGH);
  delay(500);
  // Blue
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, LOW);
  delay(500);
}

    代码是然后LED三色闪烁,同时串口发送"Hello DigiKey & EEWorld!"。

    可以先点击IDE的“√”按钮,看看语法有没有错误,然后点击“->”按钮进行程序烧录。

    看到提示”Done uploading”就说明烧录成功了,如下图。

     串口可以使用IDE软件自带的串口工具,在Tools->Serial Monitor中,设置好波特率后,就可以看到打印的字符。

 

任务二:

    学习IMU基础知识,调试IMU传感器,通过串口打印六轴原始数据;

    板子上有ST公司的陀螺仪加速度计芯片,叫做LSM6DSOX,Arduino IDE有IMU的库函数,但是需要额外安装,在库中搜索安装如下。

 

    可以去Arduino官网中查看该库的详细介绍:Arduino_LSM6DSOX | Arduino Documentation,这个库函数写的非常的简单,而且限制了数据的跟新频率为104Hz,详细的源码可以去官方Github库中查看:

链接已隐藏,如需查看请登录或者注册

程序全部源码如下:

#include <Arduino_LSM6DSOX.h>
float Ax, Ay, Az;
float Gx, Gy, Gz;
float data[6];  
char tail[] = {0x00, 0x00, 0x80, 0x7f};
void setup() {
  Serial.begin(115200);
  while(!Serial);
  if (!IMU.begin()) {
    Serial.println("Failed to initialize IMU!");
    while (1);
  }
}
void loop() {
  if (IMU.accelerationAvailable()) {
    IMU.readAcceleration(Ax, Ay, Az);
    data[0]=Ax;
    data[1]=Ay;
    data[2]=Az;
  }
  if (IMU.gyroscopeAvailable()) {
    IMU.readGyroscope(Gx, Gy, Gz);
    data[3]=Gx;
    data[4]=Gy;
    data[5]=Gz;
  }
  Serial.write((char *)data, sizeof(float) * 6);
  Serial.write(tail, 4);
}

    程序是在loop中不断的查询数据是否准备好,然后获取数据并发送出来。烧录程序后数据的展示使用的是一个叫做VOFA+的软件,这是一个免费的数据波形展示软件,设定两个波形显示控件,左边是加速度计的值,右边是陀螺仪的值,配置好数据引擎为JustFloat,配置好串口参数,打开DTR,如下图所示。

 

    然后转动开发板,显示的结果如下图所示。

 

    任务三:

    学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形。

    该任务在库例程中有一个直接可用的例程,在File->Examples->PDM,这个例子可以直接烧录运行,然后在IDE自带的数据显示工具中显示波形数据,但是波形显示的数据量太少,不太直观,这里仍然用VOFA+软件进行波形的展示,稍微修改一下例程中的代码,将波特率改为115200,数据按照通信协议进行发送。

程序全部源码如下:

#include <PDM.h>
float data[2];  
char tail[] = {0x00, 0x00, 0x80, 0x7f};
// default number of output channels
static const char channels = 1;
// default PCM output frequency
static const int frequency = 16000;
// Buffer to read samples into, each sample is 16-bits
short sampleBuffer[512];
// Number of audio samples read
volatile int samplesRead;
void setup() {
  Serial.begin(115200);
  while (!Serial);
  // Configure the data receive callback
  PDM.onReceive(onPDMdata);
  // Optionally set the gain
  // Defaults to 20 on the BLE Sense and 24 on the Portenta Vision Shield
  // PDM.setGain(30);
  // Initialize PDM with:
  // - one channel (mono mode)
  // - a 16 kHz sample rate for the Arduino Nano 33 BLE Sense
  // - a 32 kHz or 64 kHz sample rate for the Arduino Portenta Vision Shield
  if (!PDM.begin(channels, frequency)) {
    Serial.println("Failed to start PDM!");
    while (1);
  }
}
void loop() {
  // Wait for samples to be read
  if (samplesRead) {
    for (int i = 0; i < samplesRead; i++) {
    data[0] = sampleBuffer[i];
    Serial.write((char *)data, sizeof(float) * 1);
    Serial.write(tail, 4);
    }
    samplesRead = 0;
  }
}

/**
 * Callback function to process the data from the PDM microphone.
 * NOTE: This callback is executed as part of an ISR.
 * Therefore using `Serial` to print messages inside this function isn't supported.
 * */
void onPDMdata() {
  // Query the number of available bytes
  int bytesAvailable = PDM.available();
  // Read into the sample buffer
  PDM.read(sampleBuffer, bytesAvailable);
  // 16-bit, 2 bytes per sample
  samplesRead = bytesAvailable / 2;
}

    烧录后对着板子说话,就可以在波形上位机中看到变化的声音波形数据了,如下图所示。

 

项目总结

    这次使用Arduino® Nano RP2040 Connect开发板结合Arduino IDE确实体验到了开发的便利性,但是如果想要更好的发挥出这个板子的全部性能,做出有意思的东西,则还需要进行探索,期望后期能用这块板子做更多有意思的东西。

 

点赞 关注
个人签名QQ:252669569
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
什么是集成电路?

什么是集成电路?   集成电路是什么?就是电路板上的那些小黑块,有很多引脚,它的里面并不复杂,无非就是一些三极管组合在 ...

电子工程师 月薪三万的智商测试题(答案出来了)

智商测试开始: 小明和小强都是张老师的学生,张老师的生日是某月某日,2人都不知道张老师的生日。 生日是下 ...

转载:<<ARM入门最好的文章>>,适合菜鸟

我自己在学arm7,不小心在网上看到这篇文章,内容如题,自我感觉他写的不错,因此帖上来供菜鸟们参考,高手就不用看了 该文章作者不详 ...

【Altera SoC体验之旅】+ DE1上跑完整的卷积神经网络

本帖最后由 zhaoyongke 于 2015-5-30 17:53 编辑 距离上次发帖有点久了,这段时间都在调试另一块Stratix V的板子。 闲话少 ...

固态器件与真空管的比较,两者会长期共存吗?

长久以来,固态器件一直是真空器件的首选。相比采用电压电源(例如,低于 50 V)的固态器件,采用高压电源(通常在几千伏范围内 ...

LCD中字符和数字的显示问题?

各位大神,想请教一下。在c6748开发板的液晶上如何显示字符和数字,应该调用那个函数? // 显示静态文本 GrContextFon ...

Thonny中数据可视化的用法

首先,在Thonny的菜单view下,勾选plotter(绘图仪)。 然后在程序中,将需要可视化的数据通过print打印出来,thonny会自动判 ...

电机控制基础——定时器捕获单输入脉冲原理

本帖最后由 DDZZ669 于 2021-2-28 14:58 编辑 上篇(https://bbs.eeworld.com.cn/thread-1157028-1-1.html)介绍了定时器的** ...

百思不得其解,浮地设备为什么能用ESD管做静电防护

本帖最后由 Nubility 于 2024-5-2 18:28 编辑 像手机这样的浮地设备,静电打入接口之后肯定是不会泄放到大地的,为什么还 ...

【K230嵌入式AI开发板测评】+色彩识别及计数统计体验篇

在我们的日常生活中,色彩随时伴随在我们的身边,而且对我们来说识别色彩是件很简单的事情。然而关于色彩的知识真的是怎么简单吗 ...

关闭
站长推荐上一条 1/4 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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