arduino
5個GPIO的呈現燈亮從左到右的跑馬燈狀態。
用一個for loop由左到右讓LED亮一下再關掉。
5個GPIO呈現queue的跑馬燈狀態。
用二維矩陣把每個LED的個別stage都列出來,1代表亮、0代表不亮,增加程式的可讀性。
用Button控制LED燈亮向左或向右。
按鈕接法為A、B或C、D接線,而A、D與B、C是接通的。
接口2號使用上拉電阻(系統內建INPUT_PULLUP
);接口3號使用下拉電阻(需由使用者自行實踐)。
項目 | 說明 | 按下條件 |
---|---|---|
上拉電阻 | LOW |
|
下拉電阻 | HIGH |
一LED燈控制按鈕需考慮de-bouncing問題;另外一顆LED燈則保持以每秒亮按的頻率持續閃爍。
在不使用delay之下,用一整數累加到指定臨界值即可。
控制多工七段顯示器顯示2021
。
多工七段顯示器(Multiplexed Seven-Segment display)使用多個七段顯示器。七段顯示器功能為解碼訊號為7個LED組合,再利用控制訊號決定哪一個七段顯示器要亮與否。
首先用pin腳10-13
控制訊號依序快速顯示個、十、百、千位數,以肉眼無法難以察覺的速度快速亮暗切換,以達成同時顯示4位數字的目的。
再來是依序選擇數字0-9,將十進位數(int
)解碼七段顯示器的7個LED訊號(顯示小數點的dp除外)並寫入訊號顯示。
控制多工七段顯示器,每隔一秒計數加一。
number
為秒數器,初始化為0使用millis函式,如官方doc解釋
Returns : Number of milliseconds passed since the program started.
Data type: unsigned long.
當millis
與timer
相差1000(ms),則number++
,並更新timer
值與millis
相同。
以模組Keypad
鍵入資料,將資料傳輸至serial monitor。
for
迴圈依序將colun1-4設置成低電位來檢測,而內層if
迴圈是判定當按紐被按下,row為0時,傳對印二維矩陣的char
到監控埠。以模組Keypad
鍵入資料,將值暫存在buffer中,按下#
會將之前輸入的字元依序傳輸至serial monitor。
引用內建函式庫keypad.h
,說明參照官方doc :
使用有參構造函數,創建一個屬於Keypad
類的對象。
調用成員函數char getKey()
,函數使用說明如下:
Return : the key that is pressed, if any.
This function is non-blocking.
用一個字符陣列去存得到的字符,並用一個int count
去累加紀錄加到哪裡。
當讀入#
,把前面的字符印出,並把int count
歸零重數。
掃描式鍵盤與七段顯示器之結合,實作碼錶,功能如下:
按鍵 | 觸發功能 |
---|---|
A |
進入計時模式 |
B |
進入倒數計時模式(先輸入欲倒數秒數) |
C |
開始 |
D |
暫停 |
* |
重新開始 |
# |
離開並進入選擇模式 |
層級如下:
mode == A
while(1)
-> 卡在無窮迴圈
counter++
-> 計秒器++if( control_A == 'D')
-> 停止計時if (control_A == '*')
-> 歸0重數if (control_A == '#')
-> 跳出迴圈mode == B
while (count < 3)
->輸入3位數後跳出
isDigit(digit)
-> 判斷輸入是否validreset
變數紀錄原本輸入的值while(1)
-> 卡在無窮迴圈
if (start == 'C')
->直到按下C才開始倒數
while(1)
-> 卡在無窮迴圈
counter--
-> 計秒器–if( control_A == 'D')
-> 停止計時if (control_A == '*')
-> 歸reset
重數if (control_A == '#')
-> 跳出2層迴圈Arduino微處理器不僅包含MCU,還內建記憶體、類比/數位訊號轉換器以及周邊控制介面,相當於將完整的電腦功能塞入一個矽晶片中,所採用的微處理器是ATmega328P。根據下圖,標示在Arduino UNO板上的digital與analog I/O的位置、數量以及相關用途(如:通訊、中斷…)。
TTL serial data 亦即 電腦的USB 到 arduino上TTL 之序列埠傳輸,應避免使用這兩個腳位。
HIGH
到LOW
之間切換。HIGH
到LOW
時觸發中斷。LOW
到HIGH
時觸發中斷。外部中斷如同CPU和OS的觀念,基於整體程式需求,OS會發出指令使CPU從當前程序中斷,處理別的項目,處理完後,再回到中斷程序繼續執行。
PWM為Pulse Width Modulation,亦即藉由調高輸出數位訊號之頻率轉為類比。
HIGH
時LED亮,LOW
時LED暗。LOW
時enable訊號,代表裝置可以與Master通訊。機械式開關為金屬彈性體製成,彈性體在受力瞬間會有諧振行為,使得按壓機械式開關時,諧振行為發生,造成按鈕內部的電子接點形成時而開起、時而閉合的狀態,訊號短時間的不穩定,稱為彈跳現象。
根據歐姆定律,上拉電阻能將不確定之訊號藉由電流的方式輸入元件中。當上拉電阻過大時,對輸入訊號形成高阻抗,電流無法通過,稱為浮接,訊號變為隨機不穩定之數值,雜訊亦增加。因此,在使用ATmeg328p時,不使用預設的高阻抗,而是另外連結1~10kΩ之上拉電阻,以減少訊干擾。
描述多工七段顯示器及鍵盤掃描的工作原理。
這次實驗包含了9個子實驗,主要是用來熟悉元件使用和程序編寫,程序部分與C大致相同,使用起來沒什麼問題,但在編程時,需要思考IO、訊號高底、延遲時間這類硬體方面的限制才能在arduino上完成實作。
元件方面,四位數七段顯示器、鍵盤掃描都是新的原件,需要先知道個別運作原理,才能用C語言進行描述,控制IO端口訊號。目前實驗還算有趣,退意還沒產生,期待下次實作。
此次實驗主要是了解Arduino的各項功能以及熟悉Arduino IDE的使用方式,因為是遠距的關係,所以有些地方想不通或是想問助教一些問題都不太方便,因此第一次實驗出來的結果沒有很好,在課堂中完成的實驗數量不如預期,主要應該是因為不熟悉操作以及不了解元件運作的關係,需要在學習理解多工七段顯示器、按鈕、Keypad上多花點心思才有辦法再應付下一次實作。
由於本人程式能力欠佳,暑假時我重新學了一遍C/C++
- 了解指標、OOP、常見資料結構等程式的基礎。三上修這門課除了延續暑假的程式學習並結合電機系課程(電工實驗、電子學等)學到的硬體,希望能了解軟硬體的整合操作。
由於COVID-19疫情改成遠距教學,禮拜四上課時,我沒有實際參與,因此事後我實際操作各個實驗的流程,程式與硬體沒有很難,但需要花時間去理解相關原理,這部分可以參閱 :
養成會看官方文件的好習慣,如此才能獲得第一手的資料,也能獲得可信度較高的資訊。另外我也打了個人筆記Arduino筆記,重點為比較Arduino與C/C++的不同之處、Arduino函式庫引用與分文件編寫。希望我能多學習、勤能補拙,方能跟上大家的進度。