---
# System prepended metadata

title: 民生國中志工團課程(2023)

---

# 民生國中志工團課程(2023)
## 第一堂 - 課程介紹(周次、上課內容、課程大綱)
### 課程安排
| 周次 | 日期       | 上課內容                              | 課程大綱                               |
| ---- | ---------- | ------------------------------------ | -------------------------------------- |
| 1    | 2023/09/01 | 分組 / 課程介紹                      | 自我介紹、介紹上課流程                 |
| 2    | 2023/09/08 | 介紹Arduino、Ardublock              | 介紹Arduino板、Ardublock教學與實作與功能介紹 |
| 3    | 2023/09/15 | 操作點亮LED燈(流水燈/呼吸燈)         | 用Arduino、Ardublock實作(紅綠燈各種變化) |
| 4    | 2023/09/22 | 介紹超音波感測器 / 實際操作超音波感測器結合LED燈 | 介紹超音波感測器原理、如何去計算距離(以距離判斷亮燈) |
| 5    | 2023/10/06 | 介紹紅外線感測器 / 實際操作紅外線感測器結合LED燈 | 介紹紅外線感測器原理、如何去判斷黑白 |
| 6    | 2023/10/20 | 結合超音波、紅外線感測器來操作LED燈 / 設計車子本體 | 為判斷亮燈加上條件、組裝車子本體(先行做好底板的基礎，其他交由同學去做設計) |
| 7    | 2023/10/27 | 組裝車子本體 / 介紹如何用Arduino來控制這台車 | 組裝車子零件，並解釋如何利用控制馬達來達到轉向的效果 |
| 8    | 2023/11/10 | 組裝車子本體                         | 組裝車子零件，並解釋如何利用控制馬達來達到轉向的效果 |
| 9    | 2023/11/17 | 設計避障車                          | 介紹超音波感測器如何判斷牆壁並做出相應行動和車子組裝 |
| 10   | 2023/11/24 | 設計避障車 / 分組競賽(比速度)     | 將設計收尾、做分組競賽 |
| 11   | 2023/12/01 | 設計巡跡車                          | 介紹紅外線感測器如何做判斷以及調整行進方向和車子組裝 |
| 12   | 2023/12/08 | 設計巡跡車 / 分組競賽(比速度)     | 將設計收尾、做分組競賽 |
| 13   | 2023/12/15 | 設計打架車(兩台車互推看誰出界)   | 在原有的車子上讓小朋友再加上不同的設計，兩兩互推進行競賽，出界的落敗。 |
| 14   | 2023/12/22 | 設計打架車 / 分組競賽               | 將設計收尾、做分組競賽 |
| 15   | 2023/12/29 | 設計拖吊車(車子後面加上重物)        | 在原有的車子後方讓小朋友再加上不同的設計，兩兩進行競賽，比賽誰的車可以拖最重的重量。 |
| 16   | 2024/01/05 | 設計拖吊車 / 分組競賽(比重量)       | 將設計收尾、做分組競賽 |
| 17   | 2024/01/12 | | |


