第32回 チャレンジ課題

今回は自分で作ってみる、ということで、チャレンジとしていくつか課題をあげてみたいと思います。

目次

チャレンジ課題

前回までに作成したプログラムをベースに、いろいろな機能を追加してみましょう!

今回はチャレンジ課題としていますので、特に回答は用意していません。正解はなく、思った通りに動作すればそれが正解ですので、ぜひチャレンジしてみてください。

このシリーズで作成したプログラムは、プログラミング経験がないと難しかったかもしれません。私のプログラミング能力はかなり低いので、それが影響して余計に難しくなっているかもしれませんが…

このシリーズを通して、電子工作にトライしてみて、プログラムを動作させてみたら、ぜひ以下のチャレンジ課題をやってみてください。中には実装が難しいものもあります。でも難しいものほど、動いた時は嬉しいですし、いろいろな経験が身につきます。

もしなかなか動かない、どうしたらよいかわからない、というようでしたら、お問い合わせフォームで問い合わせいただければと思います。何かサポートできると思います。

表示パターンを変える

「晴のち曇」や「晴時々曇」などのLED点滅パターンでの表現方法は、今回実装した以外にもいろいろとあると思います。自分の好きなパターンに変えたりしてみてください。

パターンの変え方は、$basic_pat配列(PHP)、basicPatリスト(Python)に格納している点滅パターンを変えたり、またパターンを増やしたりして、実際のLED点滅パターンを生成するところを変えたりすると変更できそうですよね。

情報取得時にLEDを全部点灯させる

指定時刻になったり、スイッチを押すとWebから情報を再取得するようにしています。現在はデバッグ用に取得したことをターミナルに表示していますが、本運用した場合、ターミナル画面は表示しませんので、情報取得したのかよくわかりませんよね。

そこで、情報を再取得する際、LEDを数秒間、全点灯するとよいと思います。各LEDに流れる電流は2mA程度ですので、LEDを全点灯すると、流れる電流の合計は 2mA x 7 = 14mAぐらいです。この程度であればRaspberry Piの電気仕様上も問題ありません。

また、全点灯する処理を関数にして呼び出す方式がいいと思います。

鉄道運行状況は時間が経ったら表示を消す

鉄道運行状況の情報は、情報自体の寿命が短いです。30分前に取得した時に「正常運転」だとしても、今現在、何かの理由で遅延が発生しているかもしれません。そこで、鉄道運行状況の情報は、例えば15分ぐらい経過したら消灯する、という処理を追加するのもよいと思います。

天気予報と鉄道運行状況の不明文字列をログに残す

天気予報や鉄道運行状況の文字列は、文字列比較の判定をしています。天気予報はいろいろ種類がありますし、鉄道運行状況も今後文字列表記が変わるかもしれません。現在のプログラムでは、判別できない文字列に対しては、LEDが消灯したままになります。

LEDの点滅表示を見て、「晴が点灯 → 曇りが点滅 → 消灯」であれば、「晴時々曇」の正常表示とわかります。もし「晴が点灯 → 消灯 → 消灯」であれば、何かがおかしいです。晴れの場合は、晴れのLEDが点灯したままになるはずです。

そこで、このように異常表示になった場合は、取得文字列が判別できなかった、ということですので、異常表示の際に、その時に取得した文字列をファイルにログに残す、という機能を追加してみましょう。

ポイントは2つあります。ひとつはLEDの店頭異常をプログラムでどのように判定するかという点、もうひとつは文字列をファイルに残す点です。ファイルの残すには、PHP/Pythonで文字列のファイルへの書き出し方法を調べればすぐにできそうですよね。では、LEDの点灯が異常かどうかの判定はどうすればいいでしょうか。この辺りが考えどころになります。

スイッチ長押しでアプリを終了させる

これはちょっと難易度が高くなると思います。

前回までに完成させたプログラムはfor文で指定回数繰り返していましたが、実際に運用する場合はwhile文で無限に繰り返すことになります。そのようなプログラムを終了させるには、Control+Cなどでプログラムを強制終了させることになります。

