レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

ダイソー電卓をPICでキーパッドにしてAVRから使う

2020年02月21日 | 電子工作

これまでPICをLCDなどの表示デバイスの制御に使って、AVRなどから利用できるようにしてきました。そうなると、今度は入力用のデバイスも欲しくなってきます。そこで、次はPIC制御の入力デバイスを作ってAVRから利用できるようにしてみましょう。

今回入力デバイスとして使用するのは、ダイソーで購入したツートン電卓です。



ボタンが押しやすそうなので、ArduinoやAVRのキーパッドとして使うつもりで購入してあったものです。
電卓をキーパッドにするのは以前にも行っていたので、その時と同じように線を引き出します。



引き出した線は11本です。以前と同様にテスターでマトリックスを調べておきます。

次に電卓のキー入力に使うPICですが、フラッシュメモリタイプのPIC16F876Aを使います。秋月電子のお楽しみ袋に5個入っていました。



これを選んだのはピン数が多く、電卓から引き出した11本の線を楽に扱えるということもあるのですが、最終的にこちらのワンタイム書き込みタイプのPIC16C73Bをキーパッドデバイスに使いたかったからです。



PIC16C73Bはお楽しみ袋に1個だけ入っていました。PIC16F876Aと同じ28Pでピンの配置もほぼ同じなので、PIC16F876Aで作成したプログラムが少しの手直しで移植できます。

作成する回路は配線が多めですが難しいものではありません。調べたマトリックス回路を元に次のように配線しました。

     (RB0) (RB1) (RB2) (RB3) (RB4)
      [1]   [4]   [5]   [7]  [11]
(RC3)  |     |     |     |     |
 [2]-  1  -  √   -  2  -  3  -  0  -
(RC4)  |     |     |     |     |
 [6]-  4  -  .  -  5  -  6  - MRC -
(RC5)  |     |     |     |     |
 [8]-  M+ - +/- -   ÷  -  X  -  =  -
(RC6)  |     |     |     |     |
 [9]-  M- -     - CE  -  +  -  %  -
(RC7)  |     |     |     |     |
[10]-  8  -     -  9  -  -  -  7  -
       |     |     |     |     |
                         |
(RC2)                    |
 [3] -     -     -    -ON/C -     -
                         |
()内の数字はPICとの接続ピン番号
[]内の番号は上面左から割り振った端子番号
空白部分はキー配置なし

まずはPIC16F876A単体でキーをスキャンするプログラムを作成してみます。前にArduino向けに作成したことがあるので、PIC向けに書き直しただけです。

newmain.c

入力したキーを確認するための表示デバイスには以前作成したPIC+LCDを利用してみました。



PIC16F876Aは外部に振動子が必要なので、20MHzのセラロックをつけてあります。プログラムもクロック20MHzでの動作を前提にしています。
このプログラムを実行すると、(元)電卓のキーを押した時と離した時にLCDに内容が表示されます。

次にこのPIC16F876Aに通信機能をつけて、AVR等から利用出来るようにします。相手として使うのはATtiny85です。



作成したPIC16F876Aのプログラムはこちらです。

newmain.c

ATtiny85のスケッチはこちらです。

ATtiny85PIC_Keypad.ino

PIC16F876Aは常にキースキャンを行っていてキーが押された時にキーコードを、離された時にブレイクコード(0xF0)+キーコードをバッファに取り込むようにしています。また、ポーリングで外部から送られてくる信号を監視していて、信号がきたらキーバッファからキーコードを取り出して送信します。キーバッファにキーコードが無いときは0xFFを送信するようにしました。

キーコードはなんでもいいのですが、数字が刻印されているキーはその数字を、四則演算など関連性のあるキーは連番になるように設定しました。上記マトリックスのキーをキーコードに変えてみるとこんな感じです。

     (RB0) (RB1) (RB2) (RB3) (RB4)
      [1]   [4]   [5]   [7]  [11]
(RC3)  |     |     |     |     |
 [2]-  1  - 18  -  2  -  3  -  0  -
(RC4)  |     |     |     |     |
 [6]-  4  - 14  -  5  -  6  - 21  -
(RC5)  |     |     |     |     |
 [8]- 23  - 20  - 10  - 11  - 15  -
(RC6)  |     |     |     |     |
 [9]- 22  -     - 17  - 13  - 19  -
(RC7)  |     |     |     |     |
[10]-  8  -     -  9  - 12  -  7  -
       |     |     |     |     |
                         |
(RC2)                    |
 [3] -     -     -    - 16 -     -
                         |

ATtiny85のスケッチは、受け取ったキーコードをLCDに表示するだけのものです。コンパイルにはATTinycoreを使い、内部クロック8MHzで動かしてみました。

ここまで出来れば、後はPIC16F876AをPIC16C73Bに置き換えるだけです。プログラムの変更はコンフィギュレーションビットと搭載していない機能のレジスタ設定を削除しただけです。

newmain.c

PIC16C73Bへのプログラムの書き込みは前回と同様です。ただ、ピンの配置は違うので間違えないように慎重に配線して書き込みました。エラーが出なくなるまで4、5回は書き込みを繰り返しましたが、最後にはエラーも出ず無事に書き込みが終了しました。

PIC16F876AとPIC16C73Bを交換して電源をつなぎ、ドキドキしながらキーを押してみると交換前とまったく同じに動作してくれました。



これでAVRから簡単に扱える入出力デバイスが揃いました。開発やデバッグ作業が楽になりそうです。

秋月電子のお楽しみ袋に入っていた大量のPIC、最初はどうしようかと思いましたが色々活用することが出来てよかったです。



最新の画像もっと見る

コメントを投稿