---
# System prepended metadata

title: 0407 課程 Code + HomeWork Guide
tags: [HW(HomeWork) Guide]

---

---
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 以滿分十分來當作受不了的標準， 請說一下你會打幾分?
- 承上題，請問原因是？
- 需要對哪一個知識做補述？