make the smart speaker smarter 5

08/25

sense for me

2021/02/02 誤記訂正。

さて、今回は以下のトリガーのうち
2番目の仕組みを作ってみる。
ちょっと苦戦したので今回はセンサーから値を
取得するところまで。

  1. When I Want(時間で)
  2. If She Felt Temp/Humidity(温湿度センサから)
  3. When She Saw(カメラから)
  4. If She Felt Someone(人感センサから)

今回、温湿度以外に照度センサも
実装しているので合わせて紹介。

say sumn when she felt sumn

何かを感じ取ったらしゃべってほしい。
ホントは温度次第でエアコンをリモート
コントロールできればよいのだが
家にエアコンがないのでできない。
リモコンで操作できそうなのは

  • テレビ
  • 部屋の電気

ぐらいなので。
ま、最低限下記のようなことができればいいかな?

  1. 室温が高かったら、「暑くないですか?窓を開けませんか?」と言う。
  2. 湿度が異様に高かったら、「ムシムシしますね。窓を開けませんか?」と言う。
  3. 部屋の電気が付いたら、「御用ですか?何でもお申し付けください。」という。
  4. 部屋の電気が消えたら、(夜なら)「おやすみなさい。」(朝〜昼なら)「いってらっしゃい。」

これらは単純な仕組みだが、人感センサやカメラと
組み合わせてもっと複雑なことができそうだ。
それはまた次の工程でやろう。

それにしても、こうやって考えると
そこらへんの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!
C'mon Baby America

さて最初は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!
C'mon Baby America

では次に照度センサから値を取得したい。
こちらはどうも私の環境ではうまく動くモジュールが
見つからなかったので、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==
–>


コメント: