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で書き直してみた。それがこちら。
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== –>
コメント: