牟曉東
在Arduino、樹莓派、掌控板等常見的開源硬件編程中,我們可以通過功能豐富的外接或內(nèi)置式傳感器,借助于代碼編程或圖形化編程,最終可以制作出非常多創(chuàng)意十足的創(chuàng)客作品。以“手勢操控”為例,根據(jù)“捕捉”到的不同手勢(比如不同方向的揮手動作、順時針或逆時針畫圈動作等),做出預(yù)先設(shè)置的不同響應(yīng)動作,比如控制PPT課件的上下翻頁、燈帶中不同燈珠的亮滅、OLED顯示屏出現(xiàn)對應(yīng)的信息提示等。
實驗器材包括:樹莓派3B+和古德微擴展板各一塊,HC-SR04超聲波傳感器一個,綠色和紅色LED燈各一支。
首先,將古德微擴展板正確安裝在樹莓派上,注意四周小心均勻用力;接著,將超聲波傳感器安裝于擴展板的20號和21號插孔,注意VCC、Trig、Echo和GND引腳要一一對應(yīng),負責超聲波發(fā)射和接收的兩個“圓孔”方向朝外;然后,將綠色LED燈插入5號插孔,將紅色LED燈插入6號插孔,注意“長腿正、短腿負”的規(guī)則;最后,給樹莓派通電,啟動操作系統(tǒng)(如圖1)。
運行Windows的“遠程桌面連接”,輸入樹莓派的IP地址(比如:192.168.1.116)登錄進入樹莓派的操作系統(tǒng)。由于手勢操控是通過將超聲波傳感器所檢測到的測距數(shù)據(jù)作為輸入控制信號,然后“驅(qū)動”系統(tǒng)的鍵盤上下方向鍵(或者鼠標的左鍵單擊),因此需要安裝PyAutoGUI庫模塊——點擊運行樹莓派的“LX終端”進入命令行模式,輸入“pip3 install pyautogui”命令進行安裝(如圖2)。
運行Thonny Python IDE,新建文件hand_PPT.py,輸入代碼開始編程:
首先,通過四行import代碼導(dǎo)入待用的庫模塊:“from gpiozero import DistanceSensor,LED”、“import pyautogui”、“from signal import pause”和“from time import sleep”;接著,分別為插接在5號、6號、20和21號引腳的綠色和紅色LED燈、超聲波傳感器建立對應(yīng)的變量:“green = LED(5)”、“red = LED(6)”、“sensor = DistanceSensor(21, 20)”;然后建立“while True:”循環(huán)結(jié)構(gòu),為變量dis進行超聲波傳感器測距賦值(取兩位小數(shù)):“dis = round(sensor.distance,2)”,并且打印輸出:“print(dis)”;接著通過if語句進行測距值是否在0.2-0.5米區(qū)間內(nèi)的判斷:“if (dis > 0.2 and dis <= 0.5):”,如果條件成立,則先調(diào)用PyAutoGUI庫執(zhí)行按下鍵盤的向下方向鍵操作——對應(yīng)PPT課件播放時的向下翻頁操作:“pyautogui.press('down')”,再亮綠色LED燈進行提醒:“green.on()”,0.2秒鐘之后再將其關(guān)閉:“sleep(0.2)”、“green.off()”;再建立elif判斷語句,對測距值是否在0.2米內(nèi)進行判斷:“elif dis <= 0.2:”,條件成立的話則先按下鍵盤的向上方向鍵——對應(yīng)PPT播放時的“回翻”操作:“pyautogui.press('up')”,然后亮紅色LED燈,持續(xù)0.2秒鐘后關(guān)閉:“red.on()”、“sleep(0.2)”、“red.off()”;最后,為循環(huán)結(jié)構(gòu)再添加一個等待0.5秒鐘的語句:“sleep(0.5)”(如圖3)。
程序代碼保存后點擊“運行”按鈕,接著打開待測試的“Python數(shù)據(jù)分析基礎(chǔ).pptx”文件播放(如圖4)。
此時在Python IDE下方的Shell區(qū)每隔0.5秒鐘就會生成一個測距值,如果在超聲波傳感器前方0.2-0.5米的區(qū)間范圍內(nèi)揮手,PPT課件就會向下翻頁,揮一次手就會翻一頁PPT,與使用鼠標點擊或是翻頁筆遙控的效果是完全一致的;如果翻頁錯誤,想“回翻”的話,則在0.2米內(nèi)的范圍內(nèi)揮手,PPT課件就會切換至上一頁;在超過0.5米的范圍外,手勢操控是“無效”的不響應(yīng)狀態(tài)。
實驗器材包括:樹莓派3B+和古德微擴展板各一塊,GY-PAJ7620手勢傳感器一個,60個燈珠的可編程ws281x燈帶一條。
保持擴展板插接在樹莓派上不動,將手勢傳感器插接至擴展板的I2C引腳區(qū),注意VIN接VCC電源正極、GND接地、SCL與CLK連接、SDA與DATA連接;然后將燈帶的輸入端插入擴展板的18號引腳,注意檢查三根引線的標注(+5V、GND和Din)與擴展板的VCC、GND和D端必須一一對應(yīng);最后,給樹莓派通電,啟動操作系統(tǒng)(如圖5)。
在瀏覽器中訪問古德微機器人網(wǎng)站(http://www.gdwrobot.cn/),登錄賬號后進入“積木”編程區(qū),開始拖動對應(yīng)的功能模塊語句進行圖形化編程:
首先,分別新建六個最“底層”的功能函數(shù),分別是“左右方向”、“上下方向”、“順時針”、“逆時針”、“靠近”和“遠離”,對應(yīng)的手勢操控動作分別是向左或向右、向上或向下四個方向的揮手動作,順時針、逆時針轉(zhuǎn)動和靠近與遠離動作,顯示效果分別是:左右兩組共30個燈珠發(fā)綠光、上下兩組的其他30個燈珠發(fā)紅光——“左右綠燈通行、上下紅燈禁行”,上下兩組的30個燈珠發(fā)綠光、左右兩組的30個燈珠發(fā)紅光——“上下綠燈通行、左右紅燈禁行”,“順時針”和“逆時針”函數(shù)則是分別控制四組燈珠從第一個燈珠同時出現(xiàn)(發(fā)黃光)“跑馬燈”的順時針、逆時針效果,而“靠近”和“遠離”函數(shù)分別控制隨機色的“花燈”效果和熄滅所有燈珠的效果(如圖6)。
接著,在主程序中先對燈帶和PAJ7620超聲波傳感器進行初始化操作;然后,添加一個名為“燈帶顯示”的子線程,對應(yīng)的同名函數(shù)是一個六分支選擇結(jié)構(gòu),實現(xiàn)的功能是對在“重復(fù)當‘真”循環(huán)結(jié)構(gòu)中每隔0.1秒鐘就檢測一次的變量“手勢信息”進行判斷,并且根據(jù)其返回的數(shù)據(jù)值進行對應(yīng)函數(shù)的調(diào)用,比如當其值為“l(fā)eft”或“right”時,說明手勢傳感器檢測到用戶發(fā)出了向左或向右的揮手指令,此時便調(diào)用“左右方向”函數(shù),出現(xiàn)“左右綠燈通行、上下紅燈禁行”的燈帶顯示效果(如圖7)。
將程序保存為“‘手勢操控交通多變燈帶”,點擊“連接設(shè)備”后再點擊“運行”按鈕,對程序進行各種手勢操控的測試,燈帶會隨之顯示出各種預(yù)設(shè)的效果(如圖8)。
實驗器材包括:掌控板2.0和百靈鴿擴展板各一塊,GY-PAJ7620手勢傳感器一個,小型面包板一個,公對母異色杜邦線四根。
首先,將手勢傳感器插接至面包板上;接著,從百靈鴿擴展板(與掌控板已經(jīng)插接好)的I2C區(qū)域接出四根杜邦線,根據(jù)G(接地)、V(電源正極)、SCL(控制線)和SDA(數(shù)據(jù)線)的標注分別插接至面包板,與手勢傳感器的GND、VIN、SCL和SDA一一對應(yīng);最后,通過數(shù)據(jù)線將掌控板與電腦的USB接口連接(如圖9)。
運行Mind+,首先通過點擊左下角的“擴展”按鈕將“掌控板”和“PAJ7620U2手勢傳感器”庫添加至左側(cè)模塊區(qū)域;接著,在“ESP32主程序”和“循環(huán)執(zhí)行”之間進行初始化設(shè)置,包括關(guān)閉全部的LED燈、屏幕第2行顯示“‘手勢操控交通信號”提示信息、設(shè)置手勢傳感器的運行模式為“高速”;然后,在循環(huán)體中控制手勢傳感器進行“獲取一次數(shù)據(jù)”的動作,并且對該動作的返回數(shù)據(jù)進行判斷:當用戶發(fā)出“向左揮手”或“向右揮手”動作時,程序調(diào)用執(zhí)行“左右方向”函數(shù);當用戶發(fā)出“向上揮手”或“向下?lián)]手”動作時,程序則調(diào)用執(zhí)行“上下方向”函數(shù);兩個函數(shù)的代碼非常相似,執(zhí)行的動作分別是在掌控板的OLED屏上顯示“紅燈,停!”、“綠燈,行!”文字信息,三支LED燈發(fā)紅光、發(fā)綠光,蜂鳴器發(fā)出“滴”的提醒音。
值得注意的是,在Mind+的窗口右側(cè)會自動生成與圖形化編程對應(yīng)的Arduino C代碼,比如程序先是通過“#include 3.測試“手勢操控”個性交通信號
將程序保存后點擊“連接設(shè)備”按鈕,出現(xiàn)類似于“COM8-CP210x”的掌控板設(shè)備名稱后再點擊“上傳到設(shè)備”按鈕,右下角的窗口就會提示開始向掌控板中寫入代碼(同時有上傳進度條)。當代碼寫入完畢后,在掌控板的OLED屏上先顯示有“‘手勢操控交通信號”的文字提示信息;接著,嘗試在手勢傳感器的上方感應(yīng)區(qū)進行向左或向右揮手、向上或向下?lián)]手,掌控板就會隨之做出不同的亮燈、顯示提示信息和蜂鳴器提醒音的響應(yīng)(如圖11)。