cp2112_BME680

CP2112とは

  • 開発するためのパッケージをlibhidapiインストール

    1
    2
    # apt install libhidapi-dev
    libhidapi-dev libhidapi-hidraw0 libhidapi-libusb0
  • 以下ファイルをゲット・コンパイルBoschSensortec/BME680_driverからFork

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bme680.c  bme680.h  bme680_defs.h  pepocp2112ctl.c
    # gcc -Wall -o pepocp2112ctl pepocp2112ctl.c bme680.c -lhidapi-hidraw
    # ll
    合計 144
    drwxr-xr-x 2 root root 140 4月 6 17:39 ./
    drwxr-xr-x 3 www-data www-data 840 4月 6 17:39 ../
    -rwxr-xr-x 1 root root 44364 4月 13 2019 bme680.c*
    -rwxr-xr-x 1 root root 8353 4月 13 2019 bme680.h*
    -rwxr-xr-x 1 root root 17134 4月 13 2019 bme680_defs.h*
    -rwxr-xr-x 1 root root 34644 4月 6 17:39 pepocp2112ctl*
    -rw-r--r-- 1 root root 30626 3月 28 16:26 pepocp2112ctl.c
  • プログラミング例、SMBus Devices操作のみソースから抜き出し重要な箇所だけ説明します、他はソースを確認して下さい。(経験上GPIOはマルチプロセスで動作させる必要があると思いセマフォ (semaphore)を使用し結構な量が有ります。)

    • CP2112のI2C接続デバイスBME680はバッファーにI2Cアドレス、必要なコマンド、データ、バイト・カウンタを設定、hid_send_feature_reportで送信し必要に応じてコマンドに対するレスポンスを待ち処理をします。
    • BME680ライトはコマンド(CP2112_DATA_WRITE)、レジスター・アドレス、データ、バイト数を設定しデバイスに書き込みます。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      int8_t user_i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
      {
      .
      reg[0] = CP2112_DATA_WRITE;
      reg[1] = BME680_I2C_ADDR_PRIMARY<<1;
      reg[2] = len+1;
      reg[3] = reg_addr;
      for (int8_t i=4; i<len+4; i++)
      reg[i] = reg_data[i-4];
      rslt = hid_send_feature_report(hd, reg, len+4);
      • デバック中のバッファ等ダンプ
        1
        2
        3
        4
        5
        user_i2c_write() dev_id: ec reg_addr: e0 len: 1
        user_i2c_write()1 rslt: 5 len: 1
        reg dump start
        0:14 1:ec 2:02 3:e0 4:b6
        reg dump end
    • BME680リードは最初にライトコマンドでレジスターアドレスを送信します。
      • 次にI2Cアドレスリード・リクエスト・コマンド(CP2112_DATA_READ_REQ)送信、
        データが整う迄(CP2112_DATA_READ_FORCE_SEND)でPolling、ステータス確認、(CP2112_DATA_READ_RESPONS)を待ち、デバイスからデータを読み出します。
        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
        int8_t user_i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
        {
        .
        reg[0] = CP2112_DATA_WRITE;
        reg[1] = BME680_I2C_ADDR_PRIMARY<<1;
        reg[2] = 1;
        reg[3] = reg_addr;
        rslt = hid_send_feature_report(hd, reg, 4);
        .
        user_delay_ms(HID_WAIT);
        reg[0] = CP2112_DATA_READ_REQ;
        reg[1] = BME680_I2C_ADDR_PRIMARY<<1;
        reg[2] = 0x00; // reads length_high
        reg[3] = len; // reads length_low
        rslt = hid_send_feature_report(hd, reg, 4);
        .
        user_delay_ms(HID_WAIT);
        while (retry_cnt < 3)
        {
        /* SMBus Polling */
        reg[0] = CP2112_DATA_READ_FORCE_SEND;
        reg[1] = 0x00; // reads length_high
        reg[2] = len; // reads length_low
        rslt = hid_send_feature_report(hd, reg, 3);
        .
        user_delay_ms(HID_WAIT);
        rslt = hid_read_timeout(hd, buf_in, len+3, timeout);
        .
        /*
        buf_in[0]:hid_report ID->0x13:CP2112_DATA_READ_RESPONS
        buf_in[1]:hid_status 0x00->Idle ,x01->Busy ,x02->Complete
        ,buf_in[2]:hid_read_length
        buf_in[3]-:Following_BME680_Read_Data
        */
        if (buf_in[0] == CP2112_DATA_READ_RESPONS)
        {
        if (buf_in[1] == 0x00 || buf_in[1] == 0x02 || buf_in[1] == 0x03)
        .
        break;
        retry_cnt++; // Busy or Idle or Other
        user_delay_ms(HID_WAIT);
        continue;
        }
        if (buf_in[0] == CP2112_TRANSFER_STATUS_RESP)
        {
        .
        user_delay_ms(HID_WAIT);
        retry_cnt++;
        continue;
        }
        }
        .
        if(buf_in[2] > 0 && rslt > 3 && buf_in[2] < rslt)
        {
        int8_t j = buf_in[2];
        for (int8_t i=0; i < j; i++)
        {
        reg_data[i] = buf_in[i+3];
        }
        return 0;
        }
      • デバック中のバッファ等ダンプ
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        user_i2c_read dev_id: ec reg_addr: d0 reg_data: 04 len: 1
        user_i2c_read()hid_read_timeout rslt:4 retry_cnt:0
        buf_in dump start
        0:13 1:02 2:01 3:61
        buf_in dump end

        user_i2c_read dev_id: ec reg_addr: 89 reg_data: 04 len: 25
        user_i2c_read()hid_read_timeout rslt:28 retry_cnt:0
        buf_in dump start
        0:13 1:02 2:19 3:40 4:a3 5:66 6:03 7:2f 8:80 9:8e 10:c9 11:d6 12:58 13:ff 14:de 15:19 16:cf 17:ff 18:2f 19:1e 20:00 21:00 22:1a 23:f3 24:e7 25:f6 26:1e 27:02
        buf_in dump end
  • 最後に
    ここまで苦労して分かってみれば、案外hidapiからCP2112でI2C素子扱いもMM-CP2112A売り文句マイコンのプログラミング不要でI2C接続のセンサーやGPIO(8ピン)をPCアプリケーションから直接制御できます。を納得出来ない事はないかも、如何でしょう

  • Please check the source code below
    https://github.com/kujiranodanna/BME680_driver

シリアル通信ソフト

シリアル通信ソフトepiconとは

  • epiconはLinuxのシリアル通信ソフトです。

  • 実践IOTハウスでは、Raspberry PiのUSB接続ToCoStick(トコスティック)からシリアル通信でTOCOS TWE-Liteで温湿度計AM2321センサーやAI・DIOを制御に使っています。

  • SwitchやRouterなどシリアルポートでとコンソールPCでConfig設定するネットワーク機器はメーカーや機種を問わず使えると思います。

  • Cisco製SwitchやRouterは設定を自動化する際、事前に作成したテキストデーターをコピー&ペーストして、コンフィグの流し込みを行います。
    この時文字と改行の送出ディレィを行いコンフィグデーターの取りこぼしを防ぐことが重要です。

  • このシリアルコンソールとして重要な文字と改行の送出ディレイをepiconはサポート、コンフィグを安心してコピー&ペーストが出来ます。

  • この他、簡易telnet、zmodemなどのファイル転送ソフト、shell、マクロ、外部ソフトの起動などCUIだが多機能でコンパクトな作りとなっています。

  • インストール
    Download
    https://osdn.net/projects/pepolinux/releases/p3211

    1
    2
    3
    4
    5
    6
    7
    # tar xvfz epicon-XX.XX.tar.gz
    # cd epicon
    # ./configure
    # make
    # make install
    uninstall
    # make uninstall
  • 使い方

    • 起動、オプションなし(com1:/dev/ttys0ポート、9600bps、8bitノンパリティ)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      # epicon

      ** Welcome to epicon Version-5.2 Copyright Isamu Yamauchi compiled:Feb 24 2021 **
      exec shell ~!
      send binary files ~f
      send break ~b
      call rz,sz,sx,rx ~rz,~sz,~sx,~rx
      call kermit ~sk,~rk
      external command ~C
      change speed ~c
      exit ~.
      Connected /dev/ttyS0
    • 終了方法
      Enter~.
    • 通信状態->shellへ->コマンド入力->exitで元の通信状態に戻る
      Enter~!
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
        epicon wait
      # ls
      AUTHORS README configure.ac install-sh
      COPYING aclocal.m4 depcomp missing
      ChangeLog autom4te.cache epicon.c patch-gkermit1.0+counter-CentOS4.2
      INSTALL config.h epicon.h patch-gkermit1.0+counter1.2.1
      Makefile.am config.h.in epicon.nr sample.scr
      Makefile.in config.status epicon_main.c stamp-h1
      NEWS configure epicon_uty.c
      # exit
      epicon run
    • Switchの設定、オプションあり(/dev/ttyUSB0,19200bps,キャラクタディレイ:30ms,CRディレイ:50ms)大昔の経験で、これ位のディレイを設定するとコンフィグの取りこぼしが起こらない。
      1
      # epicon -d 30 -D 50 -s 19200 -l /dev/ttyUSB0
    • Switchの設定、オプションあり(telnet,キャラクタディレイ:20ms,CRデレイ:50ms)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      # epicon -d 20 -D 50 -n 192.168.0.1:23

      ** Welcome to epicon Version-5.2 Copyright Isamu Yamauchi compiled:Feb 24 2021 **
      exec shell ~!
      send binary files ~f
      send break ~b
      call rz,sz,sx,rx ~rz,~sz,~sx,~rx
      call kermit ~sk,~rk
      external command ~C
      change speed ~c
      exit ~.

      Telnet Server 1.10 All rights reserved.


      login :
    • “-c”オプション:外部スクリプトの指定
      • mono-wireless無線モジュールTWELITEとMONOSTICKで温湿度計AM2321センサー、アナログ入力、デジタル入出力信号を離れた場所から遠隔監視・制御がするプログラム pepotocsctlで使用しています。twelite_dip_monostick
      • 以下は、AM2321センサーから温湿度を読み取るスクリプトを作成してepiconを起動します。
        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
        # /usr/local/bin/epicon -s 115200 -ql /dev/ttyUSBTWE-Lite -c $CMD
        # cat $CMD
        #!/bin/bash
        RETRY=5
        I2CRD="-1"
        while [ ${RETRY} -ne 0 ];do
        retry_time=`echo -en $RANDOM |cut -c 1-2`
        echo -en ":7888AA015C0000X\r\n"
        msleep 50
        read -s -t 1 I2CRD || I2CRD="-1"
        echo -en ":7888AA015C03020004X\r\n"
        msleep 50
        read -s -t 1 I2CRD || I2CRD="-1"
        msleep
        echo -en ":7888AA025C0006X\r\n"
        msleep 50
        read -s -n 28 -t 1 I2CRD || I2CRD="-1"
        TMP=`echo -en ${I2CRD} | wc -c`
        [ ${TMP} -eq 28 ] && break
        RETRY=$((${RETRY} - 1))
        [ ${RETRY} -eq 0 ] && break
        RETRY=$((${RETRY} - 1))
        msleep $retry_time
        I2CRD="-1"
        done
        echo -en ${I2CRD} >/dev/stderr
  • マニュアル抜粋

    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
    # man epicon

    epicon(1) epicon Manuals

    NAME
    epicon is Easy Personal Interface Console terminal software. First I
    am sorry. Because my English linguistic power is very shabby, this sen‐
    tence is being translated by the machine. Because of that, read it in
    the interpretation which it is tolerant of though it thinks that it is
    a little funny translation.

    SYNOPSIS
    usage:
    epicon [-options [argument] [-options [argument]]
    [-b ] <--escape cannot be used
    [-c external_command]
    [-d send_charcacter_delay(ms)]
    [-D send_CR_delay(ms)]
    [-e escape_char]
    [-f send_file]
    [-F send_file_effective_delay]
    [-m ] <--input echo mode
    [-M ] <--line mode
    [-l com_port]
    [-L output_log_file]
    [-n ip_address[:port]]
    [-p [server_port]]
    [-q ] <--quiet mode
    [-s speed]
    [-v ] <--show version
    [-x bit_length (5|6|7) parity(o|e|n) stop_bit (1|2)]
    [-z ] <--auto rz prohibition

    defaults:
    speed: 9600b/s (Higest of 460800)
  • Please check the source code below
    https://github.com/kujiranodanna/IOT-House/tree/master/raspberrypi/usr/src/epicon

config_irkit

IRkitとは

  • IRKitはネットワーク対応学習型赤外線リモコン

IRKit Home appliance operation

  • IOTハウスではWiFi経由でRaspberry piがIRkitからの赤外線データを読み取り、定時や入力イベント毎に送信、家電を操作します。
IRKitをRaspberry piで操作
  • IRkitから家電の赤外線データを読み取り、送信や定時操作、入力イベントによる操作は全てWebブラウザから行います。

  • IRkitのIPアドレスが不明な場合はWebブラウザからDIO SettingsTABのテキストBOXnoneの状態でSearch_Set ボタンを押し、IRkitのIPアドレスが数分後に自動検出して表示されてから以下の操作をします。

  • IRkitへ向けて赤外線リモコン操作直後にWebブラウザでIRkitから家電の赤外線データを読み取りします。(赤外線リモコン・ボタン操作直後のみデータ読み取り可能)

irkit_rasp_reg
  • Raspberry piでIRkitから家電の赤外線データの読み取りは以下GETコマンドで行います。
    1
    # curl -s -m $RETRYTIME --retry $RETRY --user-agent ${USERAGENT} http://${IP}/messages --header "X-Requested-With: PepoLinux" >${IRFILE}
  • 読み取ったデータは以下json形式で格納されます、これをタイミング毎に送出して家電を操作します。
    1
    2
    # cat .irdata_0
    {"format":"raw","freq":38,"data":[3968,1927,10762,1927,2911,1037,2911,1037,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,2813,1073,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,2911,1037,1037,1037,2911,1037,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,968,968,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,968,968,2911,968,843,1111,2911,1037,2911,1037,843,1111,2911,1037,2911,1037,843,21415,3834,1927,10762,1927,2911,1037,2911,1037,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,2813,1073,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,2911,1037,1037,1037,2911,1037,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,968,968,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,968,968,2911,968,843,1111,2911,1037,2911,1037,843,1111,2911,1037,2911,1037,843,21415,3834,1927,10762,1927,2911,1037,2911,1037,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,2813,1073,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,2911,1037,1037,1037,2911,1037,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,968,968,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,843,1111,968,968,2911,968,843,1111,2911,1037,2911,1037,843,1111,2911,1037,2911,1037,843]}
  • Raspberry piでIRkitから家電の赤外線データを読み取りは以下POSTコマンドで行います。
    1
    # curl -s -m $RETRYTIME --retry $RETRY --user-agent ${USERAGENT} -X POST -F upfile=@/${IRFILE} http://${IP}/messages >${DOCFILE}
  • IRkitの定時操作はAuto ProsessTabで行います。
irkit_auto_img
  • IRkitの入力イベント操作はDIO ContorolTabで行います。
irkit_event_img
  • Please check the source code below

https://github.com/kujiranodanna/IOT-House/blob/master/raspberrypi/www/remote-hand/irkit_reg.cgi

https://github.com/kujiranodanna/IOT-House/blob/master/raspberrypi/www/remote-hand/irkit_post.cgi

臭いセンサー

pepoiaq2ledとは

  • 環境ガスセンサーBME680から読み出したガス抵抗値5分毎50カウント平均値80%、温度10%、湿度10%から計算された空気質:IAQ(indoor air quality)0〜500をブラウザは数値と共にgood(緑)〜very_bad(赤)色で表現しています。

    bme680_iaq_img
  • これをpepoiaq2ledでGPIO出力から3色LEDを点灯させることが出来ます。

  • 常時起動していれば臭いセンサー・アプライアンスとして活用出来ます。

    • pepoiaq2ledは以下コマンドにてdaemontools経由で起動させます。
      1
      2
      3
      4
      # cd /www/pepolinux
      # ln -s /usr/local/bin/pepoiaq2led iaqled
      # cd /service/
      # ln -s /www/pepolinux/iaqled iaqled
      daemontoolsで起動したpepoiaq2ledは以下コマンドで停止・起動・確認をおこないます。
      1
      2
      3
      # svc -d /www/pepolinux/iaqled
      # svc -u /www/pepolinux/iaqled
      # svstat /www/pepolinux/iaqled
  • Raspberry_piのBME680と3色LEDでチューブ入りにんにくの臭いを検出デモ動画

  • Please check the source code below
    https://github.com/kujiranodanna/IOT-House/blob/master/raspberrypi/usr/local/bin/pepoiaq2led

config_twelite

  • 100均電卓のソーラパネルで簡易照度計を作る
    • ソーラパネルの発電電圧をTWELITE DIPのアナログ入力で測る
twelite_solar_cell_img
  • アナログ入力電圧をグラフ化、測定場所による発電電圧のバラつきをスライス電圧で補正しデジタル化high/lowとする
twelite_solar_cell_img
  • 日の出と日没をhigh/lowで検出、玄関電灯をオン・オフする
    • 玄関電灯をhigh/low(日没・日の出)で単純にオン・オフしない
    • 防犯と省エネを考慮して5分毎に30秒(30000ms)消灯する
    • 設定の具体的な内容はAuto ProcessTabで行う
      • 17〜24時の5分毎に屋外照度=lowを判定して玄関電灯->low(30秒)30秒消灯後、4分半程点灯 
      • 0〜6時の5分毎に屋外照度=lowを判定して玄関電灯->low(30秒)
      • 5〜7時の5分毎に屋外照度=highを判定して玄関電灯->low日の出後、電灯消灯
twelite_solar_cell_img
Raspberry_piとTocos無線モジュールのコラボ動画

pepotocsctl

pepotocsctlとは

  • pepotocsctlとはmono-wireless無線モジュールTWELITEとMONOSTICKで温湿度計AM2321センサー、アナログ入力、デジタル入出力信号を離れた場所から遠隔監視・制御が出来るプログラムです。
    twlite_img
    pepotocsctl単独では動作しません、別途epiconが必要です。 Tocos無線モジュールのGPIOとAM2321センサーをコマンドで操作できます
    1
    2
    3
    # pepotocsctl
    # pepotocosctl
    usage /usr/local/bin/pepotocosctl read->chno:0-6 | write->chno:0-6 [DO:0|1|f] to 300000ms
    DI(デジタルインプット)の4ポート分リード
    1
    # pepotocsctl 0 7
    DI(デジタルインプット)の一番ポートリード
    1
    # pepotocsctl 1 1
    DO(デジタルアウトプウト)一番ポートへ1をライト
    1
    2
    # pepotocsctl 1 1
    1
    DO(デジタルアウトプウト)一番ポートへ1をライト、5秒間保持
    1
    2
    # pepotocsctl 1 1 5000
    0
    I2C温湿度計AM2321センサーのリード
    1
    2
    # pepotocsctl 5
    2016/01/20,19:16:19,4.0℃,75.4%
    アナログ入力リード
    1
    2
    # pepotocosctl 6
    4080,4080,4080,4080
    ライトアフターリード
    1
    2
    # pepotocosctl 0 0
    7;4080,4080,4080,4080
    デジタルインプットとアナログインプットリード
    1
    2
    # pepotocosctl 7
    f;1952,4080,4080,4080
    リードウエイト・DIの変化を指定時間待つ
    1
    2
    # pepotocosctl 7 120
    e;4080,4080,4080,4080
  • Please check the source code below
    https://github.com/kujiranodanna/IOT-House/blob/master/raspberrypi/usr/local/bin/pepotocosctl

pepogpioctld

pepogpioctldとは

  • gpioの入出力制御と環境ガスセンサーBME680のデーターを元に空気質を数値化するデーモンです。

  • BME680センサーが接続されている場合、pepobme680が作成した2021/02/04/17:22:23,10.2,43.0,1018.9,3436 値から、ガス抵抗値5分毎50カウントの平均値80%、温度10%、湿度10%を元に以下のような空気質:IAQ (indoor air quality)を計算、付加します。

  • IAQ is Sample 0(Good) to 500(Hazardous) Temperature(17-28℃):10% Humidity(40-70%):10% Gas(Gas±Gas_base/Gas_base):80%

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [iot00f:root#] cat /www/remote-hand/tmp/.pepobme680
    2021/02/04/17:22:23,10.2,43.0,1018.9,3436
    日時,温度,湿度,気圧,ガス抵抗

    [iot00f:root#] cat /www/remote-hand/tmp/.gpiodi_read_data
    di[0]=1
    di[1]=1
    di[2]=1
    di[3]=0
    gpio_i2c=17:25:15,10.2,43.0,1019,3436,21
    日時,温度,湿度,気圧,ガス抵抗,空気質

    [iot00f:root#] cat /www/remote-hand/tmp/.gpiodo_write_data
    do[0]=0
    do[1]=0
    do[2]=0
    do[3]=0

    BME680環境ガスセンサーを接続してグラフ表示させます

  • Please check the source code below
    https://github.com/kujiranodanna/IOT-House/blob/master/raspberrypi/usr/local/bin/pepogpioctld

pepoalexado

pepoalexadoとは

  • Alexaで電気をつけたり、消したり、温度を聞いたりする為に作成、IOTハウスに分散しているRaspberry PiへGPIOの出力やjsonデータを取得します
    pepoalexado
    usage /usr/local/bin/pepoalexado host user password [write->chno:0-17 [DO:0|1] [timer->1 to 300000ms]] or read->json_name

  • GPIO 3 ON
    pepoalexado iot001.local remote hand 3 1

  • GPIO 3 OFF
    pepoalexado iot001.local remote hand 3 0

  • I2CガスセンサーBME680のjsonデータを取得
    pepoalexado iot001.local remote hand gpio_i2c
    { “date”: “08:47:11”, “temp”: “27.5℃”, “hum”: “79.7%”, “pres”: “1006hPa”, “gas”: “2055427Ω”, “iaq”: “17” }

  • I2CガスセンサーBME680の気圧データを取得
    pepoalexado iot001.local remote hand gpio_i2c.pres
    1020hPa

  • 屋外照度がlow/highを取得 ->屋外照度が暗くなれば部屋の電気をつけるなどの判定に使う
    pepoalexado iot01f.local remote hand ai2di12
    low

  • iot01f.localのGPIO 4番ポート入力low->highイベント登録されたコマンドdio3highを実行
    dio3highはモジュールカメラ10秒動画メールを登録している、これはカメラ接続がないGPIO入力イベントから他カメラ接続のRaspberry Piのモジュールカメラを起動出来る
    実践IOTハウスではAlexaへの防犯カメラ起動に使用
    pepoalexado iot02f.local remote hand dio3high

  • chromeなどブラウザが、https://iot01fを閲覧中は登録している文言で音声操作と応答をそのブラウザが返す
    pepoalexado iot01f.local remote hand voice_req 電気を消して ->電気を消してを実行します
    pepoalexado iot01f.local remote hand voice_req 部屋の温度教えて ->部屋の温度は24.0℃です

  • Alexaのhomebridge/config.json設定例

    アレクサ、ダインニング電気つけて

    アレクサ、ダインニング電気消して

    アレクサ、防犯カメラオン

    アレクサ、防犯カメラオフ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    {{{
    "platforms": [
    {
    "platform": "Alexa",
    "name": "Alexa",
    "username": "user",
    "password": "pass"
    }
    ],
    "accessories": [
    {
    "accessory": "CMD",
    "name": "ダイニング電気",
    "on_cmd": "sudo /usr/local/bin/pepoalexado iot001.local remote hand 3 1",
    "off_cmd": "sudo /usr/local/bin/pepoalexado iot001.local remote hand 3 0"
    },
    {
    "accessory": "CMD",
    "name": "防犯カメラ",
    "on_cmd": "sudo /usr/local/bin/pepoalexado iot03f.local remote hand dio3low",
    "off_cmd": "sudo /usr/local/bin/pepoalexado iot02f.local remote hand dio3high"
    },
    }}}
  • Please check the source code below
    https://github.com/kujiranodanna/IOT-House/blob/master/raspberrypi/usr/local/bin/pepoalexado

防犯カメラ応用

  1. ドップラーセンサーRCWL-0516とモジュールカメラで防犯カメラの応用技術を紹介
  • Module CameraかWeb Cameraを使用して日中に写真と夜間はビデオを切り替えます。

  • 夜間の動画は充分な照明が必要ですが、写真画像は比較的暗くても認識する事が出来ます。

  • Moduleカメラ接続とドップラーセンサー接続の別々のラズパイ2台による分散処理を実現させています。

  • Input1と3へ適当な名前、ここでは「防犯センサー」と「リモート制御」
    DIO_settings

  • DIO contorl1で防犯センサーのAction:High->LowへModuleカメラの写真メールリモート制御のAction:High->LowへModuleカメラの動画メールをそれぞれ設定
    DIO contorl1

  • Moduleカメラが接続されているラズパイの設定は終わり

  • 次にドップラーセンサーRCWL-0516が接続されているラズパイの設定

  • Output4へ時間制御用として「カメラ有効」命名、Output4はIutput4とダイレクト接続Output4の出力が反転されてIutput4へ反映される
    DIO_settings

  • DIO contorl1で防犯センサーのAction:High->Lowへnoneのままでreset登録のみ、カウンタを生成するのみ、Actionは何も設定しない
    DIO contorl1

  • Auto processで「カメラ有効」を18時、06時でHigh,Low切り替え
    DIO contorl1

  • DIO contorl1で防犯センサーのAction:High->Lowで自動生成された/usr/bin/dio0lowスクリプトの最後へエディタで追加

  • 意味はjsonデータのInput4がHigh->Moduleカメラが接続されているラズパイのdio0lowを実行、Lowならdio2lowを実行
    [iot00f:root#] vi /usr/bin/dio0low

    1
    2
    3
    4
    5
    6
    ENABLE=`cat /www/remote-hand/.di_read_data.json |jq -r .di3`
    if [ $ENABLE = “high” ];then
    pepoalexado iot02f remote hand dio0low
    else
    pepoalexado iot02f remote hand dio2low
    fi
  • 追記、下記でOutput4の出力情報を取れるのでこれで判定しても良いかも

    1
    2
    3
    [iot00f:root#] cat /www/remote-hand/.di_read_data.json |jq -r .do3
    low <-結果
    high or low

防犯カメラ

  1. ドップラーセンサーRCWL-0516とモジュールカメラで防犯カメラとして使用する。
  • RCWL-0516の出力0-3.3vをラズパイのgpio入力へ直接、接続出来ないのでフォトカップラで安全にレベル変換後接続します。
    rcwl-0516_bord
  1. ドップラーセンサー作動時に防犯カメラで写真や動画メールを送信する。
    secure_image