星期五, 4月 05, 2013

Arduino筆記(七):3x4 Keypad 控制蜂鳴器發聲


[2013/04/05]
由於工作關係,隔了兩個多星期才又開始進行實驗,這次實驗的主題是從電料行買的3x4 Keypad,這個Keypad總共有八隻接腳,由於不知道行與列的線路連接方式,於是將拆開後背後的螺絲拆開看看線路圖:


仔細檢視每一個行(自右而左,分別為COL0 ~ COL2)與列(自上而下)的線路,知道接腳(從左至右)如下:

位置 KeyPad接腳 Arduino接腳
COL0
5
9
COL1
6
8
COL2
7
7
ROW0
1
13
ROW1
2
12
ROW2
3
11
ROW3
4
10

如要使用喇叭,Arduino有一個涵式庫已經定義好音調,只要用Include將"pitches.h"包含進來:
,以本單元的Do, Re ~ Si,總共七個,定義名稱如下:

#define NOTE_C5  523     // Do
#define NOTE_D5  587     // Re
#define NOTE_E5  659     // Me
#define NOTE_F5  698     // Fa
#define NOTE_G5  784    // So
#define NOTE_A5  880    // La
#define NOTE_B5  988    // Si

[材料]

• 麵包板 x 1
• Arduino 主板 x 1
• 3x4 Keypad x 1
• 喇叭 x 8
• 單心線 x 8

[接線]

將Keypad的第一隻腳接Pin 13,第二隻腳接Pin12,餘此類推至第八隻腳接Pin6,將喇叭的兩條線,一條接GND,一條接Pin4。





在畫Fritizing的電路圖時,內建沒有KeyPad圖形,可從http://code.google.com/p/fritzing/ 搜尋Keypad後下載Keypad.fzz匯入即可。雖然跟我買的Keypad圖樣不同,但是鍵盤排列位置是一樣的。

[程式]

// 引用 Keypad library
#include <Keypad.h>
#include <pitches.h>

// 3x4 Keypad
const byte ROWS = 4;  // 4 Rows
const byte COLS = 3;   // 3 Columns
int duration = 500;        // 500 miliseconds

// 定義 Keypad 的按鍵
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

// 定義 Keypad 連到 Arduino 的接腳
byte rowPins[ROWS] = {13, 12, 11, 10}; // 連到 Keypad 的 4 個 Rows: Row0, Row1, Row2, Row3 
byte colPins[COLS] = {9, 8, 7};   // 連到 Keypad 的 3 個 Columns: Column0, Column1, Column2

// 建立 Keypad 物件
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600); 
}
  
void loop(){
  // 讀取 Keypad 的輸入
  char key = keypad.getKey();
  
  // NO_KEY 代表沒有按鍵被按下
  if (key != NO_KEY){      // 假如有按鍵被按下,就印出按鍵對應的字元
      switch (key) {
     case '1':    
       tone(4, NOTE_C5, duration);
       break;
     case '2':    
       tone(4, NOTE_D5, duration);
       break;
     case '3':    
       tone(4, NOTE_E5, duration);
       break;
     case '4':    
       tone(4, NOTE_F5, duration);
       break;
     case '5':    
       tone(4, NOTE_G5, duration);
       break;
     case '6':    
       tone(4, NOTE_A5, duration);
       break;
     case '7':    
       tone(4, NOTE_B5, duration);
       break;       
     default:
       tone(4, NOTE_C8, duration);
     }
    Serial.println(key);
  }
}


[執行結果]

當按下數字1時,會發出Do的音,按下數字2時,會發出Re的音...直到
數字7為Si的音,其他鍵盤則為高音Do。




參考資料:
• Arduino Playground : The Matrix Keypad how-to
• Arduino  Examples > Digital I/O > Tone4
• Copper Maa:Arduino 筆記 – Lab6 控制蜂鳴器發聲
• Copper Maa:Arduino 筆記 – Lab18 讀取 3x4 Keypad 的輸入


Share:

3 則留言:

  1. 鍵盤我找不到呢@@
    然後有4*4的鍵盤嗎?

    回覆刪除
    回覆
    1. 3x4鍵盤在一般電子材料行都有賣, 可以找看看!! 有4x4鍵盤, 右邊多一排ABCD四個鍵!!

      刪除
  2. 3*4為什麼會有8隻腳?是有共同腳?

    回覆刪除