#4 Digital Input
講義日: 2016.10.11 今回の講義の目的は、外部から情報をマイコンで受け取る方法をマスターすることです。ただし、今回扱うのはデジタル信号です。具体的には、スイッチが押されたことをマイコンで検知する、ということをやります。 目次 I. Basics of Switch II. Practical Work I. Basics of Switch Switch スイッチというのは、電線を連結したり、切断したりするためのデバイスです。ボタンということもあります。スイッチは、様々な種類が存在しますが、よく使うものはタクトスイッチと、トグルスイッチです。 タクトスイッチ(tactile switch)とは、通常ボタンの形状をしていて、押すと電線が連結され、離すと切断されます。 写真のタクトスイッチはとても小さくて、5ミリ角くらいです。このタイプのものは、そのままブレッドボードに差し込んで使うことができます。 足が4つ付いていますね。これらの足は、2つずつの2グループに分かれていて、同一のグループに属する足は、常に通電されています。どの足とどの足が繋がっているかは、背面にマークがあることが多いです。写真の製品の場合には、背面に線が書いてあって、繋がっている足がわかります。 タクトスイッチが押された時にLEDが光る回路は以下のようになります。電源と抵抗の間にあるのが、タクトスイッチの記号です。 トグルスイッチ(toggle switch)とは、電線の連結と切断を切り替えられるようにしてあるスイッチです。どちらかを選択すると、他を選択し直すまで同じ状態を保ちます。 スイッチの電子部品記号は、いくつかあります。この講義では以下の2つを使います。 おまけとして、ディップスイッチの写真も載せておきます。これは、複数のトグルスイッチが1つのパッケージになったものです。 How to Connect a Tactile Switch スイッチは、直感的にわかりやすいデバイスですが、マイコンへの入力として使うときには少し注意が必要です。以下のように回路を作ると、タクトスイッチが押されたかどうかをマイコンで検知できそうですよね。 しかし、これはやってはいけません。タクトスイッチが押されているときには、dp16が3.3Vにつながりますから検知できます。しかし、タクトスイッチが離されているときには、dp16はどこにも繋がっていない状態になります。このような状態を、オープンになっていると呼び、マイコンのピンでは電圧が測定できません。 そこで、代わりに以下のような回路を組みます。 こうすると、タクトスイッチが押されている時には、dp16では3.3Vが計測され、離されている時には、0Vが計測されます。タクトスイッチが離されている時には、dp16はGNDにだけつながっているので、0Vになるわけです。タクトスイッチが押されている時には、この回路は並列回路になりますから、dp16にも10KΩの抵抗にも同じ3.3Vがかかります。 このような回路をプルダウン回路と呼び、10KΩの抵抗をプルダウン抵抗と呼びます。 プルダウン回路とは逆に、タクトスイッチが離されている時に3.3Vが計測され、押されている時に0Vとなる回路も作れます。 これをプルアップ回路と呼び、10KΩの抵抗をプルアップ抵抗と呼びます。この場合、スイッチが離されている時に3.3Vが計測されます。タクトスイッチを押した状態では、並列回路になります。タクトスイッチが押された状態で、その両端の電圧を計ると0Vです。よってdp16にも0Vがかかります。0Vになる理由は、スイッチはオンの時は、ただの電線と同じと考えてよく、10KΩの抵抗に3.3Vがかかるからです。 Digital Input それでは実際に回路を作って試してみましょう。プルダウン回路にしてみます。 プログラムは、以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include "mbed.h" DigitalIn mytactile(dp16); Serial pc(USBTX, USBRX); // tx, rx int main() { while(1) { if(mytactile.read() == 1) { pc.printf("high\n"); } else { pc.printf("low\n"); } wait(0.1); } } |
PC側で、ターミナルを起動して、シリアル通信の結果を表示できるようにしてください。LPC824のリセットボタンを押してプログラムをスタートさせ、適当にタクトスイッチを押してみると、以下のような結果が得られるはずです。 DigitalIn mytactile(dp16);は、dp16でデジタル信号の入力を待つための宣言です。mytactile.read()で、その時のdp16の状態を読み取っています。結果は、1か0です。 Chattering 以下のような回路を作りました。 これは、タクトスイッチをプルダウン回路で作り、dp17にLEDをつないだものです。プログラムは、以下のように作ったとしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include "mbed.h" DigitalIn mytactile(dp16); DigitalOut myled(dp17); int main() { myled = 0; while(1) { if(mytactile.read() == 1) { if(myled == 1) { myled = 0; } else { myled = 1; } } wait(0.1); } } |
このプログラムは、タクトスイッチが押されるたびにLEDが点灯したり消灯したりすることを意図して作られています。 しかし、実際に実験してみると、思ったようには動きません。タクトスイッチを押しても、LEDの状態が変わらないことがあります。これは、スイッチを使うときに起きるチャタリング(chattering)という現象が原因です。 mbedの公式ページにもjim hamblenという人が解説を書いてくれていますから、時間があったら見ておきましょう。 […]