实现ST开发板开发环境的搭建,声音以及灯光的基本控制,并输出串口信息;
硬件准备
NUCLEO-C562RE 开发板 1 块
Arduino 传感器拓展板 1 块
蜂鸣器模块 1 个
杜绑线若干

开发环境说明
本次活动我尝试使用 Zephyr 进行开发,在 Zephyr 官方恰好有本次活动的开发支持。基于 Zephyr 可以非常简单地实现与上位机的串口通信。只需要新建工程后配置启动 Console 即可。
代码实现
Zephyr 工程配置
CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y CONFIG_PRINTK=y CONFIG_SERIAL=y CONFIG_GPIO=y
串口输出
printk("==================================================\n");
printk(" Motor State Detector based on Edge AI\n");
printk(" Mode : INFERENCE\n");
printk(" Peripherals : LED Buzzer LIS3DHTR OLED Stepper\n");
printk("==================================================\n");效果展示

实现加速度计传感器数据的采集,并通过串口进行打印;
硬件准备
NUCLEO-C562RE 开发板 1 块
Arduino 传感器拓展板 1 块
Grove - 三轴数字加速度计 (LIS3DHTR) 1 个
QWiic - Grove 连接线 1 根
Grove - 三轴数字加速度计 (LIS3DHTR) 通过QWiic - Grove 连接线连接到 Arduino 传感器拓展板的 Qwiic 接口。如下图所示:

代码实现
int accel_sample_fetch(struct accel_sample *out)
{
int rc;
struct sensor_value sv[3];
if (out == NULL) {
return -EINVAL;
}
rc = sensor_sample_fetch(accel_dev);
if (rc < 0) {
return rc;
}
/* 一次取三轴:比分三次通道读取少两次 I2C 往返 */
rc = sensor_channel_get(accel_dev, SENSOR_CHAN_ACCEL_XYZ, sv);
if (rc < 0) {
return rc;
}
/* sensor_value:val1 为整数 m/s^2,val2 为百万分之一余数;
* mg = (val1 * 1e6 + val2) / 9807,1 mg = 9.80665e-3 m/s^2。
* +/-2 g 量程结果在 +/-2000 内,int16_t 可容纳。
*/
out->x = (int16_t)(((sv[0].val1 * 1000000) + sv[0].val2) / 9807);
out->y = (int16_t)(((sv[1].val1 * 1000000) + sv[1].val2) / 9807);
out->z = (int16_t)(((sv[2].val1 * 1000000) + sv[2].val2) / 9807);
out->seq = g_seq++;
out->ts_ms = k_uptime_get();
return 0;
}效果展示

获取并整理电机运行状态(停止与启动)加速度数据,满足NanoEdge AI Studio工具获取数据要求;
硬件准备
NUCLEO-C562RE 开发板 1 块
Arduino 传感器拓展板 1 块
Grove - 三轴数字加速度计 (LIS3DHTR) 1 个
QWiic - Grove 连接线 1 根
齿轮步进电机驱动套件 1 套
杜绑线若干
Grove - 三轴数字加速度计 (LIS3DHTR) 通过QWiic - Grove 连接线连接到 Arduino 传感器拓展板的 Qwiic 接口。并使用杜绑线连接齿轮步进电机驱动套件到 Arduino 传感器拓展板的相应引脚。 如下面包板接线图所示:

代码实现
int collector_write_window_flat(const struct accel_sample *samples, size_t n)
{
/* 行缓冲:最坏 n*3 个值 x "-2000,"6 字符 = 900 字节(n=50),
* 取 1024 留余量;静态分配避免占栈
*/
static char line[1024];
size_t len = 0;
size_t i;
if (samples == NULL || n == 0U) {
return -EINVAL;
}
for (i = 0U; i < n; i++) {
int rc;
int v;
v = samples[i].x;
rc = snprintf(line + len, sizeof(line) - len,
len == 0U ? "%d" : ",%d", v);
if (rc < 0 || (size_t)rc >= sizeof(line) - len) {
return -ENOSPC;
}
len += (size_t)rc;
v = samples[i].y;
rc = snprintf(line + len, sizeof(line) - len, ",%d", v);
if (rc < 0 || (size_t)rc >= sizeof(line) - len) {
return -ENOSPC;
}
len += (size_t)rc;
v = samples[i].z;
rc = snprintf(line + len, sizeof(line) - len, ",%d", v);
if (rc < 0 || (size_t)rc >= sizeof(line) - len) {
return -ENOSPC;
}
len += (size_t)rc;
}
line[len] = '\n';
len++;
line[len] = '\0';
printk("%s", line);
return 0;
}效果展示

我要赚赏金
