- 2017.12.25
- 技術ブログ電子工作
クリスマスの定番(?) Raspberry Piで光るクリスマスリースを作る【動画あり】
INDETAIL Advent Calendar 2017 の 25日目の記事です。
Advent Calendarも最終日、そしてクリスマスと言えば、ラズパイですよね!
そんなわけで、最終日はtacckがラズパイネタで締めたいと思います。
やること
今回はRaspberry PiでLEDを光らせて、ちょっとだけ目立つクリスマスリースを作ってみたいと思います。
近年は、ご家庭でクリスマスのイルミネーションをやっていらっしゃる方も増えてきているように思います。
自分もやってみたいと思いつつも、なかなか思い切ってはやりづらい。でも、一手間かけてみたい。
そういう方にオススメです。
材料
- リース本体
- デコレーション用LED
こちらは、100均で購入してきました。オーナメントも、好みで揃えると良いと思います。
- Raspberry Pi 3 Model B
- その他ジャンパーケーブルなど
こちらは、ご家庭に常備してあるものをご利用ください。
手順
Raspberry PiでLEDを光らせるのですが、せっかくなので点滅のパターンを好きに選べると良いですよね。
そこで、Raspberry PiにNode.js
でちょちょいとプログラムを書いて、制御できるようにしてみました。
Node.js
でRaspberry PiのGPIOを操作するのは、下記の記事を参考にしてみてください。
PythonじゃなくてもOK! Raspberry Pi + JavaScript で「Lチカ」から「明るさ制御」まで【動画あり】
プログラム
下記のリポジトリをcloneして実行するだけで、Webサーバとして動作し、LEDの点滅パターンを選択できるようになります。
https://github.com/tacck/rp-node-led
実行方法はこちら。
1 2 3 |
raspberrypi$ git clone https://github.com/tacck/rp-node-led.git raspberrypi$ cd rp-node-led raspberrypi$ node bin/www |
この状態で http://raspberrypi.local:3000
へアクセスすると、操作画面が表示されます。
作りはシンプルになるように、GPIOの操作(LEDのON/OFF)は、APIとして作成しておきます。
(https://github.com/tacck/rp-node-led/blob/master/app.js で実装)
1 2 3 4 5 6 7 8 9 10 11 12 |
var LED_PIN_1 = 15; // GPIO22 rpio.open(LED_PIN_1, rpio.OUTPUT, rpio.LOW); app.get('/api/ledOn', function (req, res, next) { rpio.write(LED_PIN_1, rpio.HIGH); res.send('ledOn'); }); app.get('/api/ledOff', function (req, res, next) { rpio.write(LED_PIN_1, rpio.LOW); res.send('ledOff'); }); |
フロントエンド側のJavaScriptでは、ボタンごとに呼び出す時間を制御してAjaxでAPIを呼び出す形です。
(https://github.com/tacck/rp-node-led/blob/master/views/layout.pug で実装)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
script(lang='javascript'). $('.container') .on('touchstart', '.touch-hover', function () { $(this).addClass('hover'); $(this).removeClass('normal'); }) .on('touchend', '.touch-hover', function () { $(this).addClass('normal'); $(this).removeClass('hover'); }); $('#p1').on('touchend', function () { p.then(pattern4) .then(function () { pattern1(); }); }); (中略) $('#p4').on('touchend', function () { p.then(pattern4); }); var ledState = 0; // 0:OFF 1:ON var p = new Promise(function (resolve) { resolve(); }); var timerId = -1; function pattern1() { // ステートをONに変更 changeState(1); // 1.0秒ON 1.0秒OFF の繰り返し var turnOnMSec = 1000; var turnOffMSec = 1000; timerId = setInterval(function () { p.then(function () { return new Promise(function (resolve) { ledOn(); setTimeout(function () { resolve(); }, turnOnMSec); }); }).then(function () { return new Promise(function (resolve) { ledOff(); setTimeout(function () { resolve(); }, turnOffMSec); }); }) if (!ledState) { clearInterval(timerId); timerId = -1; } }, turnOnMSec + turnOffMSec); } (中略) function pattern4() { // Off return new Promise(function (resolve) { ledOff(); changeState(0); var tmpId = setInterval( function () { if (timerId < 0) { clearInterval(tmpId); resolve(); } }, 100); }); } function ledOn(percent) { $.get('/api/ledOn'); } function ledOff() { $.get('/api/ledOff'); } function changeState(state) { return new Promise(function (resolve) { ledState = state; resolve(); }); } |
画面上のボタンをタップすると、パターンに応じてLEDが点滅します。
- Pattern1: 1秒ごとにON/OFFを繰り返す。
- Pattern2: 0.5秒ごとにON/OFFを繰り返す。
- Pattern3: 短い間隔で2度ONとなり、少し長くOFFとなる。
- Off: LEDがOFFとなる。
LEDとRaspberry Piの接続
ケーブルを加工して、Raspberry PiのGPIOピンと接続します。
過電流とならないように、100Ωの抵抗を入れています。
電流の方向さえ間違わなければ、特に難しいことはありません。
作成してLED点灯
あとは、LEDとオーナメントでリースを飾っていきます。
手先の器用さとセンスがポイントです。(私にはどちらもありません。)
飾り付けが終われば完成です!
実際に動かしてみましょう。
パターン通りに、ちゃんと点滅していますね!
まとめ
Raspberry Piで一手間かけることで、いつもと違ったデコレーションになったかと思います。
センサーを組み込めば、暗くなったら光る、音に反応して光る、など、さらに面白いこともできますね。
身近なものに少しだけRaspberry Piを使って、いつもよりも楽しい日常を過ごしてみませんか?