---
# System prepended metadata

title: 2023第一屆創客松營隊

---

# 2023第一屆創客松營隊

### :car:循跡避障自走車

#### Step1 環境安裝
[Arduino IDE 2.0.3]a(https://www.arduino.cc/en/software)
![](https://i.imgur.com/fodOlDp.png)


---

#### Step2 硬體認識
##### Arduino UNO
![](https://i.imgur.com/QbrV0Gl.png)
腳位功能
![](https://i.imgur.com/XvU6cmy.png)
##### 麵包板
![](https://i.imgur.com/dJcEaMC.png)
##### 線材
杜邦線
![](https://i.imgur.com/35vvzhm.png)
##### 被動／主動元件
![](https://i.imgur.com/zY2cu5z.png)


---

#### Step3 Blink
##### 接線
LED電阻很小->直接用導線接->電流過大->LED燒掉
:::success
如何使用電阻？
* [如何挑選 LED 用的電阻](https://www.digikey.tw/zh/blog/atm-how-to-select-a-resistor-for-an-led)
* [LED與電阻的必學之術](https://www.lazytomatolab.com/as-06/)
* [電阻器色碼計算](https://shop.mirotek.com.tw/arduino/start/a100021/)
![](https://i.imgur.com/ZcyaZcc.png)
:::
##### 接線
![](https://i.imgur.com/vXWSokn.png)
##### 程式
```cpp=
void setup() {
 pinMode(3, OUTPUT);  //設定Pin3為輸出腳位
}

void loop() {
 digitalWrite(3, HIGH);  //Pin3高電位(5V)
 delay(1000);  //延遲1秒
 digitalWrite(3, LOW);  //Pin3低電位(0V)
 delay(1000);  //延遲1秒
}
```


---

#### Step4 紅綠燈條件判斷
##### Parking Sensor
``` cpp=
// 設定腳位
int led1 = 3; 
int led2 = 4;
int trigPin = 11;
int echoPin = 12;
long duration, cm;

void setup() {
  Serial.begin(9600);
  pinMode(led1, OUTPUT); // 設定led1為輸出腳位
  pinMode(led2, OUTPUT); // 設定led2為輸出腳位
  pinMode(trigPin, OUTPUT); // 設定trigPin為輸出腳位
  pinMode(echoPin, INPUT); // 設定echoPin為輸出腳位
}

void loop() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH); // trigPin發射
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  pinMode(echoPin, INPUT); // echoPin接收
  duration = pulseIn(echoPin, HIGH); // 當echoPin收到訊號 設為HIGH

  cm = (duration/2) / 29.1;
  
  if(cm < 15){
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW);
  } else{
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
  }

  delay(250);
}

```
##### 按鈕
```cpp=
const int BUTTON_PIN = 7;  // 按鍵的接腳
const int LED_PIN =  3;   // LED燈的接腳

int buttonState = 0;   // 按鈕的狀態

void setup() {
  pinMode(LED_PIN, OUTPUT);   //設定LED的PIN腳為輸出
  pinMode(BUTTON_PIN, INPUT); //設定按鈕的接腳為輸入，因為我們要讀取它的狀態
}

void loop() {
  buttonState = digitalRead(BUTTON_PIN);  //讀取按鍵的狀態

  if(buttonState == LOW){          //如果按鍵按了
    digitalWrite(LED_PIN, HIGH);   //LED就亮了 
  }else{                           //如果按鍵是未按下
    digitalWrite(LED_PIN, LOW);    //LED就不亮
  }
}
```


---

#### Step5 組裝
##### 焊接馬達
1. 黑紅電子線焊上接口
2. 另一端剝出更長銅線，對折後上錫（鎖在模組電源座較不容易鬆脫）
##### 壓克力雷切 ---超音波感測器座
:::warning
雷切軟體下載
* [LaserMaker](https://www.lasermaker.com.cn/)
* [RDWorksV8](https://www.thunderlaser.tw/laser-download)
:::
![](https://i.imgur.com/3tYGJIo.png)
##### 車體組裝
1. 鎖就對了
    * 先鎖馬達
    * 然後驅動模組（L9110S）
    ![](https://i.imgur.com/fUoMFKF.png)
    * 電池盒
    * Arduino UNO
    * Sensor擴充板
    ![](https://i.imgur.com/c1LE8ng.png)
2. 嗯對然後接線
    * 馬達接驅動板
    * 電池盒接擴充版
---

#### Step6 Drivetrain Control
1. 挑選支援PWM腳位控制馬達驅動板
2. 腳位5、6控制一顆馬達；腳位 9、10 控制另一顆馬達
3. 定義腳位輸入／輸出
```cpp
pinMode(腳位, OUTPUT);
```
4. 控制腳位輸出
```cpp
analogWrite(腳位, 強度); //強度範圍(0~255)
```
##### 前進三秒完整程式
```cpp=
void setup() {
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);

  analogWrite(5, 200);
  analogWrite(6, 0);
  analogWrite(9, 200);
  analogWrite(10, 0);

  delay(3000);
  analogWrite(5, 0);
  analogWrite(6, 0);
  analogWrite(9, 0);
  analogWrite(10, 0);
}
```
:::info
![](https://i.imgur.com/zyidu1i.png)
* 5號腳輸出強度200／6號腳無輸出(0)時->馬達順時針旋轉
:::


---

#### Step7 循線功能
##### 循線感測器組裝＆接線
![](https://i.imgur.com/DdSHvpa.png)
**感測原理**
循線感測器是由一個紅外線發射器，與一個紅外線接收器所組成。當正常供電時紅外線發射器會不停的發射紅外線，當紅外線經過物體表面會有二種情形：
1. 絕大部份的紅外線經由表面反射
2. 絕大部份的紅外線經由表面吸收，極少部份反射。
##### 讀取循線感測器數值
1. 啟動序列埠
```cpp
Serial.begin(9600);
```
> 鮑率 9600
2. 新增A0／A1腳位，分別讀取兩個循線感測器（INPUT） 
```cpp
pinMode(類比腳位, INPUT);
```
3. 讀取訊號
```cpp
byte IR_L = digitalRead(類比腳位);
```
4. 監控視窗列印
```
Serial.print();  //不換行
Serial.println("");  //換行
```
##### 實現循線方法
1. 定義同時控制四個馬達腳位的Function
![](https://i.imgur.com/iZfpZlp.png)
狀態1 前行；狀態2 向右偏移；狀態3 向左偏移；
```cpp
//定義'motor'設定四支腳位狀態
void motor(byte LA, byte LB, byte RA, byte RB) {
    analogWrite(9, LA);
    analogWrite(10, LB);
    analogWrite(6, RA);
    analogWrite(5, RB);
}
```
```cpp
//不同狀態馬達對應控制動作
if (IR_L == 0 && IR_R == 0) {
    motor(200, 0, 200, 0);
  }
  else if (IR_L == 1 && IR_R == 0) {
    motor(200, 0, 0, 0);
  }
  else if (IR_L == 0 && IR_R == 1) {
    motor(0, 0, 200, 0);
  }
  else {
    
  }
```


---

#### Step8 避障功能
##### 超音波感測器組裝＆接線
![](https://i.imgur.com/qjPUJHE.png)
![](https://i.imgur.com/3kAhE0S.png)
:::warning
型號：HC-SR04
測量範圍：2~450cm
:::
##### 讀取超音波感測器數值
```cpp
#include <NewPing.h>  //匯入函式庫「NewPing.h」
```
1. 定義腳位
```cpp
#define TRIGGER_PIN  11  
#define ECHO_PIN     12  
#define MAX_DISTANCE 200 

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
```
2. 輸出超音波感測器數值（可跳過）
```cpp
void loop() {
  delay(50);
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm());
  Serial.println("cm");
}
```
##### 實現避障功能
當偵測距離大於 20 公分，自走車以強度 150 前進，反之則以強度 150 轉彎
```cpp
void loop() {
  if (sonar.ping_cm() > 20) {
    motor(150, 0, 150, 0);
  }
  else {
    motor(0, 150, 150, 0);
  }
}
```


---

#### Step9 Combine
完整程式
```cpp=
#include <NewPing.h>

#define TRIGGER_PIN  11
#define ECHO_PIN     12
#define MAX_DISTANCE 200

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup() {
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);

  Serial.begin(9600);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
}

void loop() {
  if (sonar.ping_cm() > 20) {
    line_following();  //沒有遇到障礙物則循線自走
  }
  else {
    motor(0, 0, 0, 0);
  }
}

void motor(byte LA, byte LB, byte RA, byte RB) {
  analogWrite(9, LA);
  analogWrite(10, LB);
  analogWrite(6, RA);
  analogWrite(5, RB);
}

void line_following() {
  byte IR_L = digitalRead(A0);
  byte IR_R = digitalRead(A1);
  if (IR_L == 0 && IR_R == 0) {
    motor(150, 0, 150, 0);
  }
  else if (IR_L == 1 && IR_R == 0) {
    motor(150, 0, 0, 0);
  }
  else if (IR_L == 0 && IR_R == 1) {
    motor(0, 0, 150, 0);
  }
  else {
    
  }
}
```


---

#### Step10 Try it!

---

### :robot_face: 一二三 木頭人
#### 材料準備
##### 木材
![](https://i.imgur.com/M2q05vH.png)

:::warning
【愛教不教】木工知識補充影片
* [木材挑選，教你怎麼分辨板材](https://youtu.be/vh9D3PdLfsk)
* [木頭組裝，教你組裝木材](https://youtu.be/JIeHDRmy99E)
* [木頭表面處理，教你做表面功夫](https://youtu.be/B5QQIJfVUFw)
:::
##### 螺絲
###### 部位名稱：
![](https://i.imgur.com/AIu7XhZ.png)
A：頸、頸下（承面） B：頭（頭部） C：螺紋部 D：螺絲尾端 E：頸下長度 F：全長 G：槽深
![](https://i.imgur.com/TjqjSHU.png)
A：**外徑** 指外螺紋的螺紋之間的直徑，即用以表示粗細的「公稱直徑」。
B：**節圓直徑** 螺紋寬度與螺紋槽寬度相等的圓的直徑。
C：**底徑** 外螺紋/內螺紋的螺谷之間的直徑。
D：**螺紋角** 螺紋從螺峰到螺谷所開的角度。
E：**螺距** 螺紋上兩個相鄰螺峰的距離。
F：**內徑** 內螺紋的螺紋之間的直徑。
###### 材質：
鍍鋅鐵、中碳鋼、不鏽鋼、銅、尼龍、鈦、鋁、壓克力

丸頭螺絲／沉頭螺絲
一字、十字、內六腳
類型、直徑、長度
英制、公制、美規
M425
攻牙
#### 工具使用
##### 大型機具
##### 手持電動機具
##### 手工具
台灣：KING TONY／日本：KTC／德國：Wera／美國：Blue Point／瑞士：PB Swiss
##### 手作工具

:::info
:shopping_trolley: 購買管道
* 木材：[木百貨](https://woodmall.com.tw/shop/)
* 電子零件：[iCShop](https://www.icshop.com.tw/)
* 電動機具：[Makita](https://makita.com.tw/)／[Bosch](https://www.bosch-pt.com.tw/tw/zh/)／[Milwaukee](https://www.milwaukeetool.com.tw/)
:::