# 民生國中志工團課程(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)** 這三個動作,
**舉例** : 小明用 **滑鼠點擊了傳說對決的影片**,**影片等了兩秒後終於開始播放**,這時,**耳機傳來了影片的聲音**。
>

圖片來源: [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連接埠**
>

圖片來源: [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燈一閃一閃的亮。
>

---
### 好用工具介紹
#### ChatGPT 人工智慧聊天機器人
>
[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://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://nkust.gitbook.io/micro-bit/bao-ban-ji-yuan-mo-de-shi-yong)
#### 電阻
> 用來限制電流,避免電流過大導致電子零件燒掉。
>

[圖片來源](https://www.synton.com.tw/Product/%E7%A2%B3%E8%86%9C%E9%9B%BB%E9%98%BB+%28CR%29/)
#### LED燈
> 長腳是正極,短腳是負極

[圖片來源](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 答案


:::
---
## 第四堂 - 操作點亮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)
> 
> **錯誤範例 :** int banana = 4.5 (banana是整數型態的變數但是4.5是**浮點數(小數)**)
>
##### 浮點數(float)
> 可以存放有小數點的變數 **(包含整數)**
> **範例 :** float apple = 6.8 (意思是宣告浮點數型態的變數apple,apple的值是6.8)
> 
##### 迴圈(for)
>用來處理重複相似的事情。
**範例 :** 我要給LED類比訊號,讓它慢慢變亮(0~255),我們可以像這樣做 
**一直做到類比輸出到D9腳位255訊號,但是這樣做太累了,我們可以用for迴圈來改善**

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

> 
#### 實際操作2
>讓LED燈一顆接著一顆發亮 **(只亮第一顆->只亮第二顆->只亮第三顆)**
---
### 串聯LED燈
**串聯的特色**
1.流過每個元件的電流都相同。
2.只要有個元件壞掉,後面的元件就沒辦法使用。


#### 實際操作時間3
> 請串聯4顆LED燈,並使用Arduino點亮它們。
---
## 第五堂 - 超音波感測器、紅外線感測器介紹及其應用
### 超音波感測器
> 超音波感測器是藉由超音波來**計算距離**的一種感測器。
> 
[圖片來源 - What is an Ultrasonic Sensor?](https://www.fierceelectronics.com/sensors/what-ultrasonic-sensor)
#### 超音波是什麼?
> 超音波是聲波的一種,只是它的頻率超過20kHz(千赫茲),20kHz大概是人類能夠聽到的極限頻率。
> 在自然界當中,蝙蝠是利用超聲波來進行定位的一種生物。
> 
[圖片來源 - 【蝙蝠解密】蝙蝠為什麼要倒掛?真的會吸血嗎?回聲定位有什麼厲害?吃害蟲大胃王?](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腳位維持是高電位的時間來計算距離。
>
**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毫秒**
#### 實際操作 - 印出距離數值



#### 蜂鳴器使用方法
> 讓蜂鳴器可以一直叫。


#### 實際操作 - 倒車雷達
> 嘗試看看利用剛剛所學,結合超音波感測器、蜂鳴器實作出倒車雷達,當距離小於五公分時蜂鳴器會一直叫。
### 紅外線感測器
>
> **VCC**:連接到5V的電源供應。
**OUT**:會輸出類比訊號(**有反射東西的值是99或100**,**沒反射東西或是物體為黑色的值會是1020左右**),所以要將其**接到類比輸入腳位(A0~A5)**。
**GND**:連接到GND。
#### 反射效果不佳的條件是什麼 ?
:::spoiler 答案
U2FsdGVkX1+ZZctXNl5s3yOlMtpmcSa5vtwlsGcEuVw1fquJjcN4nBIK/wMYr3ozkaNs99aill6Ofne45Wkk1A==
:::
#### 實際操作 - 印出是否有偵測到東西
>如果有偵測到東西(99或100)則顯示Yes,否則(1020左右)顯示No。
>
---
## 第六堂 - 期中小考試!
> 今天要期中小考試 ! 每次一組考試,要考試的組別請到前面來。
> **題目** : 使用LED燈、超音波感測器來實作,當感測到距離小於10公分時要點亮LED燈,否則LED保持暗的。
> **加分題** : 當感測到距離小於10公分時LED燈要一閃一閃,否則LED保持暗的。
---
## 第七堂 - 紅外線感測器/組裝車體
#### 實際操作 - 偵測是否有東西並加入LED燈
> **題目**:使用LED燈、紅外線感測器來實作,當感測物品時會使LED燈點亮,否則LED燈保持暗的狀態。(<11CM)
> **小提示**:紅外線感測器要如何調整距離?
:::spoiler 答案

<a href="https://hackmd.io/_uploads/SJ4CAvT-6.png" style="color: white;">解答</a>
:::
### 減速馬達

#### 馬達使用方法
>馬達的運轉方向是根據高低電位決定的,**高電位會往低電位轉**,如上圖所示。
>**兩邊的電位差(HIGH、LOW的值差距)越大則馬達轉速越快。**
### 電機驅動板(L9110)
>
>用來驅動馬達,分成馬達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車

>***前輪組裝***

>***組裝左右輪***

>***電機驅動板接線***
>
>**注意!以一條紅線和黑線為一組,才不會搞混。**

>***穿到洞裡面***
### 讓馬達動起來(兩個馬達都正轉)

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



### 讓車子可以前進/後退
>**注意! 在上傳程式時,請拔掉電機驅動板和電池盒的連接線**
> **注意! 在上傳程式時,請拔掉電機驅動板和電池盒的連接線**
**注意! 在上傳程式時,請拔掉電機驅動板和電池盒的連接線**
> 為什麼要這樣做 ?
**向前走(會因為接法不同而變成向後走)**
> D6、D8腳位分別控制A、B馬達的轉向 , 目前皆為反轉
> D7、D9腳位分別控制A、B馬達的轉速
> **D6和D7 以及 D8和D9的 差距越大則轉越快(目前是LOW、255)**
>

**向後走**
> D6、D8腳位分別控制A、B馬達的轉向 , 目前皆為正轉
> D7、D9腳位分別控制A、B馬達的轉速
> **D6和D7 以及 D8和D9的 差距越大則轉越快(目前是HIGH、0)**
>

#### 上傳程式後用9V電池提供Arduino板提供電源
> **!!!要開始前請先找老師協助!!!**
> **步驟一**:程式上傳完成後,拔掉Arduino板和電腦的連線
> **步驟二**: 將9V電池接上Arduino板
> 
> **步驟三**: 把電機驅動板上接電池的線接回去(**一接上去車子就會開始跑**)
#### 練習時間!
> 請讓車子可以向前走和向後走,**不會的話舉手問老師**!
### 讓車子可以左右轉彎
> **想一想~ 要如何讓車子可以左轉右轉,要控制什麼東西?**
#### 控制車子的速度
> **想一想~ 以上面的向前走的程式為例,我要改什麼才可以讓車子跑慢一點?**
---
## 第九堂 - 誰的車最準?(競賽)
>**今日目標:**
>1. 小組競賽!比誰的車走的距離最準?
### 誰的車走最準?
> **競賽方式:** 前方貼有起點 、終點的膠帶,目標是看誰的車從起點出發,最後離終點最近
> **範例程式:**

> **小提示:**
> 1. 更改times的次數
> 2. 馬達轉的時間(delay)
> 3. 調整馬達轉速(LOW 、255的差距)
每一組都要上來回答以下的問題(有餅乾!):
1. 你們是第幾組?成員有誰?如何分工的?
2. 你們是如何完成這個任務的? (或是為什麼沒有完成)
3. 有哪些因素會影響車子行走的距離? (請發揮想像力,至少列出3點)
4. 你們覺得可以怎麼改進車子?
---
## 第十堂 - 電影時間!
### 模仿遊戲

> 天才數學家**Alan Turing**被後世譽為「**電腦科學之父**」、「**人工智慧之父**」,在二次世界大戰期間協助英國政府破解了德國的Enigma密碼機,讓二戰可以提早結束。
### 加密與解密
> 簡單來說就是A把明文(看得懂的)加密成密文(看不懂的)傳給B,B再用A提供的方法來把密文還原成明文。
> 舉例: loveyou(明文)加密後變成mpwfzpv(密文)
### 古典加密法
#### 凱薩加密
> 是一種最簡單的加密方法,把明文中的每個字母往前或往後幾個後變成密文。

[圖片來源](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.在擺放好的場地內可以完成行駛(**連續直角轉彎**)
### 複習: 車子前進
>參考第八堂的課程
### 讓車子可以轉彎
> 想一想~ 要讓車子可以左轉右轉,要控制什麼東西?
#### 右轉彎
> 注意!因為接線不同,所以有可能會變成左轉彎
一般寫法:

**函式寫法(!推薦):**

#### 左轉彎
> 把上圖program裡面的right改成left
>
### 常見錯誤
#### 沒辦法上傳
* 沒有選擇序列埠(COM) => 重新將Arudino連接到電腦,並選擇最新出現的COM
* 線沒有接好 => 重新將Arudino連接到電腦
#### 車子沒有辦法動
* 電池沒有電 => 可以三用電表檢查
* 電池盒開關沒有開
* 線沒有接好 => 檢查馬達與電機驅動板的接線
* 程式寫錯 => 參考上方的程式
### 比賽時間 - 誰的車會轉彎!
> 請每組都來前面測試車子嘗試通過前面的賽道! 衝吧!在賽道上奔馳吧!
## 第十三堂 - 超音波避障車
>**今日目標**
>1.複習如何使用超音波感測器
>2.結合超音波感測器在前面的場地看哪一組車子可以在裡面撐最久!
### 複習超音波感測器 - 顯示出偵測距離
> 參考第五堂的課程
>
>
**Trig接到D5,Echo接到D4,VCC接到5V,GND接到GND**
### 避障車程式參考程式碼
#### 副程式:
backward函式(往後走)請自己實作

#### 主程式:
主程式空白的地方請自己實作,也可以不要按照下方的程式碼,可以自行發揮

>**小提示:**
>1. 當distance大於多少時要直走
>2. 超音波感測器距離太遠偵測不到的話,distance數值是0
>3. distance小於多少且大於多少時要做什麼(後退?左轉?右轉?)
### 比賽時間 - 誰的車撐最久!
> 做好避障車後,請每組都來前面測試車子會不會碰撞到牆壁,比賽哪一組的車子可以撐最久
## 第十四堂 - 紅外線循跡車
### 複習紅外線感測器 - 顯示出紅外線感測器的數值
>**參考第五堂**
>一組會有兩個紅外線感測器,**左邊和右邊感測器的OUT分別接到A0和A1,VCC接到5V,GND接到GND**
>
>**上傳完程式後請點開序列埠監控視窗找老師!**
### 利用紅外線感測器完成循跡車
>[參考影片](https://www.youtube.com/watch?v=t7k9D1jDEtk&t=300s)
#### 循跡原理

#### 大致程式碼

### 比賽時間 - 誰的車最快!
>請做好循跡車的組別,來前面測試車子能不能順利通過賽道,我們會計時,最快通過的組別有獎品!!
## 第十五堂 - 聖誕節燈燈燈燈!!!
>**今日目標**
>1.介紹LED燈
>2.利用程式碼來操控LED燈
>3.寫聖誕卡片!
>4.裝飾聖誕樹!
### 介紹LED燈
>我們今天要使用的LED燈是**WS2812B**,它是
RGB的LED燈,所以可以利用Arduino來分別控制R G B的亮度來組成各式的顏色

[圖片來源](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 |

#### 安裝套件Adafruit NeoPixel
> 要用Arduino控制LED燈前,需要先安裝Adafruit NeoPixel套件
##### 步驟一 - 點開Arduino上面的工具->管理程式庫

##### 步驟二 - 在上方搜尋 Adafruit NeoPixel 並在下方點安裝

#### 明亮交錯程式範例

``` 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);
}
}
```
#### 燈輪流亮程式範例

``` 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!!!
>

### 寫聖誕小卡 !!!
> 每組拿一張卡片來寫上任何想說的話!!!
## 第十六堂 - 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條件判斷

**題目:判斷分數等級**
```
請使用者輸入一個分數(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 後面的剩餘敘述,
接著繼續執行下一次的迴圈運作

### 例題:求從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個***
