ブロックチェーン・AI・システム開発の株式会社INDETAIL

PythonじゃなくてもOK! Raspberry Pi + JavaScript で「Lチカ」から「明るさ制御」まで【動画あり】

2017.10.02
tacck

札幌はすっかり秋の空気となり、外に出るときには上着が必要な季節となってきました。
秋といえば食欲の秋なtacckです。ビール飲みたい。

私の記事でラズパイを触るときに比較的JavaScriptを使ってきましたが、これはどちらかというと外部サービスとの連携のしやすさから選択してきたものでした。
そこで今回は、ラズパイのハードである"GPIO"を扱えるパッケージを使って、JavaScriptによるLチカをやってみたいと思います。

用意するもの

  • Raspberry Pi 3 Model B
  • ブレッドボードとジャンパーワイヤー (適量)
  • 赤色LED 3個
  • カーボン抵抗 (220Ω) 3個

Raspberry Pi のセットアップ

OSはRaspbianの最新、Node.js7.2.*系がインストールされているものとします。

OSのインストールは、下記記事を参考にしてください。
Raspberry Pi Zero を入手したのでセットアップ手順をまとめてみる

同じく、Node.jsのインストールは、下記記事を参考にしてください。
ラズパイで手軽に作る!ドアロックセンサーの実現【第一回 AWS IoTの設定】

Lチカさせる

NPMパッケージのインストール

今回利用するパッケージは、node-rpioというものです。
node-rpio

Node.jsからGPIOを使えるパッケージはいくつかあるようですが、最初に見つけたこちらがとても取り扱いやすかったのでこちらを使うことにしました。

上記のサイトに記載のある通り、パッケージのインストールと設定ファイルの追加を行ないます。

これでRaspberry Piを再起動すれば、準備完了です。

Lチカプログラム その1

まずは、簡単な使い方を確かめるところからやってみます。

LEDを3つ並べ、順番に点灯し、最後に全部点灯させる、、、というのを繰り返させるものです。

特にこれ以上の説明も不要なものですね。
では、動画で動きを観てみましょう。

とてもわかりやすいものでしたね。

Lチカプログラム その2

その1でもサンプルとしては十分ですが、せっかくなのでもう少し遊んでみましょう。

その1のプログラムで観たように、基本的にGPIOへの信号は「HIGH (ON)」と「LOW (OFF)」の二種類しかありません。
これだと明るさの調整ができなくて不便です。
それに、世の中にあるLED照明などは明るさの調整ができますよね。どうやって実現しているのでしょう?

電流を減らすことでもある程度できますが、LEDではあまり良い方法ではありません。
(ある程度電流を流さないと、そもそも光らせることができない。)

別の方法として、「高速で点滅させ明るい時間と暗い時間の比率を調整する」ことで、明るさを調整する、というものがあります。
一般に「パルス幅変調 (PWM / Pulse Width Modulation)」と呼ばれるものです。

Raspberry PiのGPIOはハード的に実現してくれているのですが、制限として使えるピンが限られています。
今回使うパッケージではハードを使うようにサポートしてくれる機能もありますが、基本原理はシンプルなのでプログラムで簡易実装してみましょう。

blink()という関数を作りました。
ここでは、3000ミリ秒間だけ真ん中(LED_PIN_2)のLEDを光らせます。
その間に、20ミリ秒の70%(つまり14ミリ秒)を点灯、残り(6ミリ秒)を消灯、という風に繰り返していきます。
比較のために、一番右側(LED_PIN_3)は、点灯しっぱなしとしています。
これを実行した結果が、次の動画です。この動画は、点滅がわかりやすいようにiPhoneでスロー撮影しています。

右側と比べて、明らかに点滅をしていますね。
肉眼では点滅はほとんど気にならないレベルで、明るさが少しだけ暗いかな、という感じになっています。

Lチカプログラム その3

もう少し、点滅の具合を確かめてみましょう。

今度は、点灯する時間の割合を段階的に小さくしてみます。
つまり、段階的に暗く見えるはずです。

こちらのプログラムを実行した結果が、次の動画です。
(こちらはスローではなく通常の撮影ですが、多少点滅していることが見えると思います。)

プログラム通り、2秒ごとに暗くなっていったのがわかると思います。

もっと早い周期の点滅を使えば、肉眼では点滅が見えない状態でも暗くなっていく、、というのが実現できますが、このような簡単な実装でそれなりに対応することもできます。

Lチカプログラム おまけ (雨情報表示)

おまけとして、今までのLチカを少し応用して、これから雨が降りそうか、、という情報表示ガジェットを作ってみましょう。
LEDなどはそのままで、プログラムだけ作り変えます。

情報源は、商用でも無償利用できる"OpenWeatherMap"を使い、下記のような仕様とします。

  • 一番左が0〜6時間までの情報。 (出かけるときに雨が降るか?)
  • 真ん中が6〜12時間までの情報。 (仕事の帰りに雨が降るか?)
  • 一番右が12~18時間までの情報。 (帰りが遅くなった場合に雨が降るか?)
  • 上記それぞれの時間帯で、降雨量が0mm/hより多い場合は暗めに光り、1.5mm/hより多い場合は明るめに光る。
  • 情報は毎分取得。

という感じで、ざっくりとしたプログラムを作成しました。

このような感じです。
一通り動いているはずですが、天気の情報相手なのでしばらく動かしてみないと改善点なども見えてこないかなぁ、と思います。
しばらくは、自宅の玄関に設置して運用です。

まとめ

いかがでしたでしょうか。
弊社のブログにて、過去に PythonでのLチカの記事 がありましたが、同じくらい簡単にJavaScriptでもLチカさせることができました。

今回使ったパッケージ"node-rpio"ではI2CやSPIなどの規格も扱えるようなので、他のセンサーとの連携もできそうです。
そちらは、次の機会に確かめてみたいと思います。

tacck Takuya KIHARA

エンジニア (モバイルアプリ、フロントエンド、バックエンド、インフラ) 得意なことは、領域をまたいで考え、開発すること。 ブログでは、主にAnsible、Docker、Raspberry Piのことを書いています。 好きなフィギュアスケートの技は、スプレッド・イーグルです。

「いいね」ボタンを押すと、最新情報をすぐに確認できます。