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