CH5 數位訊號 最簡單的互動設計 – Arduino一試就上手 孫駿榮、吳明展、盧聰勇
數位表示方式 數位訊號通常會使用2進位表示: 10011010101 在0與1之間所轉換的其實就是電壓高低的準位,0表示電壓在低準位,而1表示電壓在高準位,依據系統運作的工作電壓,低準位和高電壓準位不會只限於單一數值,而會介於一電壓範圍區間內。 數位訊號則非常要求時脈周期,每個訊號的時間長短會依據連接的設備不同而有不同的要求。
Arduino LED範例 digitalWrite(ledPin, HIGH); // 將第13隻腳設為高電位 delay(1000); // 等待1秒 digitalWrite(ledPin, LOW); // 將第13隻腳設為低電位 改變Delay函式內的時間參數,會有不同的影響
Arduino LED接線 LED可以有兩種接法,因為LED是一種二極體,只有單一方向可以導通,讓電流由正極流向負極,接法1是視Arduino的接點為負極,所以只有當接腳改變為低電位時,LED才會亮;而接法2是視接腳為正極,故當接腳為高電位時,LED才會亮。
Arduino Pin13 在Arduino的Duemilanove板子上,第13隻腳已經接上了1k的限流電阻,如圖所示。 若讀者利用其他數位腳位來測試LED時,最好加上限流電阻的部分以保護LED,尤其是採用外部電源時。
Arduino結合按鈕與LED 利用外部的訊號來做燈號的切換,有單純的開關或是紅外線感應。
Arduino結合按鈕與LED val = digitalRead(BUTTON); // 讀取並儲存按鈕狀態 if (val == HIGH) //若按鈕按下,改變狀態 程式當中的HIGH,是因為按鈕一邊接上的是Arduino的正5伏特腳位,故當按鈕被按下時,接腳的狀態會為高電位,並不是任意定義腳位的狀態,需依據實際接線的安排。
霹靂燈 有兩種方式,第一種是直接接上多顆LED按照單顆的接法,分別接在不同腳位上;另一種是已經將10顆LED整合成一個小模組的方式,如圖: 請注意使用的為共陽或共陰的模組
霹靂燈接線與控制 void loop() { // 將第i隻腳設為高電位 for(i=0;i<6;i++) digitalWrite(ledPin[i], HIGH); delay(1000); // 等待1秒 // 將第i隻腳設為低電位 digitalWrite(ledPin[i], LOW); }
指撥開關與LED 每當外在改變指撥開關的組合時,此時的LED也會相對應的產生一樣的亮法。
LED陣列 它經由16隻接腳來控制8×8共64顆LED,這邊LED有分成共陽極和共陰極兩種,在程式上需要特別注意這樣的不同。
LED陣列內部 左:共陽;右:共陰
LED陣列接腳 由於Arduino本身的核心單晶片只有28隻腳位,其中也只有14隻數位控制接腳,扣除必要腳位,只剩12隻,因此範例我們犧牲了LED陣列中最外圍的一圈,實際只控制了6×6的燈號。
LED陣列與Arduino接線腳位 LED陣列 Arduino 1 空接 9 7 2 10 8 3 11 4 12 5 13 6 14 15 16
Arduino控制程式 void loop() { //由上至下移動燈號陣列 int UDPins[] = {5, 13, 4, 7, 12, 8}; //由左至右移動燈號陣列 int RLPins[] = {6, 3, 11, 2, 10, 9}; for(i=0;i<=5;i++) //由上至下顯示燈號 digitalWrite(UDPins[i],HIGH); delay(200); //暫留0.2秒,方便觀察 }
Arduino控制程式 為了程式撰寫的結構能夠簡單明瞭,先定義了兩個陣列來存放實際LED燈的接腳定義,這樣在之後的控制可以使用迴圈讓程式看起來乾淨許多。由前面的LED陣列內部架構可以看出,第1個LED陣列的上下燈號控制中,只需要將Arduino的5、13、4、7、12、8依序拉高電位,這樣就會驅動LED陣列中的6、16、4、9、15、10的腳位,讓燈號亮起。要關閉燈號也就在依照想要的順序將腳位的訊號由高電位該為低電位即可。
外部控制燈號顯示 由於讀取到直線滑動式可變電阻訊號電壓的值為0-5伏特,所以在顯示當中是以0-1023來表示,我們也就利用1024除以總共可以控制的LED陣列數量6組,這個間隔大約為170,所以在程式當中使用判斷式來隨著不同的區間亮出不一樣的燈號位置。
部分程式碼區段 //讀取滑桿式可變電阻的電壓值 範圍:0 - 1023 int analogValue = analogRead(0); //依據不同的電壓值觸發不同的列數 1 - 6 if(analogValue>=853) //電壓值高於853 觸發最右邊 { digitalWrite(RLPins[0],HIGH); digitalWrite(RLPins[1],HIGH); digitalWrite(RLPins[2],HIGH); digitalWrite(RLPins[3],HIGH); digitalWrite(RLPins[4],HIGH); digitalWrite(RLPins[5],LOW); }
XY滑桿LED陣列燈光控制
7段顯示器 它已經將8顆LED排列成8字形,外加一顆小數點,經由不同的燈號組合搭配出0到9的數字顯示。基本的7段顯示器模組只有1位數字,也可以買到多顆組合在一起的多位數顯示。
7段顯示器 7段顯示器也是一種LED陣列,因此也有分成共陽極與共陰極兩種,1顆顯示器有10隻腳位,除了8科LED的控制外,另外兩隻是共同接腳(COM),在電路裡擇一接上即可,依據顯示器共陽或共陰,COM腳位要接正電或接地。
7段顯示器 1顆7段顯示器中的腳位排列如圖所示,分做上下各5之接腳,中間的為共同接腳,由上方右邊數來第2隻是為a腳位,其餘以順時針方向排列,而每隻腳位所對應到的位置也標示在圖中,依據這些位置,才可以顯示出我們要的數字。
Arduino與7段顯示器接線
顯示設定 //先將7段顯示器的0~9用陣列設定好 int number[10][7] ={ {4, 6, 7, 8, 9, 10}, {7, 10}, {3, 6, 7, 8, 9}, {3, 6, 7, 9, 10}, {3, 4, 7, 10}, {3, 4, 6, 9, 10}, {3, 6, 7, 8, 9, 10}, {6, 7, 10}, {3, 4, 6, 7, 8, 9, 10}, {3, 4, 6, 7, 9, 10} };
PWM Pulse Width Modulation 數位訊號模擬成類比訊號,最常使用的方法便是PWM – 脈波寬度調變。 主要的原理便是調整電壓準位變化的時間長短,我們來看以下例子:
Arduino控制PWM 在Arduino的核心ATMEGA328上共有6隻接腳支援PWM訊號,在Arduino的板子上都有標示出來,分別是:3、5、6、9、10、11,如果是較舊的核心:ATMEGA8,只有支援9、10、11三隻腳。 analogWrite(LED, i); // PWM輸出(逐漸變亮) 輸入的參數:第1個是接腳;第2個則是PWM訊號的數值,從0-255
蜂鳴器 蜂鳴器一般常見的有壓電式與磁激式兩種,而聲音高低的變化簡單來說,也就是頻率的不同,藉由高低電位長短時間的配合,可以讓蜂鳴器模擬出近似的音階變化。
音階高低說明 音階 Do Re Mi Fa So La Si 低音 261 294 329 349 392 440 493 中音 523 587 659 698 784 880 988 高音 1046 1175 1318 1397 1568 1760 1976
Arduino音階說明 音階 頻率(Hz) 週期 高電位時間 c(Do) 261 3830 1915 d(Re) 294 3400 1700 E(Mi) 329 3038 1519 f(Fa) 349 2864 1432 g(So) 392 2550 1275 a(La) 440 2272 1136 b(Si) 493 2028 1014 523 1912 956
Arduino與蜂鳴器接線 大顆的蜂鳴器,使用電晶體來放大訊號。若不太要求聲音大小聲、蜂鳴器本身也屬於比較小尺寸的,可以直接從Arduino的腳位接上蜂鳴器。
音階 void playTone(int tone, int duration) { for (long i = 0; i < duration * 1000L; i += tone * 2) { digitalWrite(speakerPin, HIGH); delayMicroseconds(tone); digitalWrite(speakerPin, LOW); }
節拍 void playNote(char note, int duration) { char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; // 利用比對字元的方式來播放某一個音階 for (int i = 0; i < 8; i++) // 將比對到的音階高電位時間長度傳送給playTone函式播放 if (names[i] == note) playTone(tones[i], duration); }
特殊LED閃爍 要在8X8的LED陣列上畫出自己想要的圖案,需要先拿一張空白的紙,畫滿跟LED陣列一樣的排列方式,或是用方格紙也行,必須知道圖案需要怎麼樣的控制方式才可以達到最接近的圖形。
分段測試 for(i=1;i<=3;i++) digitalWrite(UDPins[i],HIGH); digitalWrite(RLPins[i],HIGH); digitalWrite(RLPins[5],LOW); for(i=1;i<=4;i++) digitalWrite(UDPins[i],HIGH); for(i=0;i<=5;i++) digitalWrite(RLPins[i],HIGH); digitalWrite(RLPins[5],LOW);
結果呈現 最後延遲是決定圖案閃爍的頻率,延遲越小閃爍速度越快。也可以搭配類比訊號,例如光敏電阻,當光線越暗時,心就會跳得越快。偷偷給個提示,可以使用map這個函式來做轉換唷!
數位擴充 擴充數位輸出的晶片:74HC595 需要3隻腳位,就可以擴充到8隻數位輸出
595腳位說明 腳位編號 名稱 功能說明 1-7, 15 Q0-7 並列輸出 (Parallel Output) 9 Q7’ 串列輸出 (Serial Output) 8 GND 接地 16 Vcc 5伏特工作電壓 10 MR Master Reset,接5伏特 11 SH_CP Shift Register Clock Input 12 ST_CP Storage Register Clock Input 13 OE Output Enable,低電位表示致能啟動 14 DS Data Serial input,串列資料輸入
Arduino與單顆595接線
shiftOut SPI(Serial Peripheral Interface)的通訊 需要從Arduino的clockPin(Pin 12)輸出,這樣74HC595才會知道dataPin(Pin 11)的正確讀取方式。
多顆595 只需要將SH_CP和ST_CP接在一起,另外第1顆的Q7’接到第2顆的DS就大功告成了。