---
tags: HW(HomeWork) Guide
---
# 0407 課程 Code + HomeWork Guide
- 注意: 有==黃標==的都是你要寫作業一定要看懂的地方。
## 電路圖
- 電路圖: 
- 接線圖: https://hackmd.io/CC-l35guRkaAayxbZu8UyQ#
### 電路解析
- 此電路圖是一個控制 Servo 進行旋轉的電路。
- 在可變電阻旁邊,你可以看到本次作業多了兩個新的元件:
- 電容 (Capacitor):
- 
- 是一個**儲存電壓能量的元件**,在沒有**外加電位差**的時候會將電容內的電壓放出。
- 在電路中起到**穩定電源**的作用。(就像臨時發電機 or 蓄水塔一樣)
- ==拔不拔除不影響功能==,但是可以幫助電路濾除雜訊、防止 **Servo 一時需要太多電流而導致功能失常**的問題。
- ==電位計== (Potentiometer):
- 
- ==可以當作是可變電阻的一種==
- 會有一個可以旋轉的物理介面,會改變==圖中箭頭指到的電阻位置==,所以會改變分壓比例
- 實際上的等效電路如圖,只是==物理上會因為 arrow(箭頭) 的上移導致 R1 變小而 R2 變大==,反之==下移的時候 R2 變小 R1 變大== 
- 而我們在 [20210324 Slide](https://docs.google.com/presentation/d/1QI9bWv5HJGueXlB-HeuVhXKMojToNRYfKmjBhThrvFM/edit#slide=id.gca37a39111_0_269) 知道: ==R1、R2 的比例會因為分壓律的關係,使我們電阻上分到的電壓差不同==: 
## 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 的 "對地" 電壓是多少==,並擷取圖片
- 
- 
- 
- 圖片一樣請按照上週作業格式,學號 + 姓名,以下是回答範例:
- 
- 記得圖片中==要有電壓數值==。
### 問題二
- 觀察問題 1 跟 Code,為何我調整電位計就可以改變 Servo 的位置?
- 可以不用把整行 Code 說出來,但是==至少要說出思路==
### 問題三
- 請問我拿掉電容會不會影響功能?
- Why?
### 問題四
請回答以下小題:
- 對於本次課程的負擔,如果 0~10 以滿分十分來當作受不了的標準, 請說一下你會打幾分?
- 承上題,請問原因是?
- 需要對哪一個知識做補述?