でも、強制終了させると、タイミングによってはLEDがついたままになったりしますので、精神衛生上もよくないです。

そこで、スイッチが一定時間以上押されたらプログラムを終了させる、という処理を追加してみましょう。

スイッチが一定時間以上押される、というのはどのように判定すればよいか、ちょっと難しそうですよね。また、スイッチを普通に押した時は情報更新する必要があります。そのため、スイッチを普通に押した場合と長押しした場合を区別する必要があるのですが、どのように実装すればいいでしょうか。

ヒントとしては、LEDの点滅パターンの最小時間は0.25秒です。0.25秒ごとにスイッチの状態を判定します。例えば、スイッチを普通に押した時には情報更新、スイッチを1秒以上押した時はプログラム終了とする場合、以下のような判定ができれはよさそうです。

・ある時刻にスイッチ状態を確認したところON、その0.25秒後にスイッチ状態を確認したところOFFの場合は、情報更新。0.25秒後のスイッチ状態がONの場合は監視継続
・さらにその0.25秒後にOFFの場合は情報更新、0.25秒後のスイッチ状態がONの場合は監視継続
・これを繰り返して、スイッチONの状態が5回確認できた場合、プログラム終了する

スイッチがONの状態が、0.25秒間隔で何回続いたかを確認すれば、スイッチ普通押しと長尾しの区別ができると思います。

人感センサーで人がいるときに表示

人感センサーというものがあります。

焦電型赤外線(人感)センサーモジュール

このセンサーは3本の端子が出てきますが、1本をグラウンド、1本を3.3Vに接続すると、人の動きを検知した場合、残りの1本の電圧が3.3Vになります。Raspberry PiのGPIOピンの1本を入力ピンにして、このセンサーの検知ピンを接続すれば、電圧の状態で人がいるかどうかの判定ができます。

またこのセンサーは基板についている半固定抵抗を調整すると、人を検知した場合、どの程度の時間、検知ピンを3.3Vにするか、設定できます。(ただ調整は勘です)

ということは、このセンサーの検知ピンを見て、3.3VであればLEDで情報表示、0VであればLEDを消灯すれば、人がいるときにLEDを点灯することができます。

ただ、LEDの消費電力は少ないので、人がいないときに消灯する必要もないかもしれませんが…

雷を表示する

夏の天気予報では雷の予報がよく見られます。せっかくですから雷も表示するようにしてみましょう。

まずハードウエアは、雷表示用のLEDを追加します。

ソフトウエアの方ですが、雷は雷っぽく点滅させるのがよいと思います。プログラムで設定した基本点滅パターンとは別にパターンを用意するのがいいと思います。なお、明るいLEDを高速で点滅すると、光過敏性発作を引き起こす可能性もゼロではありませんので、LEDを点滅させる場合は早くても1秒間に3回程度に抑えるようにします。

他にもいろいろ考えてみましょう!

上の例はまだまだ一部だと思います。いろいろアイデアや工夫でもっといろいろなことにチャレンジしてみてください。

更新履歴

日付 内容
2016.1.23 新規投稿
2019.5.12 誤記訂正
通知の設定
通知タイミング
guest
0 コメント
本文中にフィードバック
全てのコメントを見る
管理者
管理者
7 年 前

ハマーさん、コメントどうもありがとうございます。

はい、例えばこの回で説明した人感センサは最大26個繋げることができます(ただし最大電流などに気をつける必要がありますが)。ただし、このシリーズで説明したように3.3Vか0Vか(デジタルに)判別するセンサは接続できますが、例えば気温、気圧、湿度センサなどはGPIOに接続できません。

というのは、一般的な気温センサはアナログ電圧を読み取る必要があり、GPIOでは電圧を読み取ることができませんので、ひと工夫必要です。

また、同じ気温センサでもデジタル信号で値を読み取ることができるタイプもあります。これはRaspberry Piの特定のGPIOピンに接続して使用することができます。

ハマー
ハマー
7 年 前

GPIOは26あることはわかったのですが同じセンサーを最大26個つなぐことができるのでしょうか?

目次