---
tags: 單晶片助教
---
# [6] Arduino講義:超音波&步進馬達
[ToC]
## 超音波感測器(Ultrasonic sensor)
* 超音波模組工作原理:
![](https://i.imgur.com/ODTMfKF.png)
* 觸發 : 採用I/O觸發測距,給至少為 <font color="red">10uS</font> 的高電位信號。
* 發射 : 模組自動發送 8 個 40KHz 的方波,自動檢測是否有信號返回。
* 接收 : 有信號返回,通過模組之 I/O 輸出高電位,<font color="red">高電位持續的時間</font>就是超聲波 從發射到返回的時間。
![](https://i.imgur.com/qci8enf.png)
* 距離計算 = (高電位時間 / 2) * 聲速 。
* 讀取高電位時間 : 使用 <font color="red">pulseIn( )</font> 此Function,單位為microsecond(µs)。
* Reference: [Arduino pulseln()](https://www.arduino.cc/en/Reference.PulseIn)
* 聲速 = 331.5 + 0.607 * t(攝氏溫度)。
Ex : 溫度為攝氏 20 度,則聲速為 331.5 + 0.607 * 20 = 343.64 m/s。
* 將聲速還算成 cm/µs => 343.64 * 100 / 1000000 = 0.034364 cm/µs。
* 超音波模組規格與腳位 :
* 電源需求 : DC 5V / 2mA
* 輸出電位( 1/ 0):5V/ 0V
* 精度:3mm
* <font color="red">距離範圍:2 ~ 450cm</font>
* 有效的角度:<15℃
![](https://i.imgur.com/LWgbM7Z.png)
* 超音波使用須知
* 不可少於2公分
![](https://i.imgur.com/z9utTOL.jpg)
* 每次訊號間隔不可太短
![](https://i.imgur.com/B5eTjnD.png)
* 待測物注意反射角度
![](https://i.imgur.com/6CxZFXd.jpg)
* 待測物圓柱體時反射角度較廣
![](https://i.imgur.com/Rv82yzQ.png)
### Example
```c=
int trigPin = 12; //Trig Pin
int echoPin = 11; //Echo Pin
long duration, cm, inches;
void setup() {
Serial.begin (9600); // Serial Port begin
pinMode(trigPin, OUTPUT); // 定義輸入及輸出
pinMode(echoPin, INPUT);
}
void loop()
{
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH); // 給 Trig 高電位,持續 10微秒
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT); // 讀取 echo 的電位
duration = pulseIn(echoPin, HIGH); // 收到高電位時的時間
cm = (duration/2) / 29.1; // 將時間換算成距離 cm 或 inch
inches = (duration/2) / 74;
Serial.print("Distance : ");
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(250);
}
```
---
## 步進馬達(Stepping motor)
* 步進馬達工作原理:
由電流通過線圈激磁後,使得線圈產生磁場(電磁鐵)吸引中間轉子磁鐵轉動,所以若要控制馬達旋轉,需控制好線圈的激磁順序。
* <font color="red">紅色線</font>:電源線供給馬達電力。
* <font color="blue">藍色線</font>:線圈。
* <font color="pink">粉色線</font>:線圈。
* <font color="FFDD00">黃色線</font>:線圈。
* <font color="Orange">橘色線</font>:線圈。
![](https://i.imgur.com/XQmFqWY.jpg)
* 步進馬達規格 :
* 額定電壓:5 VDC
* 相數:4
* 變速比:64/1 圈 (輸入/輸出)
( 1 : 9,2 : 32/11,3 : 22/9,4 : 27/8,5 : 24 )(齒輪比)
![](https://i.imgur.com/JJ7us5I.jpg)
* 步進角度:5.625度
藉由以上數據可得知
輸出的轉速(度) = 主軸轉速(度) x 9/32 x 11/22 x 9/27 x 8/24 = 主軸轉速(度) x 1/64
假設馬達步進角為5.625度 x 1/64 = 0.087890625度
所以若要轉一圈,則需360/0.087890625 = 4096步
經過角度與步數的運算,馬達就可以依需求來做控制。
* 步進馬達控制方法 :
* 單相激磁(優點:省電,缺點:力矩小)
![](https://i.imgur.com/epLYANa.jpg)
* 二相激磁(優點:力矩大,缺點:耗電)
![](https://i.imgur.com/ZnlY9Zc.jpg)
* 一二相激磁(優點:省電,缺點:力矩小)
![](https://i.imgur.com/madKBT0.jpg)
<font color="blue">hint</font> : 一二相與單相二相差異點為輸出所需的步數,假設一二相所需一圈為4096步,那單相與二相就只需2048步,由此可知,一二相可做到較精準的角度控制。
* ULN2003A驅動IC :
![](https://i.imgur.com/g4J3dzs.jpg)
此IC特點在於,透過控制數位訊號來控制哪個輸出接腳要接地。
### Example
```c=
//單相激磁
int t= 10; //換相所需的時間
void setup() {
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT); }
void loop() {
digitalWrite(8,1);
digitalWrite(9,0);
digitalWrite(10,0);
digitalWrite(11,0);
delay(t);
digitalWrite(8,0);
digitalWrite(9,1);
digitalWrite(10,0);
digitalWrite(11,0);
delay(t); digitalWrite(8,0);
digitalWrite(9,0);
digitalWrite(10,1);
digitalWrite(11,0);
delay(t);
digitalWrite(8,0);
digitalWrite(9,0);
digitalWrite(10,0);
digitalWrite(11,1);
delay(t); }
```
### Lab1 - 超聲波測距器
#### 實作說明:
* 實作目的 : 學習使用超聲波模組。
* 實作範例 : 使用超聲波模組搭配 LCD 顯示器與LED燈,當物體在 20 公分內時,LCD第一行顯示自己學號,第二行顯示"Distance : xx cm",超過 20 公分,則顯示"Out of Distance",LED部分隨著距離越來越近閃爍越來越快,5 cm以下恆亮。
<font color="red">需注意</font> : 距離更新時不能有上次的殘值,且cm必須顯示在最左下角(請參考實作結果圖)
* 實作電路圖 :
![](https://i.imgur.com/R5E6O9J.jpg)
* 實作腳位配置 :
| HC-SR04 | Arduino | LCM 1602 |Arduino|
| -------- | -------- | -------- | -------- |
| Vcc | 5V | GND | GND |
| Trig | Pin12(可自行決定) | Vcc | 5V |
| Echo | Pin11(可自行決定) | SDA | A4 |
| Gnd | GND | SCL | A5 |
* 實作結果圖 :
![](https://i.imgur.com/w8v7iuz.jpg)
* 實作影片 :
<iframe width="944" height="540" src="https://www.youtube.com/embed/nXZL98UFn6A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
### Lab2 - 測距控制步進馬達轉動
#### 實作說明:
* 實作目的 : 學習控制步進馬達轉動。
* 實作範例 : 使用超聲波模組搭配步進馬達,當物體在 10 公分內時,馬達順時針旋轉,當物體在 15 公分外時,馬達逆時針旋轉,當物體恰於 10至15 公分時,馬達停止旋轉。
<font color="blue">hint</font> : 可用監控視窗檢測距離。
* 實作影片 :
<iframe width="678" height="480" src="https://www.youtube.com/embed/bQgpPqJdu9Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
### Lab3 - 步進馬達角度控制
#### 實作說明:
* 實作目的 : 學習控制步進馬達轉動角度。
* 實作範例 : 使用步進馬達搭配 LCD 顯示器與按鈕。
按鈕A:按1下時,馬達順轉90度;長按時(約3秒),馬達順轉360度。
按鈕B:按1下時,馬達逆轉180度;長按時(約3秒),馬達逆轉120度。
LCD第一行顯示自己學號,第二行顯示"Steps : 步數"。
<font color="red">需注意</font> : 必須確實計算所需角度得步數
* 實作影片 :
<iframe width="1280" height="720" src="https://www.youtube.com/embed/2QvI0pDkVP8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
### bonus - 單按鈕控制步進馬達
#### 實作說明:
* 實作目的 : 學習更加進階之步進馬達控制。
* 實作範例 : 利用按鈕控制步進馬達旋轉角度。
按1下:馬達旋轉90度
快速按2下:馬達旋轉120度
快速按3下:馬達旋轉180度
長按(約3秒):馬達旋轉360度
## 課後問題 (三題)
:::info
* Q1.詳述 超聲波模組感測原理。
* Q2.詳述 步進馬達動作原理。
* Q3.詳述 步進馬達會因程式內容導致轉速變慢,此問題該如何處理。
:::