書籍內容更新_202012更新
Last updated
Last updated
*** P19新增LED模組亮度調整內容說明***
展示效果和序列埠輸出結果 新增以下內容:
LED 模組將亮 1 秒,燈滅 1 秒。
下面新增說明及圖片
LED模組亮度調整說明:
LED模組上有可變電阻,可以用螺絲起子轉動它,使LED更亮或更暗。
*** P27 程式碼部分修改程式碼內容***
程式碼後面加上//本行修改部分為須更改之程式碼AND註解
*** 修改蜂鳴器內容說明和蜂鳴器程式碼&新增範例程式碼內容***
與 LED 模組相同,蜂鳴器也是輸出模組,不同的是它不會發光而是發出聲音。蜂鳴器在很多情況下可以用於指示某種狀況或提醒。
背景知識
什麼是有源蜂鳴器和被動式蜂鳴器?
蜂鳴器有兩種類型,一種是有源,另一種是無源。有源蜂鳴器和無源蜂鳴器都是用來給電子產品發聲的。
有源蜂鳴器具有內部振盪源,只要接通電源,蜂鳴器就會發出聲音。有源蜂鳴器廣泛應用於電腦,印表機,警報器,電子玩具,汽車電子產品,電話,計時器和其他電子產品的發聲設備。
無源蜂鳴器沒有內部振盪源,需要由方波和不同頻率驅動。它的作用就像電磁揚聲器,不斷變化的輸入信號會產生聲音,而不是自動發出聲音。
在本套件中,Grove-Buzzer是一個無源蜂鳴器,所以需要一個交流信號(AC)來控制它。這就產生了一個問題,如何用Arduino產生方波(交流信號)? 一個簡單的方法就是使用PWM。
什麼是 PWM ?
脈衝寬度調變 (PWM) 是一種通過數位方式來模擬類比效果的技術。數位腳位可以產生方波,即在開 (ON) 和關 (OFF) 之間切換的訊號。只要改變 (ON) 和 (OFF) 這兩種訊號的時間長度比例,此開關模式可以模擬全開 (5V) 和關 (0V) 之間的連續電壓變化。【接通時間 (ontime)】的持續時間稱為脈衝寬度。例如,如果 LED 重複這種開關模式夠快的話,結果就如同控制 LED 亮度從 0 至 5V 之間的連續穩定電壓一樣。引用自:Arduino(https://www.arduino.cc/en/tutorial/PWM)
Seeeduino 上有 6 個數位腳位,上面額外標示了“ ~ "符號,表示它們可以發送PWM訊號:3、5、6、9、 10、11,因此它們也稱為PWM腳位。
使用模組
1. Seeeduino 開發板
2. 蜂鳴器
3. 訊號線(僅適用於模組已拆開的情況)
硬體連接
模組連接
① 預設以電路板上的線路連接到 Seeeduino。
② 透過 USB 傳輸線將 Seeeduino 連接到電腦。
程式碼
①打開 Arduino IDE.
②輸入以下程式碼,按一下【驗證(✓)】來檢查有無語法錯誤,如果沒有出現錯誤訊息,就可以按【上傳(→)】把程式碼上傳到開發板。
程式碼分析
analogWrite(BuzzerPin, Value);
將類比值(PWM)寫入蜂鳴器。
描述:
將類比值(PWM)寫入腳位。可用於調整 LED 亮度或控制馬達的轉速快慢。在設定 analogWrite() 函式後,該腳位將生成指定工作週期的穩定方波,直到同一腳位再次被不同參數的 analogWrite()函式設定(也可以使用 digitalRead() 或 digitalWrite() 函式)為止。
語法:
analogWrite(pin, value)
參數:
pin(腳位): 要寫入的 Arduino 腳位(pin)。
允許的資料型態:整數 (int)。
數值 : 工作週期:介於 0(始終關閉)和 255(始終開啟)之間。
允許的資料型態:整數 (int)。
展示效果和序列埠輸出結果
蜂鳴器會響一秒、停止響一秒。
拆解指南
如果模組已從主機板上分離,則需要使用訊號線把蜂鳴器連接到 Seeeduino 的數位連接埠 D5。
使用蜂鳴器發出設定頻率的聲音
如果要使蜂鳴器發出設定好的頻率的聲音,可以使用以下程式碼,詳細介紹請參考以下連結。
https://cavedu.gitbook.io/cavedu/hangeekduino/samplecode/output_module/buzzer
PWM用法
現在我們已經學會了PWM的使用,除了用PWM控制無源蜂鳴器外,我們還可以用PWM於控制馬達的轉速快慢或調整LED亮度等功能。
如下圖所示,使用 analogWrite() 函式來生成不同寬度 PWM 波,其中工作週期 (Duty Cycle) 高電位的比例越高,LED燈越亮。
然而,Grove Beginner Kit上的LED燈無法直接使用PWM控制,因為LED連接的是D4,而如上文中所述PWM腳位為3,5,6,9,10,11,pin 4並不是PWM腳位。如果您想用PWM來控制LED,則需要將它拆開下來,使用訊號線連到帶PWM功能的腳位。(或著如以下範例使用訊號線連接D3腳位,但不能同時使用溫溼度感測器)
例如,讓我們用訊號線將LED模組與數位連接埠D3連接起來。
*注意:D3也與溫濕度感測器相互連接,因此本範例不能與溫濕度感測器一起使用。
編譯並上傳程式碼,你應該可以使用PWM訊號來調整旋轉式電位器改變LED的亮度。
程式碼分析
Value = map(potentioValue, 0, 1023, 0, 255);
把旋轉式電位器的類比訊號 (0 - 1023) 映射為LED的亮度 (0 - 255)。
語法:
map(value, fromLow, fromHigh, toLow, toHigh)
描述:
把一個範圍中的某個數字等比例對應到另一個範圍中的數字。也就是說,fromLow 這個值會被對應到 toLow,fromHigh 同樣地會被對應到 toHigh。兩者之間的數字也是如此。
不需要硬把數字限制在某個範圍中,因為就算超出上下限的數字有時也是有意義甚至是有用的。如果真的有必要限制範圍的話,可把 constrain() 函式放在 map() 函式的之前或之後來執行。
請注意,新舊兩個數值範圍的下限不一定要真的小於上限。這樣一來,map() 函式還可以把一個範圍的數字反過來,例如:
y = map(x, 1, 50, 50, 1);
這個函式也可以處理負數,如以下範例:
y = map(x, 1, 50, 50, -100);
同樣也可以正確執行。
map () 函式只接受整數,因此就算運算結果有小數點,一樣會被改為整數。小數點會直接被捨去,而非四捨五入。
參數:
● value: 要被映射的數字
● fromLow: 原始數值範圍的下限
● fromHigh: 原始數值範圍的上限
● toLow:映射後數值範圍的上限
● toHigh:映射後數值範圍的上限
展示效果和序列埠輸出結果:
調整旋轉式電位器的數值會改變LED的亮度。
總而言之,當你要使用PWM功能時,需要選擇那些名字前面有"~"符號的腳位。
*** P42 程式碼部分修改註解內容*** 程式碼後面加上//本行修改部分為須更改之程式碼AND註解
***P45新增將OLED模組拆解下來需要更新之程式碼***
測試發現將OLED顯示模組拆解下來時,燒錄原本的程式碼時會無法使用。所以更新程式碼內容讓OLED顯示模組在拆解下來時也可正常使用。
u8x8.setBusClock(100000);
為新增之程式碼,如將模組拆解下來需要設定BusClock才可使用。