---
# System prepended metadata

title: Maker 異想世界期末專題

---

# 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，都是透過不斷的討論、嘗試和搜尋網路的資料才完成的，所以這部份讓我印象比較深刻。
    在未來我希望能增加定位功能，讓機器人能在最短的距離打掃到最大的面積，並且能設定清潔後到定點停放。
