一个喜闻乐见的可见光编码通讯实例
可见光 通讯 DIY
xukejing
发布时间: 2019-05-31
阅读: 1135

大家好,我是MC老徐,传说中云汉第一灯神,今天又恬不知耻地来表演点灯神技了。今天带来的这个小装置有特殊意义,是我送给我老婆的520小礼物。

 1板子.JPG

  

它基于STM32F030主控芯片,布置了两个LED(一个绿色,一个蓝色),可以把数据以光波的形式进行编码和传输。考虑到人脑的反应能力,我们把通信速度设置地慢一点,每隔500毫秒传送一个二进制位。考虑到人眼的便是能力,为了让10在视觉上的区别更大,绿色LED点亮,蓝色LED熄灭,表示数据1;绿色LED熄灭,蓝色LED点亮,表示数据0

  

这个装置是这样工作的。假设,你有一段想要说的话“我爱你”,先把话翻译成英语“ILOVEU”。然后,这段话的每个字符,都可以以ASSIC码被码成一个字节,然转换为8个二进制位。比如I可以转化为1001001。然后就可以控制LED1001001这样的编码进行闪烁了。下面是一个测试时候的照片,当属LED正在闪烁,同时屏幕上显示了板子通过串口输出的解码数据。第一行00 01 00 01 00 00 01正是1001001中的每一位转为uint8t形式然后以16进制表示的样子。

 2测试图.JPG

  

在做这个小作品前,最先被考虑的其实是串口控制协议。我设计的控制协议如下图所示(协议并不是固定的,而是根据具体的场景来构思)。

 3数据协议.JPG

  

控制协议的设计,是要考虑单片机的工作过程的。因为串口难免会有干扰和丢包,为了过滤干扰,使用连续3个帧头来判断数据开始,然后第4字节获得数据长度,最后的567位是具体的控制编码。上图中的控制编码要实现绿色LED亮灭的独立控制、蓝色LED亮度调节、自定义的可见光通信程序开关。数据第5位独立控制绿灯亮灭,1代表亮,0代表灭。数据第6位的值域从0255,可以独立控制蓝色LED进行255级调光。数据第7位是1的时候,会启动按编码闪烁的程序。

    

这个装置基于STM32单片机,所以可以很方便地用STM32CubeMX来做初始设置。先进行引脚配置。PA9PA10分别是UART1TXRX引脚。PA5设置为输出,用来点绿色LEDPA4设置为PWM输出,用TIM14通道1控制。

   4cube引脚配置.JPG


PWM定时器设置如下。我们的单片机是48MHz的,所以先48分频道1MHz,然后每计数1000就是耗时1毫秒,于是就可以得到1kHzPWM

   5PWM定时器设置.JPG

  

然后是串口波特率设置,115200是比较常用的。

 6串口和波特率设置.JPG

  

设置串口TXRXDMA。其中接收的DMA最好设置循环回调,不然还要在代码里加入循环启用中断的语句,要不接收数据只回调一次就再也不触发了。

 7串口DMA设置.JPG

  

确保串口和DMA中断的钩被打上。

 8串口中断设置.JPG

  

下面开始码代码,先定义变量,这些变量是要实现具体功能的。前面提到过那个数据协议,为了判断进入数据帧头、开始解析、以及解析完毕,需要定义各自的变量。

 9变量定义.JPG

  

定义函数名,这两个函数分贝是串口中断回调中的数据解析函数和可见光编码函数。

 9-1数据解析和自定义函数.JPG

  

使能串口接受中断。刚启动时,我们可以往串口发送100Y,这样做是为了测试方便,能比较明显地看出单片机已经启动了。

 10使能中断并发送100个Y.JPG

    

主函数里做3种控住方案的控制逻辑。

 11主函数中做逻辑控制.JPG

   

数据解析函数加到串口回调函数里面去

 12数据解析函数加到串口回调函数里.JPG

  

其中,数据解析函数的具体形式如下,这个也是要与本文前面的数据协议对应的。

 13数据解析函数.JPG

  

重定向函数,方便调试时候能使用printf输出串口数据

 14重定向函数方便使用printf.JPG

  

压轴好戏,定义那个可见光编码通讯的函数的具体形式

 15UDF1.JPG

16UDF2.JPG

 

以上代码编译通过后,烧写到板子上就可以开始跑了。我们发点命令测试一下功能。

   

输入55 55 55 03 00 00 01,其中55 55 55是识别帧头, 03是有3个控制变量 ,第一第二都是0,第三是01。于是启动可见光编码通讯程序,LED开始按编码闪烁,同时串口输出了编码数据。

17char转2进制.JPG

   

输入55 55 55 03 01 00 00,绿色LED被点亮

18点绿灯.JPG

   

输入55 55 55 03 01 FF 00,绿色LED被点亮,同时蓝色LED的亮度也调到最高(0xFF表示最高)。

 19PWM点呼吸灯到最亮.JPG

  

下面是两个LED被同时点亮的照片。

 led点亮.JPG

  

程序代码中用来被发送的char数组,现在写的是“ILOVEU”,因为是我送给老婆的小礼物。

当然,您也可以改成别的话,原理都是一样的。比如改成“HELLOWORLD”。

  

这种通信方式,我可以拓展到其它的领域,比如探险、救援。

比如,抛锚的船舶可以控制灯光发送ASSIC码,然后对方就可以把闪烁的灯光进行解析了。

灯塔也可以做些除照明以外的事情,比如把附近暗礁的GPS坐标编码在灯光上。

总之,可见光通讯是一种非常有实用意义的技术。


原创作品,未经权利人授权禁止转载。详情见转载须知 举报文章

展开查看更多
点赞 (2)
打赏
当前打赏0人    
xukejing 擅长:其他应用
相关文章推荐
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回

我要举报该内容理由

×
请输入您举报的理由(50字以内)