ゆっくり技術ノート!

いつかきっとできるだろうよ

壁のスイッチをWi-Fi経由で操作する

Image from Gyazo

これ何

  • 2つの壁のスイッチを Wi-Fi経由で操作できます
  • 部屋の 温度、湿度と照度 を送信します
  • 別の部屋の 温度と湿度 を送信します
  • ドアの状態を送信します

ESP8266 を使って Wi-Fi経由 で壁のスイッチを操作できるものを作った。

ESP8266内で Webサーバが起動していて、ブラウザから壁のスイッチを操作できる。
壁のスイッチはサーボモータを使ってオンオフしています。
また、いちいちブラウザを起動するは面倒なので、プッシュボタンも付けています。

温度などのデータは毎分送信され、ローカルにあるサーバの InfluxDB に格納しています。

ESP8266とは

Image from Gyazo ESP8266 は Espressif Systems が製造している小型で安価な Wi-Fiモジュールです。
3.3V で動作し、大きさは100円玉くらいでとても小型ながら、2.4GHz帯の Wi-Fi(b/g/n) に接続することができます。
また、Arduino と互換性があり Wi-Fi が付いた Arduino として使うことができます。
技適に通っている ESP8266 は ESP-WROOM-02(とその派生型) パッケージだけなので、これを使います。
この手の工作ではおなじみですね。

ESP8266 - Wikipedia

部品

合計で大体 2500円。

リストに書いたもの以外にも、プログラムを書き込むための USBシリアル変換機、リード線、ピンヘッダ、ピンソケットなどが必要です。やってないですが、USBシリアル変換機は Arduino UNO などで代用できるようです。
元々持っていた物が多くて、今回買ったのは温湿度センサと三端子レギュレータだけ。
サーボは数年前に、ヴイストン ロボットセンタ 秋葉原店 で 1人 2個、1個 100円で安売りしてたやつ。

回路

初めて KiCad に挑戦してみました。(数時間でまぁまぁ使えるようになります)
Image from Gyazo

温湿度センサ

今回使用した 2つの温湿度センサ(AM2320)は I2C (Inter-Integrated Circuit) に対応していましたが、同じデバイスを同じ I2C bus で使うと device address が重複してしまいます。
そのため、device address を変更する必要があるのですが、AM2320 の device address を変更する方法がわからなかったので、今回は I2C を諦めて 1-Wire で接続しています。
1-Wire だと読み取りに失敗することがあるので何回か試行するようにしています。

リードスイッチ

リードスイッチは近くに磁石があるとオンになるスイッチです。
今回使用したものはガラス管がむき出しで壊れそうだったので、ストローに入れてホットボンドで蓋をしています。
Image from Gyazo ユニバーサル基板でテスト中の回路 と ブレッドボードでテストした回路

電源

回路図には書いてませんが、電源は iPhone の 5W充電器 から 5V を供給し三端子レギュレータで 3.3V に降圧しています Image from Gyazo とても素朴な基板ができた

接続

Device PIN name PIN name Device
3V 3V GND GND
- EN IO16 LED 1
Button 2 IO14 TOUT Illuminance
Button 1 IO12 RST Writer RST
Servo 1 IO13 IO5 ReadSW 1
Servo 2 IO15 IO1(TXD) Writer RX
Sensor 2 IO2 IO3(RXD) Writer TX
Sensor 1 IO0 IO4 ReadSW 2

回路のパターンは Numbers.app で書いた Image from Gyazo 作業風景、マグカップ

ちなみに、回路とサーボを覆う筐体は Amazon で買ったスノコ を解体したものが余っていたので、それで箱を作りました。ヒノキの良い匂いがします。

参考URL

回路の作成にあたって大変お世話になりました。ありがとうございます。

コード

github.com
コードは 600行くらい。
web server や web client は ESP8266 の標準ライブラリがあるのでそれを使っています。
温湿度センサは以下のライブラリを使わせてもらいました。
github.com

Grafana

ESP8266 から InfluxDB に送られたデータを Grafana で可視化してみた。

Image from Gyazo かっこいい。
3つの ESP8266 と 3つの Raspberry Pi が、毎分データを送信してくる。
ちなみに Raspberry Pi には赤外線LED を繋げていて、部屋の照明やテレビなどのリモコン信号が出るようにしています。
センサーは BME280, HDC1000, AM2320 を使っています。

HomeKit

