--- tags: HW(HomeWork) Guide --- # 0407 課程 Code + HomeWork Guide - 注意: 有==黃標==的都是你要寫作業一定要看懂的地方。 ## 電路圖 - 電路圖: ![](https://i.imgur.com/UBxg424.png =55%x) - 接線圖: ![](https://i.imgur.com/icSU34U.png =55%x)https://hackmd.io/CC-l35guRkaAayxbZu8UyQ# ### 電路解析 - 此電路圖是一個控制 Servo 進行旋轉的電路。 - 在可變電阻旁邊,你可以看到本次作業多了兩個新的元件: - 電容 (Capacitor): - ![](https://i.imgur.com/uEjJTaP.png) - 是一個**儲存電壓能量的元件**,在沒有**外加電位差**的時候會將電容內的電壓放出。 - 在電路中起到**穩定電源**的作用。(就像臨時發電機 or 蓄水塔一樣) - ==拔不拔除不影響功能==,但是可以幫助電路濾除雜訊、防止 **Servo 一時需要太多電流而導致功能失常**的問題。 - ==電位計== (Potentiometer): - ![](https://i.imgur.com/QhLsVgY.png) - ==可以當作是可變電阻的一種== - 會有一個可以旋轉的物理介面,會改變==圖中箭頭指到的電阻位置==,所以會改變分壓比例 - 實際上的等效電路如圖,只是==物理上會因為 arrow(箭頭) 的上移導致 R1 變小而 R2 變大==,反之==下移的時候 R2 變小 R1 變大== ![](https://i.imgur.com/tNKdPMA.png =45%x) - 而我們在 [20210324 Slide](https://docs.google.com/presentation/d/1QI9bWv5HJGueXlB-HeuVhXKMojToNRYfKmjBhThrvFM/edit#slide=id.gca37a39111_0_269) 知道: ==R1、R2 的比例會因為分壓律的關係,使我們電阻上分到的電壓差不同==: ![](https://i.imgur.com/5oUHkwz.png) ## Code ```C= // // Arduino Starter Kit projects // // Created by Claudio Carnino // Modified by Josh Chang // Copyright © 2021 Futurenest. All rights reserved. //https://hackmd.io/CC-l35guRkaAayxbZu8UyQ# // 載入 Servo 函式庫的標頭檔 #include <Servo.h> enum PinId { PinIdPontentiometerOutput = A0, PinIdServoMotorInput = 9, }; enum PontentiometerOutputValue { PontentiometerOutputValueMin = 0, PontentiometerOutputValueMax = 1023, }; enum ServoMotorInputAngle { ServoMotorInputAngleMin = 0, ServoMotorInputAngleMax = 179, }; const int loopCycleDelayMilliseconds = 15; // 宣告一個 Servo 的物件實體 Servo servoMotor; int potentiometerValue; int servoMotorAngle; void setup() { // 告知伺服馬達所使用的腳位 servoMotor.attach(PinIdServoMotorInput); Serial.begin(9600); } void loop() { // 讀取電位器數值 potentiometerValue = analogRead(PinIdPontentiometerOutput); Serial.print("PontentiometerOutputPin: "); Serial.print(potentiometerValue); // 計算伺服馬達轉動角度:將電位器變化數值轉換為 0-180 度。 servoMotorAngle = map(potentiometerValue, PontentiometerOutputValueMin, PontentiometerOutputValueMax, ServoMotorInputAngleMin, ServoMotorInputAngleMax); Serial.print(", angle: "); Serial.println(servoMotorAngle); // 轉動伺服馬達 servoMotor.write(servoMotorAngle); delay(loopCycleDelayMilliseconds); } ``` ### Code 解析 - `enum` 不影響我們對本次 Code 的邏輯理解。 - `servoMotor.attach(<PIN_NAME>)` 是用來告訴 Arduino 對於 `PinIdServoMotorInput` 此一引腳要接上 Servo - 所以在本次 Code,意義上跟 `servoMotor.attach(9)` 等價,原因是因為在 Code 的第 14 行,我們設定了 `PinIdServoMotorInput = 9` 當作變數。 ```C= void setup() { // 告知伺服馬達所使用的腳位 servoMotor.attach(PinIdServoMotorInput); Serial.begin(9600); } ``` - `map(<input_Variable>, <input_fromLow>, <input_fromHigh>, <input_toLow>, <input_toHigh>)` 指的是將 `<input_Variable>` 對應的數字的==尺度放大== - 舉個例子,如果我現在有一把尺,刻度 0~10 裡面存在一個點 在 `5` 上面,也就是==在這把尺的中間== - 則如果我換另一把只有 0~5 刻度的尺,那==如果我把這個點放在這把尺的中間==,則對應到的刻度只有 `2.5` 而已。 - map 就是在做==尺跟尺之間的互換==,`fromLow/High` 就是你原本的尺,`toLow/High` 就是你想換過去的新尺。 - `servoMotor.write(<ANGLE>);` 指的是==要讓 servo 轉幾度==,以 `servoMotor.write(servoMotorAngle);` 來說,就是讓 Servo 轉 `servoMotorAngle = ????` 度 - `????` 自己往上查。 ## 作業內容 ### 問題一 - 我們知道在 20210324,我們學過了 ADC 的使用方式。 - 請利用==之前用過的電表==,觀察下方三張圖,在這三張圖對應的 Servo 角度中,回答==類比輸入 A0 的 "對地" 電壓是多少==,並擷取圖片 - ![](https://i.imgur.com/vsJNeit.png) - ![](https://i.imgur.com/9rqmDU1.png) - ![](https://i.imgur.com/gsw8KrH.png) - 圖片一樣請按照上週作業格式,學號 + 姓名,以下是回答範例: - ![](https://i.imgur.com/KZcN4iS.png) - 記得圖片中==要有電壓數值==。 ### 問題二 - 觀察問題 1 跟 Code,為何我調整電位計就可以改變 Servo 的位置? - 可以不用把整行 Code 說出來,但是==至少要說出思路== ### 問題三 - 請問我拿掉電容會不會影響功能? - Why? ### 問題四 請回答以下小題: - 對於本次課程的負擔,如果 0~10 以滿分十分來當作受不了的標準, 請說一下你會打幾分? - 承上題,請問原因是? - 需要對哪一個知識做補述?