本帖最后由 WT_0213 于 2024-3-14 09:03 编辑
免费申请 | 挑战智能家居!毫米波雷达模组,100个名额,先到先得!(活动已停)
https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=44214
参加论坛活动,用毫米波雷达点灯。由于没有合适的灯控制,直接点亮M61-32S上面的LED了。
基于Rd-03E原生固件通过手势识别进行点灯。
相关资料:
Rd-03E手势识别上位机:Rd-03E手势识别上位机
Rd-03E快速入门使用文档
Rd-03E 手势识别固件用户手册
接线方式:
Rd-03E |
M61-32S |
VCC |
5V |
GND |
GND |
OT1 |
GPIO24 |
RX |
GPIO23 |
如下图按数字标号连线即可。
下面是示例代码:
#include "bflb_mtimer.h"
#include "board.h"
#include "bflb_uart.h"
#include "bflb_gpio.h"
#include "FreeRTOS.h"
#include "task.h"
#include "math.h"
#define DBG_TAG "MAIN"
#include "log.h"
struct bflb_device_s *gpio;
struct bflb_device_s *rd03e;
uint8_t UART_RECEIVE_BUFFER[5];
// 创建任务持续获取雷达数据
void _rd03eTask(void* pvParameters){
int index = 0;
int data_count = 5;
int status = 0;
while (1)
{
// 获取单个数据
int ch = bflb_uart_getchar(rd03e);
// 如果ch不等于-1说明有数据
if(ch!=-1){
// 如果当前数据是雷达指令头
if(ch == 0xAA){
// 重置数据缓存
memset(UART_RECEIVE_BUFFER,0 , data_count);
index = 0;
}
// 如果当前数据量小于指令数据
if(index < data_count){
UART_RECEIVE_BUFFER[index++] = ch;
// 如果是数据帧结束标记
if(ch == 0x55){
// for (size_t i = 0; i < data_count; i++)
// {
// printf("0x%02x ", UART_RECEIVE_BUFFER[i]);
// }
// 检测手势
if(UART_RECEIVE_BUFFER[3] == 0x01){
printf("触发了手势\r\n");
if(status==0){
status = 1;
bflb_gpio_set(gpio, GPIO_PIN_14);
}else{
status = 0;
bflb_gpio_reset(gpio, GPIO_PIN_14);
}
}
// printf("\r\n");
}
}
}
vTaskDelay(1);
}
}
int main(void)
{
board_init();
// 初始化gpio
gpio = bflb_device_get_by_name("gpio");
// 初始化led针脚gpio
bflb_gpio_init(gpio, GPIO_PIN_14, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
bflb_gpio_reset(gpio, GPIO_PIN_14);
// 初始化uart
rd03e = bflb_device_get_by_name("uart1");
// 初始化uart gpio
bflb_gpio_uart_init(gpio, GPIO_PIN_23, GPIO_UART_FUNC_UART1_TX);
bflb_gpio_uart_init(gpio, GPIO_PIN_24, GPIO_UART_FUNC_UART1_RX);
// 初始化uart配置参数
struct bflb_uart_config_s conf = {
.baudrate = 256000,
.data_bits = UART_DATA_BITS_8,
.stop_bits = UART_STOP_BITS_1,
.parity = UART_PARITY_NONE,
.flow_ctrl = UART_FLOWCTRL_NONE,
.rx_fifo_threshold = 7,
.tx_fifo_threshold = 7
};
bflb_uart_init(rd03e, &conf);
// 创建任务接收数据
xTaskCreate(_rd03eTask, (char*)"rd03e", 1024, NULL, 1, NULL);
vTaskStartScheduler();
while (1) {
}
}
|