Apple HomeKit は ホームオートメーション機器と通信するためのフレームワークで、家電を macOS, iOS, watchOS のホームアプリとSiri、または iOSのコントロールセンタ から操作できます。影が薄いですが、ホームアプリは iOS8 から標準で入っていますね。
Image from Gyazo 今回は、HomeKit 上でブリッジとして振る舞うOSSである Homebridge を使って HomeKit に対応しています。
ファンは動作中だと羽が回転するアニメーションがあったりして見てて楽しい。
壁のスイッチ操作は Wi-Fi経由で DB に送信されているので、Homebridge は DB を参照し家電のオンオフ状態を認識しています。
Homebridge のプラグインhomebridge-cmd4 を使っています。
温度と湿度が常にグレーでちょっと見づらいのが難点ですが、これは HomeKit の仕様っぽい。

オートメーション

今回はお風呂の照明と換気扇のスイッチを操作しているので、DB を参照して以下の操作を自動で行うようにしました。
お風呂が使用中か非使用かはドアの状態を見ています。

  • ライトを点ける: もし使用中かつ暗いなら
  • ライトを止める: もし非使用かつ点灯中なら
  • ファンを点ける: もし使用中かつ暑いなら
  • ファンを止める: もし使用中かつ暑くないなら
  • ファンを点ける: もし非使用かつ湿ってるなら
  • ファンを止める: もし非使用かつ乾いてるなら

以下を サーバ上で定期実行している
Automatically operate the bath light and fan

ハマりどころ

雑感

  • 温湿度センサは設置する高さで結構数値が変わる
  • 人がいない時、温度が下がったりしているのが見えて面白かった
  • HomeKit対応製品でここまで機能てんこ盛りの製品はないのでとても満足した
    • HomeKit対応の温度、湿度、気圧センサーが 8000円もするので、値段的にも優位
    • 自分で作ると安くできて、好きに細かい機能を作り込めるし、何より楽しい
  • Apple watch で心拍とか色々取ってきてリアルタイムに Grafana で表示してみたい
    • 室温が体温にどれだけ影響するのかみたい
  • ESP8266 の後継機 ESP32 では Bluetooth に対応しているので、分割キーボードを完全無線化してみたい (AirPods みたいに)

間違いなどがありましたら、コメントいただけるとありがたいです。
最後までお付き合いいただきありがとうございました。

見ているアニメのアニソンの発売日をスマホに通知する

github.com 見ているアニメのアニソンの発売日をスマホに通知するAnison-noticeというのを作った

Animetick.netという視聴中のアニメを登録するサイトがあります
ここで登録したアニメのアニソンの発売日に通知するものです
http://animetick.net/

通知はPushbulletを用います
https://www.pushbullet.com/

こんな感じに携帯にPush通知がくるのでリリースを逃すことがない
f:id:Coro:20170726105213p:plain:w400

これをcrontabで毎日0時に実行することにする。

どなたか使われる際はconfig.rbにpushbullet token と animetickのユーザidを入力して使ってください
github.com

Raspberry Pi で温度と湿度を知る

Raspberry Pi で温度と湿度を知る

はじめに

この記事はおうちハック Advent Calendar 2016の21日目の記事です。
前日:ajimitei labo.: HUIS でいらすとやリモコンを作ってみた
翌日:MQTTベースのおうち環境にMESHを追加する - Qiita

遅刻記事になってしまい本当にすいません。
RasPiの不調と、風邪をひいてしまったのと、能力不足で遅くなってしまいました。

環境と機器

  1. Raspberry Pi B 3 (Rasbian 2016-11-25)
  2. 温湿度計 HDC1000

手順

実際の試行錯誤はトラブルの項にまとめています

Step.1 Rasbianの初期設定を終わらせてからraspi-configでi2cを有効にします

sudo raspi-config
7 Advanced Options > I2C

Step.2 確認します

lsmod

Step.3 i2c-toolsをインストールする

sudo apt-get install i2c-tools

Step.4 HDC1000の接続を確認

sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Step.5 Wiring Piはデフォルトで入っているので再度入れる必要はないです

Step.6 HDC1000から温湿度を読む

gcc -Wall -o hdc1000_sample -lwiringPi hdc1000_sample.c
sudo ./hdc1000_sample

Raspberry Pi 2 Model B でI2C 温度+湿度センサーモジュール(HDC1000)を使う - Qiita
とうい記事の中のサンプルコードをほとんどそのまま使わせてもらいました
ありがとうございます

Step.7 継続的なログを見るためにcsvを作ります

これをcronで実行します

