Arduinoの周辺回路の組み立てができた。
くわしく回路図なども載せられたらよかったのだけど、めんどくさいのでそれは載せないことにした。
まずLCDの接続ですが、LCDはI2Cで接続するだけだから簡単ですね。
I2C低電圧キャラクタ液晶モジュール(16×2行) (Strawberry Linux)
これのデータシートをみるとわかるが、リセット・SCL・SDA・GND・VDDをつなげばいい。
本来は電源は3.3Vなのだが、5Vでも動くそうなので、Arduinoの電圧に合わせて+5Vを供給した。
あと忘れてはいけないのがI2Cバスをプルアップすることですね。SCL・SDAをそれぞれ10kΩでVccへプルアップした。
動作させるプログラムはここのAVRサンプルを元にI2Cの通信の内容だけ参考にすればよい。
コントラストは5Vになった分下げる必要があって、20でうまく動いている。
次にマトリックスキーの作成だが、4×3にスイッチを並べて、縦にスイッチの足の片方を1本の線につなぐ。
そしてもう片方の足は横に1本の線につなぐ。
あとは縦の線をVccに10kΩでプルアップすれば一応完成。
ここで縦の線には1つだけLで後はHを与えてやれば、縦の線からLにした行でボタンが押されているところがあればLが出てくる。
この7本の線とVccをArduinoのところまで持って行ってやる必要があるが、ここでフラットケーブルを使った。
フラットケーブルの端をバラして、縦横の線とVccにつなぐ。
そして反対の端には買ってきた10ピンの圧接端子をガシッと取り付けてやった。これでフラットケーブルで接続できるようになった。
この時点でマイコンとジャンパーワイヤーで接続してテストしたところうまく動いた。
char initKey(){
pinMode( 8,OUTPUT); digitalWrite( 8,HIGH);
pinMode( 9,OUTPUT); digitalWrite( 9,HIGH);
pinMode(10,OUTPUT); digitalWrite(10,HIGH);
pinMode(11,OUTPUT); digitalWrite(11,HIGH);
pinMode(5,INPUT); pinMode(6,INPUT); pinMode(7,INPUT);
}
char readKey(){
char t;
digitalWrite( 8,LOW); delay(1);
t=digitalRead(7)<<2|digitalRead(6)<<1|digitalRead(5)
digitalWrite( 8,HIGH);
if(t==0b011) return 1;
if(t==0b101) return 2;
if(t==0b110) return 3;
digitalWrite( 9,LOW); delay(1);
t=digitalRead(7)<<2|digitalRead(6)<<1|digitalRead(5)
digitalWrite( 9,HIGH);
if(t==0b011) return 4;
if(t==0b101) return 5;
if(t==0b110) return 6;
digitalWrite(10,LOW); delay(1);
t=digitalRead(7)<<2|digitalRead(6)<<1|digitalRead(5)
digitalWrite(10,HIGH);
if(t==0b011) return 7;
if(t==0b101) return 8;
if(t==0b110) return 9;
digitalWrite(11,LOW); delay(1);
t=digitalRead(7)<<2|digitalRead(6)<<1|digitalRead(5)
digitalWrite(11,HIGH);
if(t==0b011) return 11;
if(t==0b101) return 0;
if(t==0b110) return 12;
return -1;
}
電話のプッシュボタンの順番に並んでいることを想定している。
なにも押されてなかった時は-1、0~9を押された時はその数字、0の左右のボタンは11・12を返す。
ただ、これでは13しかないデジタル入出力ポートを7本も使うのでロジックICを使って4本に圧縮したのだが、
このことは書くと長くなるので省略。
2入力4回路NANDゲートのIC、7400を2つ買ってきて組み合わせて作ったんだけど配線が大変だった。
LCDを接続するためのピンヘッダ、フラットケーブルでマトリックスキーを接続するためのボックスヘッダも取り付けなならんかったので。
配線に使える線が赤1色しかないからえらい混乱しそうになるし。
まだ自分がどんな回路を作ってるかわかりながらはんだ付けしてるからましだけど。
あとLEDも取り付けた。LEDは1つArduinoのボード上にもあるようだが、上にユニバーサル基板を乗せると隠れるので、その代替に1つ、
あとPWMのポートにつなげたLEDを1つ用意した。LEDは赤と緑なので300Ωの抵抗を挟んでつないだ。
安いLEDなんだけどけっこう明るい。PWMで制御してもデューティー比上げたらすぐに明るくなっちゃう。
それとブザーも取り付けといた。ブザーは適当なデジタル入出力ポートにつなげばいい。
これで完成。
キャラクタLCD・マトリックスキー・LED2つ・ブザーとかなり充実したインターフェースを取り付けることが出来た。
ここまで日曜日と今日ちょっとの作業でできた。
これだけで十分いろんなことができる。キャラクタLCDはいろいろ表示できるし、12個もスイッチがあればいろいろ入力できる。
ポート数の制約はあるけど、LCDもマトリックスキーもポート数を節約したのでまだまだ拡張できますね。
これで早速、逆ポーランド式の電卓を作ってみている。
ただ電卓を作るには12個ではキーが足りないな。演算子は何回か押して選ぶなどすれば収められますけどね。
またゆっくり遊ぼうかなと。