Arduino Nano 33 BLE Sense 实验
Arduino Nano 33 BLE Sense 板旨在为寻求在其项目中实现低功耗蓝牙连接的制造商提供省电且经济高效的解决方案。它基于 NINA B306 模块,核心是包含 Cortex M4F 微控制器的 Nordic nRF52480。Nano 33 BLE Sense 和 Arduino Nano 33 BLE 一样,只不过增加了一组传感器。下面将会逐一介绍这些传感器,了解如何设置编程环境并驱动硬件。
要对 Arduino Nano 33 BLE Sense 进行编程,可以使用 Arduino IDE 或者 Arduino Web Editor,下面以 Arduino IDE 进行讲解。
开发环境
要对 Arduino Nano 33 BLE Sense 进行编程,安装好 Arduino IDE 工具之后,还需要安装 Arduino Mbed OS Core。安装方法很简单,选择菜单栏的“工具” -> 开发板 -> 开发板管理器,在开发板管理器中输入 “nano 33 ble” 进行搜索,找到 Arduino Mbed OS Nano Boards,点击“安装”即可。请耐心等待安装完毕。
Arduino Nano 33 BLE Sense 板是 Arduino Nano 33 BLE 的硬件变体,这两块板都会被识别为 Arduino Nano 33 BLE,所以当你连接 Arduino Nano 33 BLE Sense 板与电脑,IDE 显示开发板为 Arduino Nano 33 BLE 时不要惊讶。
OSX 和 Linux 系统不需要额外安装驱动程序,而对于 Windows 系统,插入 Arduino Nano 33 BLE Sense 板卡后,将会启动其驱动程序安装过程。
如果一切正常,你可以打开 LED blink 示例程序,编译并上传到 Arduino 板上,看板载的橙色 LED 灯是否闪烁。
注意事项
开始之前,我们先来看看使用 Arduino Nano 33 BLE Sense 的一些注意事项。
-
工作电压
Arduino Nano 33 BLE Sense 微控制器的工作电压是 3.3V,这意味着你不能在其数字和模拟引脚上施加超过 3.3V 的电压。连接传感器和执行器时必须小心,以确保永远不会超过 3.3V 的限制。连接更高电压的信号(如其他 Arduino 板常用的 5V)会损坏 Arduino Nano 33 BLE Sense。
由于默认出厂设置 VUSB 焊盘没有连接上,所以接口连接器上的 5V 引脚(位于 RST 和 A7 之间)并不能立即工作。这是为了安全考虑,提醒用户尽量连接器件到数字和模拟引脚上时,应尽量使用 3.3V 电压。如果你的设计必须从该引脚获取 5V 电压,那么你必须用焊锡连接上 VUSB 的两个焊盘,同时采用 USB 端口为 Nano 33 BLE Sense 供电。如果从 VIN 引脚为电路板供电,则不会得到 5V 稳压。
3.3V 引脚 始终可用,并且支持足够的电流来驱动传感器。因此,请在设计时尽可能选择 3.3V 驱动的传感器和执行器。这很容易实现,因为 3.3V 已经成为电子 IC 的标准电压了。
-
串口
评估板的 USB 接口直接连接到 NINA B306 模块的 USB 控制器。因此,你可以将 Arduino Nano 33 BLE Sense 用作 USB 外设(充当连接到计算机的鼠标或键盘),或者用作 USB 主机设备,以便将鼠标、键盘或 Android 手机之类的设备连接到 Arduino Nano 33 BLE。该 USB 端口也可用作虚拟串口,使用 Arduino 编程语言中的
Serial
对象操作。而 RX0 和 TX1 引脚可作为第二个串口,使用Serial1
。 -
ADC 和 PWM 分辨率
Arduino Nano 33 BLE 可以更改其模拟读取分辨率 —— 默认为10位,最高支持12位 ADC。PWM 具有8位分辨率。关于如何更改 ADC 分辨率,请查看 analog read resolution 页面。
实验示例
现在你已经知道怎么给 Arduino Nano 33 BLE Sense 板编程,接下来你可以去 Project Hub 找一些灵感,或者跟着下面的教程来学习如何使用开发板上的功能。
惯性测量单元(LSM9DS1)
Arduino Nano 33 BLE Sense 板载的 IMU(惯性测量单元)是 LSM9DS1,它包含三轴加速度计(3-axis accelerometer)、三轴陀螺仪(3-axis gyroscope)和三轴磁力计(3-axis magnetometer)。LSM9DS1 是意法半导体生产的,并已提供 Arduino_LSM9DS1 软件库。通过该软件库的示例代码,我们可以快速使用 LSM9DS1 传感器。
加速度
/*
Arduino LSM9DS1 - Simple Accelerometer
从 LSM9DS1 传感器读取加速度值
*/
#include <Arduino_LSM9DS1.h>
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("Started");
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.println("Acceleration in G's");
Serial.println("X\tY\tZ");
}
void loop() {
float x, y, z;
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(x, y, z);
Serial.print(x);
Serial.print('\t');
Serial.print(y);
Serial.print('\t');
Serial.println(z);
}
}
陀螺仪
/*
Arduino LSM9DS1 - Simple Gyroscope
从 LSM9DS1 传感器中读取旋转率(角速度)
*/
#include <Arduino_LSM9DS1.h>
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("Started");
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Gyroscope sample rate = ");
Serial.print(IMU.gyroscopeSampleRate());
Serial.println(" Hz");
Serial.println();
Serial.println("Gyroscope in degrees/second");
Serial.println("X\tY\tZ");
}
void loop() {
float x, y, z;
if (IMU.gyroscopeAvailable()) {
IMU.readGyroscope(x, y, z);
Serial.print(x);
Serial.print('\t');
Serial.print(y);
Serial.print('\t');
Serial.println(z);
}
}
磁力计
/*
Arduino LSM9DS1 - Simple Magnetometer
从 LSM9DS1 传感器中读取地磁场数据
*/
#include <Arduino_LSM9DS1.h>
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("Started");
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Magnetic field sample rate = ");
Serial.print(IMU.magneticFieldSampleRate());
Serial.println(" uT");
Serial.println();
Serial.println("Magnetic Field in uT");
Serial.println("X\tY\tZ");
}
void loop() {
float x, y, z;
if (IMU.magneticFieldAvailable()) {
IMU.readMagneticField(x, y, z);
Serial.print(x);
Serial.print('\t');
Serial.print(y);
Serial.print('\t');
Serial.println(z);
}
}
数字麦克风(MP34DT05)
Arduino Nano 33 BLE Sense 板载的数字麦克风(digital microphone)是 MP34DT05,它也是来自意法半导体公司的芯片。是一个超紧凑、低功耗的全向数字 MEMS 麦克风,内置有电容式感应元件和 IC 接口,输出 PDM 编码格式数据。
PDM(Pulse Density Modulation)格式由 PDM 库支持,也可以与 ArduinoSound 一起使用。
/*
读取板载 MP34DT05 传感器数据,并转换为环境噪声 dB 值
*/
#include <PDM.h>
#include <math.h>
static const char channels = 1; // default number of output channels
static const int frequency = 16000; // default PCM output frequency
short sampleBuffer[512]; // Buffer to read samples into, each sample is 16bits
volatile int samplesRead; // Number of audio samples read
void setup()
{
Serial.begin(9600);
PDM.onReceive(onPDMdata);
PDM.setGain(20);
if (!PDM.begin(channels, frequency)) {
Serial.println("Failed to start PDM!");
while (1);
}
}
void loop()
{
double spl = 0; // 环境噪声 dB
double amp = 0; // amp: amplitude of sound
double sum = 0;
int cnt = 0; // max: 1023, 15.625Hz
while (cnt<1020) { // 1024
if (samplesRead) {
for (int i=0; i<samplesRead; i++) {
sum += double(sampleBuffer[i])*sampleBuffer[i];
}
cnt += samplesRead;
samplesRead = 0;
}
amp = 20 * log10(10*sqrt(sum/cnt));
}
spl = amp;
Serial.print(spl);
Serial.println(" dB");
delay(1000);
}
void onPDMdata()
{
int bytesAvailable = PDM.available();
PDM.read(sampleBuffer, bytesAvailable);
samplesRead = bytesAvailable / 2;
}