牟曉東
在中小學(xué)階段的開源硬件編程創(chuàng)意智造中,有時(shí)會(huì)用到一種叫作“絲桿”(微型)的輸出設(shè)備,常見的“滾珠絲桿”能夠?qū)A周運(yùn)動(dòng)轉(zhuǎn)化為直線運(yùn)動(dòng),也就是依靠設(shè)定內(nèi)部的微型步進(jìn)電機(jī)精準(zhǔn)的正轉(zhuǎn)或反轉(zhuǎn)的圈數(shù),最終帶動(dòng)絲桿上的“滑臺(tái)”產(chǎn)生直線位移。利用絲桿的這一特征,我們可以在樹莓派中使用圖形化編程進(jìn)行各種創(chuàng)意智造,開發(fā)出一些有趣好玩兒的創(chuàng)客項(xiàng)目。
實(shí)驗(yàn)器材包括樹莓派3B+和古德微擴(kuò)展板各一塊,微型滾珠絲桿(包括電機(jī)驅(qū)動(dòng)板)一個(gè),按鈕一個(gè),杜邦線若干,國旗徽章一枚。
絲桿的內(nèi)部步進(jìn)電機(jī)有四根引線,首先將它們分別連接至電機(jī)驅(qū)動(dòng)板的L1、L2、L3和L4端,再將電機(jī)驅(qū)動(dòng)板底部標(biāo)注有5V、GND和VCC的引腳通過杜邦線分別連接至擴(kuò)展板左下角的5V、GND和3.3V引腳,將電機(jī)驅(qū)動(dòng)板中間的IN1、IN2、IN3和IN4引腳通過杜邦線分別連接至擴(kuò)展板的5號、6號、12號和16號引腳的正極;接著,將按鈕插入擴(kuò)展板的25號引腳,注意VCC、OUT和GND同樣要一一對應(yīng);最后,借助于熱熔膠槍將國旗徽章粘貼于絲桿的滑臺(tái)上,并且給樹莓派通電,啟動(dòng)操作系統(tǒng)(如圖1)。
雖然絲桿的連接方式較為復(fù)雜,但使用“積木”進(jìn)行圖形化編程來控制卻非常簡單。在瀏覽器中訪問古德微機(jī)器人網(wǎng)站并進(jìn)行賬號登錄后,首先,從“智能硬件”-“常用”區(qū)域?qū)⒔z桿的初始化模塊語句拖至編程區(qū),即“設(shè)置步進(jìn)電機(jī)GPIO口分別為‘步進(jìn)電機(jī)輸入端”,對應(yīng)的GPIO接口分別是5、6、12和16;接著,建立一個(gè)“重復(fù)當(dāng)‘真”的循環(huán)結(jié)構(gòu),嵌套一個(gè)“如果…執(zhí)行…”的選擇結(jié)構(gòu),判斷條件為“獲取25號按鈕檢測結(jié)果”,當(dāng)檢測到按鈕有“被按下”的動(dòng)作時(shí),執(zhí)行下面的模塊語句:
先是在LOG調(diào)試信息區(qū)輸出調(diào)試信息:“奏國歌,升國旗!”然后是一個(gè)重復(fù)執(zhí)行600次的循環(huán),每次均控制絲桿的步進(jìn)電機(jī)以“慢速”的速度正轉(zhuǎn)1圈、等待0.038秒后再進(jìn)入下一次循環(huán)。這是因?yàn)閲璧恼2シ艜r(shí)長是46秒,經(jīng)測試——絲桿的步進(jìn)電機(jī)如果不加等待時(shí)間進(jìn)行“慢速”正轉(zhuǎn)600圈的話,大約是23秒鐘,對應(yīng)滑臺(tái)從預(yù)設(shè)的“地面”到預(yù)設(shè)的“旗桿頂部”(不要設(shè)置為絲桿的最頂端以防損壞),冗余的23秒鐘(46-23)就要在600次循環(huán)中進(jìn)行均勻拆解來“消耗”掉,才能整體實(shí)現(xiàn)精準(zhǔn)升旗的效果。循環(huán)結(jié)束后,LOG調(diào)試信息區(qū)輸出“禮畢!”,再加一個(gè)“等待0.001秒”的按鈕“消抖”時(shí)間等待模塊即可(如圖2)。
將程序保存為“按鈕控制絲桿精準(zhǔn)升旗”后點(diǎn)擊“運(yùn)行”按鈕,將絲桿豎直后按一次按鈕,就會(huì)實(shí)現(xiàn)在奏國歌的46秒時(shí)間內(nèi)精準(zhǔn)升旗的效果(如圖3)。
此時(shí)還有個(gè)小“問題”,那就是絲桿控制滑臺(tái)帶動(dòng)國旗完成升旗后,如何復(fù)位以進(jìn)行下一次的升旗呢?非常簡單,可以在程序中的整個(gè)“重復(fù)當(dāng)‘真”循環(huán)結(jié)構(gòu)上點(diǎn)擊右鍵,選擇“禁用塊”(變灰);然后,在后面添加一條“控制步進(jìn)電機(jī)以‘快速的速度反轉(zhuǎn)‘600圈”的模塊語句,執(zhí)行一次程序即可控制滑臺(tái)復(fù)位。
同樣,程序中也可以使用“多線程”方式來調(diào)用音樂播放模塊語句——演奏《義勇軍進(jìn)行曲》,實(shí)現(xiàn)“奏國歌”與“升國旗”同步進(jìn)行的效果。
實(shí)驗(yàn)器材包括樹莓派3B+和古德微擴(kuò)展板各一塊,絲桿一個(gè),USB接口麥克風(fēng)一個(gè),音箱一個(gè),杜邦線若干,硬紙片一張(模擬推拉門)。
絲桿的連接方法與案例1完全相同,再將麥克風(fēng)插入樹莓派的一個(gè)USB接口中;然后,將音箱插入樹莓派的音頻輸出插孔,再用熱熔膠槍將帶有“我是‘推拉門,聲控噢!”標(biāo)記的硬紙片粘貼于絲桿的滑臺(tái)上,給樹莓派通電,啟動(dòng)操作系統(tǒng)(如圖4)。
由于用到了麥克風(fēng)要進(jìn)行語音喚醒和識別,因此先要從“人工智能”-“語音識別”中將“小度小度關(guān)鍵詞語音喚醒,請創(chuàng)建一個(gè)Wakeup新函數(shù)”功能模塊拖至中央編程區(qū);然后,仍然是對絲桿的步進(jìn)電機(jī)進(jìn)行初始化;接著,建立一個(gè)名為Wakeup的函數(shù),用來響應(yīng)被語音喚醒時(shí)觸發(fā)的一系列動(dòng)作:
先是播放“?!钡囊宦暎ㄔ跇漭蒘D卡中:/home/pi/temp/ding.mp3)作為喚醒回應(yīng),并且在LOG調(diào)試信息區(qū)輸出調(diào)試信息:“Hello”;然后,建立變量“語音輸入”,為其賦值為“將3秒的語音輸入保存到‘/home/pi/temp/record.mp3”,再建立變量“語音文字”,賦值為“把語音‘語音輸入轉(zhuǎn)換為文字”,實(shí)現(xiàn)將用戶的語音指令轉(zhuǎn)換成文字信息的功能;接著,建立一個(gè)三分支選擇結(jié)構(gòu),前兩個(gè)分支的判斷條件類似——“語音文字”中是否包含有“開門”(或“關(guān)門”)的關(guān)鍵字,條件成立,則在LOG調(diào)試信息區(qū)輸出該關(guān)鍵字,并且控制絲桿的步進(jìn)電機(jī)以“中速”(可自行設(shè)置“快速”或“慢速”等)正轉(zhuǎn)或反轉(zhuǎn)600圈,正轉(zhuǎn)對應(yīng)開門、反轉(zhuǎn)對應(yīng)關(guān)門;第三個(gè)分支用來匹配用戶的語音指令中未包含“開門”或“關(guān)門”時(shí)的情況,則語音提醒用戶“請發(fā)正確的指令!”(包括LOG調(diào)試信息區(qū)也同步顯示)。
最后,加一個(gè)“等待0.1秒”的功能模塊,作用是防止占用過多系統(tǒng)資源而“死機(jī)”(如圖5)。
將程序保存為“絲桿‘聲控推拉門”后點(diǎn)擊“運(yùn)行”按鈕,開始對麥克風(fēng)發(fā)出語音指令進(jìn)行測試(注意每次語音指令的喚醒詞必須是“小度小度”):當(dāng)說“小度小度,關(guān)門”時(shí),絲桿會(huì)將推拉門緩緩關(guān)閉;當(dāng)說“小度小度,開門”時(shí),推拉門則會(huì)緩緩打開;當(dāng)說“小度小度,就這樣吧”(或者其他不包括“開門”“關(guān)門”的語音指令)時(shí),音箱會(huì)發(fā)出“請發(fā)正確的指令”的語音提醒(如圖6)。
同時(shí),在LOG調(diào)試信息區(qū)也會(huì)輸出對應(yīng)的文字信息,提醒用戶程序的運(yùn)行進(jìn)程。需要特別注意的是,如果推拉門已經(jīng)處于“開門”的狀態(tài)時(shí),就不要發(fā)出“小度小度,開門”的重復(fù)語音指令,否則絲桿的步進(jìn)電機(jī)又會(huì)做出“響應(yīng)”——繼續(xù)“開門”,但無法控制滑塊推拉門移動(dòng),反之亦然。