|第3章|
節點船
Sara Gorecki
在2014年舉辦的JS開發者大會上,節點船在一個全時工作室中開始。機器人+水=樂趣!這一天結束的時候,參與者們用他們的筆記本電腦控制他們的船在酒店的泳池中飛馳。活動中我有幸加入了一個四人小組,負責全程引導與會者設計出他們的小船。本章将介紹如何制作機器人小船,如圖3-1所示。

圖3-1 節點船
設計一艘船的挑戰之一就是把它的硬體和你的電腦連接配接起來,畢竟你不希望帶着你的電腦下水或是把你的船限制在USB線的長度範圍之内。是以,我們将使用離線技術來控制我們的船,了解更多有關Spark核心闆請見“Spark WiFi開發工具包”。
如你在圖3-1中所見,船體采用塑膠材質,并進行了密封防水,裡面嵌有面包闆和電池盒。圖中的船體是用一個8.5英寸×5.5英寸×2.5英寸的塑膠文具盒制成,頂部使用按扣開關(手工店裡就可以買到),一次性的食品包裝盒或者小的儲物盒也可以。無論你用什麼,記得在上面打個孔。
選擇好了塑膠容器之後,就可以确定泡沫闆的尺寸了。圖中的船使用的是兩塊2英寸×12英寸×4英寸的泡沫闆,建議你多用點泡沫闆,這樣小船的安全系數能高一些,而且,泡沫闆也很便宜,不是嗎?
在組裝的時候記得用矽膠把小船上打的孔封好,務必要確定膠的厚度和密封性。如果你手邊沒有矽膠,E6000速幹膠的效果也是可以的。
3.1 材料清單
表3-1列出了建構船隻所需的材料。
表3-1 物料清單
工具
制作小船所需工具:
- Micro USB線(用于設定Spark核心闆)
- 剝線鉗
- 烙鐵
- 焊錫線軸
- 英寸鑽頭的電鑽
- 熱膠槍
- 浴缸或兒童遊泳池
3.2 潛艇電機吊艙
在制作小船的時候,務必注意電子裝置的防水,防止短路。否則,項目隻能提前結束了。不過如果不下水,小船又如何劈波斬浪呢?
下面隆重介紹田宮潛艇馬達!它有一個通過鎖扣扣緊的防水外罩,可以有效地保護電機。全封閉的外罩通過一個吸盤和船身相連,這使得電機無法從外部進行控制。是以在組裝時我們需要對其進行改裝進而通過Spark核心闆驅動電機。
由于田宮潛艇使用雙向電機,我們可以使用電機驅動器驅動電機進行雙向運動。而且在改裝馬達和外罩,添加其他電子裝置的接線後,部分電機驅動器,包括我們将使用的電機驅動器還支援對速度的控制。
3.2.1 為什麼要使用電機驅動器
我們可以直接将大多數I / O零件(LED,伺服等)連接配接到微控制器上的相應引腳,然後它們就可以正常工作了(可能需要電容器或電阻器),然而電動機卻不是這樣。
你遇到的問題是電機消耗的電流過大。事實上,它所需要的電流比Arduino或Spark提供的電流更大,甚至可能會超出晶片的安全範圍!是以如果直接将電機連上微控制器,電機非常小的話可能還好,不過很有可能會因電流過大把元件燒毀。
為解決這個問題,我們需要用到電機驅動器或一種稱為H橋的晶片。這樣,在實作晶片控制電流的同時還可能通過外部電源為電機供電。
使用驅動器或H橋也帶來了額外的好處。一些電機驅動器,例如我們用來制造這種船的SparkFun驅動器(見圖3-2),還包含一些額外的零件,可以實作對電機轉速的控制。
圖3-2 SparkFun 電機驅動器
3.2.2 電機吊艙零件
田宮潛艇馬達設計為在吊艙内插入電池來使用,但我們改裝它以使用外部電源,這樣我們就可以在電腦上控制它的開關。是以,我們不需要子工具包中的所有零件。我們所需要的是外殼,一些藍色塑膠沖孔零件,黑色膠圈,小管潤滑脂和電機。
由于潛艇吊艙中包含的方向舵太小,無法有效操縱小船。是以後面我們将另外制作方向舵,是以吊艙中所附帶的大部分藍色塑膠零件已經沒有用了,不過有兩個零件是必不可少的,一個是推進器,另一個是夾在電機吊艙上的一端扁平的小環,如圖3-3所示。
田宮改進型
這些都是黃色田宮馬達的改進型,紅色的迷你田宮馬達不過是外形上做了點改變且底盤小了點。
圖3-3 随附的塑膠套件
将螺旋槳和夾子打出并将它們放在一邊,直到完成焊接。
3.2.3 修改電機
接下來就需要焊接電機的控制線路了,首先将兩根電線焊接到電機上。然後,将這些電線連接配接到船内的Spark核心闆。電機吊艙内空間有限,必須選擇柔軟的細電線。事實證明,标準的跳線是不二之選。以下是具體的步驟:
1.拿兩根最長的跳線。如果你的跨接線具有較粗的端頭,請使用剪線鉗将其剪掉,然後剝去兩端的橡膠絕緣層,如圖3-4所示。切記不要切斷裡面的金屬線。
2.在馬達上。你會看到一側有兩個小金屬環伸出來。這些是用于為電機供電的正極和負極接線柱,我們要把跳線焊接到接線柱上。
圖3-4 剝線跳線
3.将剝好的跳線穿過電機上的金屬環,以確定将它們固定到位。
4.定位電線,使其長端靠在電機主體上,向後指向電機的主軸/螺旋槳端。也可以将電線連接配接到電機主體上,以便在焊接時将它們固定到位。
5.将跳線焊到電動機接線柱上,如圖3-5所示,保持跳線朝向線圈的外邊。沒必要焊得非常完美,但是要保證能夠裝上我們之前留在電機尾部的藍色塑膠夾。
圖3-5 将電線焊接到電機上
確定長跳線末端的裸露金屬不會接觸電機的金屬主體。這可能會導緻電路短路并使電機無法工作。為避免這種情況發生,我們可以在可能有接觸的電機周圍纏上一些膠帶。
3.2.4 測試電機
現在,檢查下電機焊接的焊接效果如何。我們可以将焊接到電機上的兩根電線與一節AA電池的正負極相連。如果電機開始旋轉,我們就可以進入下一步了。如果沒有,請檢查焊點,確定焊接良好,并且電路沒有短路;或者,換節電池試試。
3.2.5 完成電機
完成焊接并檢查之後,在裝入電機盒之前還需要做幾項準備工作(需要之前準備好的藍色塑膠環、黑色橡膠圈和小管潤滑脂):
1.将藍色塑膠環卡在電機的白色端,確定夾子在電線的一側。夾子應緊貼在電機側面的凸起上,如圖3-6所示。
圖3-6 将環卡在電機上(附彩圖)
在電機套件中,該塑膠環是用來将接線柱和電池的接線固定在一起。在我們的項目中,它将有助于将電機固定在吊艙後部,并在關閉時保持電機與螺旋槳的連接配接。
2.在橡膠圈的平端塗抹潤滑脂。這将有助于密封,以防止你的電機進水。(适量即可,在後面我們還會用到潤滑脂。)
3.将橡膠圈平的一面朝向電機,穿到電機的主軸上,如圖3-7所示。
在電機主體和橡膠圈之間填滿潤滑脂。如果有明顯的間隙,則繼續加添潤滑脂。
圖3-7 絕緣橡膠圈
3.2.6 插入電機
現在可以将電機插入吊艙了!
1.首先是吊艙的後半部分。它的後端應該有一個洞。
從洞裡可以看到裡面向吊艙内凸出的塑膠墊片(見圖3-8)。當插入電機時,我們要注意這些塑膠墊片的位置,這些塑膠墊片可能會卡住電線。
圖3-8 吊艙内部
2.将馬達上的接線向内彎轉,使它們并攏,指向遠離電機主軸的方向并将它們靠在電機的主體上。兩根電線應并攏,向着電動機的中心,如圖3-9所示。
圖3-9 彎轉導線
3.将電線固定到位,将電機插入吊艙的後半部分,如圖3-10所示。
圖3-10 插入電機
在插入電機時,注意不要把電線夾進去,藍色塑膠環上有一個小間隙,可以穿過它們,始終保持電線是伸出吊艙的。
4.将電機推入吊艙到底,并使主軸從吊艙的後端伸出。
5.将之前準備好的螺旋槳安裝到電機主軸上,如圖3-11所示。現在後半部分的安裝就完成了。
圖3-11 螺旋槳
3.2.7 打孔
我們需要在吊艙上打幾個孔以将電線伸出來。在決定鑽孔的位置時,記住以下幾點:
在吊艙的前部有很多空間可供使用,但空間越向前越窄;鑽的孔越向前,穿線的難度越大,而且在靠前的位置鑽孔也會浪費電線的長度。
在吊艙内部,有一條用于固定電池座的一部分的凸邊。這個位置的吊艙壁更厚,盡量避免在這個位置打孔。最後一點,注意電線是朝向小船的方向伸出來的,應避開電機吊艙外部的凸起部分。一切準備好後,請按照以下步驟操作:
1.将吊艙的前半部分和後半部分對齊,如圖3-12所示。按照下面的步驟鑽孔。
圖3-12 潛艇吊艙預裝配
在吊艙的前半部分标記好電線伸出的位置。
2.使用1/8英寸鑽頭在标記的位置打孔。確定孔的大小能夠同時穿過兩根導線。
3.孔打好後,将電線從孔中依次穿出,如圖3-13所示。
圖3-13 修改接線後的吊艙
3.2.8 關閉電機吊艙
電機接線完成後,我們就可以合上電機吊艙并密封潛水艇上的孔了。
1.在接頭的接縫處塗上之前剩下的潤滑脂會使密封效果更好。
2.将吊艙的兩半對接上,并把接頭處擠出的潤滑脂擦幹淨。
3.把電線拉直,但要注意不要用力過大以免拉斷接頭。将矽膠或膠水密封劑塗在鑽出的孔上,把孔密封好。
4.将吊艙放好,等它幹燥即可。如果你有讓它快速幹燥的配方,應該隻需要幾分鐘就幹燥到可以移動了。
這些膠水需要一天才能完全凝固,但如果趕時間的話,不必等這麼久。幾個小時就可以了。這也是為什麼我們要先進行船體改裝。
3.2.9 電線的防水
如果你在焊好電線組裝好電機吊艙之後發現電線有點短;或者後面想要改變電機吊艙的位置,需要延長電線的話,務必做好電線的防水工作。
熱縮管可以保證焊接處的密封性。你可以購買熱風槍來收縮管子,但是一些收縮包裝可以用一個好的吹風機加熱。確定購買與你可用工具相容的收縮包裝。
然後:
1.在焊接兩根電線之前,将一根适當直徑的管子套到其中一根電線上。
2.将兩根導線焊接在一起。
3.把熱縮管套在兩根電線的焊接點處。
4.加熱熱縮管直至其收縮到足以在電線上形成良好的密封。
5.如果擔心熱縮管的密封性,可以用一些矽膠或防水膠将熱縮管兩端密封。
這樣電線的防水問題就解決了。
3.3 安裝Spark核心闆
現在我們已經完成了吊艙的改裝,接下來我們将對Spark核心闆(見圖3-14)進行聲明,并連接配接硬體實作用計算機對其進行控制。如果你還沒有做完這些,檢查你的“Spark WiFi 開發套件”。我們将引導你完成整個過程。
圖3-14 Spark核心闆
部分Spark核心闆晶片有一個晶片天線,而另一些則有一個光纖連接配接器。光纖連接配接器版本上裝有闆載天線。如果你的Spark核心闆有光纖連接配接器,需要接一個外接天線,可連接配接柔性天線或“鴨”天線。在連接配接WiFi之前,檢查下你的天線是否安裝好了。
我們可以在智能手機App上通過WiFi聲明Spark,但如果有許多WiFi裝置或任何其他裝置時,通過USB連接配接Spark并使用Spark CLI指令行工具進行聲明會更便捷,而且還可以避免意外地聲明其他人的裝置。
因為你将基于目前的WiFi網絡配置Spark,請記住,如果你将船帶到另一個不同WiFi網絡的位置,你将不得不重新配置!組裝船時請切記這一點。你不需要為了配置Spark的WiFi憑證而把整個船拆掉。
在配置過程中,如果Spark有異常情況出現,閃爍别的顔色,請查詢相關檔案以擷取更多資訊。
在運作你的船的代碼之前,你還必須用VoodooSpark替換Spark的存儲固件。“Spark WiFi開發套件”中也對此進行了概述。
測試Spark
在進行下一步之前,将Spark連接配接到電池組并對其進行測試,以確定其工作正常并可以正常接收計算機的指令:
1.将Spark插入面包闆,并確定它橫跨面包闆中間的分隔闆。
2.将電池組的紅線連接配接到Spark标記VIN的引腳上。
3.将電池組的黑線連接配接到Spark上的GND引腳。VIN和GND都位于電路闆的左上方(當USB端口朝上時)。圖3-15顯示了應該如何接線。
4.将四節AA電池裝入電池座。Spark将開始工作,閃爍綠色表示它正連接配接到WiFi,連接配接成功後就變成了青色的呼吸燈(緩慢淡入和淡出光線而不是穩定閃爍)。
圖3-15 線路布置
3.4 第一個Spark項目
現在,我們可以建立一個簡單的測試程式,以確定你的Spark可以通過WiFi正确接收指令。就是如圖 3-16所示的閃爍的LED燈,Spark有一個與引腳D7共享連接配接的闆載LED,下面我們将編寫一個簡單的程式來使這個LED燈閃爍。
現在,你可能已經完成了基本的Johnny-Five設定,然後按照下列步驟操作
圖3-16 運作Spark測試程式
1.在程式設計之前,你需要為項目建立一個檔案夾并将目錄更改為它。
進入項目目錄後,可以通過使用指令npm init建立pack-age.json檔案來開始項目。這将引導你完成建立項目的package.json的步驟,該檔案将存儲代碼依賴項清單。
2.由于在此項目中所使用的是Spark而不是Arduino,是以我們需要使用Spark-IO子產品作為Johnny-Five的插件。在項目目錄中安裝Johnny-Five和Spark-IO并添加--save标志以自動将這些子產品添加到package.json檔案中:
接下來建立一個名為test.js的新檔案。這是你編寫代碼來控制Spark的地方,如例3-1所示。
例3-1 Johnny-Five的Spark測試本
①在此檔案中,你應首先調用Johnny-Five和Spark-IO子產品,并将它們設定為變量。這樣就可以通路此檔案中的Johnny-Five和Spark-IO子產品。
②初始化一個新的Johnny-Five闆。執行此操作時,你可以傳入JavaScript對象作為參數。由于我們正在使用Spark,并且将使用Spark的輸入/輸出而不是Arduino,我們将指定輸入輸出并将其設定為新的Spark()。
③現在程式已經知道要查找Spark了,但它仍然不知道如何識别你的Spark。為此,你需要将JavaScript對象作為參數傳遞給新的Spark對象。在配置Spark時注意指定token(令牌)和deviceId(裝置ID)。
“最好把通路令牌和裝置ID作為環境變量存儲進而可以把它們從源代碼中去掉。”——《Spark WiFi開發零件》
将此代碼儲存在test.js 檔案中後,繼續使用指令node test.js運作它。Spark核心闆上星星符号旁邊的藍色LED小燈(如圖3-16所示)開始有規律地閃爍。現在你的Spark就全部設定好了!切記,如果你遇到任何問題,可以檢視《Spark故障排除指南》。
注意:運作幾分鐘後Spark上的晶片會變得非常熱!
現在請拔下電池組,因為要稍微修改一下電池組的走線。
3.5 焊接電機驅動器
現在,在繼續組裝船之前,還需要進行一點焊接。現在SparkFun電機驅動器上沒有插腳,無法将其插入面包闆,需要進行焊接:
1.電機驅動器有兩排孔。将晶片朝上準備好。
從插針上面扣掉兩排八個的引腳。将這兩排插針對正驅動器兩排孔的下面。插頭引腳的短端應穿過驅動器中的孔。當兩側都裝配到位時,電機驅動器能夠像桌子一樣立住。
2.從電機驅動器的頂部将插針接頭焊接到位,如圖3-17所示。注意不要将兩個引腳焊接在一起。這會使驅動器短路并導緻其發生故障。
圖3-17 焊接電機驅動器
3.6 給小船接線
在船上有三個主要零件。第一是電機驅動器;第二是Spark核心闆;第三是電池座。這三個都将插到面包闆并彼此聯通。
- 将Spark核心闆和電機驅動器插入面包闆。它們應該很好地貼合在一起。并注意使Spark核心闆和電機驅動器都橫跨面包闆中心的分隔線,如圖3-18所示。
帶你讀《JavaScript機器人: 用Raspberry Pi、Arduino和BeagleBone建構NodeBots Make:JavaScript Robotics》之三:節點船節點船
圖3-18 Spark核心闆和電機驅動器
注意在放置Spark核心闆的時候USB接口應該朝向面包闆的外側,這樣後面連接配接的時候會友善很多。
2.将電池座連接配接到面包闆,如圖3-19所示。将電池座的紅線插入面包闆的有“+”标記的接線柱上(正極)。現在将黑色電線插入面包闆的有“-”标記的接線柱上(負極)。無論何時需要接通電源、Spark核心闆、電機驅動器或是電機、我們都可以連接配接到面包闆上的這些線路。
- 将陶瓷電容器安裝到面包闆中。陶瓷電容器可以任意方向與電源正負極相連,而其他類型電容器則有正負極性的要求。你可以将電容器了解為一種備用電源,如果用電器需要的電能超過電池可以提供的功率,電容器可以臨時充當一下能量來。
帶你讀《JavaScript機器人: 用Raspberry Pi、Arduino和BeagleBone建構NodeBots Make:JavaScript Robotics》之三:節點船節點船
圖3-19 将電池座連接配接到面包闆上(附彩圖)
Spark 核心闆可以由3.6~6.0V的外接電源供電。每節AA電池提供1.5V電壓,是以四節AA 電池組剛剛好。如果使用可充電電池的話注意一節可充電電池在電量充滿的情況下也隻有 1.2V的電壓。
- 電容器安裝好之後,就可以将電源與Spark核心闆相連。在連接配接的時候無須從電池組上引線,用跳線将面包闆的正負極連接配接到Spark上的VIN和GND引腳即可。Fritzing電路圖如圖3-19所示。
3.6.1 給電機驅動器供電
現在可以連接配接電機驅動器了。驅動闆的每個引腳都印有标簽,不過它們印在電路闆的下面。如果你從頂部看,晶片朝上,則引腳的設定如圖3-20所示。
圖3-20 電機驅動器引腳圖
給電機驅動器供電,我們需要兩個電源——一個是電池,另一個是Spark。
1.找到電機驅動器上的VM引腳。使用跳線将電池的正極連接配接到此引腳。然後,找到GND引腳,并以相同方式将其與電池負極相連。
2.在電機驅動器的VM和GND引腳之間還有另一個标記為VCC的引腳。将另一個電源連接配接到此,但注意此引腳僅能接入2.7~5.5V的電壓。
電池組要向整個電路提供電力,那麼如何保證能夠獲得足夠的電力?
解決方案是使用Spark核心闆。如果你看一下Spark,就會發現一個标有3V3的引腳,它可以提供3.3V電壓!你可以直接用跳線連接配接Spark的3V3引腳和電機驅動器的VCC引腳。
Spark有兩個3.3V引腳。一個标記為3V3,另一個标記為3V3 *。(列印出的星标非常小,是以它看起來更像是一個點。)接線的時候務必使用沒有星标的引腳!星标表示這是一個低噪聲穩壓電源軌,可能無法提供足夠電力。
3.6.2 連接配接Spark核心闆和電機驅動器
我們使用的電機驅動器可以支援兩個電機,但我們在船上隻使用一個。我們要使用的電機輸入的電機驅動器上的三個引腳是PWMA、AIN1和AIN2。要連接配接Spark和電機驅動程式,請按照下列步驟操作:
1.使用跳線将電機驅動器上的PWMA連接配接到Spark上的A0位置。這是Spark的PWM引腳之一。PWM代表脈沖寬度調制。這樣就可以調整電機旋轉的速度了。
2.将電機驅動器上的AIN1和AIN2的引腳連接配接到D0和D1上。兩個輸入引腳各自對應電機的不同旋轉方向。圖 3-21為接線的Fritzing電路圖。
脈沖寬度調制引腳
并非所有引腳都是PWM引腳。在Spark上,脈沖寬度引腳為A0、A1、A4、A5、A6、A7、D0和D1。
PWM引腳的什麼特别之處呢?大多數引腳都可以設定為打開或關閉兩種狀态。而PWM引腳的不同在于,它們可以非常快速地打開和關閉。你基本上選擇引腳的占空比,這允許對零件進行更多級别的控制。
以LED為例。如果将它連接配接到非PWM引腳,它隻能處于打開或關閉兩種狀态。如果連接配接到PWM引腳,LED會以極快的速度閃爍,就像不斷地打開和關閉一樣。根據引腳開啟的時間百分比,這會讓人感覺它變得更亮或更暗。
圖3-21 電機驅動器接線圖
3.6.3 連接配接電機
現在電機驅動器已經接好電源,并能夠從Spark核心闆接收指令了,接下來就可以連接配接我們密封在吊艙内的電機了。
-
從電機吊艙中取出一根電線,并将其連接配接到電機驅動器上的A1。将另一根電機線連接配接到A2。注意這是一個雙向電機,是以電線和引腳之間的對應關系無關緊要。
在本例中,我們隻使用一個電機吊艙為船提供動力,後面我們還會添加一個伺服系統驅動方向舵。不過,我們所使用的電機驅動器可以驅動兩個電機,你可以為你的船再加一個電機吊艙。如果你有這個打算的話,第二個電機吊艙應該接到驅動闆的B01和B02引腳,控制方向的引腳為BIN1和BIN2,控制速度的引腳為PWMB。
使用兩個電機可以獲得更快的速度,如果你把兩個電機安裝在船的兩側,還可以通過控制兩個電機的不同速度和方向來控制船的行進。
2.為確定電機正常工作,還需要進行布線。你會注意到電機驅動器有一個标有STBY的引腳。在未通電的時候,此引腳将阻止電機開啟。這個功能并不影響我們的船正常工作,是以你可以通過将此引腳連接配接到Spark的3V3引腳來有效地關閉此功能,以便始終接收電壓。圖3-22展示了Spark核心闆和電機的最終布線。
圖3-22 Spark核心闆和電機的完整布線
3.7 電機的控制:代碼
現在船上的電機線路連接配接工作已經完成,讓我們開始編碼。
本書中示例的所有源代碼都可以在GitHub上找到。
1.在項目中建立一個名為boat.js的新檔案。類似于你之前建立的test.js,需要用到Johnny-Five和Spark-IO。但是,這一次,在你準備好的事件中,你将需要執行個體化一個新的電機對象而不是一個新的LED。
2.建立新電機時,将JavaScript對象作為參數傳遞。該對象将指定我們連接配接到電機驅動器上的三個Spark引腳。你需要指定哪個是脈沖寬度子產品(pwm),哪個是正向(dir),哪個是反向(cdir)。本書中預設的接口分别是A0、D0和D1:
3.為了更友善地測試電機并從終端控制它,你還可以在boat.js檔案中添加REPL:
請記住,執行個體化電機并将其添加到REPL應該都在你準備好的事件中進行。
4.連接配接電池組并插入電池,以便測試電機。
等待Spark連接配接到WiFi,青色呼吸燈閃爍。然後使用node boat.js運作你的程式。
終端顯示出“Repl Initialized”時,Spark核心闆就可以接收指令了。沒什麼問題的話,現在你應該能夠控制電機的方向和速度!
5.你可以在終端運作m.forward()和m.reverse()以使電機在一個方向或另一個方向上旋轉。m.stop()将停止電機。而且,通過這個電機驅動器,你還可以控制電機的速度!
為此,你可以傳遞一個0~255的數字作為正向和反向函數的參數。0相當于停止,255是最高速度!
在測試電機的時候,可以通過把手放在螺旋槳後感受氣流的方向來判斷電機的轉向。如果電機反轉,有許多種辦法解決。最簡單的方法是,轉換你的代碼中的Spark核心闆的dir 和cdir 引腳。(本書中所使用的是D0 和D1引腳。)如果你想通過實體方法解決,你可以代替重新将兩根電線插入到電機驅動器的 A01和A02 引腳。
3.7.1 添加按鍵事件
現在你可以通過終端的REPL來操縱你的船,但是如果能夠使用方向鍵來控制它會更好。為此,請使用節點的keypress子產品:
按鍵子產品可以擷取按鍵事件,你可以指定要監控的按鍵。它還為你的鍵提供了友善的名稱,比如,你可以通過查找key.name ===“up”來監聽up鍵上的按鍵:
-
在代碼中需要“keypress”,并確定process.stdin将發出keypress事件。
2.在按鍵事件中,指定不同按鍵按下時所需要進行的動作。比如,“up”應該調用motor.forward(255),“down”應該調用motor.reverse(255),如例3-2所示。
例3-2 節點按鍵事件
3.按鍵子產品不會檢測按鍵彈起事件,是以使用此代碼,你的船将永遠無法停止。你需要添加另一個鍵作為制動器。空格鍵就不錯:
3.7.2 記錄按鍵狀态
使用按鍵子產品時遇到的一個問題是,如果按住某個鍵,則會一直調用與該鍵相關聯的功能,直到該鍵被釋放。這可能會導緻Spark出現錯誤并使其崩潰。為了避免這種情況,你可以将按鍵的狀态存儲在對象中,并且隻在第一次按下該鍵時調用該函數:
1.建立一個對象并将其設定為等于變量state(狀态)。鍵将是向上和向下,并将兩者的值設定為false。
2.當你在代碼中檢測到按鍵事件時,調整函數使motor.forward()和motor.reverse()函數隻有在相關的向上或向下狀态值為false時才會調用。同樣,當up或down狀态為true時,你隻需要調用motor.stop()。
3.當motor.forward()、motor. reverse(),或motor.stop()被調用時,你要確定你調整的是相應的按鍵狀态。
簡單的前進功能可以參考例3-3。
例3-3 通過鍵盤事件控制電機
3.8 船體裝配
現在我們已經完成了船隻的動力安裝并完成内部零件的安裝接線,現在可以進一步完成船的實體建構。
1.取事先準備好的兩塊泡沫塑膠,并使用熱膠槍連接配接到船的兩側,如圖3-23所示。當你安裝定位時,注意要使電機吊艙完全浸入水中,但確定你的船頂位于水面之上。
圖3-23 裝配船體
粘貼泡沫時還要注意:任何電子裝置,包括稍後将裝配到船頂的伺服電機,都必須與水隔離,否則會進水短路,你的船也将無法正常工作。你還需要確定泡沫的定位不會阻止蓋子關閉。
2.将面包闆和電池組放入作為船體的容器内,并确定要放置零件的位置。确定後,标記你希望電機吊架的電線進入船體的位置。
現在可以從船上拆下電子元件。
現在我們可以把零件都裝到船體内,或者使用重量相當的東西代替,然後檢測船體的浮力。
3.在你标記的位置鑽一個洞。根據你的船的設計,孔可以不是中心,但請記住孔的位置将會對馬達吊艙的位置有所影響。而馬達吊艙的位置必須居中,否則你的船可能會偏航。
同之前電機吊艙上鑽孔一樣,在這裡鑽的孔也要盡可能小,同時確定電機兩端的電線可以穿過它。
4.斷開電機吊艙與電機驅動器的連接配接,然後将電線穿過你在船底鑽出的孔。
5.将船倒置并将電機吊架放置在中心位置,使其朝向正确的方向。為了使電機吊艙穩定,你需要将其放置在船底部,如
圖 3-24所示。
6.将電機吊架固定到位,用矽膠或膠水密封船上的孔,確定船體完全密封。你也可以使用矽膠或膠水來固定電機,稍後你還可以進行加強。将船放在一邊靜置,等待密封膠幹燥。
圖3-24 放置電機吊艙
7.矽膠或膠水幹燥到足以使其固定時,将船正面翻轉并從内部密封孔。
一旦幹燥,如果你的電機吊艙仍在移動,請在電機吊艙和船之間添加一些熱膠以穩定它。
8.将面包闆和電池固定器放回船内,然後将電機重新連接配接到電機驅動器上。
恭喜你!現在可以測試你的船了。但是你還沒有完成。現在你的船隻能前進和後退。接下來我們将添加一個方向舵來對船進行控制。
注意:在平靜的水中(如浴缸或兒童遊泳池)對你的船隻進行測試!以免船隻出現問題時無法及時搶救。
3.9 伺服系統
為了控制船的方向舵,我們将使用伺服系統。伺服系統是一種可以控制移動角度的電機,從0°到180°。這非常适合驅動方向舵!
我們将在船上使用标準伺服系統。注意不是連續旋轉伺服(continuous-rotation servo)。連續旋轉伺服可以360°旋轉,而且所控制的不是其旋轉的角度而是旋轉的速度。
1.你的伺服電機應連接配接三根電線。這些電線的顔色可能因伺服而異,但黑色或棕色的電線為負極端。使用跳線将此電線連接配接到面包闆上的負極端。
2.伺服的中間導線應為紅色或橙色。通過面包闆将此電線連接配接到電池電源正極。伺服電機需要很大的功率,是以通常可以用外部電池電源供電。對于這艘船而言,隻要你的電池是新的,四節AA電池應足以為伺服電機、電機和Spark供電。
3.伺服系統上的第三根電線是從Spark接收輸入的線。為了使伺服系統正常工作,需要将其連接配接到PWM引腳。
注意,Spark上的PWM引腳是A0、A1、A4、A5、A6、A7、D0和D1。A0是正在使用的電動機。我們将使用A4作為伺服,如圖3-25所示。
圖3-25 最終接線,帶伺服系統(附彩圖)
由于電機連接配接到 A0,是以無法将伺服連接配接到A1。這是因為,A0 和 A1 連接配接到相同的内部零件,而且輸出相同頻率的脈沖寬度。電機和伺服系統正常工作的頻率不同,是以你需要将伺服系統接到A4引腳,以避免該沖突。如果你的船用了兩個伺服,可以将一個接到A0另一個接到A1。
3.9.1 伺服系統程式設計
現在我們已經将伺服連接配接到你的船上,接下來将它添加到你的代碼中。
1.在定義電機後,使用new five.Servo()函數初始化伺服。
2.将伺服作為參數傳遞給對象,将引腳設定為A4,因為這是伺服連接配接到Spark上的引腳。
将startAt設定為90,這将確定你的伺服在程式啟動時自動居中。如果伺服偏離中心位置,你可以稍微調整一下。
你還可以添加一個範圍來定義伺服可以轉向的最小角度和最大角度。這樣可以確定方向舵不會碰到船體,定義伺服轉向的角度時調用min()函數和max()函數。本書中将角度範圍設定為45-135,如下代碼所示:
3.在存儲向上和向下按鍵狀态的狀态對象中,你還要添加向右和向左的狀态。在按鍵事件中,你就可以監測這些按鍵,并調用servo.min()函數和servo.max()函數控制伺服機構左右偏轉(見例 3-4)。
例3-4 通過鍵盤事件控制伺服
現在我們的程式已經可以通過按鍵控制船的左右偏航,但由于按鍵監測子產品無法檢測到的按鍵擡起,是以船會一直轉向。正常來講我們不需要按其他的按鍵來使船恢複直行。你将使用時間子產品來控制按鍵時長,如例3-5所示。
例3-5 時态隊列
4.初始化timeOfDirection變量,并在按鍵事件中,每當按下右方向鍵或左方向鍵時,将其更新為Date.now()。這将允許我們檢視已經過了多長時間,并且如果不再按下鍵,則使伺服居中。
5.因為我們所使用的是Temporal子產品,是以在終端中鍵入npm install --save temporal來安裝子產品并将其儲存到package.json檔案中。
6.在就緒事件中調用temporal.queue()。這需要一個數組,并允許你指定任務何時運作以及它們是否循環。在我們的設計中,将重複一個函數,并且每100毫秒循環一次。
7.在此函數中,将timeOfDirection的值與目前時間進行比較。如果超過500毫秒,就可以确定按鍵不再被按下,并且可以使伺服中立。每當按下向右鍵或向左鍵時,確定将timeOfDirection重置為目前時間。
3.9.2 安裝方向舵
現在我們已經完成伺服系統的安裝和程式!但是,伺服系統不是方向舵。我們需要用冰棍棒改裝一個并将它連接配接到我們的伺服器上。
1.取兩根冰棒棍,将它們切成兩半并排成一行,使四個半部分接觸,形成正方形或矩形。這将是方向舵底部的鳍。
2.用四個半冰棍棒将你制作的鳍黏到一個全長冰棍棒的底部。這就是你的方向舵。
3.将沒有翅片的方向舵的末端黏合到伺服旋轉件的末端上。你的伺服可能帶有多個附件。建議使用較長的一個,這樣可以使方向舵遠離船隻,如圖 3-26所示。
4.方向舵連接配接到伺服系統之後,将伺服系統安裝在船體後部外側。根據容器蓋子的緊密程度,你可以直接将蓋子蓋在從船的内部硬體通向伺服的導線上。但是,如果電線擋住了蓋子,那麼要在船艙蓋上鑽一洞。
5.使用熱膠槍将伺服系統固定到船上。根據你使用的容器類型和船的設計外形,你可以選擇将其連接配接到主船體,蓋子的邊緣或将蓋子固定到位的夾子上。
圖3-26 方向舵和伺服
固定伺服系統時,注意確定船隻漂浮後,方向舵的主要部分要完全浸沒在水中。還要確定方向舵居中,否則會很控制船。
注意,伺服不具備防水能力!做好防水工作,否則伺服系統将會失靈。許多伺服都貼有标簽。固定黏接伺服系統時,注意盡可能避開标簽。否則,伺服可能會在你最不期望的時候在标簽貼紙處脫落!
3.10 啟航
現在方向舵已經安裝好了,船可以下水了!把它放在遊泳池裡,或者僅僅放在浴缸中,然後讓它前行!
你也随意裝飾你的船,讓它擁有百變的造型,見圖3-27。
圖3-27 成品船
3.11 進一步探索
現在你有一個完整的船,你可以添加更多的功能或嘗試其他方法來控制它!
比如,你可以嘗試以下任何一個或全部:
在船底添加一個水傳感器,進水時就會發出預警信号。
使用帶有加速度計的裝置(例如Sphero)操縱船隻。
安裝第二個電機吊艙并通過調節兩個吊艙之間的速度來轉向。
程式設計來控制更精細的轉彎。
添加加速和減速功能。
添加聲呐實作自動駕駛。
安裝可以用程式控制的LED彩燈,發送不同的指令彩燈将呈現不同的顔色。
創意有無限的可能,而每一個創意都是獨一無二的,我們期待着你的作品,可以将你的作品照片發送到我們的推特@NodeBoats(
http://twitter.com/nodeboats),祝你玩得開心!