この記事はRaspberry Piでスマートルームをつくる(設計編)の続きです。
- 設計・部品調達編
- 動作テスト編←イマココ
- エアコンのリモコン信号解析編
- 基板実装編
- API/chatbot実装編
購入した部品のテストを行い正常に動作することを確かめていきます。
Raspberry Piのセットアップ
早速Raspberry Piをいじっていきたいところですが、まずはピンソケット40本はんだ付けノックです。
無心ではんだ付けし続けます。
はんだ付けを終えたら初期設定に入ります。
今回利用するRaspberry Pi ZeroではHDMIケーブルが直接接続できないことから、sshを有効にしたうえでWi-Fi設定をあらかじめ書き込むこととします。
SSHの有効化
ここではSDカードのboot
パーティションをマウントしてファイルを書き込みます。
# mkdir /mnt/boot
# mount /dev/mmcblk0p1 /mnt/boot
# touch /mnt/boot/ssh
# umount /mnt/boot
Wi-Fi設定
SDカードのルートファイルシステムをマウントしてファイルを編集します。
ここで認証キーはハッシュ化したものを記述する必要があるのであらかじめ取得します。wpa_passphrase "SSID"
を実行した後キーを入力しEnterキーを叩いて出てくるpsk=
の行がハッシュ化されたキーです。この情報をSDカードに書き込んでいきます。
# mkdir /mnt/card
# mount /dev/mmcblk0p2 /mnt/
# nano /mnt/card/etc/wpa_supplicant/wpa_supplicant.conf
以上のように/etc/wpa_supplicant/wpa_supplicant.conf
を開いたら以下の内容を追記して保存します。
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="SSID"
psk=ハッシュ化されたキー
}
Raspberry Piの起動
以上の手順を踏んでからRaspberry Piに電源を接続してPC側からsshで接続できることを確認して初期設定は完了です。接続先のIPアドレスについてはルータのクライアント一覧から確認しました。
接続したらついでにパッケージのアップデートをしておきます。
# apt update && apt -y upgrade
続いてGPIOピンにワイヤを接続していくのでsudo halt -p
で電源を落としておきます。
素子の動作テスト
続いて赤外線LEDと赤外線受信モジュールの動作テストを行います。
受信モジュール
まずはデータシートを見ながらブレッドボードで受信モジュールの回路を組みます。Vccは3Vのピンから供給します。
Raspberry PiのGPIOは以下の図に示すように配置されています。
基本的にGPIOnnのピンが入出力用として自由に使えますが、線が出ているピンについては別の用途で使用することがあるので何も書かれていないピンを利用するのがいいでしょう。
出典: StackExchange
配線をしてRaspberry Piの電源を入れたら信号を受信する準備に入ります。
GPIO制御でよく使われるライブラリとしてlircが挙げられますが、管理者権限が必要だったりと手順が煩雑になるので、管理者権限いらずでGPIOが操作できるpigpioをインストールします。
$ sudo apt install pigpio python3-gpio
$ sudo systemctl enable pigpiod.service
$ sudo systemctl start pigpiod
そしてpigpioの作者による赤外線リモコン信号解析スクリプトが公開されているので適当な場所へダウンロードします。
$ curl http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip | zcat > irrp.py
保存したら実際にリモコン信号の受信を試みます。
$ python3 irrp.py -r -g13 -f codes aircon:on --post 130
Recording
Press key for 'aircon:on'
Okay
Press key for 'aircon:on' to confirm
Okay
-g
オプションで読みとりに利用するGPIOピン番号を指定し、-f
オプションで出力先jsonファイルとキー文字列を指定します。ピン番号は今回の配線では13です。--post
オプションは信号終端の後の空白時間の目安を指定するもので、リモコンによってはデフォルトの値だと認識に失敗する場合があるようです。
無事にOkayと言われたら学習成功です。
続く赤外線LEDのテストのために再び電源を落とします。
赤外線LED
続いて赤外線LEDとドライバ回路をブレッドボード上で組み立て先ほどと同様にRaspberry Piと接続します。回路は設計編通りの構成で、特にトランジスタの向きはデータシートを確認して間違いのないように配線します。
再びirrp.py
を使って先ほど記録した信号を実際に送信します。
$ irrp.py -p -g19 -f codes aircon:on
pigpio: chain is too long
」というエラーで信号が送信できない場合があります。この場合は信号の圧縮を
irrp.py
内で行う必要があります。irrp.py
内のpi.wave_chain(wave)
の手前でリンク先のcompress_wave
メソッドをcompress_wave(wave)
と呼び出すことで圧縮処理を適用することができます。リンク先ではクラス内に記述している関係で第一引数がクラスになっていますが、トップレベルで定義する場合引数は
code
のみでOKになります。
動画のようにエアコンのスイッチが入れば無事成功です。
— ぱらつり (@paralleltree) 2018年12月30日
と言いたいところですが、テレビなどの家電に対してエアコンのリモコン信号は全てのパラメータが載った状態で送られるという点で違いがあります。
例えばテレビの「音量を上げる」という動作は画面に即反映されるので音量の情報だけを送れば問題ありませんが、エアコンの場合は信号が届かなかったりするとリモコンとエアコン本体の設定がどんどん剥離してしまいます。室内の環境が設定どおりになるまでに時間もかかるため、全ての制御パラメータを操作ごとに逐一送信する必要があることとなります。
したがって、エアコンを細かく制御したい場合はリモコン信号の解析が必要になります。とはいえ、「冷房、24度」といった状態のリモコン信号を学習させ季節ごとに使い分けるならば先ほどの方法でも十分実用性があると思います。
信号解析にチャレンジする場合はこちらの記事を参考にしてみてください!
温度モジュール
続いてBME280搭載の温度モジュールの動作テストです。
このモジュールを動作させるためには初っ端からはんだ付けが必要になります。
Raspberry Piとの通信方式はI2Cを選択するので、J3の部分にはんだジャンパの実装を行います。
出典: センサマニュアル(秋月電子)
また、今回はユニバーサル基板上への実装を考えている関係で、パッケージ付属のピンヘッダではなく別途用意したまっすぐなピンヘッダを取り付けます。
はんだ付けが完了したらブレッドボードに突き刺して以下のようにRaspberry Piへ接続します。
ピン | 接続先 |
---|---|
VDD | 3.3V |
GND | GND |
CSB | 配線しない |
SDI | GPIO2 |
SDO | GND |
SCK | GPIO3 |
Raspberry Pi上でsudo raspi-config
を実行しInterfacing Options
、I2C
の順にメニューを選択してI2Cを有効化、再起動します。
続いてI2C用のパッケージを以下のようにしてインストールします。
$ sudo apt install i2c-tools python-smbus
インストールを終えたらセンサから値を取得してみます。実際は測定値の補正など複雑な処理が必要ですが、スイッチサイエンスさんからよしなにやってくれるスクリプトが公開されているのでこれをお借りします。
$ wget https://raw.githubusercontent.com/SWITCHSCIENCE/samplecodes/master/BME280/Python27/bme280_sample.py
$ python bme280_sample.py
temp : 25.70 ℃
pressure : 1016.45 hPa
hum : 32.69 %
スクリプトを実行して値を取得できれば成功です。
まとめ
購入した部品のテストを行い正常に動作することを確認しました。sshでRaspberry Piにログインすれば自由にデータの取得や家電の操作ができますが、拡張性を高めつつより手軽に触れるようにするためにAPIを作っていきます。その前に続いての記事では部品を基板に乗せて1つのモジュールにしていきます。