【第6回】で、タクトスイッチで”Lチカ蛍”をon/offすることができるようになったので、タクトスイッチを人感センサーに替えれば、人が近づくと蛍が明滅するようなものが実現できるのではないかと思い試してみました。
今回使った部品
- Raspberry Pi 3 Model B × 1
- 40Pinフラットリボンケーブル
- 40Pin T型GPIO拡張ボード
- ブレットボード × 1
- LED × 1
- 抵抗 220Ω × 1
- 人感センサー ( HC-SR501:焦電型赤外線センサーモジュール )
- ジャンプワイヤー(オス/オス) × 2
- ジャンプワイヤー(オス/メス) × 3
実体配線図
予め、新たなプロジェクトを名前を付けて保存しておく
【第6回】と同じ「Scratch 1.4」を起動しますが、今回はGPIOサーバーを事前に起動しておく必要はありません。
表示されたフォルダから、ベースとするプロジェクトが保存されたフォルダを選択します。今回は、【第6回】のプロジェクト”LED_hotaru_SW”を保存したフォルダ「Scratch_GPIO」をダブルクリックします。
GPIOサーバーを起動するブロックを置く
できたブロック「 ( gpioserveron▼ ) を送る」をスクリプトエリアのブロック「緑の旗がクリックされたとき」の下に割り込ませます。
このブロックは「Scratch 1.4」のメニューバーから「編集」→「GPIOサーバーを開始」をクリックするのと同じ命令なので、このブロックを置くことで事前の操作が不要になります。
人感センサーからの入力をGPIO4番ピンに設定する
スクリプトを実行してみる
スクリプト実行中に人感センサーに手をかざすと、ステージ上の変数モニター「 gpio4センサーの値 (0) 」が” (1) “に変わると共に、もうひとつの変数モニター「 pwmout」の値も刻々と変化しながらLEDが明滅します。
ただよく見ていると、「 pwmout」の値が0~1023の上下限を超えて変化したり、「 gpio4センサーの値 (0) 」が” (1) “から” (0) “に戻るときの反応が不安定です。
停止時にLEDを消灯するスクリプトを作る
LED明滅中に人感センサーからの信号でLEDを消灯させるスクリプトを作る
ブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」」に抱え込まれたブロック全てを引き出し、ブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」でなければ「」」の上側の凹に当て嵌めます。
もう1組のブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」」に抱え込まれたブロック全てを引き出し、ブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」でなければ「」」の上側の凹に当て嵌めます。
ブロック「 ( 32 ) 回繰り返す」に抱え込まれたブロックを引き出し、右クリックして現れるメニューから「削除」をクリックします。
もう1組のブロック「 ( 32 ) 回繰り返す」に抱え込まれたブロックを引き出し、右クリックして現れるメニューから「削除」をクリックします。
2組のブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」でなければ「」」を2組のブロック「 ( 32 ) 回繰り返す」の内側に抱え込ませます。
2つのスクリプトを合体してメインのスクリプトに組み込む
2組のブロック「 ( 32 ) 回繰り返す」をブロック「gpio4▼を ( 0 ) にする」の下に繋げます。
繋げたブロックをブロック「もし< スペース▼キーが押された >なら「」でなければ「」」の下側の凹に当て嵌めます。
もう一度、スクリプトを実行してみる
画面右上の緑の旗をクリックすると、スクリプトが実行され、LEDが明滅します。
但し、よく見ていると、たま~に「gpioセンサーの値」が変わるタイミングで「 pwmout」の値がマイナスになったり、上限の1023まで上昇しない内に下降に転じてしまうことがあり、そのせいでLEDの明滅ピッチが不揃いになることがあります。
画面右上の「赤丸」ボタンをクリックしても、その瞬間の明るさをLEDが保ったままでスクリプトが停止します。
しかし「赤丸」ボタンをクリックする前に「スペース」キーを押せば、スクリプトが停止してLEDも消灯します。
スクリプトの停止は「赤丸」ボタンではなく、「スペース」キーで実行することにします。
人感センサー信号切替時、GPIO17出力の強制リセットスクリプトを組み込む
3度目のスクリプトを実行する
画面右上の緑の旗をクリックすると、スクリプトが実行され、LEDが明滅します。
今回は、人感センサーからの信号で「gpioセンサーの値」が、どんなタイミングで”1″から”0″に変わっても、その瞬間の「 pwmout」の値を保ったままでブロック「gpio17off▼を送る」によってLEDが消灯します。「 pwmout」の値も0~1023の範囲を超えることがなくなり、点灯中の明滅ピッチも一定になりました。
ただ惜しむらくは、消灯時の挙動が唐突で自然の蛍と比較すると違和感があるので、次回で改善を図ってみたいと思います。
作成したプロジェクトを上書き保存する
できたと思ったスクリプトでも、変数モニターの値を見ながら挙動を注意深く観察すると、問題点に気付くことがあります。今回も残念ながら問題点を残してしまったので、次回はこの改善に取り組んでみたいと思います。