# 第十二週週記 > **Date**: 2022.05.02 (一) > **主題**:Arduino作業(紅外線遙控馬達)、0~1023的秘密 [TOC] ## 本週自學筆記 ### 紅外線遙控馬達 {%youtube 38ZULyqyOjc %} #### 材料準備 - Arduino 開發板、傳輸線 - 紅外線接收器、遙控器(遙控器需要的電池(CR2025)在小福的金興發購入) - 直流馬達模組、直流馬達 - 足夠的跳線 - 麵包板 - 接下來就可以準備開工了! #### 資料蒐集 & 實作 **Step 1. 下載 IRremote Library** - 看到週一發給大家的紅外線接收器上面有寫編號「VS18388」,上網搜尋後就找到教學文$^{[1]}$,裡面有提到紅外接收器要額外安裝library,因此可以到 [**Github**](https://github.com/Arduino-IRremote/Arduino-IRremote) 下載下來放到Arduino Library的資料夾裡面,不過後來發現也能夠從Arduino裡面的「工具 > 管理程式庫」搜尋「IRremote」即可找到並安裝。 **Step 2. 紅外線接收器** - 紅外線接收器有三隻腳,分別對應到「VOUT」(接收紅外線訊號,我接到D3腳位)、「GND」(接地)和「VCC」(5V電源),這次作業中我是把他們接在麵包版上來操作。將紅外線接收器架好之後,我在Youtube上面發現有一個教學影片跟我們的遙控器長得一樣$^{[2]}$,後續就照著他的影片做。 **Step 3. 遙控器按鍵測試** - 參考根據影片中的作法,可以把遙控器按下的按鍵在「序列阜監控視窗」中顯示對應的編碼,因此我就記錄下我的「-」、「+」、「EQ」分別對應的編碼,以備後續使用。 **Step 4. 結合直流馬達** - 結合課堂中寫好的直流馬達控制function,只要設定條件判斷式,當接收到「+」的按鍵訊號時進行正轉,「-」的按鍵訊號時開始反轉,「EQ」的按鍵訊號時停下來,上傳程式碼到開發板之後就大功告成了! #### 程式碼 ```Arduino= #include <IRremote.h> int RECV_PIN = 3; IRrecv IR(RECV_PIN); int sspeed; void setup() { IR.enableIRIn(); // 啟動接收 Serial.begin(9600); pinMode(8, OUTPUT); pinMode(9, OUTPUT); sspeed = (int)(150); } void loop() { if (IR.decode()) { Serial.println(IR.decodedIRData.decodedRawData, HEX); if(IR.decodedIRData.decodedRawData == 0xEA15FF00){ // + = EA15FF00 正轉 forward(); } if(IR.decodedIRData.decodedRawData == 0xF807FF00){ // - = F807FF00 反轉 backward(); } if(IR.decodedIRData.decodedRawData == 0xF609FF00){ // EQ= F609FF00 停下來 stop(); } delay(1000); IR.resume(); } } // Describe this function... void forward() { digitalWrite(8, LOW); analogWrite(9, sspeed); } // Describe this function... void backward() { digitalWrite(8, HIGH); analogWrite(9, sspeed); } // Describe this function... void stop() { digitalWrite(8, LOW); analogWrite(9, 0); } ``` :::danger **參考資料** - [**[1] 葉難: Arduino練習:紅外線傳送與接收**](http://yehnan.blogspot.com/2013/05/arduino.html) - [**[2] Arduino Tutorial 31- How to Use the Infrared (IR) Remote**](https://www.youtube.com/watch?v=0DgALFDwouA) ::: <br> ### 0~1023的秘密 > **Q: 為什麼使用digitalRead得到的值會是0-1023之間?** > (不確定題目是否有誤,感覺應該是指analogRead這個function) - 「類比訊號」可以是任何數值,但「數位訊號」只有0和1,也可以說是只有HIGH和LOW兩種訊號。 - 為了衡量類比訊號的量值,Arduino能夠讀取類比訊號並轉為數位訊號(analog-to-digital converter, 簡稱ADC) - 方法就是透過讀取類比電壓(analog voltage)來轉換為數位訊號數值,常用的內建函式就是`analogRead(pin)`,將0到5.5V或0到3V的電壓轉換為0~1023的數值。 - 而0~1023的數值範圍是由於**電壓的解析度為10個bit**,0到1023相當於具有1024個數值,也就是2的十次方,由10個0或1的一串數字組合出來的結果。 - 實務上也常會用函式`map()`來將0~1023的數值轉換為其他範圍來使用。 :::success **參考資料** - [**analogRead() -- Arduino Reference**](https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/) - [**arduino範例程式-類比電壓轉數位訊號**](https://frank1025.pixnet.net/blog/post/339436976-%5Barduino%5D002-arduino%E7%AF%84%E4%BE%8B%E7%A8%8B%E5%BC%8F-%E9%A1%9E%E6%AF%94%E9%9B%BB%E5%A3%93%E8%BD%89%E6%95%B8%E4%BD%8D%E8%A8%8A%E8%99%9F) - [**How To Use Arduino’s Analog and Digital Input/Output (I/O)**](https://www.allaboutcircuits.com/projects/using-the-arduinos-analog-io/) ::: <br> ### 本週實作心得 這禮拜又再度回到了開發板無法順利連接的困境QQ,經過一番掙扎以及助教的幫忙才終於又有開發板可以用,謝天謝地。 這次課堂主要就是介紹「**直流馬達**」的部分,會透過一個「**直流馬達模組**」來控制。這個模組接一個馬達時會接出四條線,除了GND(接地)和VCC(電源)之外,剩下兩個要分別接類比與數位接腳,是用來控制「轉向」與「轉速」。 程式碼的部分,也嘗試用`function`的方式來做簡化。將一組程式碼包裝在一個自訂函數當中,在主要的程式碼用到時引入使用,可以讓程式碼閱讀時更精簡,如果是重複性的動作也很適合使用。 <br> [**:link: 返回筆記列表**](https://hackmd.io/@FuvAXb7jSPqE7rfCyod68A/SyOs8PGlq) ###### tags: `創新原型實作` `第12週`