文/俞晗熠
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里面的命令控制臺中的命令?!跋鬟f”指令塊的實質就是通過“直接命令”進行藍牙的接收與發送。我們用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后發送??梢杂寐摵项愋蚒nion方便地進行拆分,因為union中可以定義多個成員,各成員共享同一塊內存。下面的函數就是發送一個數值型信息到EV3主要部分代碼

EV3可以用“切換”指令塊根據接收到的不同數值執行相應的動作,如馬達轉動、屏幕顯示、播放聲音等,Arduino可以連接各種各樣的傳感器,而樂高EV3的傳感器比較少。 Arduino與EV3的結合,就為樂高EV3擴展了眾多的傳感器,讓創意的實現又增加了一條途徑。
理解了樂高EV3的藍牙通訊協議后,我們也可以讓手機與樂高EV3連接,自己編寫程序讓手機與EV3交互,開發出個性化的APP來。