用語(yǔ)音命令和傾斜控制來(lái)給Crowbot增壓,以便與電路板一起工作
該設(shè)備基于安裝了開(kāi)發(fā)人員軟件的DevBoard。該板通過(guò)藍(lán)牙連接到受控設(shè)備,并傳輸識(shí)別的語(yǔ)音命令及其傾斜角度。用戶(hù)將這個(gè)“遙控器”握在手中,使用傾斜和語(yǔ)音命令來(lái)控制機(jī)器人或其他他適應(yīng)的設(shè)備,以便與電路板一起工作,我希望這篇文章能有所幫助。
板上有兩個(gè)微控制器,ESP32-S3和ESP32-C3。
S3已經(jīng)閃過(guò),當(dāng)設(shè)備打開(kāi)時(shí),機(jī)器人控制程序默認(rèn)啟動(dòng)。無(wú)法訪問(wèn)源代碼,也無(wú)法跨flash S3。
交互和對(duì)控制器本身進(jìn)行任何更改的能力僅在C3部分可用。它的固件源代碼是開(kāi)源的,可以在這里找到(對(duì)于那些想要更深入地理解或修改交互機(jī)制的人來(lái)說(shuō))。
第一種方法:?jiǎn)伟骞ぷ髟谡Z(yǔ)音命令識(shí)別模式,選擇固定的命令。
第二種控制方法是控制板子在平面上的傾斜變化。在這種情況下,在X和Y軸上的傾斜角度的實(shí)時(shí)值被發(fā)送到被控設(shè)備,可以轉(zhuǎn)換為運(yùn)動(dòng)控制命令。
要切換到手動(dòng)控制模式,說(shuō)manual control命令,板屏幕將改變。
雖然語(yǔ)音命令仍然可以識(shí)別和發(fā)送,但您可以繼續(xù)在受控設(shè)備上處理它們。
準(zhǔn)備實(shí)現(xiàn)CrowBOT BOLT
最簡(jiǎn)單的入門(mén)方法是購(gòu)買(mǎi)控制模塊和Elecrow的CrowBOT。DevBoard開(kāi)發(fā)人員已經(jīng)為它添加了工廠固件,包括與開(kāi)發(fā)板交互的塊。
正如我上面所寫(xiě)的,開(kāi)發(fā)者已經(jīng)意識(shí)到與電路板“開(kāi)箱即用”互動(dòng)的可能性,但對(duì)于特定的設(shè)備-來(lái)自Elecrow的CrowBOT Bolt。這是一個(gè)訓(xùn)練機(jī)器人,可以用Arduino IDE, Letscode和MicroPython編程。
來(lái)自制造商的機(jī)器人的工廠固件可以在Elecrow wiki上獲得,并且它已經(jīng)實(shí)現(xiàn)了機(jī)器人附帶的IR遠(yuǎn)程控制。
我們有興趣比較來(lái)自制造商的機(jī)器人原始固件與來(lái)自控制器板開(kāi)發(fā)人員的新固件,以了解代碼并將其用作開(kāi)發(fā)項(xiàng)目中任何其他設(shè)備程序的基礎(chǔ)。
主要固件更改
?通過(guò)藍(lán)牙連接到DevBoard
在機(jī)器人的原始固件中,有可能與藍(lán)牙一起工作,因?yàn)闄C(jī)器人可以配備藍(lán)牙操縱桿進(jìn)行控制。但我們感興趣的是如何連接到我們的董事會(huì)是實(shí)現(xiàn)。
?對(duì)語(yǔ)音指令的響應(yīng)
處理來(lái)自董事會(huì)和與語(yǔ)音控制相關(guān)的事件
機(jī)器人的DevBoard傾斜控制同樣適用于板的傾斜控制。
?倒車(chē)時(shí)的聲音信號(hào)
開(kāi)發(fā)人員添加了一些有用的小東西,使固件更有趣。例如,機(jī)器人開(kāi)始在每次倒車(chē)時(shí)發(fā)出警告聲,就像今天的許多汽車(chē)一樣
?轉(zhuǎn)彎背光(轉(zhuǎn)向燈)
還增加了在轉(zhuǎn)彎時(shí)的背光,這使得使用CrowBOT更加豐富多彩和令人興奮。
讓我們仔細(xì)看看這些變化
在程序的最開(kāi)始,允許組織多任務(wù)處理的庫(kù)的頭文件被鏈接:
這些庫(kù)用于創(chuàng)建和管理任務(wù),以及在任務(wù)之間傳遞消息。在未來(lái),這將有助于播放音頻和處理來(lái)自DevBoard的命令。
接下來(lái),輸入DevBoard的藍(lán)牙UUID:
這指定了我們的機(jī)器人要連接的設(shè)備。
聲明信號(hào)量和消息緩沖區(qū)來(lái)控制任務(wù)的執(zhí)行和它們之間的同步。
什么是信號(hào)量?
我們更容易把信號(hào)量想象成一個(gè)盛著一顆糖的盤(pán)子。任務(wù)可以檢查糖果,試著拿走它,并在一段時(shí)間后歸還。它原來(lái)只是一個(gè)bool,但由于多線程和相關(guān)問(wèn)題,它的工作有點(diǎn)復(fù)雜。同樣值得澄清的是,除了二進(jìn)制信號(hào)量(當(dāng)有一個(gè)糖果時(shí)),還有非二進(jìn)制信號(hào)量(多個(gè)糖果)。
在本例中,我們將使用信號(hào)量在任務(wù)之間進(jìn)行通信:
例如,這句話(huà)的意思是“等糖果出現(xiàn)在盤(pán)子里的時(shí)間越長(zhǎng)越好,一旦糖果出現(xiàn),就立即拿走”。
這句話(huà)的意思是:“把糖果放回原處”。
定義來(lái)自DevBoard的消息的最大長(zhǎng)度。
提供給電動(dòng)機(jī)的絕對(duì)值的間隔。沒(méi)有這個(gè)限制,機(jī)器人的馬達(dá)只會(huì)嗡嗡作響,但不會(huì)工作。增加最小轉(zhuǎn)速有助于在低功率時(shí)消除噪聲。
箝位功能允許您通過(guò)設(shè)置其下限和上限來(lái)限制某些值的變化范圍。
這個(gè)函數(shù)執(zhí)行一個(gè)多項(xiàng)式坐標(biāo)變換。這用于將從DevBoard接收到的傾斜角度轉(zhuǎn)換為提供給電機(jī)的功率。注意這個(gè)變換是非線性的。如前所述,電機(jī)的工作功率間隔為[-255…,接收角度在[-45…]45)。
如果我們?yōu)槊總€(gè)電機(jī)取3個(gè)三維點(diǎn)(橫搖,俯仰和期望功率值)并進(jìn)行插值,我們可以得到這個(gè)變換的公式。例如,對(duì)于左馬達(dá),我們?nèi)↑c(diǎn):
(45,45,256) - DevBoard向前和向右轉(zhuǎn)動(dòng),因此我們應(yīng)該以最大功率轉(zhuǎn)動(dòng)左電機(jī)以向右轉(zhuǎn)動(dòng)。
(-22.5, 45, 128) - DevBoard面朝前方,略偏左,這意味著我們應(yīng)該向前移動(dòng),但也要向左轉(zhuǎn),所以預(yù)計(jì)電機(jī)功率為一半。
(0,0,0,0) -不傾斜-不移動(dòng)。
如果我們進(jìn)行雙線性插值,我們得到左電機(jī)的公式:l = 1.3274074074074107x+ 3.792592592592593y +0.012641975308641975xy
正確的電機(jī)的值是相似的。
led_callback和buzzer_callback過(guò)程分別用于更新led的狀態(tài)和控制蜂鳴器。每隔一段時(shí)間就會(huì)叫他們。
不斷嘗試捕獲信號(hào)量的任務(wù),如果成功,則播放音樂(lè)。Tone數(shù)組包含要播放的頻率,Time數(shù)組包含播放特定音符的時(shí)間。信號(hào)量在主任務(wù)中釋放,允許PLAY MUSIC語(yǔ)音命令異步執(zhí)行。
主要任務(wù)是這樣的:
改變速度因子(對(duì)于更快的速度和更慢的速度語(yǔ)音命令)
速度因子本身(用于GO FORWARD和GO BACK命令)
是否處于傾斜控制模式:
當(dāng)我們切換到傾斜控制模式時(shí),我們開(kāi)始定期調(diào)用led_callback和buzzer_callback。
切換到語(yǔ)音控制模式時(shí),關(guān)閉電機(jī)和LED,停止led_callback和buzzer_callback的周期性調(diào)用:
打開(kāi)(front_lights_en == true)或關(guān)閉(front_lights_en == false)“前燈”
消息緩沖
期待來(lái)自緩沖區(qū)的消息。一旦收到,將其轉(zhuǎn)換為字符串。
消息中出現(xiàn)XY表示收到了來(lái)自?xún)A斜傳感器的數(shù)據(jù)。如果我們沒(méi)有在傾斜控制模式,我們收到了XY,切換到它。
我們以語(yǔ)音方式執(zhí)行命令。
現(xiàn)在在傾斜控制模式下處理語(yǔ)音命令。
讓我們來(lái)看看傾角的處理:
我們從消息中得到兩個(gè)字節(jié):X和Y角度
我們將值限制在[-45…]45)
將傾斜角度轉(zhuǎn)換為電機(jī)值。
如果提供給電機(jī)的值足夠小,我們只需將它們?cè)O(shè)置為零。這基本上只是上述電機(jī)的“消聲器”。
這可能需要對(duì)機(jī)器人的“前燈”進(jìn)行一點(diǎn)解釋?zhuān)?
除了RGB led(遠(yuǎn)光燈),還有一個(gè)4個(gè)前燈陣列:
led[0] -右后方
led[1] -左后方
led[2] -正面右
led[3] -前左
默認(rèn)情況下,前燈是關(guān)閉的。
我們限制了馬達(dá)的功率,如果向前/向左移動(dòng),我們打開(kāi)前轉(zhuǎn)向燈。
左馬達(dá)也是一樣
倒車(chē)時(shí),我們打開(kāi)倒車(chē)信號(hào)
最后,我們告訴馬達(dá)它們的功率。
這個(gè)程序負(fù)責(zé)接收來(lái)自控制設(shè)備的消息。
關(guān)于藍(lán)牙通信丟失
我們關(guān)掉馬達(dá),釋放信號(hào)。
創(chuàng)建信號(hào)量、緩沖區(qū)和任務(wù)
在連接到設(shè)備時(shí),我們用默認(rèn)值初始化燈和電機(jī):
當(dāng)連接時(shí),我們嘗試捕獲設(shè)備斷開(kāi)信號(hào)量。
基本上,我們期待一個(gè)斷開(kāi)信號(hào)。當(dāng)我們得到它時(shí),我們繼續(xù)尋找設(shè)備。
結(jié)論
讓我們總結(jié)一下討論過(guò)的固件變化:
1. 增加了多線程,用于并行處理命令,而不管它們的接收情況,以及聲音的異步播放
2. 兩種不同功能的控制模式
3. DevBoard旋轉(zhuǎn)角度到電機(jī)功率值的多項(xiàng)式轉(zhuǎn)換
正如您從本文中看到的那樣,這離不開(kāi)對(duì)專(zhuān)有源代碼的一些更改。添加的功能與標(biāo)準(zhǔn)功能非常不同,因此有相當(dāng)多的更改。如果有人在這里發(fā)現(xiàn)有趣的東西,他們可以在他們的項(xiàng)目中使用它。
本文編譯自hackster.io