デコレーションライトを制御する
目次
Xmasっぽいネタ
100均でLEDの電飾が売っていたので、ラズパイで操作できそうなので衝動買い。

使ったのはラズパイ3B+。
GPIO操作はShellからデバイスファイルへ書き込みをすればON・OFFを制御できる。
ただShellからやると細かい制御ができないので、今回はnodejsからGPIOでPWM出力ってのをやってみようかな。
GPIOは21を使う。Pin番号は40。
Shellの例を挙げると
#!/bin/bash
INTERVAL=1 PORT=21 DEVPATH=/sys/class/gpio/gpio${PORT}
echo out > $DEVPATH/direction for i in $(seq 1 100); do echo "ON" echo 1 > $DEVPATH/value sleep 0.2 echo "OFF" echo 0 > $DEVPATH/value sleep 0.1 done echo 0 > $DEVPATH/value
|
これでもできなくはないとは思うけど、実行速度でいえばnodejsのほうが早そうな気がするので、そちらで組んでみる。
調べたら、rpioというモジュールがあったので、それを使ってみる。
PWM出力の場合、LOWとHIGHで電圧が0Vと3.3Vで制御できるようなので、
同モジュールを使うことでsleepも用意されているようなので、ちゃちゃっとできそう。
rpio.js
const _rpio = require('rpio'); const crypto = require('crypto');
var rpio = {}; rpio._ = _rpio; rpio.device = { opened: false, pin: 21, };
var Random=()=>{ const buff=crypto.randomBytes(8); const hex=buff.toString("hex"); const rand=parseInt(hex, 16); let s=(''+rand).split(''); return parseInt(s[3])/10; }
rpio.open=()=>{ if(rpio.device.opened){ console.log(`device has already opened`); return false; } rpio._.open(rpio.device.pin, rpio._.OUTPUT, rpio._.LOW); rpio.device.opened=true; console.log('device opened'); return true; } rpio.close=()=>{ if(!rpio.device.opened){ console.log(`device hasn't opened yet`); return false; } rpio._.close(rpio.device.pin); rpio.device.opened=false; console.log('device closed'); return true; } rpio.sleep=(msec=1000)=>{ if(isNaN(msec)){ console.log(`argument was not valid`); return false; } rpio._.msleep(msec); return true; } rpio.on=()=>{ if(!rpio.device.opened){ console.log(`device hasn't opened yet`); return false; } rpio._.write(rpio.device.pin, rpio._.HIGH); } rpio.off=()=>{ if(!rpio.device.opened){ console.log(`device hasn't opened yet`); return false; } rpio._.write(rpio.device.pin, rpio._.LOW); } rpio.blink=async (onTimer=1000,offTimer=100)=>{ await rpio.on(); await rpio.sleep(onTimer); await rpio.off(); await rpio.sleep(offTimer); } module.exports = rpio;
|
こんな感じにモジュール化してみたので、呼び出し元で
index.js
const rpio=require("./rpio"); rpio.device.pin=40;
var blink=async (counter=1, timer1=1000, timer2=100)=>{ rpio.open(); for(let i=0;i<counter;i++){ await rpio.blink(timer1, timer2); } rpio.close(); }
blink();
|
こんな感じにしてあげれば、1秒光って消える。
blink関数の引数は、光らせる回数(counter)、光っている時間[ms](timer1)、光っていない時間[ms](timer2)になっているので
こんな感じにすれば、ピカピカと結構はやく明滅する。
最後に
ラズパイ+Google Homeで時報やら家で起こっているいろいろなことを喋らせているが、これがあれば視覚的にもお知らせしてくれる。
結構面白い。
コメント: