大家好,我是MC老徐,传说中云汉第一灯神,今天又恬不知耻地来表演点灯神技了。今天带来的这个小装置有特殊意义,是我送给我老婆的520小礼物。
它基于STM32F030主控芯片,布置了两个LED(一个绿色,一个蓝色),可以把数据以光波的形式进行编码和传输。考虑到人脑的反应能力,我们把通信速度设置地慢一点,每隔500毫秒传送一个二进制位。考虑到人眼的便是能力,为了让1和0在视觉上的区别更大,绿色LED点亮,蓝色LED熄灭,表示数据1;绿色LED熄灭,蓝色LED点亮,表示数据0。
这个装置是这样工作的。假设,你有一段想要说的话“我爱你”,先把话翻译成英语“ILOVEU”。然后,这段话的每个字符,都可以以ASSIC码被码成一个字节,然转换为8个二进制位。比如I可以转化为1001001。然后就可以控制LED以1001001这样的编码进行闪烁了。下面是一个测试时候的照片,当属LED正在闪烁,同时屏幕上显示了板子通过串口输出的解码数据。第一行00 01 00 01
00 00 01正是1001001中的每一位转为uint8t形式然后以16进制表示的样子。
在做这个小作品前,最先被考虑的其实是串口控制协议。我设计的控制协议如下图所示(协议并不是固定的,而是根据具体的场景来构思)。
控制协议的设计,是要考虑单片机的工作过程的。因为串口难免会有干扰和丢包,为了过滤干扰,使用连续3个帧头来判断数据开始,然后第4字节获得数据长度,最后的5、6、7位是具体的控制编码。上图中的控制编码要实现绿色LED亮灭的独立控制、蓝色LED亮度调节、自定义的可见光通信程序开关。数据第5位独立控制绿灯亮灭,1代表亮,0代表灭。数据第6位的值域从0到255,可以独立控制蓝色LED进行255级调光。数据第7位是1的时候,会启动按编码闪烁的程序。
这个装置基于STM32单片机,所以可以很方便地用STM32CubeMX来做初始设置。先进行引脚配置。PA9和PA10分别是UART1的TX和RX引脚。PA5设置为输出,用来点绿色LED。PA4设置为PWM输出,用TIM14通道1控制。
PWM定时器设置如下。我们的单片机是48MHz的,所以先48分频道1MHz,然后每计数1000就是耗时1毫秒,于是就可以得到1kHz的PWM。
然后是串口波特率设置,115200是比较常用的。
设置串口TX和RX的DMA。其中接收的DMA最好设置循环回调,不然还要在代码里加入循环启用中断的语句,要不接收数据只回调一次就再也不触发了。
确保串口和DMA中断的钩被打上。
下面开始码代码,先定义变量,这些变量是要实现具体功能的。前面提到过那个数据协议,为了判断进入数据帧头、开始解析、以及解析完毕,需要定义各自的变量。
定义函数名,这两个函数分贝是串口中断回调中的数据解析函数和可见光编码函数。
使能串口接受中断。刚启动时,我们可以往串口发送100个Y,这样做是为了测试方便,能比较明显地看出单片机已经启动了。
主函数里做3种控住方案的控制逻辑。
数据解析函数加到串口回调函数里面去
其中,数据解析函数的具体形式如下,这个也是要与本文前面的数据协议对应的。
重定向函数,方便调试时候能使用printf输出串口数据
压轴好戏,定义那个可见光编码通讯的函数的具体形式
以上代码编译通过后,烧写到板子上就可以开始跑了。我们发点命令测试一下功能。
输入55 55 55 03 00 00 01,其中55 55 55是识别帧头, 03是有3个控制变量
,第一第二都是0,第三是01。于是启动可见光编码通讯程序,LED开始按编码闪烁,同时串口输出了编码数据。
输入55 55 55 03 01 00 00,绿色LED被点亮
输入55 55 55 03 01 FF 00,绿色LED被点亮,同时蓝色LED的亮度也调到最高(0xFF表示最高)。
下面是两个LED被同时点亮的照片。
程序代码中用来被发送的char数组,现在写的是“ILOVEU”,因为是我送给老婆的小礼物。
当然,您也可以改成别的话,原理都是一样的。比如改成“HELLOWORLD”。
这种通信方式,我可以拓展到其它的领域,比如探险、救援。
比如,抛锚的船舶可以控制灯光发送ASSIC码,然后对方就可以把闪烁的灯光进行解析了。
灯塔也可以做些除照明以外的事情,比如把附近暗礁的GPS坐标编码在灯光上。
总之,可见光通讯是一种非常有实用意义的技术。
原创作品,未经权利人授权禁止转载。详情见转载须知。 举报文章
我要举报该内容理由
×