【第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サーバーを事前に起動しておく必要はありません。
メニューバーの「ファイル」→「開く…」をクリックします。。
現れた「プロジェクトを保存」画面の右にある「pi」ボタンをクリックします。
・
・
表示されたフォルダから、ベースとするプロジェクトが保存されたフォルダを選択します。今回は、【第6回】のプロジェクト”LED_hotaru_SW”を保存したフォルダ「Scratch_GPIO」をダブルクリックします。
今回のベースにするプロジェクト”LED_hotaru_SW”を選択して「OK」ボタンをクリックします。
間違えて上書きしてしまわないように、予めメニューバーの「ファイル」→「名前を付けて保存」をクリックし、別プロジェクトとして保存しておきます。
画面上中央に保存するフォルダが表示されていることを確認し、「新しいファイル名」の入力蘭に新しいプロジェクト名を入力して「OK」ボタンをクリックします。
GPIOサーバーを起動するブロックを置く
カテゴリー「制御」のブロック「 ( config17out▼ ) を送る」の”▼”をクリックして出る「新規/編集」をクリックすると「メッセージの名前:」画面が現れるので、入力欄に”gpioserveron”と入力し、「OK」ボタンをクリックします。
できたブロック「 ( gpioserveron▼ ) を送る」をスクリプトエリアのブロック「緑の旗がクリックされたとき」の下に割り込ませます。
このブロックは「Scratch 1.4」のメニューバーから「編集」→「GPIOサーバーを開始」をクリックするのと同じ命令なので、このブロックを置くことで事前の操作が不要になります。
人感センサーからの入力をGPIO4番ピンに設定する
スクリプトエリアのブロック「 ( config4inputpulldown▼ ) を送る」の”▼”をクリックして出る「新規/編集」をクリックすると「メッセージの名前:」画面が現れるので、入力欄に”config4in”と入力し、「OK」ボタンをクリックします。
スクリプトを実行してみる
画面右上の緑の旗をクリックすると、スクリプトが実行されます。
スクリプト実行中に人感センサーに手をかざすと、ステージ上の変数モニター「 gpio4センサーの値 (0) 」が” (1) “に変わると共に、もうひとつの変数モニター「 pwmout」の値も刻々と変化しながらLEDが明滅します。
ただよく見ていると、「 pwmout」の値が0~1023の上下限を超えて変化したり、「 gpio4センサーの値 (0) 」が” (1) “から” (0) “に戻るときの反応が不安定です。
画面右上の「赤丸」ボタンをクリックすると、その瞬間の明るさをLEDが保ったままでスクリプトが停止してしまいました。
停止時にLEDを消灯するスクリプトを作る
スクリプトエリアのブロック「ずっと」の内側に抱え込まれたブロックを全て、一旦、引き出しておきます。
ブロック「もし< >なら「」でなければ「」」をスクリプトエリアに引き出します。
カテゴリー「調べる」のブロック「<スペース▼キーが押された>」をスクリプトエリアに引き出したブロック「もし< >なら「」でなければ「」」の”< >”に当て嵌めます。
スクリプトエリアにある1番下のブロック「gpio17off▼を送る」を右クリックして現れるメニューから「複製」を左クリックします。
複製した「gpio17off▼を送る」をスクリプトエリアのブロック「もし< >なら「」でなければ「」」の上側の凹に当て嵌めます。
ブロック「すべてを止める?」をスクリプトエリアのブロック「もし< >なら「」でなければ「」」の上側の凹に当て嵌めた「gpio17off▼を送る」の下に割り込ませます。
LED明滅中に人感センサーからの信号でLEDを消灯させるスクリプトを作る
スクリプトエリアのブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」でなければ「」」の上側の凹に抱え込まれたブロックを全て引き出します。
ブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」でなければ「」」を右クリックして現れるメニューから「複製」を左クリックします。
ブロック「もし< 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出力の強制リセットスクリプトを組み込む
ブロック「もし<スペース▼キーが押された>なら「」でなければ「」」の下側の凹に抱え込まれたブロックを全て、一旦、引き出します。
ブロック「 ( 32 ) 回繰り返す」の凹に抱え込まれたブロックを引き出します。
更に、ブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」でなければ「」」の上側の凹に抱え込まれたブロックを引き出します。
ブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」でなければ「」」を右クリックして現れるメニューから「複製」をクリックします。
複製したブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」でなければ「」」の上側の凹に引き出しておいたブロックを戻します。
複製したブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」でなければ「」」を元のブロック「 ( 32 ) 回繰り返す」の凹に戻します。
残ったブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」でなければ「」」の上側の凹に引出しておいたスクリプト全体を当て嵌めます。
再構成したブロック「もし< gpio4▼センサーの値 = ( 1 ) >なら「」でなければ「」」をブロック「もし< スペース▼キーが押された >なら「」でなければ「」」の下側の凹に戻します。
3度目のスクリプトを実行する
画面右上の緑の旗をクリックすると、スクリプトが実行され、LEDが明滅します。
今回は、人感センサーからの信号で「gpioセンサーの値」が、どんなタイミングで”1″から”0″に変わっても、その瞬間の「 pwmout」の値を保ったままでブロック「gpio17off▼を送る」によってLEDが消灯します。「 pwmout」の値も0~1023の範囲を超えることがなくなり、点灯中の明滅ピッチも一定になりました。
ただ惜しむらくは、消灯時の挙動が唐突で自然の蛍と比較すると違和感があるので、次回で改善を図ってみたいと思います。
作成したプロジェクトを上書き保存する
メニューバーの「ファイル」→「保存する」をクリックしてプロジェクトを上書きします。
できたと思ったスクリプトでも、変数モニターの値を見ながら挙動を注意深く観察すると、問題点に気付くことがあります。今回も残念ながら問題点を残してしまったので、次回はこの改善に取り組んでみたいと思います。