# 民生國中志工團課程(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)