sense for me
2021/02/02 誤記訂正。
さて、今回は以下のトリガーのうち
2番目の仕組みを作ってみる。
ちょっと苦戦したので今回はセンサーから値を
取得するところまで。
- When I Want(時間で)
- If She Felt Temp/Humidity(温湿度センサから)
- When She Saw(カメラから)
- If She Felt Someone(人感センサから)
今回、温湿度以外に照度センサも
実装しているので合わせて紹介。
say sumn when she felt sumn
何かを感じ取ったらしゃべってほしい。
ホントは温度次第でエアコンをリモート
コントロールできればよいのだが
家にエアコンがないのでできない。
リモコンで操作できそうなのは
- テレビ
- 部屋の電気
ぐらいなので。
ま、最低限下記のようなことができればいいかな?
- 室温が高かったら、「暑くないですか?窓を開けませんか?」と言う。
- 湿度が異様に高かったら、「ムシムシしますね。窓を開けませんか?」と言う。
- 部屋の電気が付いたら、「御用ですか?何でもお申し付けください。」という。
- 部屋の電気が消えたら、(夜なら)「おやすみなさい。」(朝〜昼なら)「いってらっしゃい。」
これらは単純な仕組みだが、人感センサやカメラと
組み合わせてもっと複雑なことができそうだ。
それはまた次の工程でやろう。
それにしても、こうやって考えると
そこらへんのAIとして世に出ているのは
頭脳とは実は名ばかりでプログラムとナレッジの
集合体でしかないんだなと思う。
それをIntelligenceって言うんかな?
閑話休題。
Specification
さてラズパイの設計と実装に移る。
そうそう。そういや私のラズパイの
構成を伝えてなかった。
| Model | OS |
|---|---|
| Raspberry Pi 3 Model B | Raspbian 8.0 |
| THP sensor | Lux Sensor | Motion Sensor |
|---|---|---|
| BME-280 | TSL2561 | HCSR501 |
| IR Control | Camera |
|---|---|
| KURO-RS | USB Web Camera unknown brand |
全然関係ないけどMarkdownで縦に表をまとめられないのかな。
The Pin Assignment
センサー類とラズパイとの接続を以下に示す。
Chipはセンサー側のピン。
Piはラズパイ側のピン。
TSL2561
| Chip | Pi |
|---|---|
| INT | - |
| SDA | p2 |
| SCL | p3 |
| GND | p5 |
| VCC | p1 |
BME280
| Chip | Pi |
|---|---|
| VCC | p1 |
| GND | p5 |
| SCK | p2 |
| SDI | p3 |
| CSB | - |
| SDO | p5 |
今回はブレッドボードで接続。
はじめユニバーサル基板とか買ってきて、、
とか思ったけど、そもそも私に
回路図書く技術もないし、ブレッドボードだと
間違えてもやり直せるし。楽しいし。
Try Sensing
さて今回のチップを操作するために
ラズパイ側でI2Cを有効にしている。
接続が上手くいっているか確認。
pi@raspberrypi:/srv/google-home-helper $ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- 39 -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
pi@raspberrypi:/srv/google-home-helper $
0x39と0x76が見えているので上手くいってるっぽい。
Temp! Humidity! Pressure!
T,T,THP!
T,T,THP!
さて最初はTemperature/Humidity/Pressure Sensor(略してTHP)を
操作してみる。楽したいのでいろいろ探したところ
skylarstein氏のbme280-sensorという
のが見つかった。本当先人の方たちに感謝。I appreciate it.
徐に以下を実行。i2c-busというモジュールも入る。
pi@raspberrypi:/srv/google-home-helper $ npm install bme280-sensor
さて、インストールが終われば、モジュール内にサンプルソースがあるので
それを使わせていただく。
pi@raspberrypi:/srv/google-home-helper $ node bme280.example.js
Found BMx280 chip ID 0x60 on bus i2c-1, address 0x76
BME280 initialization succeeded
data = {
"temperature_C": 27.72,
"humidity": 62.30247329165339,
"pressure_hPa": 997.5298584028808,
"temperature_F": 81.896,
"pressure_inHg": 29.45704425948914
}
data = {
"temperature_C": 27.72,
"humidity": 62.29140134332793,
"pressure_hPa": 997.5281998961145,
"temperature_F": 81.896,
"pressure_inHg": 29.456995283805046
}
data = {
"temperature_C": 27.71,
"humidity": 62.29035562613135,
"pressure_hPa": 997.4877214736172,
"temperature_F": 81.878,
"pressure_inHg": 29.455799956494275
}
^C
pi@raspberrypi:/srv/google-home-helper $
取れる取れるぞ!
中ではsetTimeout()で2秒間隔で値を取得しているようだ。
これは使える。
LUX
L,L,LUX!
L,L,LUX!
では次に照度センサから値を取得したい。
こちらはどうも私の環境ではうまく動くモジュールが
見つからなかったので、GitHubを探索したところ
shinjimatsumoto氏のtsl2561が
見つかった。本当に素晴らしいなぁ。
I2Cにコマンドを送って取得した値をゴニョゴニョしている。
なるほど。大変参考になる。
ただこちらはPythonで書かれていたので
JavaScriptで書き直してみた。それがこちら。
/*
* TSL2561 for Node.js
*
*/
const smbus=require('i2c-bus');
function sleep(s){
let e = new Date().getTime() + (s * 1000);
while (new Date().getTime() <= e);
}
function calcLux(part, int_ch0, int_ch1){
let ch0=int_ch0*16;
let ch1=int_ch1*16;
if(ch0==0){
return .0;
}
if(part==PART_TSL2561_CS){
if(ch1/ch0 <= .52)
return .0315*ch0 - .0529*ch0*((ch1/ch0)**1.4);
if(ch1/ch0 <= .65)
return .0229*ch0 - .0291*ch1;
if(ch1/ch0 <= .80)
return .0157*ch0 - .0180*ch01;
if(ch1/ch0 <= 1.30)
return .00338*ch0 - .00260*ch1;
return .0;
}else{
if(ch1/ch0 <= .50)
return .0304*ch0 - .062*ch0*((ch1/ch0)**1.4);
if(ch1/ch0 <= .61)
return .0224*ch0 - .031*ch1;
if(ch1/ch0 <= .80)
return .0128*ch0 - .0153*ch01;
if(ch1/ch0 <= 1.30)
return .00146*ch0 - .00112*ch1;
return .0;
}
}
const BUS = 1;
const ADDR = 0x39;
const REG_CONTROL = 0x80;
const REG_TIMING = 0x81;
const REG_DATA0LOW = 0x8C;
const REG_DATA0HIGH = 0x8D;
const REG_DATA1LOW = 0x8E;
const REG_DATA1HIGH = 0x8F;
const REG_ID = 0x8A;
const PART_TSL2561_CS = 0x1;
const PART_TSL2561_T_FN_CL = 0x5;
const CONTROL_POWER_ON = 0x03;
const CONTROL_POWER_OFF = 0x00;
const TIMING = 0x2;
const i2c=smbus.openSync(BUS);
var part=i2c.readByteSync(ADDR, REG_ID) >> 4;
i2c.writeByteSync(ADDR, REG_TIMING, TIMING);
i2c.writeByteSync(ADDR, REG_CONTROL, CONTROL_POWER_ON);
sleep(.403);
var ch0low=i2c.readByteSync(ADDR, REG_DATA0LOW);
var ch0high=i2c.readByteSync(ADDR, REG_DATA0HIGH);
var ch1low=i2c.readByteSync(ADDR, REG_DATA1LOW);
var ch1high=i2c.readByteSync(ADDR, REG_DATA1HIGH);
i2c.writeByteSync(ADDR, REG_CONTROL, CONTROL_POWER_OFF);
var ch0=ch0high*256+ch0low;
var ch1=ch1high*256+ch1low;
console.log(calcLux(part, ch0, ch1));
もう本当ただ移植しただけ。こちらをtsl2561.jsなんてファイル名にする。
BME280のときと同様、こちらもi2c-busを利用している。
値を取得してみる。
pi@raspberrypi:/srv/google-home-helper $ node tsl2561.js
9.511205680621705
pi@raspberrypi:/srv/google-home-helper $ node tsl2561.js
10.198404905757291
pi@raspberrypi:/srv/google-home-helper $ node tsl2561.js
10.797829115941898
pi@raspberrypi:/srv/google-home-helper $ node tsl2561.js
8.989965474479833
pi@raspberrypi:/srv/google-home-helper $ node tsl2561.js
163.23260832563182
pi@raspberrypi:/srv/google-home-helper $ node tsl2561.js
163.23260832563182
pi@raspberrypi:/srv/google-home-helper $ node tsl2561.js
10.198404905757291
pi@raspberrypi:/srv/google-home-helper $ node tsl2561.js
10.42620609657119
pi@raspberrypi:/srv/google-home-helper $
正直、値の意味がわからないので、部屋の電気を付けたり消したりで
値が変化したので、まぁ合っているのかなと。今度ルクスのこと調べよう。
Next
さて今回はここまで。
次は取得した値の扱い方やそれをトリガに
喋らせてみる。
fQ==
–>
fQ==
–>
fQ==
–>