2016/8/22

スイッチ押しを使ったプログラムを作ろう

どうも、クラゲです。
今回はkonashi搭載のスイッチを使ったプログラムを作ります

【 大まかな流れ 】

  • スイッチ押し最小コード
  • イベントドリブン駆動
  • スイッチ押し最小コードの解説
  • PIO入力の詳細
  • 応用

スイッチ押し最小コード

では早速こちらをお試しください。コピペでもForkでもOKです。

実行してみると分かりますが、konashiに搭載されている黒いスイッチを押すと"1"の画面表示、スイッチから手を離すと"0"の表示が出ると思います。

イベントドリブン駆動

Arduinoなどで入力を扱ってきた人にとっては、このコードは違和感があると思います。
konashi.jsの大きな特徴として、普通のマイコンプログラムと違って、全て"イベントドリブン駆動"である点です。
イベントドリブン駆動とは、ユーザーや他のプログラムなどが何か実行した際のみ処理を行う方式です。
それに対してArduinoなどのプログラミングは"フロー駆動"と呼ばれています。
フロー駆動はユーザーや他のプログラムに関係なくループでぐるぐる処理を回す方式で、ぐるぐる回している間に処理を色々と記述します。
つまり、Arduinoなどでよくある"delay(1000);"のように1000m秒間何もせず待つといような記述は、konashi.jsでは行いません。
konashi.jsで1000m秒待ちたい場合はタイマーを使用します。タイマーを発動させ、1000m秒経過したらイベントとして通知してもらうというやり方を行います。
タイマーを使用したプログラミングは、別途詳しく解説します。

スイッチ押し最小コードの解説

今回のプログラムでは最小記述にするために、今まで常に記述していたk.readyを省略しました。
k.readyもイベント処理のうちの1つで、Bluetooth接続準備が完了したときに呼ばれます。
今回記述した"k.updatePioInput"は、PIO(デジタル入出力端子)の入力に変化があったときに呼ばれます。

k.updatePioInput(function(){
    //ここに処理を書く 
});

k.readyと異なる点は、PIOの入力状態をデータとして受け取れる点です。
上記のコードのままだと、変化は通知されますが、スイッチが押されているのか押されていないのかが分かりません。
そこで引数"data"を使って、データを受け取ることが可能になります。

k.updatePioInput(function(data){
    //ここにdataを使って処理を書く 
});

スイッチを押していると"data"は1、押していないと"data"は0です。
この"data"をそのまま表示されているのが、今回のプログラムです。

k.updatePioInput(function(data){
    $("#helloWorld").text(data);
});

PIO入力の詳細

先ほどのPIO入力と引数"data"について詳しく見て行きます。
konashi搭載のスイッチは回路図番号で言うと"S1"という所にあります。

色を塗ったところが、S1の信号線で、CN3(マイコン)のPIO0端子、CN5の4番ピンに接続しているのが分かります。今回、CN5は使っていないので無視します。
PIO0信号線は抵抗R1(3.3kΩ)を介してGNDに繋がっています。これをプルダウンと言いますが、ここでは詳細説明は省略します。
GNDは0Vのことなので、PIO0端子はLOW入力されていることになります。
スイッチS1を押すと、+3Vと抵抗無しでショートするため、PIO0端子は3V、つまりHIGHになります。
k.updatePioInputはこのLOWからHIGHの変化、HIGHからLOWの変化がPIO端子に生じたときにイベントとして呼ばれる仕組みです。
PIO0だけではなく、PIO1〜PIO5が入力モードのときに状態が変化してもこのイベントは呼ばれます。
ジャンパー線を持っている人は、先ほどのプログラム実行中に以下の写真のようにPIO1〜5と+3V端子をショートしてみてください
ただし、挿し間違えにはご注意ください。間違えるとkonashiが壊れる可能性があります。自信のない人はやめましょう。

先ほどの引数"data"ですが、実はPIO0の値だけでなく、PIO1〜PIO5の値も加算されています。
それぞれ2進数のbit値を持っており、その加算になります。
PIO0がHIGHの場合は +1ですが、PIO1がHIGHの場合は +2、PIO02がHIGHの場合は+4、PIO03がHIGHの場合は+8、PIO04がHIGHの場合は+16、PIO05がHIGHの場合は+32になります。
konashi単体ではPIO0にしか変化がないため、0か1にしかなりません。


http://konashi.ux-xu.com/documents/#core-digital

この表をみると、PIO7とPIO6も使えそうですが、これはkonashi1.0のときのハードのみで、konashi2.0ではPIOとしては使えないので注意してください。

応用

応用という程ではないですが、konashiとBT接続されたら"接続されました"表示、さらにスイッチが押されたら"スイッチ押されてます"表示、
スイッチ押しが離れたら"押されていません"表示するプログラムです

コードはこれまでの複合です。
新しいのはif文が増えたくらいです。if文についての説明は省略します。
ちなみに比較演算子のイコールが3つあるのはJavaScript特有で、"厳密等価演算子"と呼ばれているもので、数値と文字列をごっちゃにした比較ではなく、厳密に比較することができます。
イコール2つでも正常に動きますが、jsdo.it上、エラー表示になってしまうため、このように記述しています。

以上、konashi搭載のスイッチを使ったプログラミングでした!