--- 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.詳述 步進馬達會因程式內容導致轉速變慢,此問題該如何處理。 :::