数値キーなどを作るのに,個別のタクトスイッチを並べるのはしんどい工作だなぁと思うのです。

以前からジャンクのキーマトリックスを1つ持ってはいたのですが,新規にシートスイッチのものが安価に手に入りました。

そこで,これを使ってUARTシリアル出力のキーパッドを作ってみようというわけです。


・今回の機材です。

1.キーマトリックス
 ・電話キータイプ
  ワゴンセールで100円ぐらいの物,いつどこで買ったか(^^;;;;;;
 ・16キー・シートスイッチ
  MITSUMI SBH-16BK1,大阪デジット限定品で1枚50円で10枚入り
  
2.MCU ATtiny1616

3. 液晶ディスプレイ (自作UART,I2C接続モジュール)






・各キーマトリックスのROWとCOLUMN端子の配置図です

 それぞれ組み込みの都合があったのか,少しずつクセがあります。
説明書など全くないので,ほぼ端子とキーを総当たりで調べてみました(^^;;;;







・ATtiny1616のPin配置です

 ROWを1Pinずつ出力してCOLUMNの入力をチェックします。
UARTとI2Cの担当Pinは残っているのでどちらでも使えますね(^^)。

なお,COLUMNは入力なので1KΩでPULL DOWNしています。






・動作チェックの結果です

 押したキーをUART接続のLCDに表示するだけのシンプルすぎるプログラムですが,,(^^;;;。

・電話キータイプです


・16キー・シートスイッチです




・シートスイッチの端子の処理

 一番困ったのがシートスイッチの接続端子が1mmピッチの配線だった事です。コネクタなどを探しても本体より高価になるのは目に見えています。

 という事で手持ちのポリウレタン銅線(0.29mm )で,引っ張り出しました。両方にハンダを先に処理しておくと結構いけます。





以上,気になっていたジャンクがやっとキーパッドとして活用できそうです(^^)。



・上記のチェックプログラムを一応メモしておきます。

 4x4のマトリックスであれば,これから応用は効くと思っているのですが,,。

/** ATtiny1616 keypad test_2 **/ 

// 4x4_keypad version
// ATtiny1616 pin arrangement
//    Row_Pin (output): 0,1,2,3 (PA4-7)
//    Column_Pin (input):10,11,12,13 (PC0-3)
//    UART TxD_Pin: 7 (PB2, default), 9600bps


const byte Row_Max = 4;
const byte Row_Pin[] = {0 ,1 ,2, 3 };     
const byte Column_Max = 4;
const byte Column_Pin[] = {10 ,11 ,12, 13 };
byte row_number;
byte column_number;

// Calculator Type character
const char* key_data[Row_Max][Column_Max] =
           {{"A0","A1","A2","A3"},{"B0","B1","B2","B3"},  
            {"C0","C1","C2","C3"},{"D0","D1","D2","D3"}};


// Key Search
byte key_in(){  

 byte key_on = 0;

 for (byte i = 0; i < Row_Max;i++){        

   for (byte j = 0; j < Row_Max; j++){   // clear all Row_bit
     digitalWrite(Row_Pin[j], LOW);
   }
   digitalWrite(Row_Pin[i], HIGH);       // Set Row bit

   for (byte j = 0; j < Column_Max;j++){          // Read column bit
     if (digitalRead(Column_Pin[j]) == HIGH){  // if key_on
       key_on = 1;       // set key_on
       row_number=i;     //     row_number
       column_number=j;  //     column_number
       break;
     }
   }
 }

 return key_on;

}// key_in end



void setup() {

 // Set Row_Pin as output
 for(byte i = 0; i < Row_Max; i++){   
   pinMode(Row_Pin[i], OUTPUT);
 }

 // Start UART
 Serial.begin(9600);         
 delay(1000);
 
 // Init. self-made_LCD
 Serial.write(0x80); Serial.write(0x01); // Clear Screen
 delay(24);
 Serial.write(0x00); Serial.write(0x00); // locate 0,0       
 Serial.print("Key:");

}// setup end


void loop() {

 Serial.write(0x00);  Serial.write(0x04);  //locate 0,4
 Serial.print("  ");

 if (key_in()){
   Serial.write(0x00);  Serial.write(0x04);  //locate 0,4
   Serial.print(key_data[row_number][column_number]);
   delay(100);
 }

}// loop end