レトロでハードな物語

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

ダイソーのスケルトン電卓をテンキーにしてみた

2021年01月19日 | 電子工作

前回PS/2→USB変換デバイスを作ったので、これを利用するキーボードを新しく作ってみたくなりました。そこで目をつけたのがこれです。


(調査のためフィルム上部は切り取ってあります。)

ダイソーのスケルトン電卓です。これまでキーボードにしてきた電卓は全てボタンで入力するタイプでしたが、この電卓はタッチパネルです。今までタッチパネルを扱ったことは無いので、まったく未知の世界です。
この電卓は薄くて軽いし、物の間に挟んで置いておけるし、太陽電池だけで動作する完成度の高い良い製品なので、壊れて使い物にならなくなる可能性がある事に使うのは躊躇したのですが、定価150円なのでだめになったらまた買えばいいやと割り切って使うことにしました。

どう利用すればいいのかすぐにはわからなかったのでネットで調べてみましたが、電子工作的な情報は見つかりません。しかたなく自分で調べることにしました。

光に透かしてみるとうっすら回路のパターンが見えるので、パターンを追ってみると今まで扱った電卓と同じような見慣れたマトリックス回路になっていました。そこでタッチ箇所にある接点につながる2つの端子をテスターで調べてみると、パネルにタッチしたときに抵抗が変化することが分かりました。抵抗膜方式というものでしょうか。
タッチしていないときは抵抗が大きすぎて計測できませんが(ほぽ絶縁状態)、タッチすると抵抗が下がります。でも、タッチの強さや場所により値はかなり変動します。20数kΩから数百kΩくらいになることもありました。

次にテスターの通電チェック機能で調べてみると、通電を知らせるブザーは鳴りませんでした。表示されている数値を見るとわずかに変化しているので、微弱な電流は流れているようです。

そこでPro Microを使ってデジタル入力で検出できるかどうか試してみましたが、パネルをタッチしてもなにも入力できません。電流が小さすぎるようです。電流の増幅なんて大げさな回路にしたくないので、アナログ入力を使うしか無さそうです。抵抗の変化は分かるので、マトリックスをマイコンのADコンバータにつなげば押したキーを判別できるでしょう。

ここまで分かったらテストのためにマトリックスを外部に引き出したいのですが、この電卓の基板は小さくてかなり難易度の高い配線になりそうです。しかも基板のパターンの一部がベアチップの樹脂に隠れていてはっきりしないところがありました。

そこでダイソーのミニルーターです。



乾電池で動く6Vタイプの物ですが、5V3AのACアダプターを無理やりつなげて使っています。これで基板の樹脂を削り取ったり、ハンダ付けできるように基板のパターンを削り出したりしました。繊細な作業が必要なのですが、うっかり配線パターンを削り取ってしまったりして、後でハンダ付けに苦労することになりました。



とりあえずテスターで配線を確認出来るようになったので詳しく調べてみると、タッチパネルからはフレキシブル基板(?)で18本の線が上部の基板に貼り付けられていますが、ベアチップには11本の線がつながっています。確認すると18本の内、7本は他の線につながっていました。

11本というのはボタンタイプの他のダイソー電卓と同じです。多分この線を引き出せばいいのでしょう。
いつものようにエナメル線で引き出しますが、基板のパターンが細かくてハンダ付けは大変です。失敗してパターンを削ってしまったところなどはどうしようもないので、フレキシブル基板の先端を少しカッターで切り取ってむき出しになった接点にエナメル線をハンダ付けしました。



なんとか11本の線を引き出し終わったので、結線をテスターと目視で確認してすぐにグルーガンで固定してしまいました。その後ピンソケットを付けて、マトリックスの引き出しは完了です。



次はキーマトリックスの確認です。テスターで抵抗値の変化を確認しながら調べました。
線の引き出し方によってラインの順番は異なるでしょうが、この電卓のマトリックスは以下のようになっていました。

     (AN4) (AN3) (AN2) (AN1) (AN0)
      [1]   [5]   [8]  [10]  [11]
(RB0)  |     |     |     |     |
 [2]-  M+ -  X  -  ÷  -     -     -
(RB1)  |     |     |     |     |
 [3]-  1  -  3  -  2  -  0  -     -
(RB2)  |     |     |     |     |
 [4]-  4  -  6  -  5  - MRC -  .  -
(RB3)  |     |     |     |     |
 [6]-  8  -  -  -  9  -  7  -     -
(RB4)  |     |     |     |     |
 [7]-  M- - +/= -     -  %  -     -
(RB5)  |     |     |     |     |
 [9]-     - ON.C-     -     -     -
       |     |     |     |     |
