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