[MM32软件] 小朋友也可以玩的灯带游戏!基于MM32F0040&MM32F0020实现dToF和WS2812B的测距彩灯工程

[复制链接]
 楼主| 春娇霹雳娃 发表于 2023-6-16 13:57 | 显示全部楼层 |阅读模式
本帖最后由 春娇霹雳娃 于 2023-7-31 10:40 编辑

#申请原创# @21小跑堂
[payamount]35.00[/payamount]
[pay]

基于 MM32F0040 & MM32F0020 实现 dToF 和 WS2812B 的测距彩灯工程
本实验基于灵动MM32F0020实现测距dToF模块,基于MM32F0040实现WS2812B,并通过AT指令将距离值转换为灯带亮的个数,实现“灯随物动”的效果。
整个工程设计框架如下图所示:
59772648bfc8651eee.png

一、简介
1.dToF ( direct time-of-flight ) ,测量发射光和反射光之间的飞行时间并根据光速直接估计目标物体的深度。dToF测距模块硬件外观如下图所示:
15200648bfcd0c5b7d.png

dToF测距模块主要特点:
  • 串口 IO 电压 3.3 V
  • 供电电压 3.3 V
  • 串口波特率默认 9600 bps,可调范围为 2000 bps - 2000000 bps

2. WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。每个元件为一个像素点,像素点内部包含智能数字接口,数据锁存信号整形放大驱动电路,高精度的内部振荡器和12 V高压可编程定电流控制部分,有效保证了像素点的光的颜色一致性。


二、实验环境
1.硬件资源:MM32F0040开发板,MM32F0020开发板,1m灯带,杜邦线若干
37210648bff371077b.png

2.软件资源:KEIL MDK 软件,Tera Term 终端软件用于监控程序

三、实验资源
1.MM32F0020硬件资源图:
17845648bfd3252d73.png

2.MM32F0020硬件尺寸:
31328648bfd3d9509b.png

3.AT 指令集
在键盘输入需要的指令,如“AT”,串口将接收后打印“OK”,其余可用AT指令如表1所示:

序列
指令名称
指令说明
1
AT
测试模块是否正常通信
2
AT+RST
复位模块
3
AT+BAUDRATE
查询串口波特率
4
AT+BAUDRATE
设置串口波特率
4
AT+D
读取一次距离值
5
AT+START
开始连续传输距离值
6
AT+STOP
停止传输距离值

AT+START 指令发送完成并接收“OK”后,模块将会连续以定长帧的形式回传测距值AT+STOP 指令发送完成并接收“OK”后,模块将停止回传测距值


4.电路图
  • MM32F0020电路原理图
26285648bfdf233ac8.png
  • MM32F0040电路原理图
22194648c006fc17b9.png

四、实验流程

本样例基于MM32F0040开发板和dToF测距模块,实现“灯随物动”。通过串口UART2获取测距模块的数据串口发送和接收的对应引脚如下表所示:
序号
引脚名称
复用功能
1
PD4
UART2_TX
2
PD6
UART2_RX

获取距离的AT指令为“AT+D?”,并将其转换为灯带亮的个数,从而实现“手止灯止”的效果。

整个模块特点:
•IC控制电路与RGB点光源共用一个电源
•测距模块供电电压3.3 V,串口IO电压3.3 V
•测距模块的串口波特率默认9600 bps,可调范围为2000 bps - 2000000 bps
•测距模块测量范围可精确到4m
•WS2812B驱动RGB灯珠电压为3.5 V~5.5 V
•WS2812B控制信号选择SPI+DMA
•WS2812B光的颜色高度一致,性价比高

Notice芯片MM32F0040正常工作电压在2.0 V~5.5 V都可以,如果接的灯珠较多整体电流功耗就会比较大,需要外接一个5 V的电源适配器给整个系统供电

AT 指令获取距离:
  1. <font face="Arial">extern const ws2812_if_t ws2812_if;
  2. ws2812_t ws2812;
  3. uint32_t led_on_cnt = 0u;
  4. char str_cmd_get_distance[] = "AT+D?\r\n";
  5. char str_cmd_rst[] = "AT+RST\r\n";</font>
uint32_t get_distance 获取距离:
  1. <font face="Arial">uint32_t get_distance(void){
  2.     uint8_t uart_buf[APP_UART_BUF_SIZE] = {0u};
  3.     uint32_t dis = 0;

  4.     for (uint32_t i = 0u; i < sizeof(str_cmd_get_distance) - 1u; i++){
  5.         uart_putc(str_cmd_get_distance[i], APP_TIME_OUT);}

  6.     for (uint32_t i = 0u; i < 15u; i++){
  7.         uart_buf[i] = uart_getc(APP_TIME_OUT);}

  8.     dis = strtol((char *)uart_buf + 3, NULL, 16);
  9.     if (dis > 65518){
  10.         dis -= 65518;}
  11.     else{
  12.         dis = 0;}

  13.     printf("dis = %d, %s\r\n", dis, uart_buf);

  14.     return dis;}</font>
led_on_cnt 灯带亮的数量:
  1. int main(void)
  2. {
  3.     BOARD_Init();
  4.     //printf("ws2812 & dtof\r\n");
  5.     ws2812_init(&ws2812, (ws2812_if_t*)&ws2812_if);
  6.     ws2812_set_fx(&ws2812, led_fx);

  7. //    ws2812_refresh(&ws2812);
  8.     for (uint32_t i = 0u; i < sizeof(str_cmd_rst) - 1u; i++){
  9.         uart_putc(str_cmd_rst[i], APP_TIME_OUT);}

  10.     while (1){
  11.         led_on_cnt = get_distance();
  12.         ws2812_refresh(&ws2812);}}

  13. uint32_t led_fx(uint32_t led_index){
  14.     if (led_index < led_on_cnt){
  15.         return 0x000F00;}
  16.     else{
  17.         return 0x0F0000;}}

五、视频展示

1.dToF 测距模块视频

2.dToF+ws2812b整个模块视频


六、附件

MM32F0040电路图: SCH_POKT-F0040_v1.3.pdf (85.15 KB, 下载次数: 6)
MM32F0020电路图: TOF-F0020.pdf (77.87 KB, 下载次数: 6)
整个项目代码工程: ws_dtof_20230321.zip (1.19 MB, 下载次数: 13)
[/pay]

点评

[url=home.php?mod=space&uid=676939]@cooldog123pp[/url] :不亮  发表于 2023-6-28 10:33
不能搞太亮,对眼睛不好  发表于 2023-6-25 09:36
通过MM32F0040开发板使用AT指令获取dTOF传感器数据,将传感器测得距离数据通过灯条显示,较为直观的展示测量距离,同时具有趣味性,实现效果较好,软硬件资料完整,感谢分享  发表于 2023-6-20 15:24
xld0932 发表于 2023-6-16 14:52 | 显示全部楼层
 楼主| 春娇霹雳娃 发表于 2023-6-28 10:34 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:灵动系统开发工程师
简介:none........

19

主题

154

帖子

3

粉丝
快速回复 返回顶部 返回列表