()内の数字はPICとの接続ピン
[]内の番号は上面左から割り振った端子番号
空白部分は配線なし

タッチパネルにつなぐマイコンはPIC16F876Aにしました。秋月電子のお楽しみ袋に入っていたPICはまだ沢山あるので、積極的に利用していきます。外部クロックが必要なので20MHzのセラロックを付けました。
タッチパネルとPICの接続は上記マトリックス表の通りです。でもそのまま接続してADコンバータでアナログ値を読み取っても、値の変動が激しくてタッチしたかどうか判別できません。そこでAN0〜AN4のアナログ入力端子にはプルダウン抵抗を付けてタッチしていないときの入力値が0になるようにしました。



抵抗の値ですが、ADコンバータの値が0かそれ以上の値かが判別できればなんでもいいので、パネルにタッチした時の抵抗値の多くが30kΩ前後だったことから、同じくらいの抵抗を付けて計測してみようと考えました。手元に47kΩの抵抗があったのでこれをつなげてPICのADコンバータで計測してみます。
そのため、パネルを押した時のキャラクタとその時のアナログ入力値を表示するプログラムを作ってみました。

newmain.c

ただのテストプログラムですが最終的にPS/2キーボードにするつもりなので、キーマトリックスのスキャンは前回同様タイマー割り込みでダイナミックスキャンを行っています。
使用したPIC16F876AのADコンバータは10ビットですが、判定は8ビットで十分なので上位2ビットは使っていません。

プログラムを実行すると、タッチした場所に印刷されているキャラクター1文字とその時のアナログ値を表示します。表示は自作のLCDデバイスで行っているので、もしこのプログラムを利用する場合は1文字表示のsendChar()ルーチンを使用する表示デバイス用に書き換えてください。

このテストプログラムでタッチパネルの20個のキー(?)が全て入力できることを確認しつつ、タッチを判定するアナログ値をいくつにするか探っていたのですが、しばらく使用しているとM+の入力値が目まぐるしく変動し始めてタッチの有無が判定できない状態になってしまいました。
何が起きているのかわからなかったので、とりあえずプルダウン抵抗を替えたり、PICの接続ポートを替えてみたりしましたが現象は収まりませんでした。マトリックス回路から電流が回り込んでいる可能性もあると思い、M+と接続する以外の出力ポートをINPUTにしてハイインピーダンスの状態で確認しても現象は収まりません。
ところが、電源を切ってしばらく放置しておくと使えるようになります。でも、そのうちにまた再発してしまうのです。

まったくお手上げ状態です。これはタッチパネルの問題かとも考えテスターでパネルを押した時の抵抗値を測ってみると、抵抗値が極端に変動することもなく特定の値に落ち着きます。故障でもない感じです。

よくよく考えてみると、元々の電卓は太陽電池で動いていたのでパネルの動作電圧はそんなに高くなかったはずです。もしかすると5Vの電圧をかけてしまったのが、誤動作の原因かもしれません。
スケルトン電卓から取り外した太陽電池の電圧を測ってみると、太陽光では2Vで室内の蛍光灯では1V弱くらいになっていました。それならタッチパネルの動作電圧をこの範囲内におさめればいいのかも。

さっそく試してみます。PICは5V以下でも動作しますが、PS/2インターフェースは5Vなので電圧は下げられません。そこでPICの出力側の端子の電圧を下げるため、抵抗をつけて分圧することにしました。こんな感じです。



抵抗は電圧を1V〜2Vくらいにできればいいので2:1〜3:1くらいの比率になるなら何でもいいと思います。ただ、PIC端子の最大電流が25mAだったので、手持ちの抵抗でこの値におさめられるのが上図の組み合わせでした。

PICのアナログ入力側につけるプルダウン抵抗ですが、電圧が下がったので計測できるレンジが小さくなると考えて大きめの100kΩに替えました。これも普段使う機会の少ない抵抗を使ってしまいたかっただけで、電圧の有無が分かれば抵抗の大きさは適当に決めていいと思います。



この回路でテストプログラムをしばらく動かして様子を見てみると、アナログ値が変動する現象は発生しませんでした。まだ安心は出来ませんが、安定動作している感じです。
ちなみにこの回路の場合、タッチの有無を判定するしきい値となるアナログ入力値は0x10でよさそうでしたが、余裕を見て0x20にすることにしました。上記プログラムにもこの数値が書き込んであります。

もうしばらくテストしてみて、問題がないようならばPS/2インターフェースを実装してみようと思います。



最新の画像もっと見る

コメントを投稿