教育部改善師資經費補助 正修科技大學 102 年度教師製作教具成果報告 ************************** 嵌入式系統 ************************** 團體 個人 單 位 : 電機系 單位主管 : ( 簽章 ) 職 姓 稱 : 副教授 名 : 廖炳松 執行期間 : 102 年 2 月 1 日至 102 年 6 月 30 日 教評會審查期間 : 學年度第次 ( 年月日 )
授課班級 : 四技影像學程二年級甲班 課程名稱 : 嵌入式系統 本教具製作以課程嵌入式系統的實作為主題, 採用 Arduino UNO 控 制卡為整個實驗項目的主核心, 配合電阻 發光二極體 開關 4X4 鍵盤 七段顯示器 LCD 液晶模組, 規劃下列實驗單元 1. 跑馬燈閃爍實驗 2. 跑馬燈速度控制實驗 ( 含按鍵開關狀態擷取 ) 3. 4X4 鍵盤擷取及按鍵數值顯示 0-F 實驗 4. 七段顯示器數字顯示驅動實驗 5. 5 X7 LED 點矩陣字幕顯示實驗 6. PWM 燈光控制實驗
一 跑馬燈閃爍實驗 本實驗的目的在於讓學生了解以 FRITZING 和 VISIO 軟體繪製的跑馬燈電路圖過程應有的軟體操作技巧 另一方面以 ARDUINO 軟體撰寫程式, 使得數位輸出的 HIGH LOW 變化, 可以變化出無限的燈光效果 在此只以簡單跑馬燈形式讓 LED 燈由左至右掃描, 之後再由右向左掃描, 反覆執行上述程式
/* 程式碼說明 ******************************************** File Name (group): G1-5-3_flashing_circuit.pde Prupose: 霹靂燈 Complier: Arduino 1.03 Authors : bsliao/a12345678, john/b258963 Date : 2013-03-11 *********************************************/ int ledpin[8] = {0,1,2,3,4,5,6,7; // 選擇 8-13 接腳驅動 LED int i, j; // 迴圈變數 ( 呼較不同顆 LED) // 下列 setup 函式只會於啟動電源時執行 1 次 void setup() { // 將 6 隻腳位設為輸出端 for(i=0; i< 8;i++) pinmode(ledpin[i], OUTPUT); // 下列 loop 函式將會持續執行直到電源關閉或重置 void loop() { for (j=0; j<8; j++) { for(i=0; i < 8;i++) { digitalwrite(ledpin[i], HIGH); // 將第 i 隻腳設為高電位 digitalwrite(ledpin[j], LOW); // 將第 i 隻腳設為低電位 delay(1000); // 等待 1 秒 for (j=0; j<8; j++) { for(i=0; i < 8;i++) { digitalwrite(ledpin[i], HIGH); // 將第 i 隻腳設為高電位 digitalwrite(ledpin[7-j], LOW); // 將第 i 隻腳設為低電位 delay(1000); // 等待 1 秒
二 跑馬燈速度控制實驗 ( 含按鍵開關狀態擷取 ) 本實驗的目的在於讓學生了解以 FRITZING 和 VISIO 軟體繪製的跑馬燈速度控制實驗電路圖過程應有的軟體操作技巧 另一方面以 ARDUINO 軟體撰寫程式, 使得數位輸入的 HIGH LOW 變化, 會影響燈光效果的閃爍速度 在此只以簡單跑馬燈形式讓 LED 燈由左至右掃描, 之後再由右向左掃描, 反覆執行上述程式, 只是跑馬燈速度控制由相關的數位輸入所決定
/* 程式碼說明 ******************************************** File Name (group): G1-5-3_flashing_circuit.pde Prupose: 霹靂燈閃爍速度控制 Complier: Arduino 1.03 Authors : bsliao/a12345678, john/b258963 Date : 2013-03-25 *********************************************/ int ledpin[8] = {0,1,2,3,4,5,6,7; // 選擇 8-13 接腳驅動 LED int buttonpin[6]={8,9,10,11,12,13; int i, j; // 迴圈變數 ( 呼較不同顆 LED) int dealytime; // 下列 setup 函式只會於啟動電源時執行 1 次 void setup() { // 將 8 隻腳位設為輸出端 for(i=0; i< 8;i++) pinmode(ledpin[i], OUTPUT); // 設定腳位為輸入狀態 for(i=0; i< 6;i++) pinmode(buttonpin[i], INPUT); // 下列 loop 函式將會持續執行直到電源關閉或重置 void loop() { if (digitalread( buttonpin[0]) == HIGH) // 偵測開關是否接通 dealytime=1500; else if(digitalread( buttonpin[1]) == HIGH) // 偵測開關是否接通 dealytime=500; else dealytime=1000; for (j=0; j<8; j++) { for(i=0; i < 8;i++) { digitalwrite(ledpin[i], HIGH); // 將第 i 隻腳設為高電位 digitalwrite(ledpin[j], LOW); // 將第 i 隻腳設為低電位
delay(dealytime); // 等待 1 秒 for (j=0; j<8; j++) { for(i=0; i < 8;i++) { digitalwrite(ledpin[i], HIGH); // 將第 i 隻腳設為高電位 digitalwrite(ledpin[7-j], LOW); // 將第 i 隻腳設為低電位 delay(dealytime); // 等待 1 秒
三 4X4 鍵盤擷取及按鍵數值顯示 0-F 實驗本實驗的目的在於讓學生了解以 FRITZING 和 VISIO 軟體繪製的 4X4 鍵盤擷取電路圖過程應有的軟體操作技巧 另一方面以 ARDUINO 軟體撰寫程式, 利用多工掃描的方式讀取 4X4 鍵盤的鍵值, 之後以 6 顆 LED 反映出相對應的表二進位的數值 此處 4 X 4 鍵盤的 位置圖以 VISIO 至 圖為參考藍本
/* 程式碼說明 ******************************************** File Name: Simple_4x4_Keypad_Input_Fetch.pde Purpose: 霹靂燈閃爍速度控制 Revised from 4x4_Keypad_amitbiswal.ino Program demonstrating 4x4 Numeric Keypad interfacing with Arduino UNO Program Written by: Amit Biswal (Speaking Technology) URL : http://amitbiswal.blogspot.com Complier: Arduino 1.03 Authors : bsliao/a12345678, john/b258963 Date : 2013/03/26, Version 1.0 *********************************************/
int row[4] ={ 6,7,8,9 ; int column[4]={10,11,12,13; int led[6]= { 0,1,2,3,4,5 ; int i; void setup() { Serial.begin(9600); // consol baud rate for (i=0; i<4; i++) pinmode(row[i],output); for (i=0; i<4; i++) pinmode( column[i],input); void loop() { int value; //setting the columns as high initially for (i=0; i<4; i++) digitalwrite( column[i], HIGH); //checking everything one by one //case 1: row1 =0 while other rows as 1 for (i=0; i<4; i++) digitalwrite( row[i], HIGH); value=31; //checking each column for row1 one by one if(digitalread(column[0])==0) { Serial.println("key 0 pressed"); value=0; else if(digitalread(column[1])==0) { Serial.println("Key 1 pressed"); value=1; else if(digitalread(column[2])==0) { Serial.println("Key 2 pressed"); value=2; else if(digitalread(column[3])==0) { Serial.println("Key 3 pressed");
value=3; //case 2: row2 =0 while other rows as 1 for (i=0; i<4; i++) digitalwrite( row[i], HIGH); digitalwrite(row[1],low); //checking each column for row2 one by one //checking each column for row1 one by one if(digitalread(column[0])==0) { Serial.println("key 4 pressed"); value=4; else if(digitalread(column[1])==0) { Serial.println("Key 5 pressed"); value=5; else if(digitalread(column[2])==0) { Serial.println("Key 6 pressed"); value=6; else if(digitalread(column[3])==0) { Serial.println("Key 6 pressed"); value=7; //case 3: row3 =0 while other rows as 1 for (i=0; i<4; i++) digitalwrite( row[i], HIGH); digitalwrite(row[2],low); //checking each column for row1 one by one //checking each column for row1 one by one if(digitalread(column[0])==0) { Serial.println("key 8 pressed"); value=8; else if(digitalread(column[1])==0) { Serial.println("Key 9 pressed");
value=9; else if(digitalread(column[2])==0) { Serial.println("Key A pressed"); value=10; else if(digitalread(column[3])==0) { Serial.println("Key B pressed"); value=11; //case 4: row4 =0 while other rows as 1 for (i=0; i<4; i++) digitalwrite( row[i], HIGH); digitalwrite(row[3],low); //checking each column for row4 one by one //checking each column for row1 one by one if(digitalread(column[0])==0) { Serial.println("key C pressed"); value=12; else if(digitalread(column[1])==0) { Serial.println("Key D pressed"); value=13; else if(digitalread(column[2])==0) { Serial.println("Key E pressed"); value=14; else if(digitalread(column[3])==0) { Serial.println("Key F pressed"); value=15; switch (value) { case 0: digitalwrite(led[0], HIGH); digitalwrite(led[1], HIGH); digitalwrite(led[2], HIGH);
digitalwrite(led[3], HIGH); digitalwrite(led[4], HIGH); digitalwrite(led[5], HIGH); break; case 1: digitalwrite(led[0], LOW); digitalwrite(led[1], HIGH); digitalwrite(led[2], HIGH); digitalwrite(led[3], HIGH); digitalwrite(led[4], HIGH); digitalwrite(led[5], HIGH); break ; case 2: digitalwrite(led[0], HIGH); digitalwrite(led[1], LOW); digitalwrite(led[2], HIGH); digitalwrite(led[3], HIGH); digitalwrite(led[4], HIGH); digitalwrite(led[5], HIGH); break ; case 3: digitalwrite(led[0], LOW); digitalwrite(led[1], LOW); digitalwrite(led[2], HIGH); digitalwrite(led[3], HIGH); digitalwrite(led[4], HIGH); digitalwrite(led[5], HIGH); break ; default: digitalwrite(led[0], LOW); digitalwrite(led[1], LOW); digitalwrite(led[2], LOW); digitalwrite(led[3], LOW); digitalwrite(led[4], LOW); digitalwrite(led[5], LOW); delay(500);
四 七段顯示器數字顯示驅動實驗本實驗的目的在於讓學生了解以 FRITZING 和 VISIO 軟體繪製的七段顯示器數字顯示驅動實驗電路圖過程應有的軟體操作技巧 另一方面以 ARDUINO 軟體撰寫程式, 使得數位輸出的 HIGH LOW 變化, 可以在七段顯示器裡依序看到 0,1,2,3,4,5,6,7,8,9 的符號
/* 程式說明 ********************************************* File Name (group): AR4_seven_segment_Display.ino Prupose: 七段顯示器數字顯示實驗 Complier: Arduino 1.03 Authors : bsliao/a12345678, john/b258963 Date : 2013-04-03 *********************************************/ /* Revised from EXcode 5-10, Arduino 一試就上手編號及設定位置圖 a f b g e c d
1: b, c 6: a, b, g, c, d, e 2: a, b, g, e, d 7: a, b, c 3: a, b, g, c, d 8: a, b, c, d, e,f, g 4: f, g, b, c 9: a, b, c, d, f, g 5: a, f, g, c, d */ #define CommonAnode 8 #define sega 0 #define segb 1 #define segc 2 #define segd 3 #define sege 4 #define segf 5 #define segg 6 #define segdp 7 int i=0; // 迴圈變數 int j=0; // 迴圈變數 void Reset() // 將 7 段顯示器全部關閉 { digitalwrite(segg,high); // g digitalwrite(segf,high); // f digitalwrite(sega,high); // a digitalwrite(segb,high); // b digitalwrite(sege,high); // e digitalwrite(segd,high); // d digitalwrite(segc,high); // c delay(500); void setup() { for(i=0;i<=8;i++) pinmode(i,output); // 接腳輸出設定 //7 段顯示器 COM 腳位設定為 HIGH( 共陽 ) digitalwrite(commonanode,low); // COM digitalwrite(segg,high); digitalwrite(segf,high); // g // f
digitalwrite(sega,high); digitalwrite(segb,high); digitalwrite(sege,high); digitalwrite(segd,high); digitalwrite(segc,high); // a // b // e // d // c void loop() { // 先將 7 段顯示器的 0~9 用陣列設定好 int number[10][7] ={ {segf, sega, segb, sege, segd, segc, {segb, segc, {segg, sega, segb, sege, segd, {segg, sega, segb, segd, segc, {segg, segf, segb, segc, {segg, segf, sega, segd, segc, {segg, sega, segb, sege, segd, segc, {sega, segb, segc, {segg, segf, sega, segb, sege, segd, segc, {segg, segf, sega, segb, segd, segc ; // 每 0.5 秒切換顯示數字 0~9 for(i=0;i<10;i++) { for(j=0;j<7;j++) digitalwrite(number[i][j],low); delay(500); Reset(); // 將 7 段顯示器重置 (LED 全部熄滅 )
五 5 X7LED 點矩陣字幕顯示實驗本實驗的目的在於讓學生了解以 FRITZING 和 VISIO 軟體繪製的 5X7 LED 點矩陣字幕顯示電路圖過程應有的軟體操作技巧 另一方面以 ARDUINO 軟體撰寫程式, 藉由多工掃描驅動方式, 控制 LED 點矩陣的縱行共陽極之端點, 再由每一列的 HIGH LOW 信號變化, 產生預期的圖形符號
/**** 程式說明本實驗的程式碼請參閱 http://playground.arduino.cc/main/directdriveledmatrix 或者參考 http://hanez.org/arduino-ta07-11-5x7-dot-matrix-display.html#code 這些網頁提供非常豐富的內容說明及繳未擴充的技巧, 值得初學者深入探究 ******************/
六 PWM 燈光控制實驗本實驗的目的在於讓學生了解以 FRITZING 和 VISIO 軟體繪製的 PWM 燈光控制實驗電路圖過程應有的軟體操作技巧 另一方面以 ARDUINO 軟體撰寫程式, 使得 PWM 端點輸出信號中 HIGH LOW 所佔的工作周期 (duty cycle) 之變化, 可以營造出 RGB 一體成型的 LEDs 燈變化出魔幻般之燈光效果
/* 程式碼說明 /********************************************* File Name (group): AR6_RGB_PWM_define.pde Prupose: 以 PWM 控制營造出 RGB 魔幻燈光 Complier: Arduino 1.03 Authors : bsliao/a12345678, john/b258963 Date : 2013-03-27 *********************************************/ # define LedPinR 3 # define LedPinG 5 # define LedPinB 6 int ledpinr = 3; // LED connected to digital pin 3 int ledping = 5; // LED connected to digital pin 5 int ledpinb = 6; // LED connected to digital pin 6 int i, j, k; int BLACK=255, WHITE=0; void setup() { pinmode(ledpinr, OUTPUT); // sets the pin as output pinmode(ledping, OUTPUT); // sets the pin as output pinmode(ledpinb, OUTPUT); // sets the pin as output void loop() { // dark analogwrite(ledpinb, BLACK); analogwrite(ledpinr, BLACK ); analogwrite(ledping, BLACK); delay(2000); // white analogwrite(ledpinb, WHITE); analogwrite(ledpinr, WHITE ); analogwrite(ledping, WHITE); delay(2000); // red analogwrite(ledpinb, BLACK);
analogwrite(ledpinr, WHITE ); analogwrite(ledping, BLACK); delay(2000); // green analogwrite(ledpinb, BLACK); analogwrite(ledpinr, BLACK); analogwrite(ledping, WHITE); delay(2000); // blue analogwrite(ledpinb, WHITE); analogwrite(ledpinr, BLACK); analogwrite(ledping, BLACK); delay(2000); for (i=0; i<256; i=i+8) { analogwrite(ledpinr, i); // analogwrite values from 0 to 255 analogwrite(ledping, BLACK); analogwrite(ledpinb, BLACK); delay(100); for (i=0; i<256; i=i+8) { analogwrite(ledping, i ); // analogwrite values from 0 to 255 analogwrite(ledpinr, BLACK); analogwrite(ledpinb, BLACK); delay(100); for (i=0; i<256; i=i+8) { analogwrite(ledpinb, i); // analogwrite values from 0 to 255 analogwrite(ledpinr, BLACK); analogwrite(ledping, 255); delay(100); analogwrite(ledpinb, BLACK); analogwrite(ledpinr, BLACK); analogwrite(ledping, BLACK); delay(2000);
/* please write down your program here. */ for (i=0; i<256; i=i+16) for (j=0; j<256; j=j+16) for (k=0; k<256; k=k+16) { analogwrite(ledpinr, i); // analogwrite values from 0 to 255 analogwrite(ledping, j); analogwrite(ledpinb, k); delay(100);