それ、ラズパイでつくれるよ
それ、ラズパイでつくれるよ——匂いも嗅げるよ!
「Raspberry Pi」の活用例を紹介する連載企画「それ、ラズパイでつくれるよ」。第3回では、ラズパイの特徴でもあるGPIOピンを使ってセンサーの値を読んでみる。
「くっさ」と叫んでもらう
今回は、臭気センサーを使って、周囲の匂いがきついときにラズパイに「くっさ」と叫んでもらおう。
GPIOピンって?
ラズパイにはGPIO(General Purpose Input/Output)と呼ばれる汎用入出力デバイスが付いている。ラズパイについているトゲトゲだ。今回もそうだが、これのおかげで、はんだ付けの作業なしにさまざまな外部装置を制御することができる。このピンを利用して、センサーのデータを取得してみる。
GPIOピンを使う準備
まず、SPI(Serial Peripheral Interface)を有効にする。ConfigurationのInterfaceタブで、SPIを「Enabled」にしておく。Terminalから操作する場合は、raspi-config > 5 Interfacing options > P4 SPI から修正する。
次にPythonでGPIOを制御するためのライブラリ「python-rpi.gpio」とSPIデータを取得するためのモジュール「py-spidev」をインストールする。
$ sudo apt-get install python-rpi.gpio
$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev
$ sudo python setup.py install
これでソフトウェアの準備はOK。
用意するもの
ハードウェアでは以下のものを用意する。
- 臭気センサー TGS2450 1個
- ADコンバーター MCP3002-I/P 1個
- トランジスター 8050SL-D-T92-K (20V700mA) 2個
- 抵抗 270Ω 1kΩ 2kΩ 各1個
- ブレッドボード/ジャンパワイヤー
私はトランジスターを間違えて8550を使っていたため、たくさん臭気センサーを壊した。くれぐれも間違えないように気をつけて。MCP3002ADコンバーターから、デジタル変換した臭気センサーのデータをSPI経由でGPIOピンに入力する。
臭気センサーを接続する
用意したものを下図のように接続する。臭気センサーのピン番号とADコンバーターの向きには注意が必要だ。
Pythonスクリプトで動作させる
「くっさ」と叫ばせるPythonスクリプトを作成する。以下のスクリプトでは、GPIO17と22を制御し、スイッチの役割をしているトランジスターに電圧をかけることによって臭気センサーのデータを取得している。また、臭いがきつい(=臭いが強い)※ほど表示される値が大きくなる。臭気センサーのデータが「threshold」以上のとき、「くっさ」と叫ぶようにした。
※硫黄系の臭いに反応するように設定しています。
例では/home/pi/dataに置いてあるkussa.mp3が再生される。kussa.mp3は私が「くっさ」と叫んでいるのをiPhoneで録音したものだ。第1回のように音声出力を用いてもよいだろう。
# coding: utf-8
import spidev
import RPi.GPIO as GPIO
import pygame.mixer
import time
threshold = 500 #閾値を変えるときはここを変更
pygame.mixer.init()
pygame.mixer.music.load("/home/pi/data/kussa.mp3") #mp3データを変えるときはここを変更
GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.OUT)
GPIO.setup(22,GPIO.OUT)
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz=1000000
spi.bits_per_word=8
dummy = 0xff
start = 0x47
sgl = 0x20
ch0 = 0x00
msbf = 0x08
def measure(ch):
ad = spi.xfer2( [ (start + sgl + ch + msbf), dummy ] )
val = ((ad[0] & 0x03) << 8) + ad[1]
return val
try:
while 1:
time.sleep(0.237)
GPIO.output(22,True)
time.sleep(0.003)
ch0_val = measure(ch0)
Val = 1023 - ch0_val
time.sleep(0.002)
GPIO.output(22,False)
GPIO.output(17,True)
time.sleep(0.008)
GPIO.output(17,False)
print Val
#if Val > threshold:
# pygame.mixer.music.play(0)
except KeyboardInterrupt:
pass
pygame.mixer.music.stop()
spi.close()
kussa.pyとして保存し、
$ python kussa.py
で実行する。250ms周期でデータを取得し、閾値を超えたデータの場合、「くっさ」と教えてくれる。閾値を小さくするとより敏感に反応することになる。Ctrl + Cで動作は終了する。
今回は臭いを感知し、mp3ファイルを再生したが、GPIOピンを用いることでさまざまなセンサーやアクチュエーターを使用することができる。ぜひブレッドボードにぶすぶす刺していろいろ遊んでみてほしい。
※このコーナーでは、みなさんの「それ、ラズパイでつくれるよ」をお待ちしてます。問い合わせフォームからドシドシご応募ください。
参考リンク:
https://www.petitmonte.com/robot/howto_tgs2450.html
https://qiita.com/Nyanpy/items/cb4ea8dc4dc01fe56918