# Maker 異想世界期末專題 ### **課程名稱**:Maker 異想世界 * **產品名稱**: 智慧掃拖機器人 * **作品功能**: 1. 全自動掃拖 : 自動感應障礙物,進行規避並從其他方向行進 2. 拆裝式用具 : 可替換式清理用具,乾or溼除塵紙或抹布 3. 車型小巧 : 可穿梭於許多狹窄處,清理暗處 * **設備材料**: | 數量 | 設備 |數量 | 設備 | |:--------:| ---- | --- |:--- | | ESP32 | 1個 |杜邦線|數條| | TT馬達 | 2個 |抹布|1塊| | L298N | 1個 |木板|1片| | 麵包板 | 1片 |前輪|兩顆 | | 充電電池 | 2顆 | 後輪 | 1顆| | 螺絲 | 數顆 | 銅柱 |數條| * **製作進程**: 1. 設定主題 : 規劃作品主題,討論一致要以掃拖機器人呈現 2. 設計車體 : 討論掃地機器人的外觀車型,討論幾回合並開始著手設計 3. 程式編寫 : 設計掃拖機器人程式,以腦中想法設計雛形 4. 組裝接線 : 素材組裝,規劃合理硬體位置 5. 測試執行 : 測試硬軟體,並改進和排錯 6. 成果展現 * **程式碼**: ```c //設定馬達、超音波連接腳位和輸出、輸入 #include<Wire.h> long randNumber; const byte MotorA1 =33 ; //輸出至 L298N 模組 IN1 const byte MotorA2 =32 ; //輸出至 L298N 模組 IN2 const byte MotorA3 =2 ; //輸出至 L298N 模組 IN3 const byte MotorA4 =4 ; //輸出至 L298N 模組 IN4 int Trig=12; int Echo=14; #include<analogWrite.h> void setup() { // put your setup code here, to run once: Serial.begin(115200); pinMode(Trig,OUTPUT); pinMode(Echo,INPUT); pinMode(MotorA1, OUTPUT); pinMode(MotorA2, OUTPUT); pinMode(MotorA3, OUTPUT); pinMode(MotorA4, OUTPUT); } void loop() { // 超音波讀取數值 float EchoTime,CMValue; digitalWrite(Trig,LOW); delayMicroseconds(5); digitalWrite(Trig,HIGH); delayMicroseconds(10); digitalWrite(Trig,LOW); EchoTime=pulseIn(Echo,HIGH); CMValue=EchoTime/29.4/2; Serial.println(CMValue); delay(50); //當超音波距離大於15公分時機器人向前移動(左、右馬達皆為正轉) if(CMValue>=15){ analogWrite(MotorA1, 120); //正轉 analogWrite(MotorA2, 0); analogWrite(MotorA3, 0); //正轉 analogWrite(MotorA4, 120); delay(2000); } //當超音波距離小於15公分時讓機器人隨機轉彎 else if(CMValue<15){ randNumber = random(1,5); if(randNumber==1){ analogWrite(MotorA1,0); //反轉 analogWrite(MotorA2,120); analogWrite(MotorA3,120); //反轉 analogWrite(MotorA4,0); delay(1000); analogWrite(MotorA1,120); //正轉 analogWrite(MotorA2,0); analogWrite(MotorA3,0); //停止 analogWrite(MotorA4,0); delay(1000); } else if(randNumber==2){ analogWrite(MotorA1,0); //反轉 analogWrite(MotorA2,120); analogWrite(MotorA3,120); //反轉 analogWrite(MotorA4,0); delay(1000); analogWrite(MotorA1,0); //停止 analogWrite(MotorA2,0); analogWrite(MotorA3,0); //正轉 analogWrite(MotorA4,120); delay(1000); } else if(randNumber==3){ analogWrite(MotorA1,0); //反轉 analogWrite(MotorA2,120); analogWrite(MotorA3,120); //反轉 analogWrite(MotorA4,0); delay(1000); analogWrite(MotorA1,0); //停止 analogWrite(MotorA2,0); analogWrite(MotorA3,0); //正轉 analogWrite(MotorA4,120); delay(2000); } else if(randNumber==4){ analogWrite(MotorA1,0); //反轉 analogWrite(MotorA2,120); analogWrite(MotorA3,120); //反轉 analogWrite(MotorA4,0); delay(1000); analogWrite(MotorA1,0); //停止 analogWrite(MotorA2,0); analogWrite(MotorA3,0); //正轉 analogWrite(MotorA4,120); delay(2000); } } } ``` * **成品展現** : ![](https://i.imgur.com/29KFuNr.jpg) ![](https://i.imgur.com/fE6dNXu.jpg) ![](https://i.imgur.com/Hn8KD8v.jpg) * **影片(YouTube連結)**: https://youtu.be/7oPg_hzjpFg * **反思與精進** : 在這次的專題中,我主要負責程式設計的部分,專題使用到的程式不困難,但主要困難的點在軟硬體的結合,我們一直嘗試調整不同的速度與設定轉彎的距離,讓機器人能盡可能清潔範圍內大部分地面且部會被障礙物卡住,而較有成就感的部分是和組員討論出船型開關和L298N供電給ESP32,都是透過不斷的討論、嘗試和搜尋網路的資料才完成的,所以這部份讓我印象比較深刻。 在未來我希望能增加定位功能,讓機器人能在最短的距離打掃到最大的面積,並且能設定清潔後到定點停放。