この投稿は Electric Imp Advent Calendar 2015 の9日目の記事です。
タクトスイッチを使う
前回まではデバイスのGPIOをデジタル出力に設定して、LEDを光らせていましたが、今回はGPIOのデジタル入力を試してみたいと思います。
タクトスイッチを使ってボタンを1回押したときにLEDをON。2回目を押したときにLEDをOFF。3回目はON...というように、スイッチを押すたびにLEDのONとOFFが切り替わるようにしてみます。
タクトスイッチの状態は、GPIOに3.3Vの電圧がかかった時に押されている、電圧がかかっていない時に離されているとします。
回路図
回路はこのようになります。
スイッチ周辺の回路がわかりにくいですが、図にするとこんな感じです。
スイッチが押されていないときは、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ライブラリを使うとその部分をやってくれるので多少楽ができ、コードの見た目もすっきりします。