文/俞晗熠
Arduino是一款便捷灵活、方便上手的开源电子平台,可以连接上百种模组,让普通人也可以制作出有趣的创意电子制作。但在制作创意作品时,如果涉及到机械结构,设计制作机械部件就比较麻烦,较为费时费力。而乐高积木中有多种积木结构件,能轻松制作出各种复杂机械结构,如果把Arduino与乐高结合,能快速地把有创意变为现实作品。
LEGO MINDSTORMS EV3 是第三代乐高机器人,它是丹麦乐高公司在2013年上市的,拥有大量的粉丝。但乐高EV3比较封闭,能与计算机或另一台EV3进行通讯,与其它设备难以通讯。有人利用一块叫Bricktronics的转接板让Arduino连接乐高积木,Bricktronics可以直接连接乐高电机与传感器,这样Arduino就可以代替乐高程序块,用Arduino直接控制乐高电机与传感器。有人也编写了APP,让手机也可以通过蓝牙控制乐高EV3。所以我对乐高EV3的蓝牙通讯机制进行了研究,让Arduino也可以通过蓝牙模块与乐高程序块进行通讯,用这个方法就不需要专用的转接板,只需要一块普通的蓝牙模块,就可以让Arduino与乐高互相通讯,协同工作。下面主要介绍其实现方法。
用乐高EV3 Programmer图形化编程软件编写过蓝牙通信的人都应该用过叫“消息传递”的指令块,就是用它对蓝牙信号进行读或写操作。但它对一般的蓝牙信号是不能识别的,因为EV3有专用的蓝牙处理协议,要让Arduino与乐高EV3进行通讯,要就认真分析EV3的蓝牙信号处理协议,让Arduino模拟成乐高设备,发送EV3能识别的蓝牙信号。如图1。
用HC05或HC06蓝牙模块一个,把蓝牙模块的VCC连接到Arduino的5V,GND连接到Arduino的GND。蓝牙上的TXD与RXD分别连接到Arduino的数字端口0和1端口(即RXD与TXD)。
表1
图1
检查无误后连接USB上电会看到蓝牙模块有红色指示灯快速闪烁。打开乐高程序块,进入设置菜单的Bluetooth选项,将Visibility和Bluetooth勾选,然后进入Connections选项搜索蓝牙设备,找到对应的蓝牙模块。连接时一般会要求输入配对密码,密码一般为1234。连接成功后,蓝牙模块上红色指示灯慢速闪烁,在乐高EV3显示幕左上角也会显示已连接图标,而还未连接时显示的是。此时,已完成Arduino与乐高的底层连接,但还不能互相通讯。如图2、图3所示。
在乐高EV3中,可以无需编写用户程序通过直接运行命令对EV3进行下载、上传、读取输入值等各种操作。官方学名为direct commands(直接命令),这类似于Windows里面的命令控制台中的命令。“消息传递”指令块的实质就是通过“直接命令”进行蓝牙的接收与发送。我们用Arduino向EV3发信息时,也只要按照EV3蓝牙的协议格式发送出去,EV3就能顺利解包,接收到信息。接收EV3发来的信息时,也只要根据蓝牙的协议格式来提取所需信息就行了。表1是蓝牙协议格式的写法。
“消息传递”指令块支持接收或发送文本、数字或逻辑三种类型的值,如果要发送“1234”这个字符串的话。LL部分内容为0x05,0x00,pp部分的内容就是 0x31,0x32,0x33,0x34 ,如果要发送数值,EV3协议是用32位浮点数表示的。
图2
图3
图4
给消息标题为’abc’的消息传递指令块发送一个逻辑值为1(真值)指令。可以在Arduino IDE中输入下面的代码,然后上传到Arduino中。因为上传时也是使用0和1号数字端口,所以在上传程序前要断开蓝牙模块,不然会发生冲突,使上传不成功。
程序上传到Arduino成功后,重新接好蓝牙模块,然后在乐高图形化编程窗口中编写如下程序。建立蓝牙连接,运行程序后就可以在显示屏上显示出逻辑值1。如图4所示。
因为EV3中传送数值是用浮点数表示,所以在发送时先要把数值转换成float类型,然后拆解成无符号位char后发送。可以用联合类型Union方便地进行拆分,因为union中可以定义多个成员,各成员共享同一块内存。下面的函数就是发送一个数值型信息到EV3主要部分代码
EV3可以用“切换”指令块根据接收到的不同数值执行相应的动作,如马达转动、屏幕显示、播放声音等,Arduino可以连接各种各样的传感器,而乐高EV3的传感器比较少。 Arduino与EV3的结合,就为乐高EV3扩展了众多的传感器,让创意的实现又增加了一条途径。
理解了乐高EV3的蓝牙通讯协议后,我们也可以让手机与乐高EV3连接,自己编写程序让手机与EV3交互,开发出个性化的APP来。