Ola Kae Tode Tai

すべてのエンジニアに、追い風を祈る。

Electric Impでタクトスイッチの入力を読み取る

この投稿は Electric Imp Advent Calendar 2015 の9日目の記事です。

f:id:kironono:20151201001226p:plain

タクトスイッチを使う

f:id:kironono:20151210212022j:plain

前回まではデバイスのGPIOをデジタル出力に設定して、LEDを光らせていましたが、今回はGPIOのデジタル入力を試してみたいと思います。

タクトスイッチを使ってボタンを1回押したときにLEDをON。2回目を押したときにLEDをOFF。3回目はON...というように、スイッチを押すたびにLEDのONとOFFが切り替わるようにしてみます。

タクトスイッチの状態は、GPIOに3.3Vの電圧がかかった時に押されている、電圧がかかっていない時に離されているとします。

回路図

回路はこのようになります。

f:id:kironono:20151210214035p:plain

スイッチ周辺の回路がわかりにくいですが、図にするとこんな感じです。

f:id:kironono:20151210214758j:plain

スイッチが押されていないときは、PIN7とGNDが抵抗を介してつながっています。このときのGNDとPIN7の間の電圧は0Vになるので入力はLOWになります。

スイッチが押されたときは、3V3とPIN7がつながり、3V3とPIN7の間の電圧は3.3Vになり、入力はHIGHになります。

この時のスイッチとGNDの間に入っている抵抗はプルダウン抵抗と呼ばれるものです。一般的には、スイッチの場合はプルアップ抵抗を使う設計のほうがよいです。プルダウンの場合は、スイッチが押された時に無抵抗でPIN7とつながることに加え、PIN7を間違って出力に設定してしまうとショートすることになるためです。

プルアップの場合は、抵抗とスイッチの位置が逆になります。ですので、スイッチが押されていないときは、PIN7はHIGH、スイッチが押されている場合は、LOWとなります。

今回はスイッチが押されたときはHIGH、と実際の感覚と一致させるためプルダウンの設計にしました。

バイスのコード

#require "Button.class.nut:1.1.0"

led <- hardware.pin9;
led.configure(DIGITAL_OUT, 0);
button <- Button(hardware.pin7, DIGITAL_IN_PULLDOWN, Button.NORMALLY_LOW);

state <- 0;

button.onPress(function() {
    server.log("Button pressed");
    state = 1 - state;
    led.write(state);
});

button.onRelease(function() {
    server.log("Button released");
});

Electric Impにはボタンの押下を扱うためのライブラリが用意されています。

#require "Button.class.nut:1.1.0"

上のコードでButtonクラスを使えるようになります。

https://electricimp.com/docs/libraries/hardware/button.1.1.0/electricimp.com

button <- Button(hardware.pin7, DIGITAL_IN_PULLDOWN, Button.NORMALLY_LOW);

Buttonクラスをインスタンス化します。PIN7をプルダウンで、押下していない時はLOWが入力されていることにしたので、そのように設定します。

button.onPress(function() {
    server.log("Button pressed");
    state = 1 - state;
    led.write(state);
});

button.onRelease(function() {
    server.log("Button released");
});

ボタンが押されたとき (onPress) 、離されたとき (onRelease) のコールバックを設定しています。

ボタンが押されたときにLEDの状態 state を変更し、PIN9を状態に応じた出力に設定します。

ボタンが離されたときは、ログの出力だけします。

まとめ

デプロイして動かしてみます。ボタンを押すたびにLEDの点灯と消灯が切り替わればOKです。 本来であれば一定時間ごとにPIN7の入力状態がHIGHからLOW、LOWからHIGHになる部分を監視するコードを書かなければいけませんが、Buttonライブラリを使うとその部分をやってくれるので多少楽ができ、コードの見た目もすっきりします。