器人制作全攻略)
1. 從一堆零件到會(huì)跳舞的機(jī)器人Otto DIY的樂(lè)趣與挑戰(zhàn)如果你和我一樣對(duì)桌面上的小玩意兒總有種“拆開(kāi)看看”的沖動(dòng)或者看著那些會(huì)動(dòng)的小機(jī)器人心里癢癢那“Otto DIY”絕對(duì)是你不能錯(cuò)過(guò)的項(xiàng)目。它不像樂(lè)高那樣按圖索驥也不像買(mǎi)成品玩具那樣開(kāi)箱即玩。Otto的魅力在于你親手將一堆看似毫無(wú)關(guān)聯(lián)的電子元件——幾塊亞克力板、幾個(gè)舵機(jī)、一個(gè)Arduino主板——組裝成一個(gè)有模有樣的小機(jī)器人然后通過(guò)編程賦予它生命讓它走路、跳舞、甚至躲避障礙。這個(gè)過(guò)程充滿(mǎn)了從無(wú)到有的創(chuàng)造快感和解決問(wèn)題的成就感。而今天我們要聊的是在這個(gè)基礎(chǔ)上再加點(diǎn)“魔法”用你家里那個(gè)可能已經(jīng)積灰的電視機(jī)紅外遙控器來(lái)無(wú)線控制你的Otto機(jī)器人。想象一下不用連著電腦按一下遙控器你的小Otto就開(kāi)始跳起你編好的舞蹈或者執(zhí)行復(fù)雜的動(dòng)作序列這體驗(yàn)可比單純用串口指令酷多了。這個(gè)項(xiàng)目的核心其實(shí)就是將“紅外遙控”這個(gè)古老但極其穩(wěn)定的無(wú)線技術(shù)與“開(kāi)源機(jī)器人平臺(tái)”結(jié)合起來(lái)。它不涉及復(fù)雜的藍(lán)牙配對(duì)或Wi-Fi配置成本極低一個(gè)紅外接收頭不到一塊錢(qián)卻能讓你的項(xiàng)目互動(dòng)性大增。無(wú)論你是想給孩子做一個(gè)有趣的科教玩具還是自己探索嵌入式開(kāi)發(fā)和機(jī)器人控制的入門(mén)亦或是想為你的創(chuàng)客作品增加一個(gè)簡(jiǎn)單可靠的控制方式這個(gè)“Otto DIY with IR Remote”的組合都是一個(gè)絕佳的起點(diǎn)。接下來(lái)我會(huì)帶你從零開(kāi)始完整走一遍制作流程并分享那些只有真正動(dòng)手做過(guò)才會(huì)知道的細(xì)節(jié)和坑。2. 項(xiàng)目核心物料清單與選型邏輯動(dòng)手之前理清你需要什么以及為什么需要它比盲目購(gòu)買(mǎi)更重要。Otto DIY本身有很多版本和變體為了配合紅外遙控我們需要一個(gè)基礎(chǔ)且擴(kuò)展性好的配置。2.1 主控板為什么是Arduino NanoOtto機(jī)器人官方推薦過(guò)Arduino Nano、Uno、Pro Mini等多種板卡。對(duì)于紅外遙控項(xiàng)目我強(qiáng)烈建議使用Arduino Nano。原因有三點(diǎn)尺寸與功耗Nano板型小巧能輕松塞進(jìn)Otto的頭部或身體結(jié)構(gòu)里為其他傳感器預(yù)留空間。其功耗也相對(duì)較低適合電池供電。引腳資源Nano擁有足夠的數(shù)字IO口來(lái)驅(qū)動(dòng)4個(gè)舵機(jī)Otto的腿和連接紅外接收器。經(jīng)典的Otto需要4個(gè)舵機(jī)控制兩條腿的髖關(guān)節(jié)和膝關(guān)節(jié)。成本與生態(tài)Nano價(jià)格低廉引腳布局標(biāo)準(zhǔn)網(wǎng)上有海量的教程和庫(kù)支持遇到問(wèn)題容易找到解決方案。當(dāng)然你也可以使用功能更強(qiáng)大的ESP32它自帶Wi-Fi和藍(lán)牙但對(duì)于“紅外遙控”這個(gè)單一需求來(lái)說(shuō)ESP32顯得有些“殺雞用牛刀”其復(fù)雜的電源管理和相對(duì)較大的體積對(duì)于Otto的小身板可能是個(gè)負(fù)擔(dān)。因此Arduino Nano是這個(gè)項(xiàng)目性?xún)r(jià)比和易用性平衡的最佳選擇。2.2 動(dòng)力核心舵機(jī)的選擇與參數(shù)解讀舵機(jī)是Otto能動(dòng)的關(guān)節(jié)選錯(cuò)了它要么無(wú)力要么抖得厲害。你需要4個(gè)微型舵機(jī)常見(jiàn)的是SG90或MG90S。SG90塑料齒輪扭矩約1.5kg/cm價(jià)格極其便宜。適合初版驗(yàn)證和輕量級(jí)動(dòng)作。缺點(diǎn)是塑料齒輪不耐沖擊長(zhǎng)時(shí)間運(yùn)行或卡住時(shí)容易掃齒。MG90S金屬齒輪扭矩約2.0kg/cm。價(jià)格稍高但耐用性遠(yuǎn)超SG90。對(duì)于需要穩(wěn)定、長(zhǎng)期運(yùn)行的Otto我強(qiáng)烈推薦MG90S。多花幾塊錢(qián)能避免你因?yàn)橐粋€(gè)齒輪損壞而不得不拆開(kāi)整個(gè)機(jī)器人的沮喪。這里有個(gè)關(guān)鍵參數(shù)工作電壓。大多數(shù)這類(lèi)舵機(jī)標(biāo)稱(chēng)電壓是4.8V-6.0V。如果你直接用5V的USB供電或者穩(wěn)壓模塊供電問(wèn)題不大。但如果你打算用電池如18650鋰電池標(biāo)稱(chēng)3.7V滿(mǎn)電4.2V直接供電會(huì)導(dǎo)致舵機(jī)速度慢、無(wú)力。這時(shí)你需要一個(gè)升壓模塊如MT3608將電池電壓穩(wěn)定升壓到5V或6V再給舵機(jī)供電。而Arduino Nano的VIN引腳可以接受5V-12V輸入其板載穩(wěn)壓器會(huì)為MCU提供穩(wěn)定的5V。所以一個(gè)合理的供電方案是電池-升壓模塊輸出5V/6V-同時(shí)給舵機(jī)和Nano的VIN引腳供電。2.3 感知“指令”紅外接收模塊紅外接收頭通常是一個(gè)三引腳的小黑塊常見(jiàn)型號(hào)是VS1838B或HS0038。它們的作用是接收紅外遙控器發(fā)出的、調(diào)制在38kHz載波上的信號(hào)并解調(diào)成數(shù)字信號(hào)輸出給Arduino。你只需要一個(gè)連接非常簡(jiǎn)單VCC接5VGND接GNDOUT或DAT接一個(gè)數(shù)字引腳比如D11。注意接收頭對(duì)電源噪聲比較敏感盡量在其VCC和GND引腳附近并聯(lián)一個(gè)10uF-100uF的電解電容可以顯著提高接收穩(wěn)定性避免誤觸發(fā)。2.4 結(jié)構(gòu)骨架機(jī)身與連接件你可以選擇激光切割的亞克力板套件也可以自己用3D打印。亞克力板美觀但較脆螺絲孔位容易開(kāi)裂3D打印建議用PLA材料韌性更好可以自定義設(shè)計(jì)。無(wú)論哪種都需要準(zhǔn)備相應(yīng)的螺絲M2或M3規(guī)格、螺母和銅柱。一個(gè)小技巧在組裝舵機(jī)到結(jié)構(gòu)件上之前先用舵機(jī)測(cè)試器或一段簡(jiǎn)單的Arduino代碼將每個(gè)舵機(jī)轉(zhuǎn)到90度位置中立位然后再安裝舵臂。這能確保你組裝出來(lái)的Otto初始姿態(tài)是站直的為后續(xù)編程省去很多調(diào)校的麻煩。2.5 完整物料清單基于以上分析一份穩(wěn)妥的清單如下Arduino Nano 開(kāi)發(fā)板 x1MG90S 金屬齒輪舵機(jī) x4紅外接收模塊VS1838Bx1Otto機(jī)器人結(jié)構(gòu)件套件亞克力或3D打印x1套M3*6mm螺絲、螺母、銅柱 若干18650鋰電池及電池盒 x15V升壓模塊MT3608x1杜邦線公對(duì)公、公對(duì)母若干通用紅外遙控器電視、空調(diào)遙控器均可x1微型開(kāi)關(guān)用于電源總控x1可選超聲波傳感器HC-SR04用于后續(xù)避障擴(kuò)展、蜂鳴器用于添加音效3. 硬件組裝從散件到雛形的關(guān)鍵步驟組裝過(guò)程是機(jī)械和電子的結(jié)合順序很重要。錯(cuò)誤的組裝順序可能導(dǎo)致最后無(wú)法接線或調(diào)試。3.1 結(jié)構(gòu)件預(yù)處理與舵機(jī)安裝首先處理好你的結(jié)構(gòu)件。如果是亞克力板小心地將各部件從板上取下用細(xì)砂紙輕輕打磨切割邊緣的毛刺防止劃傷手或電線。如果是3D打印件檢查所有軸孔和螺絲孔是否暢通必要時(shí)用合適尺寸的鉆頭或螺絲刀手動(dòng)清理一下。接下來(lái)是核心——安裝舵機(jī)。以一條腿為例將舵機(jī)放入腿部的舵機(jī)槽。通常槽的設(shè)計(jì)是緊配合可能需要稍微用力按壓。確保舵機(jī)輸出軸對(duì)準(zhǔn)結(jié)構(gòu)件上的孔。關(guān)鍵步驟設(shè)定舵機(jī)初始角。不要急著上螺絲。用杜邦線將舵機(jī)臨時(shí)連接到Arduino Nano紅線接5V黑線接GND黃線接一個(gè)PWM引腳如D9。上傳一段簡(jiǎn)單的測(cè)試代碼讓該舵機(jī)轉(zhuǎn)動(dòng)到90度。#include Servo.h Servo myservo; void setup() { myservo.attach(9); // 連接在引腳9 myservo.write(90); // 轉(zhuǎn)到90度位置 delay(2000); } void loop() {}在舵機(jī)處于90度位置時(shí)將隨舵機(jī)附帶的舵臂通常是十字或一字形安裝到輸出軸上。對(duì)于Otto通常讓舵臂處于與舵機(jī)本體垂直的狀態(tài)。然后用配套的小螺絲固定舵臂?,F(xiàn)在將帶有舵臂的舵機(jī)用提供的螺絲固定在結(jié)構(gòu)件上。擰緊螺絲但注意不要過(guò)度用力導(dǎo)致亞克力板開(kāi)裂或3D打印件滑絲。重復(fù)以上過(guò)程安裝好四個(gè)舵機(jī)兩條腿每條腿的髖關(guān)節(jié)和膝關(guān)節(jié)。3.2 電路連接構(gòu)建可靠的神經(jīng)系統(tǒng)電路連接的原則是電源優(yōu)先信號(hào)其次布局清晰。電源總線這是最易出錯(cuò)的地方。取一塊小面包板或直接焊接建立兩條公共線路5V正極VCC和地GND。你的升壓模塊的5V輸出端接到這個(gè)VCC總線上GND接到GND總線。Arduino Nano的VIN引腳接VCC總線注意是VIN不是5V引腳GND接GND總線。微型開(kāi)關(guān)串聯(lián)在電池正極和升壓模塊輸入之間用于控制總電源。舵機(jī)連接4個(gè)舵機(jī)的紅線正極都接到VCC總線黑線負(fù)極都接到GND總線。舵機(jī)的信號(hào)線黃線或橙線分別連接到Arduino Nano的四個(gè)PWM引腳。我常用的配置是左髖 D5左膝 D6右髖 D9右膝 D10。務(wù)必在VCC總線靠近舵機(jī)群的位置并聯(lián)一個(gè)至少100uF的電解電容用于吸收舵機(jī)突然啟動(dòng)或停止時(shí)產(chǎn)生的電流沖擊防止電壓驟降導(dǎo)致Arduino復(fù)位。紅外接收頭連接其VCC接VCC總線GND接GND總線OUT引腳接Arduino的任意數(shù)字引腳例如D11。同樣在接收頭本身的VCC和GND引腳間并聯(lián)一個(gè)10uF電容。最終檢查連接完成后對(duì)照電路圖哪怕是自己手畫(huà)的仔細(xì)檢查三遍有沒(méi)有短路特別是VCC和GND所有正負(fù)極是否正確信號(hào)線是否接對(duì)了引腳確認(rèn)無(wú)誤后再接通電源。3.3 機(jī)身總裝與走線管理將安裝好舵機(jī)的腿部結(jié)構(gòu)通過(guò)螺絲和銅柱與Otto的身體通常是承載Arduino的主板部分連接。連接時(shí)注意舵機(jī)線的走向盡量讓線從結(jié)構(gòu)內(nèi)部或預(yù)留的線槽中穿過(guò)避免外露被關(guān)節(jié)夾住。可以用一點(diǎn)點(diǎn)扎帶或膠帶固定線束。將Arduino Nano、升壓模塊、紅外接收頭用雙面膠或熱熔膠固定在身體內(nèi)部空余位置。確保所有連接牢固不會(huì)因?yàn)闄C(jī)器人運(yùn)動(dòng)而松脫。最后裝上頭部裝飾件。一個(gè)完整的Otto機(jī)器人硬件部分就搭建完成了。4. 軟件編程讓Otto聽(tīng)懂遙控器的語(yǔ)言硬件是身體軟件是靈魂。這部分我們將編寫(xiě)Arduino代碼實(shí)現(xiàn)紅外信號(hào)解碼和舵機(jī)動(dòng)作控制。4.1 開(kāi)發(fā)環(huán)境搭建與核心庫(kù)介紹首先確保你安裝了Arduino IDE。我們需要兩個(gè)核心庫(kù)IRremote庫(kù)用于解碼紅外信號(hào)。在Arduino IDE的“工具”-“管理庫(kù)”中搜索“IRremote”選擇由“Arduino-IRremote”或“shirriff”維護(hù)的版本進(jìn)行安裝。這個(gè)庫(kù)封裝了紅外接收、解碼和發(fā)送的復(fù)雜操作讓我們用幾行代碼就能讀取遙控器按鍵。Servo庫(kù)這是Arduino內(nèi)置庫(kù)用于控制舵機(jī)。無(wú)需額外安裝。4.2 紅外信號(hào)解碼與按鍵映射每個(gè)紅外遙控器的每個(gè)按鍵都會(huì)發(fā)射一個(gè)獨(dú)特的編碼通常是NEC、Sony、RC5等格式。我們的第一步是“學(xué)習(xí)”遙控器的編碼。編寫(xiě)一個(gè)簡(jiǎn)單的解碼程序并上傳到Nano#include IRremote.h const int RECV_PIN 11; // 紅外接收頭連接的引腳 IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // 啟動(dòng)紅外接收 Serial.println(紅外解碼器就緒請(qǐng)按下遙控器按鍵...); } void loop() { if (irrecv.decode(results)) { Serial.print(解碼類(lèi)型: ); Serial.print(results.decode_type, HEX); Serial.print(, 解碼值: ); Serial.println(results.value, HEX); // 以16進(jìn)制打印按鍵值 irrecv.resume(); // 準(zhǔn)備接收下一個(gè)信號(hào) } }打開(kāi)串口監(jiān)視器波特率設(shè)為9600用遙控器對(duì)準(zhǔn)紅外接收頭按下你計(jì)劃使用的按鍵如方向鍵、數(shù)字鍵。串口會(huì)打印出類(lèi)似解碼類(lèi)型: 1, 解碼值: FF629D的信息。記錄下每個(gè)按鍵對(duì)應(yīng)的16進(jìn)制值。這個(gè)值就是該按鍵的“身份證”。4.3 舵機(jī)控制與動(dòng)作函數(shù)封裝控制Otto走路、跳舞本質(zhì)是精確控制4個(gè)舵機(jī)在特定時(shí)間序列內(nèi)轉(zhuǎn)動(dòng)到特定角度。直接在主循環(huán)里寫(xiě)角度序列會(huì)非?;靵y。好的做法是封裝成函數(shù)。初始化與舵機(jī)對(duì)象定義#include Servo.h Servo hipLeft, kneeLeft, hipRight, kneeRight; // 定義四個(gè)舵機(jī)對(duì)象 const int HL_PIN 5, KL_PIN 6, HR_PIN 9, KR_PIN 10; // 引腳定義 void setupServos() { hipLeft.attach(HL_PIN); kneeLeft.attach(KL_PIN); hipRight.attach(HR_PIN); kneeRight.attach(KR_PIN); homePosition(); // 調(diào)用歸中函數(shù) } void homePosition() { hipLeft.write(90); kneeLeft.write(90); hipRight.write(90); kneeRight.write(90); delay(500); // 給舵機(jī)時(shí)間轉(zhuǎn)到位置 }封裝一個(gè)簡(jiǎn)單的步行動(dòng)作走路是一個(gè)周期性動(dòng)作。我們可以寫(xiě)一個(gè)函數(shù)讓Otto完成一步。void takeStepForward() { // 階段1重心移到右腿左腿抬起 hipLeft.write(70); // 左髖后擺 kneeLeft.write(110); // 左膝微曲準(zhǔn)備抬起 delay(200); kneeLeft.write(130); // 左膝進(jìn)一步彎曲腳離地 delay(200); // 階段2身體前移 hipRight.write(110); // 右髖前擺推動(dòng)身體向前 hipLeft.write(90); // 左髖回中 delay(200); // 階段3左腿放下重心轉(zhuǎn)移 kneeLeft.write(90); // 左腿放下 delay(200); // 階段4右腿抬起準(zhǔn)備下一步對(duì)稱(chēng)動(dòng)作 // ... 此處省略對(duì)稱(chēng)的右腿動(dòng)作代碼 homePosition(); delay(300); }注意上面的角度值70, 110, 130等需要根據(jù)你實(shí)際組裝中舵機(jī)的安裝方向、舵臂角度進(jìn)行大量調(diào)試。沒(méi)有一個(gè)標(biāo)準(zhǔn)值能適用于所有組裝。這就是DIY的必經(jīng)之路——反復(fù)測(cè)試和微調(diào)。4.4 主程序邏輯將紅外指令與動(dòng)作綁定現(xiàn)在我們將紅外解碼和動(dòng)作控制結(jié)合起來(lái)。在主程序循環(huán)中持續(xù)監(jiān)聽(tīng)紅外信號(hào)一旦檢測(cè)到預(yù)先映射的按鍵值就觸發(fā)對(duì)應(yīng)的動(dòng)作函數(shù)。#include IRremote.h #include Servo.h // ... 引腳定義、舵機(jī)對(duì)象、初始化函數(shù)、動(dòng)作函數(shù)如takeStepForward, turnLeft, dance等在此處定義 const long IR_KEY_UP 0xFF629D; // 示例上箭頭鍵值 const long IR_KEY_DOWN 0xFFA857; // 示例下箭頭鍵值 const long IR_KEY_LEFT 0xFF22DD; // 示例左箭頭鍵值 const long IR_KEY_RIGHT 0xFFC23D; // 示例右箭頭鍵值 const long IR_KEY_OK 0xFF02FD; // 示例OK鍵值 IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); setupServos(); // 初始化舵機(jī)并歸位 irrecv.enableIRIn(); Serial.println(Otto IR Remote Control Ready!); } void loop() { if (irrecv.decode(results)) { Serial.println(results.value, HEX); // 調(diào)試用可注釋掉 switch(results.value) { case IR_KEY_UP: takeStepForward(); break; case IR_KEY_DOWN: takeStepBackward(); // 需要你實(shí)現(xiàn)后退函數(shù) break; case IR_KEY_LEFT: turnLeft(); // 需要你實(shí)現(xiàn)左轉(zhuǎn)函數(shù) break; case IR_KEY_RIGHT: turnRight(); // 需要你實(shí)現(xiàn)右轉(zhuǎn)函數(shù) break; case IR_KEY_OK: performDance(); // 執(zhí)行一段編排好的舞蹈 break; // 可以添加更多按鍵映射 default: // 對(duì)于未定義的按鍵可以忽略或蜂鳴提示 break; } irrecv.resume(); // 至關(guān)重要重新開(kāi)始接收 } // 這里可以添加其他非阻塞任務(wù)比如超聲波避障檢測(cè) }這樣一個(gè)通過(guò)紅外遙控控制Otto機(jī)器人基本運(yùn)動(dòng)的主程序框架就完成了。上傳代碼到Arduino Nano斷開(kāi)USB線用電池供電拿起遙控器你的Otto就應(yīng)該能響應(yīng)指令了。5. 調(diào)試、優(yōu)化與進(jìn)階玩法代碼跑起來(lái)只是第一步讓Otto動(dòng)作流暢、穩(wěn)定才是真正的挑戰(zhàn)。5.1 舵機(jī)抖動(dòng)與電源噪聲排查你可能會(huì)遇到舵機(jī)在靜止時(shí)嗡嗡作響或輕微抖動(dòng)。這通常是電源問(wèn)題或信號(hào)干擾。癥狀舵機(jī)到達(dá)指定角度后不停抖動(dòng)發(fā)出“滋滋”聲。排查與解決電源容量不足這是最常見(jiàn)原因。多個(gè)舵機(jī)同時(shí)運(yùn)動(dòng)時(shí)瞬時(shí)電流很大可能超過(guò)升壓模塊或電池的供電能力。解決方法使用容量更大的電池如兩節(jié)18650并聯(lián)或選擇持續(xù)輸出電流更大的升壓模塊至少2A以上。電源線太細(xì)或太長(zhǎng)細(xì)長(zhǎng)的導(dǎo)線電阻大導(dǎo)致舵機(jī)端的電壓下降。盡量使用粗短的導(dǎo)線連接電源總線到舵機(jī)。未使用濾波電容務(wù)必在VCC總線靠近舵機(jī)群的位置和紅外接收頭旁邊加上電解電容如前文所述。軟件消抖在Servo.write()函數(shù)后可以嘗試添加一個(gè)極短的延時(shí)delay(5)有時(shí)能緩解由MCU信號(hào)微小波動(dòng)引起的抖動(dòng)。5.2 紅外接收不靈敏或誤觸發(fā)癥狀遙控器要對(duì)得很準(zhǔn)才有反應(yīng)或者偶爾自己觸發(fā)動(dòng)作。排查與解決供電與電容確保紅外接收頭供電穩(wěn)定5V且并聯(lián)了10uF電容。引腳干擾嘗試更換紅外接收頭的信號(hào)引腳避開(kāi)那些可能產(chǎn)生PWM干擾的引腳如D3, D5, D6, D9, D10, D11。雖然我們用了其中一些控制舵機(jī)但可以試試將紅外接到D2、D4、D7、D8等數(shù)字引腳。環(huán)境光干擾強(qiáng)烈的日光燈或自然光可能包含紅外成分??梢越o接收頭套上一小段黑色熱縮管或使用不透明的外殼遮擋。庫(kù)函數(shù)調(diào)用確保在每次irrecv.decode()之后都調(diào)用了irrecv.resume()否則庫(kù)無(wú)法接收下一個(gè)信號(hào)。5.3 動(dòng)作平滑性與軌跡規(guī)劃直接讓舵機(jī)從A角度轉(zhuǎn)到B角度動(dòng)作會(huì)顯得生硬??梢酝ㄟ^(guò)分段移動(dòng)來(lái)實(shí)現(xiàn)平滑。void smoothMove(Servo servo, int targetAngle, int stepDelay 15) { int currentAngle servo.read(); int step (targetAngle currentAngle) ? 1 : -1; for (int angle currentAngle; angle ! targetAngle; angle step) { servo.write(angle); delay(stepDelay); // 延遲越小運(yùn)動(dòng)越快 } servo.write(targetAngle); // 確保到達(dá)目標(biāo) }在動(dòng)作函數(shù)中調(diào)用smoothMove(hipLeft, 70, 20)來(lái)代替直接的hipLeft.write(70)動(dòng)作會(huì)柔和很多。你可以為每個(gè)舵機(jī)的每個(gè)動(dòng)作階段設(shè)計(jì)不同的目標(biāo)角度和步進(jìn)延遲來(lái)創(chuàng)造出更擬人、更復(fù)雜的步態(tài)或舞蹈。5.4 項(xiàng)目擴(kuò)展從遙控到“自治”一旦紅外遙控玩熟了你可以很容易地?cái)U(kuò)展Otto的能力增加超聲波避障在頭部加裝HC-SR04模塊。在主循環(huán)中當(dāng)沒(méi)有紅外指令時(shí)持續(xù)測(cè)量前方距離。如果距離小于設(shè)定閾值如10厘米自動(dòng)觸發(fā)一個(gè)后退轉(zhuǎn)彎的動(dòng)作實(shí)現(xiàn)簡(jiǎn)單的自主避障。這時(shí)紅外遙控就變成了一個(gè)高級(jí)干預(yù)手段。添加聲音反饋連接一個(gè)無(wú)源蜂鳴器??梢詾椴煌膭?dòng)作開(kāi)始、結(jié)束、遇到障礙配上不同的簡(jiǎn)短音效讓互動(dòng)更有趣。使用tone()函數(shù)可以輕松實(shí)現(xiàn)。設(shè)計(jì)更復(fù)雜的動(dòng)作序列將舞蹈動(dòng)作編排成數(shù)組例如int danceRoutine[][4] {{90,100,90,80}, {85,110,95,75}, ...}每一行代表四個(gè)舵機(jī)在某一時(shí)刻的角度。通過(guò)循環(huán)播放這個(gè)數(shù)組就能實(shí)現(xiàn)復(fù)雜的編舞。紅外遙控的按鍵可以用來(lái)切換不同的舞蹈序列。從一堆散件開(kāi)始到最終一個(gè)聽(tīng)從你指尖命令翩翩起舞的小機(jī)器人“Otto DIY with IR Remote”這個(gè)項(xiàng)目貫穿了機(jī)械結(jié)構(gòu)、電子電路、嵌入式編程和問(wèn)題調(diào)試的全過(guò)程。它帶給你的不僅僅是一個(gè)玩具更是一套解決問(wèn)題的思維方法和動(dòng)手實(shí)現(xiàn)的自信。當(dāng)你按下遙控器看著自己親手打造的Otto做出第一個(gè)動(dòng)作時(shí)那種成就感是無(wú)可替代的。最重要的是這個(gè)平臺(tái)是開(kāi)放的你的想象力是它唯一的邊界。