require "csv"
results = `sudo ./hdc1000_sample`
stamp  = Time.now.to_s + "," + results
File.open("/home/pi/outi_hack/tem_hyg.csv","a"){|f|f.puts(stamp)}

Step.8 ブライザで見るためにSinatraで表示させます

sudo apt-get install -y sinatra
sudo apt-get install -y sinatra-contrib

require "sinatra"
require "csv"
require 'sinatra/reloader' if development?
set :bind, '0.0.0.0'

get '/' do

    logs = CSV.read("tem_hyg.csv").reverse
    time = logs[0][0]
    tem = logs[0][1]
    hyg = logs[0][2]

    p "TEM: " + tem + " HYG: " + hyg + "   (#{time})"

end

できました!

f:id:Coro:20170129180030p:plain

トラブルと嵌ったところ

恥を忍んで公開します、笑ってやってください

配線を間違えてHDC1000を壊す

  • 暗がりでRasPiにジャンパー線を差し込んでいたら青と黒を見間違えて壊しました
  • 焦げ臭くなって基板上のセンサチップの半田が溶けて位置がずれた
  • RasPiが壊れなかったのは不幸中の幸い

i2c が有効にならない

  • 最初はRaspberry Pi B 1 Rev.2でRasbian(2016-11-25)を使っていたのですがraspi-configでもi2c や spi の項目ができこず/etc/modulesなどで手動で試みるも有効になりませんでした
  • 結局 Raspberry Pi B 3 を用意して再度やったら何の問題もなくraspi-config`から有効にできました
  • 今記事を書いてる時点で確認したら Raspberry Pi B 3 でもI2Cの項目が消えました f:id:Coro:20161228032233p:plain

RasPiが家の外に繋がらない

  • 家の中の他の PC には ping が通るのですがapt-getできなかったりwgetできなかったりしました
  • 原因がわからなかったので OS を再書き込みしました

sshができない

Sinatraが外から見えない

おわりに

  • i2cはArduinoで使ったことがあったので「温湿度表示とか簡単だろう」とたかをくくっていましたが、大変なことになってしまいました
  • 本当はESP-WROOM-02で温湿度やCO2を計測してマトリクスLEDなんかをつけることを妄想していたのでいつになるかわかりませんが、やりたい
  • 温度と湿度があっているのか調べるために家にあったアナログの温湿度を3つHDC1000の隣に置いていたのですが温度は3つのアナログ温度計もHDC1000も大体一致するのですが湿度に関してはすべて約15%の誤差があり湿度を正確に知るのは難しいことがわかりました f:id:Coro:20161228033953j:plain
  • ここまでお付き合いいただきありがとうございました

参考URL

  1. Raspberry Pi 2 Model B でI2C 温度+湿度センサーモジュール(HDC1000)を使う - Qiita
  2. 共有ライブラリへパスを通す | hajichan.net technical version
  3. Raspberry Pi 3でRaspbian Jessieをセットアップする方法 - karaage. [からあげ]
  4. RubyでWiringPiを使う | ぬわーーーーーーー!!!
  5. 「全裸で学ぶMVC事始め」をruby + Sinatraでやってみた - 飲む、寝る。
  6. Raspberry Pi の I2C を有効化する方法 (2015年版) – ymyzk’s blog

ありがとうございます

玄関をSuicaで開ける

玄関をSuicaで開ける

この記事は おうちハック Advent Calendar 2015 の23日目の記事です。

動機

私は普段、家の鍵を他の鍵と一緒にでまとめてをオシリポケットに入れているのですが、座ると鍵が当たって痛いので PASMOSuica で開けられるようにしたいと思います

私は iPhone なので FeliCa を搭載していないため iPhoneiPhoneケースの間に PASMO磁気干渉防止シートを挟んで使っています

では、作っていきましょう!

この記事を見れば作れるようにしたいので少しくどくなるかもしれませんが、ご了承ください
セキュリティはあまり考えていません。試す際は自分で対策してください
(でも多分、空き巣は NFC をハックするより窓を割って入ってくる方が簡単)

構成

今回、時間をかけず簡単に作るために機能を最低限の「NFC をかざしたら鍵を開ける(そして自動で閉める)」という機能に絞ることにします
NFC リーダ はこの手の工作では定番の RC-S380 を使います
サーボモータは鍵のサムターン(つまみ)を回すことを考えてトルクの大きなものを秋月電子で購入しました

https://gyazo.com/ef7c2750e751b7af3209cf18c9c2fe93:plain:w300

NFC からidmを取得する

Raspberry Pi の公式から Raspbian jessie を落としてSDカードにセットし IPアドレスの固定等の設定を行ったら(今回はRaspberry Pi Bを使います)
いよいよ PASMO から idm を取得します
idm とは PASMO/Suica 等の製造番号のことです

nfcpy

NFC を使うためのツールであるnfcpyを使います
これは公式サイトGetting started の通りやるとインストールできました
bzrというバージョン管理システムをinstallして、nfcpyをinstallしたい場所に移動、bzrでnfcpyをinstallします

sudo apt-get install bzr
cd <hoge>
bzr branch lp:nfcpy trunk

続いて Python で USB を使うたに python-usb をinstallします

sudo apt-get install python-usb

できたらサンプルコードを動かしてみましょう

sudo python examples/tagtool.py

PASMO等をタッチして、こんな感じにIDが表示されたら成功です https://gyazo.com/450bf973357d0df5bcfa0f59bc1cff4c

今回はこのサンプルコードをそのまま使わせてもらいます

サーボを動かす

ServoBlaster

サーボを動かすにはServoBlasterというCで書かれたツールを使います
git で公開されているのでgit clone してきて、Cのコードをmakeでコンパイルしinstallします

git clone git://github.com/richardghirst/PiBits.git
cd PiBits/ServoBlaster/user
make
sudo make install

サーボを動かしてみる

ServoBlasterは/dev/servoblasterに文字列[Servo_number]=[0-100]%を書き込むことでサーボを動かしてくれます

echo 4=100% > /dev/servoblaster

ServoBlasterで指定するServo_numberはgpioのピン番号とは違うので注意が必要です
https://gyazo.com/0c86c45477643e795ca7b5481fd835b8
https://gyazo.com/00d9e01f2b023184ecb46b7694edd4ae
ここではパーセンテージで指定するのでサーボを見ながら鍵を開けるのに良い角度を探ります
私のサーボの場合は91と40でした
このServoBlasterのいいところは使っていない時サーボに電圧をかけないところです
このため普通の鍵でも手で開閉錠できます

サーボが動いたら NFC をかざした時サーボを回してみましょう

サーボについて追加情報があります *1

登録したidmの時サーボを回す

Ruby から nfcpy と ServoBlaster を使うコードを書きます
ただコマンドを実行するだけなので簡単です
(ServoBlasterは Ruby の File.write ではダメな模様)

#ここは先ほど表示させた自分のidmに書き変える
USERS = {"Bob_Marley" => "xxxxxxxxxxxxxxxx",
        "Alice_Cartelet" => "xxxxxxxxxxxxxxxx"}
#ここも自分のサーボにあったものに書き換える
#s03t-2bbmg servo
UNLOCK_ANGLE = "91"
LOCK_ANGLE = "40"

AUTO_LOCK = 40

def nfc()
    #ここも自分の環境にあったものを指定
    `sudo python ~/Documents/nfc/trunk/examples/tagtool.py`
end

def idm(text)
    m = text.match(/ID=(.*?)\s/)
    idm =m[1]
    print("IDm = #{idm}\n")
    return idm
end

def unlock()
    print("Unlocking\n")
    `echo 4=#{UNLOCK_ANGLE}% > /dev/servoblaster`
