# 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);
}
}
}
```
* **成品展現** :



* **影片(YouTube連結)**:
https://youtu.be/7oPg_hzjpFg
* **反思與精進** :
在這次的專題中,我主要負責程式設計的部分,專題使用到的程式不困難,但主要困難的點在軟硬體的結合,我們一直嘗試調整不同的速度與設定轉彎的距離,讓機器人能盡可能清潔範圍內大部分地面且部會被障礙物卡住,而較有成就感的部分是和組員討論出船型開關和L298N供電給ESP32,都是透過不斷的討論、嘗試和搜尋網路的資料才完成的,所以這部份讓我印象比較深刻。
在未來我希望能增加定位功能,讓機器人能在最短的距離打掃到最大的面積,並且能設定清潔後到定點停放。