### 自我介紹時間!!!!
每位學生都需要進行自我介紹，可以按照下面的模式去修改!
> **自我介紹範例** :*大家好!我是二年三班的石小綸，我會選擇這個社團的原因是因為我平常就很喜歡電腦的知識，我也想學習更多的相關知識。請大家多多指教!*
### 第一堂測驗表單!!!!
> 每位學生皆須進行作答，表單並不會影響成績，但請認真作答!!!
https://forms.gle/mKFQbbJPHDNuhznx5
### 你畫我猜時間!!!!
前三名會有小獎勵!!!!
[https://gartic.io/055rwbr8](https://)

## 第二堂 - 介紹Arduino、Ardublock
[Arduino影片介紹 (By LazyTomato Lab 懶番茄工作室)](https://www.youtube.com/watch?v=B4T8hzO0IYc)


---

### 電腦五大單元



> 電腦最主要就是在進行 **輸入(Input)->處理(Process)->輸出(Output)** 這三個動作，
**舉例** : 小明用 **滑鼠點擊了傳說對決的影片**，**影片等了兩秒後終於開始播放**，這時，**耳機傳來了影片的聲音**。
>
![](https://hackmd.io/_uploads/HkofQkSA2.png)
圖片來源: [3.1 現代電腦的擬人神經系統](https://docs.f5ezcode.in/cs-basic/di-san-zhang-shi-zen-zhan-cheng-ren-gong-zhi-hui-de/3.1-dai-de-ren-gu-mo-xing)

#### 輸入單元(Input Unit)
將資料或訊息輸入到電腦的設備。
設備舉例 : 滑鼠、鍵盤

#### 輸出單元(Output Unit)
資料經過電腦處理後，呈現給使用者的設備。
設備舉例 : 音響、耳機、印表機、螢幕

#### 記憶單元(Memory Unit)
資料儲存的地方，主記憶體是電腦的短期工作區，用來處理當前的任務，而輔助記憶體是長期資料儲存的地方，就算關機後也不會遺失。

#### 中央處理單元(CPU)
中央處理單元(CPU) = 控制單元(CU) + 邏輯運算單元(ALU)
像是人類的大腦。

#### 控制單元(CU)
負責協調和控制所有的電腦的操作、流程。

#### 邏輯運算單元(ALU)
負責執行數學運算和邏輯運算。
> **想一想 :** 
> 中央處理單元、主記憶體、副記憶體、輸入/輸出單元各像是人體的什麼(長期記憶、做的行動、感官器官、短期記憶、大腦)?
>
:::spoiler 答案
中央處理單元就像是我們的**大腦**，主記憶體像是**短期記憶**，副記憶體像是**長期記憶**，輸入單元像是人體的**感官器官**，輸出單元像是**做的行動**。
::: 


---

### Arduino介紹
#### Arduino可以做到什麼事情?
>Arudino可以做到很多事情，從最簡單的點亮LED燈到複雜的機器人都可以做到，下面這三個都是Arduino的作品影片。

[Arduino Banana Piano (香蕉彈鋼琴)](https://www.youtube.com/watch?v=Lbkw0LFVZDI)
[How To Make A DIY Arduino Line Follower Car At Home(循跡車)](https://www.youtube.com/watch?v=t7k9D1jDEtk&t=303s)
[TOP 10 Arduino Projects Of All Time(十種Arduino專案)](https://www.youtube.com/watch?v=-p_8u_0GNZE)

#### Arduino Uno的元件圖
> 下圖介紹了Aruduino Uno板上的一些零件和腳位，目前只要了解**數位輸入、輸出**和**類比輸入、輸出腳位**和**5V**和**GND**和**重製鈕**和**USB連接埠**
> 
![](https://hackmd.io/_uploads/Byrw_TrAn.png)
圖片來源: [Arduino Uno功能簡介](https://openhome.cc/Gossip/Books/mBlockArduino1-3and1-4.html)

要注意的是上面那排的**3、5、6、9、10、11**前面有個~，可以作為類比輸出。
#### 類比/數位是什麼意思?
> 類比訊號(analog signal)和數位訊號(digital signal)是兩種不同的訊號表示方法。

**類比訊號**是一種連續變化的訊號。
舉例 : 聲音的大小聲變化、亮度的變化。
**數位訊號**通常只有兩個值**1、0**或**HIGH、LOW**，代表的是兩種狀態**有、沒有**。
舉例 : 開關電燈。
> **想一想 :** 
> 如果要讓LED一下亮一下暗，要怎麼接呢(LED要接到Arduino板上的**輸入還是輸出**，**類比還是數位**腳位?)
>
:::spoiler 答案
LED要接到Arduino板上的**數位輸出腳位**。
::: 


---

### Arduino IDE / Ardublock下載教學
>在前面我們介紹了許多硬體元件，但僅僅連接線到 LED 燈並不足以讓它亮起來。除了連接線之外，我們還需要使用程式來控制這些元件。下面我們將介紹如何下載並使用 Arduino IDE 來撰寫 Arduino 程式。

[【教學】Arduino軟體與ArduBlock外掛程式安裝方法](https://www.youtube.com/watch?v=oL2rBgiiA_U)
[Arduino IDE 1.8.19版載點](https://downloads.arduino.cc/arduino-1.8.19-windows.exe?_gl=1*z9i8dy*_ga*OTQxNDEyOTkuMTY5NDAxMzQ3Mg..*_ga_NEXN8H46L5*MTY5NDAxMzQ3Mi4xLjEuMTY5NDAxMzQ4OS4wLjAuMA..)
[Ardublock 5.3.1版載點](https://www.davidhuanglab.com/_files/archives/77ef90_77442801480d415e849633be2b060c0c.zip?dn=5.3.1.zip)


---

### Ardublock 實際範例
>下面的範例是將LED燈接到D2接腳上，並讓LED燈一閃一閃的亮。
>
![](https://hackmd.io/_uploads/BkXTrmLA3.png)


---

### 好用工具介紹
#### ChatGPT 人工智慧聊天機器人
>![](https://hackmd.io/_uploads/BJCo9VI03.png)

[ChatGPT](https://chat.openai.com/)


---

### 課堂測驗
> 測驗是為了驗收大家的學習成果，歡迎使用剛剛介紹的ChatGPT來幫助你!
> 
https://forms.gle/FbfF5x5YUixLeciN6

## 第三堂 - 操作點亮LED燈(流水燈/呼吸燈)
### 分組時間!!!
> 2~3人一組(**1組兩人、5組三人**)，請自行到下方Google表單內填寫**隊名、組員姓名、班級座號**。
> https://reurl.cc/0ZjD7o
---
### 複習時間!!!
> 大家還記得上禮拜在做什麼嗎 !
---
### 二進位、八進位、十六進位
> 在電腦的世界裡，通常是使用二進位(0、1)，八進位(0 ~ 7)比較少使用，十六進位(0 ~ 9、A ~ F)相較於八進位更常見。
#### 二進位
>只有0~1

|     | 32 | 16 | 8  | 4  | 2  | 1  |
|:---------:|---:|---:|---:|---:|---:|---:|
| 二進位值  |  1 |  1 |  0 |  1 |  0 |  0 |

(110111)<sub>2</sub> = (1 * 32 + 1 * 16 + 0 * 8 + 1 * 4 + 0 * 2 + 0 * 1)<sub>10</sub> = (52)<sub>10</sub>
#### 八進位
>只有0~7

|    | 512 | 64 | 8  | 1  |
|:---------:|----:|---:|---:|---:|
| 八進位值  |  7  |  3 |  4 |  6 |

(7346)<sub>8</sub> = (6 * 1 + 4 * 8 + 3 * 64 + 7 * 512)<sub>10</sub> = (3814)<sub>10</sub>
#### 十六進位
>只有0 ~ 9、A ~ F(10 ~ 15)，**通常是用來表示記憶體位置**。
>
|    | 256 | 16 | 1  |
|:-----------:|----:|---:|---:|
| 十六進位值  |  7  |  B |  E |

(7BE)<sub>16</sub> = (15 * 1 + 11 * 16 + 7 * 256)<sub>10</sub> = (1983)<sub>10</sub>

---
### 電腦的邏輯運算(AND、OR、NOT)
#### AND(&、∧)真值表
> 範例: **手機要開機要滿足下列兩個前提**
>      **(1) 有電(TRUE)
>      (2) 手機沒有壞(TRUE)**
>      **兩個條件都要滿足手機才會正常開機(TRUE)。**
>      
| 輸入值1(是否有電)  | 輸入值2(手機是否有壞)  |   結果(可不可以開機)   | 範例|
|:--------:|:--------:|:--------:|:--------:|
| TRUE(1)  | FALSE(0) | FALSE(0) |手機有電且手機壞了，所以開不了機|
| FALSE(0) | TRUE(1)  | FALSE(0) |手機沒電且手機沒有壞，所以開不了機|
| TRUE(1)  | TRUE(1)  | TRUE(1)  |手機有電且手機沒有壞，所以可以開機|
| FALSE(0) | FALSE(0) | FALSE(0) |手機沒電且手機壞了，所以開不了機|

#### OR(|、∨)真值表
> 範例: **下雨天出門不被淋濕有兩種前提，滿足其中之一就可以避免被淋濕**
>      **(1) 你有穿雨衣(TRUE)
>      (2) 你有帶傘(TRUE)**
>      **只要滿足有穿雨衣或是有帶雨傘，就不會被淋濕(TRUE)。**
>      
| 輸入值1(你有穿雨衣) | 輸入值2(你有帶傘) | 結果(你不會被淋濕) |                  範例                  |
|:-------------------:|:-----------------:|:------------------:|:--------------------------------------:|
|       TRUE(1)       |     FALSE(0)      |      TRUE(1)       | 你有穿雨衣但你沒帶傘，所以你不會被淋濕 |
|      FALSE(0)       |      TRUE(1)      |      TRUE(1)       | 你有帶傘但你沒穿雨衣，所以你不會被淋濕 |
|       TRUE(1)       |      TRUE(1)      |      TRUE(1)       |  你有帶傘又有穿雨衣，所以你不會被淋濕  |
|      FALSE(0)       |     FALSE(0)      |      FALSE(0)      |  你沒有穿雨衣又沒有帶雨傘，所以你會被淋濕  |

#### NOT(!、¬)真值表
| 輸入值  | 結果 |
| ------- | ---- |
| TRUE(1)  | FALSE(0)|
| FALSE(0) | TRUE(1)|
---
### 介紹零件
#### 杜邦線
> 算是電線的一種，只要用它來連接模組、Arudino Uno板。
> 
![](https://hackmd.io/_uploads/HJqVNjxkT.png)
[圖片來源](https://www.taiwansensor.com.tw/product/10cm-%E6%9D%9C%E9%82%A6%E7%B7%9A-%E6%AF%8D%E5%B0%8D%E6%AF%8D-%E6%9D%9C%E9%82%A6%E7%B7%9A-40p-%E9%9B%99%E9%A0%AD-%E6%AF%8D%E8%BD%89%E6%AF%8D/)

#### 麵包板
> 用來插電子零件的板子，最上面、下面兩排的橫向5個、5個會通電，下面的5個、5個(abcde、fghij)的直向會通電。

![](https://hackmd.io/_uploads/S1GXrox16.png)
[圖片來源](https://nkust.gitbook.io/micro-bit/bao-ban-ji-yuan-mo-de-shi-yong)
#### 電阻
> 用來限制電流，避免電流過大導致電子零件燒掉。
> 
![](https://hackmd.io/_uploads/HkShwsxJ6.png)
[圖片來源](https://www.synton.com.tw/Product/%E7%A2%B3%E8%86%9C%E9%9B%BB%E9%98%BB+%28CR%29/)
#### LED燈
> 長腳是正極，短腳是負極

![](https://hackmd.io/_uploads/r1i9uslJa.png)
[圖片來源](https://www.digikey.tw/zh/products/detail/kingbright/WP7113ID/1747663?utm_adgroup=General&utm_source=google&utm_medium=cpc&utm_campaign=PMax%20Shopping_Product_Middle%20ROAS&utm_term=&productid=1747663&gclid=CjwKCAjw3oqoBhAjEiwA_UaLtjPoK2lmG56mCd9MaM1eTw45lJc_QTlWPjSDJ0eDcG9WLCGn1sfBGxoCJZcQAvD_BwE)

#### 電路板實際範例(使用TinkerCAD)
[TinkerCAD](https://www.tinkercad.com/dashboard)

---

### 利用Ardublock來控制LED燈
#### 讓LED燈可以一閃一閃的亮
> 小提示: **數位輸出**還是**類比輸出**、**插在哪個腳位**、要**記得延遲一秒**、**程式要放在LOOP裡**

:::spoiler 答案
![](https://hackmd.io/_uploads/rJyct3e1a.png)
![](https://hackmd.io/_uploads/SkXoKnlJ6.png)
::: 


---
## 第四堂 - 操作點亮LED燈(呼吸燈)
### 複習時間!!!
> 還記得要怎麼讓LED燈一閃一閃發亮嗎? 先試著做做看!
---
### 讓LED燈可由完全暗漸漸變亮
#### 變數介紹
> 變數簡單來說就是它可以是不固定的值，像是數學上的x、y。
> **範例 :**  apple = 1, banana = 7。
> 意思是**把數字1指定給變數apple、把數字7指定給變數banana** (apple、banana就算是一種變數，變數的名稱可以自己設定)。當然，之後也可以改變x或是y的值。
#### 變數型態
> 變數有不同型態的差別，像是: 整數型態、浮點數型態。
##### 整數型態(integer)
> 只能存放整數的變數 **(包含0)**
> **範例 :**  int apple = 6 (意思是宣告整數型態的變數apple，apple的值是6)
> ![](https://hackmd.io/_uploads/ByGTjAt1p.png)

> **錯誤範例 :** int banana = 4.5 (banana是整數型態的變數但是4.5是**浮點數(小數)**) 
> 
##### 浮點數(float)
> 可以存放有小數點的變數 **(包含整數)**
> **範例 :** float apple = 6.8 (意思是宣告浮點數型態的變數apple，apple的值是6.8)
> ![](https://hackmd.io/_uploads/Byyb3AFJT.png)

##### 迴圈(for)
>用來處理重複相似的事情。
**範例 :** 我要給LED類比訊號，讓它慢慢變亮(0~255)，我們可以像這樣做 ![](https://hackmd.io/_uploads/BJmZ00Y1a.png)
**一直做到類比輸出到D9腳位255訊號，但是這樣做太累了，我們可以用for迴圈來改善**
![](https://hackmd.io/_uploads/S1ftxJ9y6.png)

#### 實際操作時間1
> 讓一顆LED燈由暗變亮再慢慢變暗。
---
### 一次操作三顆LED燈

#### 一次點亮三顆LED燈。
![](https://hackmd.io/_uploads/SkQY0y516.png)
> ![](https://hackmd.io/_uploads/HkyQ019yp.png)
#### 實際操作2
>讓LED燈一顆接著一顆發亮 **(只亮第一顆->只亮第二顆->只亮第三顆)**
---
### 串聯LED燈
**串聯的特色**
1.流過每個元件的電流都相同。
2.只要有個元件壞掉，後面的元件就沒辦法使用。
![](https://hackmd.io/_uploads/HJQI5xqJ6.png)
![](https://hackmd.io/_uploads/B1-PWZqJ6.png)
#### 實際操作時間3
> 請串聯4顆LED燈，並使用Arduino點亮它們。

---
## 第五堂 - 超音波感測器、紅外線感測器介紹及其應用
### 超音波感測器
> 超音波感測器是藉由超音波來**計算距離**的一種感測器。
> ![](https://hackmd.io/_uploads/SJTS1Z2e6.png)
[圖片來源 - What is an Ultrasonic Sensor?](https://www.fierceelectronics.com/sensors/what-ultrasonic-sensor)
#### 超音波是什麼?
> 超音波是聲波的一種，只是它的頻率超過20kHz(千赫茲)，20kHz大概是人類能夠聽到的極限頻率。
> 在自然界當中，蝙蝠是利用超聲波來進行定位的一種生物。
> ![](https://hackmd.io/_uploads/B1Zgjghl6.png)
[圖片來源 - 【蝙蝠解密】蝙蝠為什麼要倒掛？真的會吸血嗎？回聲定位有什麼厲害？吃害蟲大胃王？](https://www.newsmarket.com.tw/blog/184997/)
[聽力測試，音響頻率響應測試音頻 10Hz~24000Hz Sine Wave Sound Frequency Tone](https://www.youtube.com/watch?v=K4sGA5wogVU)


#### 聲速公式
> 這邊的聲速是指聲音**在空氣中傳遞的速度**，可以藉由以下公式來計算。
> ***v = 331 + 0.6T***
> **v是聲音的速度，單位為(m/s)**，**T是攝氏溫度**。

#### 超音波感測器原理介紹
>簡單來說這個感測器的原理是，**Trig腳位被觸發後會發出超音波**，同時，**Echo腳位會被變成高電位(1)**，當再次**接收到回傳波時Echo腳位會變回低電位(0)**，所以我們可以藉由Echo腳位維持是高電位的時間來計算距離。
>![](https://hackmd.io/_uploads/rkjyOl2gT.png)
**VCC**：連接到5V的電源供應。
**Trig**（觸發）：用於觸發超音波發射，要接到**數位輸出腳位**。
**Echo**（回應）：用於接收超音波回波的信號，要接到**數位輸入腳位**。
**GND**：連接到GND。
[超音波感測器 為什個這麼難用](https://www.davidhuanglab.com/post/hc-sr04)

#### 挑戰題! - 計算物體距離
> 小明有一天他想要測量自己跟電腦的距離，於是他拿出了超音波感測器來測量，超音波感測器Echo腳位維持高電位的時間為**250毫秒**，且當天的溫度為**攝氏15度**，請幫忙小明計算他與電腦**距離幾公分**。
> 
> **小提示**: 
> 1. **聲速的公式 => v *(m/s)* = 331+0.6T**
> 2. **距離 => d *(m)* = v *(m/s)* * t *(s)* (距離 = 時間 * 速度)**
> 3. **高電位的時間代表的是聲波來回的時間**
> 4. **1秒 = 1000毫秒**

#### 實際操作 - 印出距離數值
![](https://hackmd.io/_uploads/Hy3wLXnep.png)
![](https://hackmd.io/_uploads/rkTqBX3xa.png)
![](https://hackmd.io/_uploads/rJNm_lTg6.png)

#### 蜂鳴器使用方法
> 讓蜂鳴器可以一直叫。
![](https://hackmd.io/_uploads/ryR8sX3g6.png)
![](https://hackmd.io/_uploads/B1rVhm3ea.png)


#### 實際操作 - 倒車雷達
> 嘗試看看利用剛剛所學，結合超音波感測器、蜂鳴器實作出倒車雷達，當距離小於五公分時蜂鳴器會一直叫。

### 紅外線感測器
>![](https://hackmd.io/_uploads/HyFoWNnxp.png)
> **VCC**：連接到5V的電源供應。
**OUT**：會輸出類比訊號(**有反射東西的值是99或100**，**沒反射東西或是物體為黑色的值會是1020左右**)，所以要將其**接到類比輸入腳位(A0~A5)**。
**GND**：連接到GND。 

#### 反射效果不佳的條件是什麼 ?
:::spoiler 答案
U2FsdGVkX1+ZZctXNl5s3yOlMtpmcSa5vtwlsGcEuVw1fquJjcN4nBIK/wMYr3ozkaNs99aill6Ofne45Wkk1A==
::: 
#### 實際操作 - 印出是否有偵測到東西
>如果有偵測到東西(99或100)則顯示Yes，否則(1020左右)顯示No。
>![](https://hackmd.io/_uploads/SklaeSng6.png)

---
## 第六堂 - 期中小考試!
> 今天要期中小考試 ! 每次一組考試，要考試的組別請到前面來。
> **題目** : 使用LED燈、超音波感測器來實作，當感測到距離小於10公分時要點亮LED燈，否則LED保持暗的。
> **加分題** : 當感測到距離小於10公分時LED燈要一閃一閃，否則LED保持暗的。
---
## 第七堂 - 紅外線感測器/組裝車體 

#### 實際操作 - 偵測是否有東西並加入LED燈
> **題目**:使用LED燈、紅外線感測器來實作，當感測物品時會使LED燈點亮，否則LED燈保持暗的狀態。(<11CM)
> **小提示**:紅外線感測器要如何調整距離？
 :::spoiler 答案
 ![](https://hackmd.io/_uploads/rJ69hv6Za.png)
<a href="https://hackmd.io/_uploads/SJ4CAvT-6.png" style="color: white;">解答</a>

:::
### 減速馬達
![](https://hackmd.io/_uploads/HkaWT1yGT.png)
#### 馬達使用方法
>馬達的運轉方向是根據高低電位決定的，**高電位會往低電位轉**，如上圖所示。
>**兩邊的電位差(HIGH、LOW的值差距)越大則馬達轉速越快。**
### 電機驅動板(L9110)
>![](https://hackmd.io/_uploads/rkcs8kkfa.png)
>用來驅動馬達，分成馬達A、馬達B和中間的正負極，每個馬達都需要兩個腳位來控制。

>**GND**：接到GND
>**VCC**：接到5V

>馬達A腳位：
>**A-1A**：要接到**數位輸出腳位**
>**A-1B**：要接到**類比輸出腳位(有～的)**
>

>馬達B腳位：
>**B-1A**：接到**數位輸出腳位**
>**B-1B(B-2A)**：接到**類比輸出腳位(有～的)**

>**1A**的腳位是用來控制馬達正或反轉
>**1B**的腳位是用來控制馬達的轉速
### 馬達控制方式
| 馬達編號 | 控制方式 | A-1A  | A-1B  | B-1A  | B-1B(B-2A) |
| -------- | -------- | ----- | ----- | ----- | ---------- |
| A馬達    | 正轉     | 高    | 0     | -     | -          |
|          | 反轉     | 低    | 255   | -     | -          |
|          | 停止     | 低/高 | 0/255 | -     | -          |
| B馬達    | 正轉     | -     | -     | 高    | 0          |
|          | 反轉     | -     | -     | 低    | 255        |
|          | 停止     | -     | -     | 低/高 | 0/255      |
### 組裝arduino車
![](https://hackmd.io/_uploads/ByLNAxJMa.png)
>***前輪組裝***

![](https://hackmd.io/_uploads/SJb9Ag1fa.png)
>***組裝左右輪***

![](https://hackmd.io/_uploads/ryhf1byfp.png)
>***電機驅動板接線***
>
>**注意！以一條紅線和黑線為一組，才不會搞混。**

![](https://hackmd.io/_uploads/SJpegb1f6.png)
>***穿到洞裡面***



### 讓馬達動起來(兩個馬達都正轉)
![](https://hackmd.io/_uploads/HJJN7OyGa.png)
>***注意高低電位不要寫反，不然左右輪轉向會相反！***

---
## 第八堂 - 馬達介紹/控制車子行進
> **今日目標:**
> 1.把車子的零件組裝完成
> 2.讓車子可以前進後退(**可以控制速度**)
### 將電機驅動板接上Arduino Uno上
>**!!!要開始前請先找老師協助!!!**
>1. 1A腳位要接到**數位輸出**的腳位,1B腳位要接到**類比輸出**的腳位(有～的)
>2. **在上傳程式時,請拔掉電機驅動板和電池盒的連接線**
>3. **不建議**將電機驅動板上的VCC、GND直接接到Arduino板上,因為驅動馬達會很耗電,可能會讓Arduino當機

![](https://hackmd.io/_uploads/rkfk_iuza.png)
![](https://hackmd.io/_uploads/r1ghsxJdMT.png)
![](https://hackmd.io/_uploads/SJx_WyuGT.png)

### 讓車子可以前進/後退
>**注意! 在上傳程式時,請拔掉電機驅動板和電池盒的連接線**
> **注意! 在上傳程式時,請拔掉電機驅動板和電池盒的連接線**
**注意! 在上傳程式時,請拔掉電機驅動板和電池盒的連接線**
> 為什麼要這樣做 ？

**向前走(會因為接法不同而變成向後走)**
> D6、D8腳位分別控制A、B馬達的轉向 , 目前皆為反轉
> D7、D9腳位分別控制A、B馬達的轉速
> **D6和D7 以及 D8和D9的 差距越大則轉越快(目前是LOW、255)**
> 
![](https://hackmd.io/_uploads/H159Ds_Mp.png)
**向後走**
> D6、D8腳位分別控制A、B馬達的轉向 , 目前皆為正轉
> D7、D9腳位分別控制A、B馬達的轉速
> **D6和D7 以及 D8和D9的 差距越大則轉越快(目前是HIGH、0)**
> 
![](https://hackmd.io/_uploads/rJ8tDj_MT.png)


#### 上傳程式後用9V電池提供Arduino板提供電源
> **!!!要開始前請先找老師協助!!!**
> **步驟一**：程式上傳完成後,拔掉Arduino板和電腦的連線
> **步驟二**: 將9V電池接上Arduino板
> ![](https://hackmd.io/_uploads/ryj16yOMT.jpg)
> **步驟三**: 把電機驅動板上接電池的線接回去(**一接上去車子就會開始跑**)

#### 練習時間！
> 請讓車子可以向前走和向後走,**不會的話舉手問老師**!

### 讓車子可以左右轉彎
> **想一想~ 要如何讓車子可以左轉右轉,要控制什麼東西？**
#### 控制車子的速度
> **想一想~ 以上面的向前走的程式為例,我要改什麼才可以讓車子跑慢一點?**
---
## 第九堂 - 誰的車最準?(競賽)
>**今日目標:**
>1. 小組競賽!比誰的車走的距離最準?

### 誰的車走最準?
> **競賽方式:** 前方貼有起點 、終點的膠帶,目標是看誰的車從起點出發,最後離終點最近
> **範例程式:**
![](https://hackmd.io/_uploads/SyIYfVTM6.png)
> **小提示:**
> 1. 更改times的次數
> 2. 馬達轉的時間(delay)
> 3. 調整馬達轉速(LOW 、255的差距)

每一組都要上來回答以下的問題(有餅乾!)：
1. 你們是第幾組?成員有誰?如何分工的?
2. 你們是如何完成這個任務的? (或是為什麼沒有完成)
3. 有哪些因素會影響車子行走的距離? (請發揮想像力,至少列出3點)
4. 你們覺得可以怎麼改進車子?
---
## 第十堂 - 電影時間!
### 模仿遊戲
![image](https://hackmd.io/_uploads/S1Hs0ys76.png)
> 天才數學家**Alan Turing**被後世譽為「**電腦科學之父**」、「**人工智慧之父**」，在二次世界大戰期間協助英國政府破解了德國的Enigma密碼機，讓二戰可以提早結束。
### 加密與解密
> 簡單來說就是A把明文(看得懂的)加密成密文(看不懂的)傳給B，B再用A提供的方法來把密文還原成明文。
> 舉例: loveyou(明文)加密後變成mpwfzpv(密文)
### 古典加密法
#### 凱薩加密
> 是一種最簡單的加密方法，把明文中的每個字母往前或往後幾個後變成密文。

![image](https://hackmd.io/_uploads/ByvELliQ6.png)
[圖片來源](https://www.wikiwand.com/zh-tw/%E5%87%B1%E6%92%92%E5%AF%86%E7%A2%BC#Media/File:Caesar3.svg)
像是把loveyou每個字母都變成下個字母(l=>m,o=>p,w=>v ....)
> **動動腦!**
> 題目: 小暐今天收到小倫傳送給他的密文(brxduhdslj)，小倫告訴他說這是用凱薩加密法加密的，而且他是把每個字母都變成後三個的字母(例如:a=>d、d=>e ...)，請你們幫助小暐破解密碼。
> 
## 第十二堂 - 控制車子轉彎
>**今日目標**
>1.複習如何讓車子往前進
>2.函式的概念
>3.讓車子可以左轉右轉(**可以控制方向**)
>4.在擺放好的場地內可以完成行駛(**連續直角轉彎**)
### 複習: 車子前進
>參考第八堂的課程
### 讓車子可以轉彎
> 想一想~ 要讓車子可以左轉右轉,要控制什麼東西？
#### 右轉彎
> 注意!因為接線不同,所以有可能會變成左轉彎

一般寫法:
![image](https://hackmd.io/_uploads/Skvgyl6Ep.png)
**函式寫法(!推薦):**
![image](https://hackmd.io/_uploads/SyqIKyaEp.png)
#### 左轉彎
> 把上圖program裡面的right改成left
> 
### 常見錯誤
#### 沒辦法上傳
* 沒有選擇序列埠(COM) => 重新將Arudino連接到電腦，並選擇最新出現的COM
* 線沒有接好 => 重新將Arudino連接到電腦
#### 車子沒有辦法動
* 電池沒有電 => 可以三用電表檢查
* 電池盒開關沒有開
* 線沒有接好 => 檢查馬達與電機驅動板的接線
* 程式寫錯 => 參考上方的程式

### 比賽時間 - 誰的車會轉彎！
> 請每組都來前面測試車子嘗試通過前面的賽道! 衝吧！在賽道上奔馳吧！

## 第十三堂 - 超音波避障車
>**今日目標**
>1.複習如何使用超音波感測器
>2.結合超音波感測器在前面的場地看哪一組車子可以在裡面撐最久!

### 複習超音波感測器 - 顯示出偵測距離
> 參考第五堂的課程
> 
>![Screenshot from 2023-11-27 22-28-09](https://hackmd.io/_uploads/r1T5w7fH6.png)
**Trig接到D5,Echo接到D4,VCC接到5V,GND接到GND**

### 避障車程式參考程式碼
#### 副程式:
 backward函式(往後走)請自己實作
 ![image](https://hackmd.io/_uploads/HkHlFmGBT.png)
#### 主程式:
 主程式空白的地方請自己實作,也可以不要按照下方的程式碼,可以自行發揮
 ![image](https://hackmd.io/_uploads/B1Qd97fH6.png) 

>**小提示:**
>1. 當distance大於多少時要直走
>2. 超音波感測器距離太遠偵測不到的話,distance數值是0
>3. distance小於多少且大於多少時要做什麼(後退?左轉?右轉?)

### 比賽時間 - 誰的車撐最久!
> 做好避障車後,請每組都來前面測試車子會不會碰撞到牆壁,比賽哪一組的車子可以撐最久

## 第十四堂 - 紅外線循跡車

### 複習紅外線感測器 - 顯示出紅外線感測器的數值
>**參考第五堂**
>一組會有兩個紅外線感測器,**左邊和右邊感測器的OUT分別接到A0和A1,VCC接到5V,GND接到GND**
>![image](https://hackmd.io/_uploads/rJFnu9nH6.png)
>**上傳完程式後請點開序列埠監控視窗找老師！**

### 利用紅外線感測器完成循跡車
>[參考影片](https://www.youtube.com/watch?v=t7k9D1jDEtk&t=300s)
#### 循跡原理
![image](https://hackmd.io/_uploads/S1cFa5hHp.png)
#### 大致程式碼
![image](https://hackmd.io/_uploads/H1DLio2Sa.png)


### 比賽時間 - 誰的車最快!
>請做好循跡車的組別，來前面測試車子能不能順利通過賽道，我們會計時，最快通過的組別有獎品!!

## 第十五堂 - 聖誕節燈燈燈燈!!!
>**今日目標**
>1.介紹LED燈
>2.利用程式碼來操控LED燈
>3.寫聖誕卡片！
>4.裝飾聖誕樹!

### 介紹LED燈
>我們今天要使用的LED燈是**WS2812B**,它是
RGB的LED燈,所以可以利用Arduino來分別控制R G B的亮度來組成各式的顏色

![image](https://hackmd.io/_uploads/rJ63q3bDT.png)

[圖片來源](https://shopee.tw/-RWG-16%E4%BD%8D-WS2812-5050-8*8-RGB-LED-%E5%85%A7%E7%BD%AE%E5%85%A8%E5%BD%A9%E9%A9%85%E5%8B%95-%E5%9C%93%E5%BD%A2%E5%BD%A9%E7%87%88-i.14363185.12421099695?sp_atk=44034dc1-8843-47d5-8334-81f01a89640b&xptdk=44034dc1-8843-47d5-8334-81f01a89640b)

#### RGB
>代表的是光的三原色(Red、Green、Blue),這三種顏色分別都使用0-255來代表各自的強度,並藉由不同的強度來呈現出不同的顏色,電腦螢幕、手機螢幕、電視...基本上都是用這種模式表示像素

[顯微鏡下的螢幕](https://3c.yipee.cc/58134/%E9%A1%AF%E5%BE%AE%E9%8F%A1%E4%B8%8B%E7%9A%84-4k-%E8%9E%A2%E5%B9%95%EF%BC%8C-%E5%AF%86%E9%9B%86%E6%81%90%E6%87%BC%E8%80%85%E6%85%8E%E5%85%A5%EF%BC%81/)
[線上RGB調色](https://www.colorspire.com/rgb-color-wheel/)

### 用Arduino來控制LED燈
 
#### Arduino連接WS2812B燈環
  |  Arduino  |  WS2812B  |
  |-----------|-----------|
  |    5V     |     5V    |
  |    GND    |     GND   |
  |    D4     |     D0    |

![image](https://hackmd.io/_uploads/Hkp_FeMPp.png)

#### 安裝套件Adafruit NeoPixel
> 要用Arduino控制LED燈前,需要先安裝Adafruit NeoPixel套件
##### 步驟一 - 點開Arduino上面的工具->管理程式庫
![image](https://hackmd.io/_uploads/Bk4E41GwT.png)
##### 步驟二 - 在上方搜尋 Adafruit NeoPixel 並在下方點安裝
![image](https://hackmd.io/_uploads/r1e2xyGwa.png)


#### 明亮交錯程式範例
![動畫](https://hackmd.io/_uploads/H1HEGJfPT.gif)
``` c
#include <Adafruit_NeoPixel.h>

#define PIN 4 // 數位輸出腳位
#define NUMPIXELS 24 // 總共有幾顆LED燈

Adafruit_NeoPixel pixels(NUMPIXELS, PIN); //設定腳位及數量(不要更改)
  
void setup() {
  pixels.begin(); //啟用pixels服務(不要更改)
}

void loop() {
    for(int i=0; i<NUMPIXELS; i++){ //i用來當第幾顆,第一次先初始化i=0,當i<24時就執行迴圈裡面的東西,做完後i = i+1
      pixels.setPixelColor(i, pixels.Color( 60,120,180 )); //設定第i顆的顏色為RGB(60,120,180)
    }
    pixels.show(); // !!!設定完後要記得打這行,讓LED燈的結果顯示出來!!!
    delay(500); //延遲

    pixels.clear(); //清除所有LED燈的顏色
    pixels.show(); // !!!設定完後要記得打這行,讓LED燈的結果顯示出來!!!
    delay(500); //延遲
}
```

#### 呼吸燈程式範例(暗到亮<->亮到暗)
``` c
#include <Adafruit_NeoPixel.h>

#define PIN 4 // 數位輸出腳位
#define NUMPIXELS 24 // 總共有幾顆LED燈

Adafruit_NeoPixel pixels(NUMPIXELS, PIN); //設定腳位及數量(不要更改)
  
void setup() {
  pixels.begin(); //啟用pixels服務(不要更改)
}

void loop() {
  //從暗到亮
  for(int j=0; j<100; j++){ //j用來當亮度,第一次先初始化j=0,當j<100時就執行迴圈裡面的東西,做完後j = j+1
    for(int i=0; i<NUMPIXELS; i++){ //i用來當第幾顆,第一次先初始化i=0,當i<24時就執行迴圈裡面的東西,做完後i = i+1
      pixels.setPixelColor(i, pixels.Color( 60,120,180 )); //設定第i顆的顏色為RGB(60,120,180)
    }
    pixels.setBrightness(j); //調整所有LED燈的亮度
    pixels.show(); // !!!設定完後要記得打這行,讓LED燈的結果顯示出來!!!
    delay(10); //延遲
  }

  //從亮到暗
  for(int j=100; j>0; j--){
    for(int i=0; i<NUMPIXELS; i++){ 
      pixels.setPixelColor(i, pixels.Color( 60,120,180 )); 
    }
    pixels.setBrightness(j); 
    pixels.show(); 
    delay(10); 
  }
}
```
#### 燈輪流亮程式範例
![動畫](https://hackmd.io/_uploads/SJqxVkGwa.gif)
``` c
#include <Adafruit_NeoPixel.h>

#define PIN 4 // 數位輸出腳位
#define NUMPIXELS 24 // 總共有幾顆LED燈

Adafruit_NeoPixel pixels(NUMPIXELS, PIN); //設定腳位及數量(不要更改)
  
void setup() {
  pixels.begin(); //啟用pixels服務(不要更改)
  randomSeed(analogRead(A0)); //設定隨機種子(不要更改)
}

void loop() {
    for(int i=0; i<NUMPIXELS; i++){ //i用來當第幾顆,第一次先初始化i=0,當i<24時就執行迴圈裡面的東西,做完後i = i+1
      int R = random(256); //隨機設定R的值(0~255)
      int G = random(256);
      int B = random(256);
      pixels.setPixelColor(i, pixels.Color( R,G,B )); //設定第i顆的顏色為RGB(R,G,B)
      pixels.show(); // !!!設定完後要記得打這行,讓LED燈的結果顯示出來!!!
      delay(50); //延遲
      pixels.clear(); //清除所有LED燈的顏色
      delay(50); //延遲
    }
}
```
### 操作時間 - 操作LED燈
> 請每組至少做出一種跟上面不一樣形式的LED燈，最後我們會把你們的燈掛在聖誕樹上，沒有想法的話請善用ChatGPT!!!
> 
![image](https://hackmd.io/_uploads/SJ06ylGPT.png)

### 寫聖誕小卡 !!!
> 每組拿一張卡片來寫上任何想說的話!!!

## 第十六堂 - Python教學(By ChatGPT)
> **今天目標**
> 1.Python簡介
> 2.變數宣告
> 3.變數類型
> 4.基本運算
> 5.IF語句
> 6.使用者輸入
> 7.練習題

### Python簡介
>Python是一種廣泛使用的高級程式語言。它以其易於學習和閱讀的代碼而聞名。Python適合所有年齡的學習者，包括初學者。
>[線上python](https://www.online-python.com/)
>
### 變數宣告
>在Python中，變數是用來存儲資訊的。你不需要告訴電腦變數是什麼類型，它會自動知道。
```python
x = 5       # 這是一個整數
y = "Hello" # 這是一個字符串
z = "5.8" # 這是一個浮點數
l = [1,2,3] #這是一個串列
```
### 變數類型
```python
整數（int）: 如 1, 100, -5
浮點數（float）: 如 1.0, 3.14
字符串（str）: 如 "Hello", "Python"
布林值（bool）: True 或 False
串列(list): 如 [1,2,3,4]、[True,5,"Hello",9]
.
.
```
### 基本運算
>加法（+）
減法（-）
乘法（*）
除法（/）
取餘數(%)
```python=
num1 = 10
num2 = 5
total = num1 + num2  
print(total) # 15

difference = num1 - num2 
print(difference) # 5

product = num1 * num2  
print(product) # 50

quotient = num1 / num2  
print(quotient) # 2

remainder = num1%num2
print(remainder) # 0
```
### IF語句
```python=
age = 15
if age >= 18:
    print("你是成年人")
elif age<0
    print("你不是人!")
else:
    print("你還是未成年")
```

### 使用者輸入
>在Python中，input() 函數允許程序接收使用者的輸入。這是與使用者互動的一種方式。當 input() 函數運行時，程序會暫停，等待使用者輸入文字並按回車鍵。

#### 基本用法
>input() 函數從使用者那裡獲取輸入後，將其作為字符串返回。這意味著即使您輸入數字，它也會被視為文字。

```python=
name = input("請輸入您的名字: ")
print("您好，" + name + "！")
```
#### 轉換輸入類型
>有時您需要將輸入轉換為其他類型，例如整數。可以使用類型轉換函數，如 int() 或 float()。
```python=
age = input("請輸入您的年齡: ")
age = int(age)  # 將字符串轉換為整數
print("您明年將是 " + str(age + 1) + " 歲。")
```

### 練習題
>要求使用者輸入他們有多少錢，然後問他們想買什麼東西(要問3次)。根據他們的選擇，告訴他們買完後還剩多少錢，如果錢是負的要跟使用者說「**你破產了!!!**」。
>**菜單:** 
>石聰明砂鍋魚頭100元、噴火火雞肉飯40、月光義廚50、晚間廚房60元、地靈鹹酥雞120元

#### Python程式碼範例
```python=
user_money = int(input("你現在有多少錢?"))

#這邊要重複問3次
user_input = input("你想吃什麼?")
if(user_input = "石聰明砂鍋魚頭"):
    user_money = user_money - 100
elif(user_input = "..."):
    user_money = user_money - ...
elif(user_input = "..."):
    user_money = user_money - ...
elif(user_input = "..."):
    user_money = user_money - ...
elif(user_input = "..."):
    user_money = user_money - ...
...

print("你剩下多少錢" + str(...) + "元")
if(... < 0):
    print("你破產了!!!")
```
## 第十七堂 - IF敘述、迴圈、中斷迴圈

### 練習題
**題目(注意有型態轉換的問題):**
```
一、在一次數學考試中以下3位同學的成績，小明40分、大壯60分、小帥22分，請算出三個人的平均成績是多少分。
二、繼上題，因為大家這次考試太差老師決定調整原本的分數，並以 原始分數*1.5 得到新的分數，請問三人的平均成績為多少分?
```


### IF條件判斷
![image](https://steam.oxxostudio.tw/webp/python/basic/if-04.webp)
**題目：判斷分數等級**
```
請使用者輸入一個分數（0 到 100之間），程式將根據分數給予不同的等級。
提示：分數區間對應等級如下：
90 到 100 分：優秀
80 到 89 分：良好
70 到 79 分：普通
60 到 69 分：及格
0 到 59 分：不及格
```

### for、while迴圈
>當我們想要重複做某個相同的動作很多次時，我們就可以使用這個迴圈

**for迴圈的語法:**
for i in range(起始值,終止值,每次遞增/遞減值):
如果直接寫成
for i in range(整數值n):
代表從0開始直到n-1為止,i會從0跑到n-1,**i=n不會被執行!**

### 例題:求0加到50的總值為多少

#### 用for迴圈來解:

**1.初始化總和**
```python
total = 0
```
**2.使用 for 迴圈遍歷範圍中的數字**
```python
for i in range(51):
    # 將每個數字加到總和中
    total += i
```
**3.輸出結果**
```python
print("數字 0 到 50 的總和為:", total)
```


**while迴圈的語法**
while 條件式: (當條件式為True,也就是條件成立的時候會執行)

### 同樣的題目用while迴圈來解(注意一下for迴圈與while迴圈有哪裡不同的地方?)

**1.初始化**
```py
total = 0
count = 0
```

**2.使用 while 迴圈**
```py
while count <= 50:
    # 將每個數字加到總和中
    total += count
    # 增加計數器
    count += 1
```

**3.輸出結果**
```py
print("數字 0 到 50 的總和為:", total)
```
接下來有兩個指令是和for、while迴圈有關的

1. break:中斷迴圈並跳脫迴圈結構，執行迴圈外的程式。
2. continue:不會中斷整個迴圈結構,只跳過迴圈內 continue 後面的剩餘敘述，
接著繼續執行下一次的迴圈運作
![image](https://steam.oxxostudio.tw/webp/python/basic/loop-01.webp)
### 例題:求從1到10的數字中,所有奇數的總和
**解法1:** 使用原本for環圈的語法,改變每次加總的值

```py    
total = 0

for i in range(1,10,2):
    total += i

print("1~10的奇數總和為",total)
```
**解法2:** 用continue
```python
total = 0

for i in range(1, 10):
    if number % 2 == 0:
        continue  # 跳過偶數
    else:
        total += i
    
print("1~10的奇數總和為",total)
```
> 想想看把continue 改成 break print出來的結果會是多少?

### 練習題
**題目一: 請用程式碼算出1~100有幾個質數? (共有25個)**
> 質數的定義:在大於1的自然數中，除了1和該數自身外，無法被其他自然數整除的數,就被稱為質數


**題目二: 使用for或while迴圈做出與下圖不同的結果,讓尖端朝下,最多有11個***
![image](https://img-blog.csdnimg.cn/2019092419245123.png)