end

def lock()
    print("Locking\n")
    `echo 4=#{LOCK_ANGLE}% > /dev/servoblaster`
end

loop do
    idm = idm(nfc)
    unlock_user = USERS.key(idm)

    unless unlock_user == nil
        print("Welcome back #{unlock_user}!\n")
        unlock

        print("Wait #{AUTO_LOCK}sec...")
        sleep(AUTO_LOCK)
        print("\n")

        lock
    else
        print("Illegal user\n")
    end

    print("Please wait reader restart...\n")
end

実行するとこんな感じに動くと思います https://gyazo.com/08b4d3d417724a3c00b491bfa92ea553 動画には写っていませんが40秒後に閉まります

土曜の進捗

A video posted by coro365 (@coro365) on

ハードウェア

鍵のサムターン(つまみ)にサーボを取り付けるための木材をノコギリとドリルで作成します
30mm*30mmの角材を30mmで切ってサイコロ状のものを作成、サムターンに合う穴を開けます
Image from Gyazo

続いてサーボを固定するためにダンボールでマウントを作成します
ダンボールを10枚積層、木工ボンドで合わせて完成です
ダンボールだととても簡単でよかったです(1時間ほどアニメ見ながら切りました)
Image from Gyazo

レーザ加工機が使う余裕があればアクリルで作ってもいいかもしれません
ただダンボールでも木工ボンドで補強するとかなり頑丈になります
ちなみに今回は溜まりに溜まったamazonの箱を使いました
https://gyazo.com/901a037740a05a6df9c20aec7ca3547a

