【第11回】では「Scratch 1.4」のPWM出力により、LEDの明るさをキーボードの上下矢印キーを使って上下させましたが、今回はキーボードの上下左右、4つの矢印キーでフルカラーLEDを任意の色と明るさにコントロールしてみたいと思います。
今回使った部品
- Raspberry Pi 3 Model B × 1
- 40Pinフラットリボンケーブル
- 40Pin T型GPIO拡張ボード
- ブレットボード × 1
- フルカラーLED(OSTA5131A) × 1
- 抵抗 220Ω × 3
- ジャンプワイヤー(オス/オス) × 4
実体配線図
フルカラーLEDは光の3原色、赤(Red)、青(Blue)、緑(Green)の3色の素子がひとつの部品に封入されたものです。
右の図を見ると、4本の端子の1番長いものがコモンカソードでGNDに、2番目に長い端子が青のアノード、3番目に長い端子が赤のアノード、1番短い端子が緑のアノードで、それぞれ220Ωの抵抗を介して各GPIO端子に接続します。
予め、新たなプロジェクトを別名で保存しておく
「Scratch 1.4」を起動し、メニューバーの「ファイル」→「開く…」をクリックします。
ファイル選択画面が現れるので、今回のプロジェクトのベースとする【第11回】で作ったプロジェクト”LED_fader″を選択して、「OK」ボタンをクリックします。
間違えて上書きしてしまわないように、予めメニューバーの「ファイル」→「名前を付けて保存」をクリックし、別プロジェクトとして保存しておきます。
画面上中央に保存するフォルダが表示されていることを確認し、「新しいファイル名」の入力蘭に新しいプロジェクト名を入力して「OK」ボタンをクリックします。
予め、変数:R、G、Bを作っておく
【第11回】で使っていた変数:pwmoutは今回使わないので、ブロックパレットの「pwmout」のチェックボックスに入っているチェックを外します。
カテゴリー「変数」のブロックパレットで、「新しい変数を作る」ボタンをクリックします。
現れた「変数?」画面の入力欄に”R”と入力して「OK」ボタンをクリックします。
続けて同様に、変数:”G”と”B”を作ります。
ステージ上の変数モニター”R”を右クリックして「スライダー」を左クリックします。変数”G”と”B”も同様にします。
ステージ上の変数モニター”R”を右クリックして「スライダーの最小値と最大値を設定」を左クリックすると「スライダの範囲:」画面が現れるので、最大値を”1023″で上書きして「OK」ボタンをクリックします。変数”G”と”B”も同様にします。
左右上向き矢印キーを変数:R、B、Gの増大と定義付けする
ブロック「もし<スペース▼キーが押された>なら「」でなければ「」」の下側の凹に抱え込まれたブロックを外に出します。
ブロック「もし<上向き矢印▼キーが押された>なら」と「もし<下向き矢印▼キーが押された>なら」を引き離します。
ブロック「もし<上向き矢印▼キーが押された>なら」に抱え込まれたブロックを外に出します。
ブロック「もし<pwmout<1023>なら「」でなければ「」」の上側の凹に抱え込まれたブロックを外に出します。
ブロック「大きさを4ずつ変える」を右クリックして削除します。
残ったブロックを繋げます。
繋げたブロック全体をカテゴリー「制御」のブロック「もし<>なら」で抱え込ませます。
ブロック「もし<pwmout<1023>なら「」でなければ「」」のブロック「<pwmout<1023>」を外に出します。
外に出したブロック「<pwmout<1023>」を右側のブロック「もし<>なら」の”<>”に当て嵌めます。
左側に残されたブロック「もし<>なら「」でなければ「」」を右クリックして削除します。
できたブロック「もし<pwmout<1023>なら」を元のブロック「もし<上向き矢印キー▼キーが押された>なら」の内側に抱え込ませます。
ブロック「もし<上向き矢印キー▼キーが押された>なら」を右クリックして複製します。
複製したブロック「もし<上向き矢印キー▼キーが押された>なら」を右クリックしてもうひとつ複製します。
3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の左側の「上向き矢印▼」の「▼」をクリックして「左向き矢印」を選択します。
3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の右側の「上向き矢印▼」の「▼」をクリックして「右向き矢印」を選択します。
3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の左側の「pwmout▼」の「▼」をクリックして「R」を選択します。
3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の中央の「pwmout▼」の「▼」をクリックして「G」を選択します。
3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の右側の「pwmout▼」の「▼」をクリックして「B」を選択します。
3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の「pwmout」を3つ共、ブロックパレットに戻します。
カテゴリー「変数」のブロック「R」を3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の左側の「< ( ) < 1023>」の” ( ) “に当て嵌めます。
カテゴリー「変数」のブロック「R」を3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の左側の「gpio17pwmとワールド」の”ワールド “に当て嵌めます。
カテゴリー「変数」のブロック「G」を3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の中央の「< ( ) < 1023>」の” ( ) “に当て嵌めます。
カテゴリー「変数」のブロック「G」を3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の中央の「gpio17pwmとワールド」の”ワールド “に当て嵌めます。
カテゴリー「変数」のブロック「B」を3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の右側の「< ( ) < 1023>」の” ( ) “に当て嵌めます。
カテゴリー「変数」のブロック「B」を3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の右側の「gpio17pwmとワールド」の”ワールド “に当て嵌めます。
3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の左側の「gpio17pwmとR」の”gpio17pwm “をフルカラーLEDの赤に接続した”gpio22pwm”で上書きします。
3つ並んだブロック「もし<上向き矢印キー▼キーが押された>なら」の右側の「gpio17pwmとB」の”gpio17pwm “をフルカラーLEDの青に接続した”gpio27pwm”で上書きします。
下向き矢印キーを変数:R、G、Bの一斉減少と定義付けする
引き出しておいたブロック「もし<下向き矢印キー▼キーが押された>なら」の内側に抱え込まれたブロックを外に出します。
引き出したブロック「もし<pwmout > 0 >なら「」でなければ「」」の上側の凹に抱え込まれたブロックの「0.1秒待つ」の下のブロック2つを外に出します。
引き出したブロックを2つに引き離します。
引き離したブロックの上側のブロックを右クリックして削除します。
残ったブロックを元のブロックの元の位置に戻します。
ブロック「もし<pwmout > 0 >なら「」でなければ「」」の下側の凹に抱え込まれたブロックを外に出します。
外に出したブロックを右クリックして削除します。
ブロック「もし<pwmout > 0 >なら「」でなければ「」」の上側の凹に抱え込まれたブロックを右クリックして複製します。
複製したブロックの下2つを引き離します。
引き離したブロックを右クリックして削除します。
残ったブロックの上にカテゴリー「変数」のブロック「B▼を0にする」を繋ぎます。
繋いだブロックをブロック「もし<pwmout > 0 >なら「」でなければ「」」の下側の凹に抱え込ませます。
できたブロック「もし<pwmout > 0 >なら「」でなければ「」」を右クリックして複製します。
複製したブロック「もし<pwmout > 0 >なら「」でなければ「」」を右クリックしてもうひとつ複製します。
3つ並んだブロック「もし<pwmout > 0 >なら「」でなければ「」」の左側の「pwmout▼を-32ずつ変える」の”▼”をクリックして”R”を選択します。
3つ並んだブロック「もし<pwmout > 0 >なら「」でなければ「」」の左側の「B▼を0にする」の”▼”をクリックして”R”を選択します。
3つ並んだブロック「もし<pwmout > 0 >なら「」でなければ「」」の中央の「pwmout▼を-32ずつ変える」の”▼”をクリックして”G”を選択します。
3つ並んだブロック「もし<pwmout > 0 >なら「」でなければ「」」の中央の「B▼を0にする」の”▼”をクリックして”G”を選択します。
3つ並んだブロック「もし<pwmout > 0 >なら「」でなければ「」」の右側の「pwmout▼を-32ずつ変える」の”▼”をクリックして”B”を選択します。
3つ並んだブロック「もし<pwmout > 0 >なら「」でなければ「」」の6つの「pwmout」を全てブロックパレットに戻します。
3つ並んだブロック「もし<pwmout > 0 >なら「」でなければ「」」の左側の”gpio17pwm”をフルカラーLEDの赤に接続した”gpio22pwm”で上書きします。
3つ並んだブロック「もし<pwmout > 0 >なら「」でなければ「」」の左側のもうひとつの”gpio17pwm”を”gpio22pwm”で上書きします。
3つ並んだブロック「もし<pwmout > 0 >なら「」でなければ「」」の右側の”gpio17pwm”をフルカラーLEDの青に接続した”gpio27pwm”で上書きします。
3つ並んだブロック「もし<pwmout > 0 >なら「」でなければ「」」の右側のもうひとつの”gpio17pwm”を”gpio27pwm”で上書きします。
3つ並んだブロック「もし< ( ) > 0 >なら「」でなければ「」」の左側の”( )”にカテゴリー「変数」のブロック「R」を当て嵌めます。
3つ並んだブロック「もし< ( ) > 0 >なら「」でなければ「」」の左側の”(ワールド)”にカテゴリー「変数」のブロック「R」を当て嵌めます。
3つ並んだブロック「もし< ( ) > 0 >なら「」でなければ「」」の左側のもうひとつの”(ワールド)”にカテゴリー「変数」のブロック「R」を当て嵌めます。
同様に、3つ並んだブロック「もし< ( ) > 0 >なら「」でなければ「」」の中央と右側の変数にも、ブロック「G」、「B」を当て嵌めます。
作成したキー操作定義のスクリプトを組み込む
3つ並んだブロック「もし< ( ) > 0 >なら「」でなければ「」」の中央と右側のブロックを繋げます。
繋いだブロックを更に左側のブロックの下に繋げます。
繋いだブロックを元のブロック「もし<下向き矢印▼キーが押された>なら」の内側に抱え込ませます。
できたブロック「もし<下向き矢印▼キーが押された>なら」を「もし<右向き矢印▼キーが押された>なら」の下に繋げます。
繋いだブロックを「もし<上向き矢印▼キーが押された>なら」の下に繋げます。
繋いだブロックを「もし<左向き矢印▼キーが押された>なら」の下に繋げます。
繋いだブロックを元の「もし<スペース▼キーが押された>なら「」でなければ「」」の下側の凹に戻します。
スクリプト停止時のLED消灯スクリプトを組み込む
ステージ上の?ボタンをクリックしてもクリックした瞬間でスクリプトを停止するだけで、LEDはその瞬間の輝度を保ったまま消灯させることができない為、スペースキーを押したときにスクリプト停止と同時にLEDを消灯させるスクリプトを組み込みます。
ブロック「もし<下向き矢印▼キーが押された>なら「」でなければ「」」の「R▼を0にする」を右クリックして複製します。
ブロック「もし<下向き矢印▼キーが押された>なら「」でなければ「」」の「G▼を0にする」を右クリックして複製します。
ブロック「もし<下向き矢印▼キーが押された>なら「」でなければ「」」の「B▼を0にする」を右クリックして複製します。
複製したブロックを全て繋げます。
ブロック「もし<スペース▼キーが押された>なら「」でなければ「」」の上側の凹に抱え込まれたブロックを外に出します。
外に出したブロックの「すべてを止める?」を引き離します。
残ったブロックを右クリックして削除します。
残ったブロック「すべてを止める?」を引き出したブロックの下に繋げます。
繋げたブロックを「もし<スペース▼キーが押された>なら「」でなければ「」」の上側の凹に抱え込ませます。
不要になったブロックを外す
今回のプロジェクトで使用するGPIOの17、22、27は【番外編】で既定の設定が”pulldown”であることが判明したので、ブロック「config17outputpulldown▼を送る」は不要になりました。「大きさを100%にする」、「pwmout▼を0にする」も今回は不要なのでスクリプトから外します。
ブロック「gpioserveron▼を送る」の下のブロックを引き離します。
ブロック「ずっと」を引き離します。
引き離なされた間のブロックを右クリックして削除します。
残ったブロックを繋げます。
できたスクリプトを実行してみる
ステージ上の緑の旗をクリックすると、スクリプトが実行されます。
キーボードの矢印キーを押すとステージ上のR、G、B各変数モニターの数値の変化に伴いLEDの色と明るさが変化します。但し、青と比べると緑の輝度が高く、赤はもっと高いのでバランスを取り直す必要がありそうです。
「スペース」キーを押してスクリプトを停止します。
スクリプトの数値設定を見直す
Raspberry PiのPWM出力は10bitなので、青の最大値を”1023″のままとして、赤の最大輝度を1/4にする為、ブロック「もし<R < 1023 >なら」の”1023″を”256″で上書きします。
赤の輝度増大ステップを1/4にする為、ブロック「R▼を32ずつ変える」の”32″を”8″で上書きします。
緑の最大輝度を1/2にする為、ブロック「もし<G < 1023 >なら」の”1023″を”512″で上書きします。
緑の輝度増大ステップを1/2にする為、ブロック「G▼を32ずつ変える」の”32″を”16″で上書きします。
赤の輝度減少ステップを1/4にする為、ブロック「R▼を-32ずつ変える」の”-32″を”-8″で上書きします。
緑の輝度減少ステップを1/2にする為、ブロック「G▼を-32ずつ変える」の”-32″を”-16″で上書きします。
キー操作によって猫の色が変わるスクリプトを組み込む
カテゴリー「見た目」のブロック「色▼の効果を25ずつ変える」を「0.1秒待つ」の下に割り込ませます。
カテゴリー「見た目」のブロック「色▼の効果を25ずつ変える」を「0.1秒待つ」の下に割り込ませます。
カテゴリー「見た目」のブロック「色▼の効果を25ずつ変える」を「0.1秒待つ」の下に割り込ませます。
割り込ませたブロック「色▼の効果を25ずつ変える」の”25″を3箇所共、”2″で上書きします。
カテゴリー「見た目」のブロック「色▼の効果を0にする」を「もし<スペース▼キーが押された>なら「」でなければ「」」の上側の凹の1番上に割り込ませます。
もう一度、スクリプトを実行してみる
スクリプトを実行し、キーボードの矢印キーを押すと、ステージ上のR、G、B各変数モニターの数値の変化に伴いLEDの色と明るさが変化します。今度は、左右上向き矢印キーを押しっぱなしにして各色が最大輝度に達したときの色がかなり白に近くなったので、赤、緑、青のバランスもよくなったのではないでしょうか。LEDと猫の色は一致していませんが・・・
スクリプトの停止は「スペース」キーで行います。
完成したプロジェクトを上書き保存する
メニューバーの「ファイル」→「保存する」をクリックしてプロジェクトを上書きします。
完成したプロジェクト
今回、フルカラーLEDも「Scratch 1.4」のPWM出力でコントロールすることができましたが、今後も「Scratch 3.0」が正式リリースされるまでは、「Scratch 1.4」で他のデバイスも制御できるか確認していきたいと思います。