2015年08月27日 | 公開。 |
前のページで、市販の電卓では、たいていキーマトリックス方式のキーパッドが使われる事を説明しましたが、今回製作する電卓では、さらに使用するI/Oピンを減らせる抵抗分圧方式のキーパッドを使う事にします。
Arduinoの様に、A/D変換器が付いており、I/Oピンに印加されたアナログ電圧を測定できるマイコンでは、このアナログ入力用I/Oピンをひとつだけ使う事で、たくさんのスイッチの状態を読み取る事ができます。
図4に、スイッチ5個から構成される、抵抗分圧方式のキーパッドを、マイコンに接続した場合の図を示します。この図から解る様に、キーパッドを一枚の基板に組んでしまえば、マイコンとキーパッドの接続は、たった3本の配線(VCC、OUTPUT、GND)でできます。
このキーパッドでは、どのスイッチをONにするか(あるいは全部のスイッチをOFFにするか)で、アナログ入力用I/Oピンに対して出力する電圧が変化します。その変化の様子を表1に示します。
ONにするスイッチ | 出力電圧 | VCC=5Vの場合の 出力電圧[V] |
---|---|---|
SW1 | 0.000 VCC | 0.00 |
SW2 | 0.500 VCC | 2.50 |
SW3 | 0.667 VCC | 3.33 |
SW4 | 0.750 VCC | 3.75 |
SW5 | 0.800 VCC | 4.00 |
なし | 1.000 VCC | 5.00 |
この表を見ると分かるように、ONにするスイッチの番号が大きいほど、出力電圧が大きくなります。また、どのスイッチもOFFにした場合は、出力電圧が最大になります。
なお、表1には複数のスイッチをONにした場合の出力電圧が書いてありませんが、その場合は、ONにしたスイッチの中で、番号が一番小さいスイッチをひとつだけONにした場合と同じ出力電圧が出ます。(例えばSW2とSW4をONにした場合は、SW2のみをONにした場合と同じ出力電圧になる) 言い方を変えれば、スイッチの番号が小さいものほど優先順位が高く、複数のスイッチをONにした場合は、最も優先順位が高いスイッチのみが検出されるという事になります。
抵抗分圧式のキーパッドは、原理的にONにしたスイッチの中で最も優先順位の高いひとつしか検出できませんが、電卓などに使う場合は、そもそも複数のスイッチを同時にONにする事を想定しておらず、問題にはなりません。(一方で、ゲーム用のキーパッドの場合には、問題になる事がある)
以上の様に、どのスイッチがONになっているかでI/Oピンに加わる電圧が変わるので、その電圧をA/D変換器で測定して、測定結果からONになっているスイッチ(の中で最も優先順位が高いもの)を推定する事ができます。
ところで、表1をよく見ると、下の行に行くほど出力電圧が大きくなっているものの、ONにするスイッチの番号が大きくなると、電圧の変化量がだんだん小さくなっている事に気づきます。(例えば、SW1とSW2なら2.5Vも出力電圧が変化するのに、SW4とSW5なら、0.25Vしか変化しない)よって、あまりにもたくさんのスイッチをキーパッドに内蔵すると、キーが正確に読み取れなくなる事が分かります。
図4では、話を簡単にするために、抵抗値を全て1kΩにしたのですが、抵抗値を最適化することにより、より多くのスイッチを読み取る事ができるようになります。抵抗値の最適化の方法は、抵抗分圧器を使った、多くのスイッチのセンシングという記事でも少し説明したのですが、少々ややこしい話になります。
そこで、難しい理屈を考えなくても、キーパッドの仕様を入力すれば、自動的に抵抗値の最適化をしてくれる、ネット上のサービスを用意しました。それがI/Oピン一つで読めるキーパッドの設計サービスです。
それでは、今回の電卓の製作に使うキーパッドを、実際に設計しましょう。必要なスイッチは19個ですが、同じ大きさのスイッチを使うと仮定する場合、19個のスイッチを並べると、前のページの図1の様に、ボタンの配置がいびつになってしまいます。そこで、ひとつ増やして20個のスイッチの付いたキーパッドを設計します。
設計するには、まずI/Oピン一つで読めるキーパッドの設計サービスのページを開きます。
ページの下のほうに設計パラメータの入力という欄がありますので、そこで設計したいキーパッドの仕様を入力します。具体的には図5の様に入力してください。
スイッチの数には、必要なスイッチの数の20を入力してください。
抵抗の精度には、使用する抵抗の精度を入力します。市販されているカーボン抵抗の精度は、たいてい5%なので、ここでは5と入力する事にします。もし、金属皮膜抵抗など、もっと精度の高い抵抗を使う場合は、ここの数字を小さくしてください。精度の高い抵抗を使うほど、多くのスイッチを付けても、余裕を持って判別する事ができます。
R1には、図4の回路図におけるR1をkΩ単位で指定します。数kΩを指定すればOkです。ここでは3.3kΩを指定することにします。
少し細かい話になりますが、実は抵抗分圧方式のキーパッドの抵抗値の決め方には、一次元の任意性があります。
といっても解りにくいので、もう少し具体的かつ簡単に説明します。仮にR1が1kΩとしてR2以降の抵抗値を最適化したとします。その結果求まった抵抗値を全体に2倍すると、R2が2kΩで、かつ元もとのキーパッドと全く同じ出力電圧が出るキーパッドが得られます。要するに、R1を何kΩにしようが、全く同じ出力電圧特性のキーパッドが求められるので、R1は設計者に決めて欲しいのです。
ただし、R1の値は、全く何Ωでもいい訳ではありません。R1を、例えば1Ωなどと極端に小さい値にすれば、スイッチを押した時に、キーパッドが大量の電流を消費します。一方で、R1を、例えば1MΩなどと極端に大きな値にすれば、マイコンのI/Oピンの入力インピーダンスの影響で、出力電圧に誤差が生じます。先ほど述べたように、R1を数kΩ程度に設定すれば、これらの問題は回避できます。
使用するE系列には、使う抵抗のE系列を指定してください。E系列の話は、抵抗の値はなぜ中途半端なの?(E系列の話)という記事にまとめてあります。E系列の事がよく分からない人は、E24を指定してください。ここではE24を指定することにします。
この様に各パラメータを指定してから、計算ボタンをクリックすると、抵抗値が最適化され、またその最適化されたキーパッドの特性などが表示されます。
設計結果の中で、一番重要なのは「抵抗値一覧表」(図6参照)です。この表は、最適化された抵抗値を表わしています。
図6の表を元に、最適化されたキーパッドの回路図を作ると、図7となります。
それでは、キーパッド部分だけ、試作してみましょう。
ユニバーサル基板に12mm角のタクトスイッチや1/6Wカーボン抵抗、L字型ピンヘッダなどを半田付けして作ったキーパッドの写真を写真1~2に示します。
ただし、写真1~2に示したキーパッドは、I/Oピン一つで読めるキーパッドの設計サービスを立ち上げる前に試作した物で、抵抗値の最適化が完全ではありません。よって、図7の回路図とは少し違う抵抗が付いています。
ところで、使用したタクトスイッチのキートップには、透明カバーが付いており、キートップと透明カバーの間に字を書いた紙片をはさむことで、任意の文字を表示できるようになっています。(写真3~4)
この様な、紙片をはさめるキートップの付いたタクトスイッチは、入手が難しく、結構高価です。マルツでは購入できますが、2015年8月時点での税抜き単価は160円で、これを20個買うと、税込み3,456円になります。
これではお財布に厳しいので、私の場合、タクトスイッチ本体は秋月電子の10個セットの物を使い、キートップは、他の部品を輸入するついでに中国から輸入しました。(ただし、キートップだけを輸入するくらいなら、マルツのタクトスイッチを買うほうが安い)
キーパッドを試作し、動作を確認してから、2層基板を起こし、少し見栄えのするキーパッドを作りました。(写真5~6) 2層基板のキーパッドには、図7と同じ抵抗が付いています。
なお、このキーパッドはキットとして発売しています。
商品名 | I/Oピン一つで読める4X5キーパッドキット | |
税抜き小売価格 | 2400円 | |
販売店 | スイッチサイエンス | |
サポートページ | I/Oピン一つで読める4X5キーパッドキットサポートページ |
このページでは、電卓に使うキーパッドを設計し、実際に製作しました。次のページでは、製作したキーパッドの動作確認を行います。
商品名 | I/Oピン一つで読める4X5キーパッドキット | |
税抜き小売価格 | 2400円 | |
販売店 | スイッチサイエンス | |
サポートページ | I/Oピン一つで読める4X5キーパッドキットサポートページ |
商品名 | Arduino用ブートローダ/スケッチライタキット | |
税抜き小売価格 | 3000円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino用ブートローダ/スケッチライタキットサポートページ |