文/俞晗熠
Arduino是一款便捷靈活、方便上手的開源電子平臺,可以連接上百種模組,讓普通人也可以制作出有趣的創(chuàng)意電子制作。但在制作創(chuàng)意作品時,如果涉及到機(jī)械結(jié)構(gòu),設(shè)計制作機(jī)械部件就比較麻煩,較為費(fèi)時費(fèi)力。而樂高積木中有多種積木結(jié)構(gòu)件,能輕松制作出各種復(fù)雜機(jī)械結(jié)構(gòu),如果把Arduino與樂高結(jié)合,能快速地把有創(chuàng)意變?yōu)楝F(xiàn)實(shí)作品。
LEGO MINDSTORMS EV3 是第三代樂高機(jī)器人,它是丹麥樂高公司在2013年上市的,擁有大量的粉絲。但樂高EV3比較封閉,能與計算機(jī)或另一臺EV3進(jìn)行通訊,與其它設(shè)備難以通訊。有人利用一塊叫Bricktronics的轉(zhuǎn)接板讓Arduino連接樂高積木,Bricktronics可以直接連接樂高電機(jī)與傳感器,這樣Arduino就可以代替樂高程序塊,用Arduino直接控制樂高電機(jī)與傳感器。有人也編寫了APP,讓手機(jī)也可以通過藍(lán)牙控制樂高EV3。所以我對樂高EV3的藍(lán)牙通訊機(jī)制進(jìn)行了研究,讓Arduino也可以通過藍(lán)牙模塊與樂高程序塊進(jìn)行通訊,用這個方法就不需要專用的轉(zhuǎn)接板,只需要一塊普通的藍(lán)牙模塊,就可以讓Arduino與樂高互相通訊,協(xié)同工作。下面主要介紹其實(shí)現(xiàn)方法。
用樂高EV3 Programmer圖形化編程軟件編寫過藍(lán)牙通信的人都應(yīng)該用過叫“消息傳遞”的指令塊,就是用它對藍(lán)牙信號進(jìn)行讀或?qū)懖僮?。但它對一般的藍(lán)牙信號是不能識別的,因為EV3有專用的藍(lán)牙處理協(xié)議,要讓Arduino與樂高EV3進(jìn)行通訊,要就認(rèn)真分析EV3的藍(lán)牙信號處理協(xié)議,讓Arduino模擬成樂高設(shè)備,發(fā)送EV3能識別的藍(lán)牙信號。如圖1。
用HC05或HC06藍(lán)牙模塊一個,把藍(lán)牙模塊的VCC連接到Arduino的5V,GND連接到Arduino的GND。藍(lán)牙上的TXD與RXD分別連接到Arduino的數(shù)字端口0和1端口(即RXD與TXD)。
表1
圖1
檢查無誤后連接USB上電會看到藍(lán)牙模塊有紅色指示燈快速閃爍。打開樂高程序塊,進(jìn)入設(shè)置菜單的Bluetooth選項,將Visibility和Bluetooth勾選,然后進(jìn)入Connections選項搜索藍(lán)牙設(shè)備,找到對應(yīng)的藍(lán)牙模塊。連接時一般會要求輸入配對密碼,密碼一般為1234。連接成功后,藍(lán)牙模塊上紅色指示燈慢速閃爍,在樂高EV3顯示幕左上角也會顯示已連接圖標(biāo),而還未連接時顯示的是。此時,已完成Arduino與樂高的底層連接,但還不能互相通訊。如圖2、圖3所示。
在樂高EV3中,可以無需編寫用戶程序通過直接運(yùn)行命令對EV3進(jìn)行下載、上傳、讀取輸入值等各種操作。官方學(xué)名為direct commands(直接命令),這類似于Windows里面的命令控制臺中的命令。“消息傳遞”指令塊的實(shí)質(zhì)就是通過“直接命令”進(jìn)行藍(lán)牙的接收與發(fā)送。我們用Arduino向EV3發(fā)信息時,也只要按照EV3藍(lán)牙的協(xié)議格式發(fā)送出去,EV3就能順利解包,接收到信息。接收EV3發(fā)來的信息時,也只要根據(jù)藍(lán)牙的協(xié)議格式來提取所需信息就行了。表1是藍(lán)牙協(xié)議格式的寫法。
“消息傳遞”指令塊支持接收或發(fā)送文本、數(shù)字或邏輯三種類型的值,如果要發(fā)送“1234”這個字符串的話。LL部分內(nèi)容為0x05,0x00,pp部分的內(nèi)容就是 0x31,0x32,0x33,0x34 ,如果要發(fā)送數(shù)值,EV3協(xié)議是用32位浮點(diǎn)數(shù)表示的。
圖2
圖3
圖4
給消息標(biāo)題為’abc’的消息傳遞指令塊發(fā)送一個邏輯值為1(真值)指令??梢栽贏rduino IDE中輸入下面的代碼,然后上傳到Arduino中。因為上傳時也是使用0和1號數(shù)字端口,所以在上傳程序前要斷開藍(lán)牙模塊,不然會發(fā)生沖突,使上傳不成功。
程序上傳到Arduino成功后,重新接好藍(lán)牙模塊,然后在樂高圖形化編程窗口中編寫如下程序。建立藍(lán)牙連接,運(yùn)行程序后就可以在顯示屏上顯示出邏輯值1。如圖4所示。
因為EV3中傳送數(shù)值是用浮點(diǎn)數(shù)表示,所以在發(fā)送時先要把數(shù)值轉(zhuǎn)換成float類型,然后拆解成無符號位char后發(fā)送。可以用聯(lián)合類型Union方便地進(jìn)行拆分,因為union中可以定義多個成員,各成員共享同一塊內(nèi)存。下面的函數(shù)就是發(fā)送一個數(shù)值型信息到EV3主要部分代碼
EV3可以用“切換”指令塊根據(jù)接收到的不同數(shù)值執(zhí)行相應(yīng)的動作,如馬達(dá)轉(zhuǎn)動、屏幕顯示、播放聲音等,Arduino可以連接各種各樣的傳感器,而樂高EV3的傳感器比較少。 Arduino與EV3的結(jié)合,就為樂高EV3擴(kuò)展了眾多的傳感器,讓創(chuàng)意的實(shí)現(xiàn)又增加了一條途徑。
理解了樂高EV3的藍(lán)牙通訊協(xié)議后,我們也可以讓手機(jī)與樂高EV3連接,自己編寫程序讓手機(jī)與EV3交互,開發(fā)出個性化的APP來。