【第7回】で、どうにか人感センサーを使って”Lチカ蛍”をon/offすることができるようになったのですが、消灯時の挙動に違和感が残ってしまいました。今回はLED消灯時にフェードアウトするスクリプトを組み込んだ上で、より本物の蛍に近いスクリプトにチューニングし、”Lチカ蛍”のプロジェクトを完成させたいと思います。
今回使った部品
- Raspberry Pi 3 Model B × 1
- 40Pinフラットリボンケーブル
- 40Pin T型GPIO拡張ボード
- ブレットボード × 1
- LED × 1
- 抵抗 220Ω × 1
- 人感センサー ( HC-SR501:焦電型赤外線センサーモジュール )
- ジャンプワイヤー(オス/オス) × 2
- ジャンプワイヤー(オス/メス) × 3
実体配線図
予め、新たなプロジェクトを別名で保存しておく
【第7回】と同じ「Scratch 1.4」を起動しますが、今回もGPIOサーバーを事前に起動しておく必要はありません。
メニューバーの「ファイル」→「開く…」をクリックします。
現れた「プロジェクトを保存」画面の右にある「pi」ボタンをクリックします。
・
・
表示されたフォルダから、ベースとするプロジェクトが保存されたフォルダを選択します。今回は、【第7回】のプロジェクト”LED_hotaru_PIR”を保存したフォルダ「Scratch_GPIO」をダブルクリックします。
今回のベースにするプロジェクト”LED_hotaru_PIR”を選択して「OK」ボタンをクリックします。
間違えて上書きしてしまわないように、予めメニューバーの「ファイル」→「名前を付けて保存」をクリックし、別プロジェクトとして保存しておきます。
画面上中央に保存するフォルダが表示されていることを確認し、「新しいファイル名」の入力蘭に新しいプロジェクト名を入力して「OK」ボタンをクリックします。
スクリプト停止時にフェードアウトするスクリプトを組み込む
カテゴリー「演算」のブロック「< ( ) > ( ) >」をスクリプトエリアに引き出します。
カテゴリー「変数」のブロック「pwmout」をブロック「< ( ) > ( ) >」の左側の” ( ) “に当て嵌めます。
ブロック「< (pwmout) > ( ) >」の右側の” ( ) “に”0″を入力します。
2つあるブロック「 ( 32 ) 回繰り返す」の下の方に抱え込まれているブロックを右クリックして複製します。
複製したブロック「もし<>なら「」でなければ「」」から「<gpio4▼センサーの値 = 1>」を引き出します。
複製したブロック「もし<>なら「」でなければ「」」の”<>”にブロック「<pwmout > 0>」を当て嵌めます。
引き出したブロック「<gpio4▼センサーの値 = 1>」を右クリックして削除します。
ブロック「もし<pwmout >0>なら「」でなければ「」」の上側の凹に抱え込まれたブロックを引き出します。
引き出したブロックをブロック「 (10) 回繰り返す」の内側にで抱え込ませます。
ブロック「 (10) 回繰り返す」の” (10) “を”32″で上書きします。
できたブロック「 (32) 回繰り返す」をブロック「もし<pwmout >0>なら「」でなければ「」」の上側の凹に当て嵌めます。
メインのスクリプトのブロック「config17out▼を送る」以下を下に引き離します。
更に、ブロック「ずっと」以下を下に引き離します。
メインのスクリプトから離れたブロック「config17out▼を送る」をブロック「もし<pwmout >0>なら「」でなければ「」」の下側の凹に割り込ませます。
もう一度、メインのスクリプトに戻り、ブロック「もし<スペースキー▼が押された>なら「」でなければ「」」の上側の凹に抱え込まれたブロックを引き出します。
引き出したブロックから「すべてを止める?」を引き離します。
引き離したブロック「すべてを止める?」をブロック「もし<pwmout >0>なら「」でなければ「」」の下側の凹に割り込ませます。
できたLEDをフェードアウトするスクリプトを、元のブロック「もし<スペースキー▼が押された>なら「」でなければ「」」の上側の凹に割り込ませます。
LEDの明滅スクリプトから、明滅中の消灯スクリプトを外す
メインのスクリプトのブロック「もし<gpio4▼センサーの値 = 1 >なら「」でなければ「」」の上側の凹に抱え込まれたブロックを引き出します。
引き出したブロックから「 (32) 回繰り返す」以下を引き離します。
引き離したブロックの上にあったブロックをメインのスクリプトに繋げます。
メインのスクリプトのブロック「ずっと」以下を上のブロックに繋げます。
メインのスクリプトから引き出したブロック「もし<gpio4▼センサーの値 = 1>なら「」でなければ「」」の上側の凹に抱え込まれているブロックを引き出します。
メインのスクリプトから引き出したもうひとつのブロック「もし<gpio4▼センサーの値 = 1>なら「」でなければ「」」の上側の凹に抱え込まれているブロックを引き出します。
残されたブロック「もし<gpio4▼センサーの値 = 1>なら「」でなければ「」」を右クリックして削除します。
引き出したブロックを「 (10) 回繰り返す」の内側に抱え込ませます。
もうひとつの引き出したブロックも「 (10) 回繰り返す」の内側に抱え込ませます。
ブロック「 (10) 回繰り返す」の”(10)”を”32″で上書きします。
もうひとつのブロック「 (10) 回繰り返す」の”(10)”を”32″で上書きします。
2つのブロック「 (10) 回繰り返す」を繋げます。
明滅中の消灯スクリプトを外した明滅スクリプトを元の位置に戻します。
LED消灯時にフェードアウトするスクリプトを組み込む
ブロック「もし<スペースキー▼が押された>なら「」でなければ「」」の上側の凹に抱え込まれたブロックを右クリックして複製します。
引き出したブロック「もし<pwmout > 0>なら「」でなければ「」」の下側の凹に抱え込まれたブロックを引き出します。
引き出したブロックから「すべてを止める?」を下に引き離します。
引き離した残りのブロックを元の位置に戻します。
メインのスクリプトから1番下のブロック「gpio17off」を引出します。
ブロック「gpio17off」を引出したところに、できたLED消灯時にフェードアウトするスクリプトを当て嵌めます。
できたスクリプトを実行してみる
画面右上の緑の旗をクリックすると、スクリプトが実行され、LEDが明滅します。
今回は、消灯時のスクリプトをいきなりの消灯から緩やかな減光に組み替えることで、より蛍の明滅に近づけることができました。
スクリプトの数値設定を見直す
LED明滅のスクリプトとして、構成上の問題点はほぼなくすことができましたが、より本物の蛍に近づけるには、使用したLEDの特性に合わせた輝度や明滅ピッチ、発光間隔等、数値設定のチューニングが必要です。
「スペース」キーを押してスクリプトを停止させます。
LEDの最大輝度をPWMの”1023″から1/4の”255=32×8-1″にする為、1ヶ所の「pwmout▼を (32) ずつ変える」の”(32)”を”(8)”に、3ヶ所の「pwmout▼を (-32) ずつ変える」の”(-32)”を”(-8)”に上書きします。
明滅ピッチを半分にする為、4ヶ所の「 (0.02) 秒待つ」の”(0.02)”を”(0.01)”に上書きします。
点灯間隔を少し取る為、上から3番目の「 (32) 回繰り返す」の”(32)”を”(36)”に上書きします。
明滅サイクルの頭でpwmoutをリセットする為、カテゴリー「変数」のブロック「pwmout▼を (0) にする」を「もし<gpio4▼センサーの値 =1>なら「」でなければ「」」の上側の凹に割り込ませます。
完成したプロジェクト
作成したプロジェクトを上書き保存する
メニューバーの「ファイル」→「保存する」をクリックしてプロジェクトを上書きします。
ここまで「Scratch 1.4」のGPIOサーバーを使った”Lチカ”のスクリプトを進化させてきましたが、次回は「Scratch 2」でも、他にできることを試してみたいと思います。