這個制作會向你展示如何拆開一架遙控直升機(jī),然后修改它的遠(yuǎn)程控制硬件使之能夠通過開源的電腦軟件來控制。更重要的是,它可以通過常見的消費(fèi)級 腦電圖 頭戴式感應(yīng)器感應(yīng)到人腦的專注和放松狀態(tài),進(jìn)而控制直升機(jī)的飛行!
項(xiàng)目中用到的軟件包含兩個應(yīng)用程序,Puzzlebox Synapse和 Puzzlebox Brainstorms 。前者連接到市售的消費(fèi)級頭戴式腦電圖感應(yīng)器,比如 NeuroSky MindSet 或者 Emotiv EPOC 。后者連接到從遙控器拆出的發(fā)射芯片上,依據(jù)Puzzlebox Synapse給出的信號向直升機(jī)發(fā)送飛行命令。這些軟件(包括源代碼)可以在 Brainstorms Puzzlebox 的網(wǎng)站下載。
1、材料和工具
○ 一架遙控直升機(jī)
○ 頭戴式腦電圖感應(yīng)器,比如 NeuroSky MindSet 或者 Emotiv EPOC
○ USB轉(zhuǎn)串口線,可以設(shè)置任意波特率
● 示波器
● 邏輯分析儀
● 烙鐵和焊錫(可選)
● 連接線和萬能電路板(可選)
● Puzzlebox Synapse和Puzzlebox Brainstorms軟件
開始干活之前,拆解直升機(jī)。充電并安裝好電池,確定所有部件都工作良好之后再開始檢查或拆卸單個部件(譯注:開拆前別忘了取下電池,不要帶電拆卸)。你也應(yīng)該事先熟悉直升機(jī)的基本控制,包括如何設(shè)置,基本控制和飛行特征。這里我們用的直升機(jī)是一架 Blade mCX2 。
2、 檢查遙控器組件
首先要拆卸和檢查遙控器電路板的組件。弄個顯微鏡記錄制造商的名稱和各種芯片的編號和數(shù)目可能是有用的,這對研究電路的功能和通訊協(xié)議的時候有幫助,可以在下一步用 示波器 或 邏輯分析儀 工作時節(jié)省時間。我們用的遙控器是 Blade MLP4DSM 。
遙控器上有4個控制飛行的遙控通道:
A. 油門(在空中上升/下降)
B. 升降舵(前進(jìn)/后退)
C. 副翼(左右轉(zhuǎn)向)
D. 方向舵(順時針/逆時針旋轉(zhuǎn))
這兩個操縱桿連接到 電位器 上,能夠控制電位器的輸出電壓。電位器與電源相連,抽頭連接到 Atmega88PA 單片機(jī)的端口上。
單片機(jī)測量輸入電壓,然后轉(zhuǎn)換成 PCM 數(shù)字信號傳送到發(fā)射芯片。發(fā)射芯片通過 Spektrum DSM2 協(xié)議和直升機(jī)進(jìn)行通訊。
簡要說明:這里的說明可能不是100%準(zhǔn)確,但卻是一個簡要有用,易于理解的可視化說明方式。
把電類比成水可能會簡單一些,水通過管道而不是電線或者電路板上的印刷線路流動。如果你測量水壓或者管道中某點(diǎn)的水位,就相當(dāng)于測量電壓。管道的直徑就是電路可接受的最大電壓。測量在某一點(diǎn)單位時間內(nèi)通過的水量相當(dāng)于在電路中測量電流。想象高處不斷落下的大水滴,這是一個高電壓,低電流的電路。而一場爆發(fā)式的洪水,是一個相對低電壓但是大電流的電路。也正是由于這一原因,放大器(它們放大電流)通常被認(rèn)為比高電壓還要危險(xiǎn)一些。
這些電池充當(dāng)著水源的角色,和水(電力)通過管道(電路)流動的目標(biāo)。連接在遙控桿上的電位器起的作用就像管道中的閥門,能夠改變之后管道中的水位(電壓)。比如說,當(dāng)油門搖桿處在最低的位置,相當(dāng)于閥門的轉(zhuǎn)子葉片完全關(guān)閉,所以管道中沒有水流動(電壓為0)。當(dāng)搖桿在最高的位置,閥門開啟,后面管道的水位(電壓)則處在最高位置。
如果水管途中經(jīng)過一個水輪,水輪轉(zhuǎn)動時就能驅(qū)動直升機(jī)的旋翼。這里可以看出越多的水沖擊水輪(電壓越高),輪子和旋翼就轉(zhuǎn)的越快,使直升機(jī)飛的越高。不過這里討論的搖桿和電路在遙控器而不是直升機(jī)上,所以需要一些額外的中繼步驟。
在這個假想的例子中,微處理器(單片機(jī))測量管道中的流水水位。這個數(shù)字代表著電壓和搖桿的當(dāng)前位置。這個數(shù)字將被轉(zhuǎn)換成數(shù)字格式并且通過發(fā)射芯片發(fā)射,數(shù)目對應(yīng)于各操縱桿的這些數(shù)字發(fā)射到直升機(jī)以后,直升機(jī)上的接收器傳送這些數(shù)據(jù)給微處理器,在那里數(shù)字信號最后轉(zhuǎn)化成用于驅(qū)動漿葉和舵機(jī)的模擬輸出。
3 、將控制電路板連接到示波器
利用一個示波器,我們可以探測微處理器和發(fā)射芯片之間通訊信號的特征。把示波器的探頭輪流接到發(fā)射芯片的每個引腳和地線上,直到找出哪個腳用于信號傳輸,那些腳是電氣地線。調(diào)整示波器的靈敏度將使顯示的圖像更加清晰可見。最重要的是,我們將可以確定我們的遙控器發(fā)送一個數(shù)字信號,而不是相反的 模擬信號 。
另外一點(diǎn)也很重要,就是我們可以測量數(shù)字信號的電平電壓,來確保我們的USB轉(zhuǎn)串口線可以產(chǎn)生和接收相同電平的信號。如果不是這種情況,就需要一個簡單電平轉(zhuǎn)換電路來變換信號電平,以適合現(xiàn)有的USB轉(zhuǎn)串口線。
在第一幅照片里,下邊沿附近的亮點(diǎn)顯示了數(shù)據(jù)包(又名數(shù)據(jù)幀)的發(fā)送,我們想要知道每一個數(shù)據(jù)包內(nèi)含的信息,為此需要使用邏輯分析儀。
在第二張放大的照片中可以看到,在數(shù)字信號的垂直邊沿上,部分線條將隨著操縱桿的操作而閃動。這表明每個數(shù)據(jù)包的內(nèi)含數(shù)據(jù)都隨著對搖桿的操作而變化,變化方式隨通道不同而不同。
更具體的討論和示波器的使用方法超出了本教程的范圍,暫且不表。
4 、連接邏輯分析儀
一個邏輯分析儀能夠幫助你抓到從微處理器發(fā)送到發(fā)射芯片間的每幀PCM數(shù)據(jù)包。顯示并且解碼它們。在這個項(xiàng)目里我們用了Tektronix 1241邏輯分析儀。 Saleae Logic 軟件能夠幫助我們精確測量每幀數(shù)據(jù)發(fā)送的頻率(22ms一幀),還有數(shù)據(jù)格式,位數(shù),每個字節(jié)數(shù)據(jù)的格式(8個數(shù)據(jù)位,無效驗(yàn),1個停止位),波特率(133000波特)。每幀數(shù)據(jù)中包含14個可以用十六進(jìn)制方便表示的字節(jié)。
注意:波特率是相當(dāng)重要的。最接近我們使用要求的,并且被大多數(shù)串口設(shè)備(比如項(xiàng)目中的USB轉(zhuǎn)串口線)支持的標(biāo)準(zhǔn)波特率是115200。但這離我們的無線發(fā)射頻率差距太遠(yuǎn),開始的嘗試失敗了。所以選用一個轉(zhuǎn)換芯片允許任意設(shè)置波特率的USB轉(zhuǎn)串口線就顯得十分重要。在之后的版本里我們選用了一個基于 FTDI 芯片的版本。(FT232 USB-Serial ‘UART’ IC,詳見最后的說明。)
同這一步驟有關(guān)的是Saleae邏輯分析軟件捕獲數(shù)據(jù)的記錄文件示例。在第一個文件示例中油門搖桿完全出于最下方,而在第二個文件里油門搖桿始終處于最上方。更多搖桿位置的數(shù)據(jù)實(shí)例和討論以及邏輯分析儀的使用超出了本教程的范圍。
簡要說明:在我們之前的比喻里,我們說水流的水壓(水位)可以類比為電流流過電路時的電壓,由于操縱桿控制的閥門而升降。然而當(dāng)我們使用示波器的時候可以觀測到,在微處理器和發(fā)射芯片之間的信號是數(shù)字的,而不是模擬的。這實(shí)際上意味著管道要么充滿水要么枯竭,沒有中間狀態(tài)。通過兩種極端狀態(tài)的變化,在管道中發(fā)送二進(jìn)制數(shù)據(jù)。
用另一種方式思考,想象管道兩端分別有著發(fā)送者和接收者。在這種情況下,發(fā)送者是微處理器(因?yàn)樗缹⒁l(fā)送的數(shù)字值)而接收者是發(fā)送芯片。試圖通過調(diào)節(jié)管道中的水流發(fā)送信息非常緩慢,所以他們采用了手電筒互打莫爾斯電碼的方式。每隔一段時間,接收者探頭進(jìn)入管道觀察情況。同一時刻發(fā)射者要么打開手電表示一個1,要么關(guān)上手電筒將之表示為0。每次發(fā)生這種情況,稱作一個位(bit)的發(fā)送。這會連續(xù)快速發(fā)送8次,形成一個字節(jié)(Byte)。如果每個詞的一個字母是一位,一個詞就是一個字節(jié)。邏輯分析儀還告訴我們微處理器朝發(fā)射芯片說的每個‘句子’有14個‘詞’,這個句子包含了所有的搖桿位置和每個運(yùn)動方向的信號。只要遙控器開啟,完整的句子每秒重復(fù)約45次(每22ms一次)。波特率非常重要是因?yàn)樗砹税l(fā)射方和接收方之間預(yù)先約定的信號時間間隔。換句話說,如果發(fā)送方每五秒鐘發(fā)送一次閃光,而接收方每十秒鐘看一次管道,他就只會記錄到一半的信號,并且將它記錄下來以后,實(shí)際上每個位都是錯的。當(dāng)我們說波特率是133000的時候,實(shí)際上這一意味著每秒鐘發(fā)生的閃爍高達(dá)133000次!
5 、拆焊發(fā)射芯片
在使用示波器觀察微處理器和發(fā)射芯片之間的數(shù)字信號,并使用邏輯分析儀對 串行 通訊協(xié)議進(jìn)行解碼之后,通過軟件遙控直升機(jī)的道路就變得清晰了。我們的軟件會繞過所有其他組件,直接通過USB轉(zhuǎn)串口線同發(fā)射芯片進(jìn)行通訊。如果這一步不順利,我們還有一個替代方案??梢允褂?Arduino 輸出模擬電壓來模擬電位器的輸出電平。
由于發(fā)射器芯片實(shí)際上是一塊單獨(dú)的電路板(見附圖),而且在兩個引腳之間有足夠的空間讓我們飛出信號,我們已經(jīng)能夠記錄和分析所有微處理器發(fā)送給它的原始數(shù)據(jù),但我們最終希望能夠自行產(chǎn)生這些數(shù)據(jù)。這需要給發(fā)射板額外供電,如果遙控器的電源開關(guān)打開,然后微處理器也將發(fā)送數(shù)據(jù),這將與我們插入的數(shù)據(jù)產(chǎn)生沖突;如果我們關(guān)閉了電源開關(guān),發(fā)射器芯片也將關(guān)閉,任何數(shù)據(jù)都不會發(fā)送到直升機(jī)。我們認(rèn)為我們將能夠從USB轉(zhuǎn)串口線為發(fā)射器芯片供電,但是我們不能肯定,電力會不會回流到微處理器使之開始工作。因此,我們決定從遙控器上拆下發(fā)射器芯片板,因?yàn)檫@是我們的項(xiàng)目唯一需要的部分。
6 、連接控制板與USB轉(zhuǎn)串口線
當(dāng)發(fā)射芯片板被拆下來以后,我們需要重新用導(dǎo)線將原來的遙控器與發(fā)射芯片板飛線相連,這樣就既可以像以前一樣放飛直升機(jī),又可以將它連接到USB轉(zhuǎn)串口線通過軟件遙控飛行,還可以通過USB轉(zhuǎn)串口線直接記錄遙控器發(fā)出的數(shù)據(jù)幀。
我們最終使用一塊萬能板搭建了簡易的開關(guān)電路,使我們能夠控制信號流向任意需要的方向。
通過這些收集到的信息我們用 Python 語言編寫了“Helicopter_Control.py”模塊作為Puzzlebox Brainstorms軟件的一部分。
在圖片里,我們從控制臺運(yùn)行了這個此模塊,像下面這樣發(fā)出了“讀”的命令:python Helicopter_Control.py --command=read --device=/dev/ttyUSB0
注意:在我們的具體配置里,我們的Linux系統(tǒng)在創(chuàng)建USB到串行端口設(shè)備時串行端口被附加了“/ dev/ttyUSB0”,這可能根據(jù)您的特定系統(tǒng)有所不同。比如在Windows下的COM端口可能被注為“COM1“。
當(dāng)以這種方式執(zhí)行模塊時很容易看到從微處理器發(fā)送到發(fā)射器芯片的實(shí)時數(shù)據(jù)。將這個模塊納入我們的源代碼之后,我們可以任意發(fā)送特定的命令字符串給直升機(jī)。
順便提一句,我們注意到,當(dāng)直升機(jī)首次啟動時,需要發(fā)送一個“中間”油門位置的命令來建立匹配(不論是由連接到發(fā)射器芯片遙控器或計(jì)算機(jī)軟件發(fā)出該字符串)。否則直升機(jī)將不會識別發(fā)射器芯片,并進(jìn)入同步模式(由一個在駕駛艙閃爍的藍(lán)燈表示)。
此外,當(dāng)控制臺命令不再發(fā)送,直升機(jī)會顯示斷開連接(在駕駛艙外長亮的藍(lán)燈),為了重新建立連接,需要再次發(fā)射了大約兩秒鐘的“中間”油門位置命令才能發(fā)送其它操縱命令,例如“懸?!被颉跋蚯帮w。”這些設(shè)置傳輸會自動由Puzzlebox Brainstorms軟件處理。
7 、測試飛行-從命令控制臺遙控直升機(jī)
在這個示例視頻中,遙控直升機(jī)首先通過原來的遙控器操作,再經(jīng)過萬能板電路切換信號通道,由在控制臺模式下運(yùn)行的Puzzlebox Brainstorms軟件發(fā)送“向前飛”的命令。注意在直升機(jī)起飛前有一個延遲,在此期間,發(fā)射器和直升機(jī)之間重新建立了同步。
可用的控制臺命令示例:
Neutral: 使用此命令來與直升機(jī)建立初始同步
python Helicopter_Control.py --command=neutral
Hover: 直升機(jī)在空中懸停
python Helicopter_Control.py --command=hover
Fly Forward: 直升機(jī)向前飛行,高度降低,此時易于著陸
python Helicopter_Control.py --command=fly_forward
Read: 讀取遙控器的輸出指令并直接在顯示器上顯示
python Helicopter_Control.py --command=read
8 、連接腦電圖感應(yīng)器到Puzzlebox Synapse
Puzzlebox Synapse是一個免費(fèi),開源,跨平臺的應(yīng)用程序,它能直接連接到市售的消費(fèi)級腦電圖頭戴感應(yīng)器上,采集腦電波信號(包括檢測狀態(tài)),將數(shù)據(jù)繪圖,選擇性地記錄數(shù)據(jù)到磁盤,并提供了TCP / IP服務(wù)器功能來為遠(yuǎn)程客戶端傳遞信息。
這個項(xiàng)目我們將使用Puzzlebox Synapse連接到一個NeuroSky MindSet感應(yīng)器,然后區(qū)分 “專注”和“冥想”的思想集中程度,Puzzlebox Brainstorms則使用這些數(shù)據(jù)來遙控直升機(jī)飛行,懸停,或著陸。如果使用的是Emotiv EPOC感應(yīng)器則可以使用“EmoKey”軟件直接同Puzzlebox Brainstorms通訊,從而跳過這一步。
首先需要建立一個電腦與NeuroSky MindSet的藍(lán)牙連接。連接方法應(yīng)該已經(jīng)在感應(yīng)器的說明中提供了,不在本教程的范圍之內(nèi)。如果你使用的是Windows XP,建議使用東芝(Toshiba)藍(lán)牙驅(qū)動(感應(yīng)器安裝光盤中有),而不是內(nèi)置的Microsoft藍(lán)牙驅(qū)動,我們使用東芝公司的軟件獲得了更好的效果。對于NeuroSky MindSet默認(rèn)的藍(lán)牙Pin識別碼為“0000”,一旦連接到你的Windows系統(tǒng)會獲得新的COM端口或Linux下的/ dev/ ttyUSB。建議Mac OS X的任何用戶嘗試使用Python解釋器從源代碼開始運(yùn)行,并通知我遇到的任何問題。理論上這些軟件應(yīng)當(dāng)兼容,但是截至交稿時我還沒有在OS X上實(shí)際測試過。
一旦連接建立,只需選擇你NeuroSky MindSet的藍(lán)牙連接MAC地址,或選擇顯示的的適當(dāng)COM端口。
點(diǎn)選“Server Daemon”下面的“Start”按鈕,圖形界面將開始顯示實(shí)時腦電圖測量結(jié)果。腦波和“eSense”計(jì)算每秒更新一次。它也可以繪制原始腦電圖輸出波形圖用來查看,顯示隨著時間的推移被測對象專注和放松的趨勢,并存儲用戶會話的全部內(nèi)容到磁盤或輸出為OpenOffice.org Calc或Microsoft Excel中使用的CSV文件。
9 、使用Puzzlebox Brainstorms遙控直升機(jī)飛行
Puzzlebox Brainstorms是一個免費(fèi),開源,跨平臺的軟件應(yīng)用程序,它允許通過腦機(jī)接口(BCI)控制車輛,設(shè)備,玩具(例如 LEGO MINDSTORMS ),遙控直升機(jī),甚至電動輪椅。
在這個項(xiàng)目里我們將使用該軟件控制直升機(jī)的向前飛行,懸停和/或著陸。這些操作的控制命令來源于NeuroSky MindSet或Emotiv EPOC腦電圖頭戴感應(yīng)器自動檢測到的被測對象專注/放松的程度。
第一步是在啟動應(yīng)用程序之后連接到上一步的準(zhǔn)備好的Puzzlebox Synapse的服務(wù)器。服務(wù)器可以搭建在同一臺計(jì)算機(jī)上或通過TCP/ IP協(xié)議或者因特網(wǎng)進(jìn)行訪問。在“控制面板”點(diǎn)擊Puzzlebox Brainstorms標(biāo)簽,核對主機(jī)和端口設(shè)置后,點(diǎn)擊“連接”,開始接收腦電圖檢測數(shù)據(jù)。
下一步點(diǎn)擊“遙控直升機(jī)”標(biāo)簽。該發(fā)射器芯片應(yīng)該已經(jīng)被改裝并連接到電腦系統(tǒng)。如前面的步驟中所述,USB轉(zhuǎn)換的串行接口將出現(xiàn)在Windows下的COM端口或/ dev/ ttyUSB Linux下的串行設(shè)備里。默認(rèn)情況下,當(dāng)大腦“專注”或“放松”的水平達(dá)到一定的閾值(約60%或更高,在“puzzlebox_brainstorms_configration.ini”文件中定義) “速度”表將開始上升,遙控直升機(jī)將工作在“懸?!蹦J?,一旦放松水平低于閾值直升機(jī)則自動下降并著陸。
如果使用Emotiv EPOC感應(yīng)器,你可以通過“EmoKey”程序指定以下快捷鍵并用它們?nèi)我庵付ㄖ鄙龣C(jī)的工作狀態(tài):
“Home ” or “[ ” -懸停
“Page Up ” or “] ” – 向前飛行
“End ” or “” -著陸
簡要說明(注意:這里的說明可能不是100%準(zhǔn)確,但卻是一個簡要有用,易于理解的可視化說明方式。)
A. 假設(shè)你站在正在進(jìn)行棒球比賽的體育場外,你不能看到球場上的球員(我們不能“讀你的心”),但每過一段時間,你就可以聽到人群歡呼和叫喊,知道發(fā)生了令人興奮的事件。我們知道,當(dāng)發(fā)生類似這樣的情況,就意味著你在保持專注。你可以設(shè)想頭上的電極就像接收場內(nèi)人群歡呼聲信號的天線,當(dāng)我們調(diào)整到合適的頻率(電極處于合適的位置),聽到興奮的叫喊轟鳴(電極傳出信號),我們就知道你在專注。
B. 人類的大腦是由約100億個 神經(jīng)元 組成的,它們不斷通過化學(xué)過程交換信息,在這一過程產(chǎn)生電信號,當(dāng)與特定功能相關(guān)的大腦區(qū)域高度活躍時,可以直接在該區(qū)域?qū)?yīng)的頭皮表面測量出電信號的微小變化。就像遙控控制電路,我們測量這些電信號的幅度和變化并用電壓表示(盡管實(shí)際的變化小而又?。?。
C. 如果你從遙控器中取出單節(jié)AA電池,你會發(fā)現(xiàn)在一邊寫著“1.5V”,表示該電池正常電壓為1.5伏。我們測量腦電信號用的單位是伏特十萬分之一(微伏),腦電圖本質(zhì)上就是一個極靈敏的電壓表的測量結(jié)果。
D. 當(dāng)我們使用腦電圖感應(yīng)器測量出大腦的電活動后,就可以用數(shù)學(xué)知識來處理這些信號。結(jié)合腦科學(xué)上的知識,我們將電極放置在大腦皮層(大腦右額葉,位于前額右下部),同時采集了中立參考點(diǎn)的信號(例如用戶的耳朵,那里沒有神經(jīng)元。,據(jù)此我們可以計(jì)算出人們的大腦對事物注意的程度——是專注還是放松。
評論
查看更多