取り付けて完成です

Image from Gyazo 動かすとこんな感じ(このNFCリーダは表からも裏からも使えました)

今後

  • 開閉錠ボタンと状況表示用のLEDを付けたい
  • 鍵が開いているか閉まっているかの状態を確認したい
  • リードスイッチ(磁気を感知するスイッチ)でドアの開閉を検知してオートロックの挙動に生かしたい
  • Sinatraとかでブラウザ上で開閉とログの確認をしたい
  • Supervosorを使ってRaspberry Piのデーモンにする

雑感

  • ServoBlasterとnfcpyが優秀ですぐにできてしまった
  • 一番時間がかかったのはマウントを作成するところ(ダンボールで作る前にアクリルをノコギリとドリルで加工して半日無駄にしている)
  • PASOM決済だけで生活できればiPhoneだけ持ち歩く生活にできるかも
  • 個人が少しのお金で、いろんなことが可能な環境は素晴らしいなと思いました(この方向で人間、進化してもらいたい)
  • 今後も隙を見ておうちを便利にしていきたいです

初めて Advent Calendar に参加しましたがイベントドリブンな感じで作ることができたので参加してよかったです(参加しなかったら作らなかったかも)
そんな おうちハック Advent Calendar 2015 の明日の記事は @YarmUIさん の スマートメータを自作した話 です
良いお年を!

購入したもの

Raspberry piは部屋に転がっていたものを使ったので出費は 4000円ほど

  1. Amazon.co.jp: Raspberry Pi Type B 512MB: パソコン・周辺機器
  2. Amazon.co.jp: SONY 非接触ICカードリーダー/ライター PaSoRi(パソリ) USB対応 RC-S380: パソコン・周辺機器
  3. GWSサーボ S03T/2BBMG/F(フタバ): サーボ 秋月電子通商 電子部品 ネット通販

ドアセンサ、開閉スイッチなどをつける時は必要です

  1. タクトスイッチ 12mm TVGP01-G73BB(黒): パーツ一般 秋月電子通商 電子部品 ネット通販
  2. ピンヘッダ 1×40 (40P): パーツ一般 秋月電子通商 電子部品 ネット通販
  3. ケース入りリードスイッチ(磁石付セット)MC-14AG: センサ一般 秋月電子通商 電子部品 ネット通販

参考ページ

  1. Raspberry PiにRaspbianをインストールする for Mac OSX
  2. Raspberry Pi 2 (Raspbian: jessie) でIPアドレスを固定する
  3. PWMでRaspberry PiのLEDの明るさ調整する
  4. FeliCa(フェリカ)IDmとは?|ステルス・ネットワークス
  5. Python module for near field communication — nfcpy trunk documentation
  6. Raspberry-PiにおけるGPIO関係ツールのインストール方法 | Раздан-3
  7. GPIO: Raspberry Pi Models A and B - Raspberry Pi Documentation
  8. nfcpyでお手軽NFC開発[1/2]

ありがとうございます

追記1 2017/08/09

サーボモータを回転させた際RasPiが再起動してしまう時は、別に電源を用意してください。
私の場合は、以下のように別電源にしました。(この方法が最適解かどうかはわかりません)

  1. USBケーブルを用意し皮膜をはがした後、プラスとマイナスの線をより分けます。
  2. プラスの線はサーボのプラスにつなぎ、マイナスの線 はサーボ と RasPi のGroundに繋ぎます。
  3. USBケーブル自体はApple USB 充電器 に繋ぎます

追記2 2017/08/09

多くの方にこの記事を読んで頂き大変嬉しく思っております。
また、この記事を見て同じものを作ろうとしている方の何人に連絡をいただきとても嬉しいです、記事にした甲斐がありました。
記事公開から1年以上経ち、その間にも iPhoneSuica 対応したり、電子マネー対応の店が増えてきたり、スマフォでATMからお金を引き出せたり、iPhone 1つで生活できる世の中に近づいている気がしてワクワクしています。

さて、この記事で作った物にLED,ドア開閉センサ,ボタンを追加した物がGithubに上がっているので、こちらもどうぞ。
github.com

追記おわり

*1:追記1 2017/08/09 をご覧ください