011.(解説)ラズベリーパイ1
初回:2018/10/17
0.今回のまとめ
偶数がコラム、奇数が解説と決めましたが、タイトルを見ただけでわかるようにします。
Python に手を出すようになったきっかけがラズベリーパイ(以下、ラズパイ)です。
元々はセンサーやらカメラの制御やらを簡単にできるのが Python だったので使いだしたのですが、なにぶん素人でバージョン2系と3系の区別も知らなかったので本当に苦労しました。
「苦労したって言いながら、結構喜んでたじゃない?」(※1)
そういう訳でラズパイ絡みの話をします。
1.温度センサー
温度センサーで有名なのは、DHT11(※2)、DHT22(※3)の(1-wireライク)の独自通信方式(※4)の温度・湿度センサーとI2Cインターフェース(※5)のSHT31(※6)です。DHT11 が200円程度、DHT22 が400円程度、SHT31 が1000円程度です。データの通信方法が違うのと精度が違うのですが、実際に動かすとデータの取得に関するエラーの頻度など思ったより差があります。
DHT11、DHT22 をPython で動かすには、Adafruit_Python_DHT(※7)を使用するのが良いと思います。この場合両方を一つのモジュールで使用できます。
2.インストール
ラズパイのOSインストールは別の人の記事にお任せするとして、その後の Adafruit_Python_DHT モジュールの設定方法を書いておきます。
$ sudo apt-get install build-essential python-dev
$ sudo git clone https://github.com/adafruit/Adafruit_Python_DHT.git
$ cd Adafruit_Python_DHT
$ sudo python3 setup.py install
3.プログラム
DHT11.py というファイル名で以下のプログラムを作成します。紙面の都合(※8)で最小限のソースだけ記述しています。
import time
from datetime import datetime
import Adafruit_DHT as DHT
TYPE = DHT.DHT11 # センサーの種類(DHT11)
PORT = 23 # 23 GPIOピンを使用
if __name__ == "__main__":
while( True ):
now = datetime.today() # 現在時刻
ymd = now.strftime( "%Y-%m-%d %H:%M:%S" ) # 年/月/日 時:分:秒
# humi,temp = DHT.read_retry( TYPE, PORT )
humi,temp = DHT.read( TYPE, PORT )
print( "{:20s} {:s}={:5.2f} , {:s}={:5.2f}".format( ymd,"温度",humi or 0,"湿度",temp or 0 ) )
time.sleep(5)
ラズパイ本体は別として、200円程度で温湿度計をたったこれだけのソースで実現できるというのがすごいことだと思います。
「ほめてくれてるの?」(※9)
4.距離センサー
距離センサーで有名なのは、HC-SR04(※10)超音波距離センサモジュールと、VL53L0X(※11)レーザー測距センサーです。VL53L0Xは、I2Cインターフェースで、HC-SR04 はGPIOで制御されたトリガ出力と信号入力を利用します。
超音波距離センサは、200円程度で購入可能です。このセンサーの場合、距離の計算に音速を使うため少しだけプログラムが複雑になるのでここには掲載しませんが、少し探せばあちこちにサンプルプログラムが見つかると思います。
5.人感センサー
人感センサーといえば、HC-SR501(※12)が有名です。焦電型赤外線センサは人体が発する赤外線の量を電圧レベルに変換し閾値判定論理により人の在不在をON/OFFで出力します。RCWL-0516(※13)のマイクロ波レーダーセンサは、ドップラーレーダー技術を使用して移動物体と人体を検出します。電波なので木製のドアなどは透過して人を検出することも可能です。
どちらも1個200円程度で入手可能なので色々と使い道がありそうです。
人感センサー HC-SR501 はラズパイの GPIO で信号の ON/OFF を判定します。GPIOを使用するには、RPi.GPIOパッケージを使用します。
$ sudo apt-get install python-rpi.gpio
このパッケージをインストールします。
ソースを以下に示します。
import time
from datetime import datetime
import RPi.GPIO as GPIO
# 定数定義
P_IN = 16 # センサーを繋ぐ BCM 番号(static変数)
if __name__ == "__main__":
GPIO.setmode(GPIO.BCM)
GPIO.setup( P_IN , GPIO.IN , pull_up_down=GPIO.PUD_DOWN )
try:
while( True ):
now = datetime.today() # 現在時刻
ymd = now.strftime( "%Y-%m-%d %H:%M:%S" ) # 年/月/日 時:分:秒
isDetect = GPIO.input( P_IN ) == GPIO.HIGH # GPIO.HIGH , True , 1 も同義
if( isDetect ):
msg = "人を感知"
else:
msg = "誰もいません"
print( "{:20s} {:s}".format( ymd , msg ) )
time.sleep(5)
except KeyboardInterrupt :# Ctl+Cが押されたらループを終了
print( "\nCtl+C Stop" )
except Exception as ex:
print( ex ) # 例外処理の内容をコンソールに表示
finally :
GPIO.cleanup( P_IN )
print( "終了" )
「なんだか、長くって、よくわかんない」(※14)
まだまだ色々なセンサーやモジュールが使えます。また機会があれば説明したいと思います。
「ほな、さいなら」(※15)
======= <<注釈>>=======
※1 「苦労したって言いながら、結構喜んでたじゃない?」
確かに新しい発見もあったし、今まで知っている言語の中では特殊な方だと思いました。
※2 DHT11 温度と湿度センサー デジタル出力
湿度測定範囲:20%~90%RH(0~50℃温度補償)
温度測定範囲:0~+50℃
湿度測定精度:±5.0%RH,温度測定精度:±2.0℃
https://www.amazon.co.jp/gp/offer-listing/B017152HD4
※3 DHT22 デジタル温度センサーモジュール
温度測定範囲: - 40℃?80℃
測定精度:0.5℃
湿度測定範囲:0から100パーセントRH
測定精度:2%RH
https://www.amazon.co.jp/gp/product/B01LJU59ZK
※4 (1-wireライク)の独自通信方式
1-Wire は接地線と一本の信号線(兼電力供給線)だけで低速なデータ転送を行うバス規格です。
https://ja.wikipedia.org/wiki/1-Wire
※5 I2C(アイ・スクエアド・シー、アイ・アイ・シー)
2本の信号線、シリアルデータ(SDA)とシリアルクロック(SCL)と電源、GNDの4線で構成されるシリアルバスで、7bit のアドレス空間のうち 16 の予約アドレスを除いた最大 112 個のノードが同じバス上で通信できます。
https://ja.wikipedia.org/wiki/I2C
※6 SHT31
+/- 2%の優れた相対湿度と+/- 0.3摂氏の精度
https://www.amazon.co.jp/gp/product/B07C4MBP4M
※7 Adafruit_Python_DHT
DHT11、DHT22 をPython で動かす方法は色々あるみたいですが、両方をひとつのモジュールで動かせる Adafruit_Python_DHT は良い選択肢だと思っています。
http://blog.livedoor.jp/victory7com/archives/48343379.html
※8 紙面の都合
ページ数というよりブログで本格的なプログラムの記述するのは気が引けます。なので最も直線的なソースとして記述しています。実際には共通クラス化したり変数を用意したり例外処理を記述するため、実用的なプログラムにする場合はこの3~5倍の分量になります。
※9 「ほめてくれてるの?」
やっと出番が来た感じです。python文法や仕様は好みの問題がありますが、こういう使いやすさは本当にすごいと思います。
※10 HC-SR04 超音波距離センサモジュール
検出距離:2cm~450cm
https://www.amazon.co.jp/gp/offer-listing/B00YQZEVIW
※11 VL53L0X レーザー測距センサー
計測範囲 約3cm~約200cm
https://www.amazon.co.jp/gp/offer-listing/B074HT8RQ1
※12 HC-SR501 焦電型赤外線センサ
時間遅延:調節可能(18秒まで0.3秒)
時間の遮断:0.2秒
センシング範囲:未満120度円錐角未満7メートル
働く温度:-1570度
https://www.amazon.co.jp/gp/offer-listing/B01FVSTOJI
※13 RCWL-0516 マイクロ波レーダーセンサ
検出範囲:7メートル以内に120度未満のテーパー角度
遅延時間:2秒(デフォルト値)それを調整するためにC-TMパッド上の異なる容量のコンデンサを半田付けする
https://www.amazon.co.jp/gp/offer-listing/B075N8Z3K5
※14 「なんだか、長くって、よくわかんない」
プログラム終了時にGPIOの初期化を行うため Ctrl-Cでブレイク処理を例外で受けて finally 節で必ず実行させています。
※15 「ほな、さいなら」
今回は出番が少なかったので最後に出てきました。だいぶ仲良くなってきたと思いませんか?