[*Raspberry Pi*] 夏だ!人感センサーを使って蝉を鳴かせよう

  • 41
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

人感センサーを買いました。
蝉が好きなので、家でも蝉に鳴いてほしいと思って以下の動作をするようにしようと思いました。

① 蝉が鳴いている
② 人が近づくと鳴き止む
③ しばらくするとまた鳴き始める

実際に、蝉を捕まえようとした時にあるあるの現象です。

準備物

  • Raspberry Pi 2B
  • 電源
  • microUSBケーブル
  • 無線LAN
  • メスメスのジャンパーケーブル
  • 人感センサー
  • USBスピーカー
  • 蝉を作る材料

手順

人感センサーをラズパイに接続

1. センサーの確認

センサーは↓を買いました。

センサーの全体を確認。
IMG_0103.JPG
オレンジのやつを回すことで、感度(左)と遅延時間(右)を調整できます。
感度は3m〜7m、遅延時間は5秒〜200秒(?)に調整できるらしいです。
遅延時間については一番左に回して短くしといたほうが思っているような動きになると思います。
IMG_0104.JPG
黄色のやつは抜き差しができて、右側にするか左側にするか選択できます。
IMG_0106.JPG
このセンターのことについてはHC-SR501に詳しく書いてあります。

2. センサーの接続

人感センサーをラズパイに接続します。
ジャンパーケーブルを挿す部分が手前で、センサーをこのように配置した場合、左からGND・OUTPUT・POWERです。
この順番は買ったセンサーによって違うようなので、このセンサーではない場合はそれぞれのセンサーの仕様に則って接続してください。
この人感センサーは動作電圧が4.5~20Vなので、POWERは5Vに繋いでいます。
OUTPUTはGPIO18を使うことにしました。
人感センサー_回路図のコピー_レ.png

3. センサーの動作確認

人感センサーが接続できたら、ラズパイの電源を入れます。
起動したらセンサーの動作確認をします。
下記をやって、cat /sys/class/gpio/gpio18/valueの部分をよく確認してください。
センサーを生き物がいない方向に向けている時には0、センサーに向かって手を振って1が表示されれば正常に動作しています。
反応がない場合は接続方法がおかしくないかと遅延時間を確認してみてください。

$ sudo su
$ echo 18 > /sys/class/gpio/export
$ echo in > /sys/class/gpio/gpio18/direction

$ cat /sys/class/gpio/gpio18/value
0 または 1 が表示される

$ echo 18 > /sys/class/gpio/unexport
$ exit

次にPythonで下記のプログラムを書きます。
一定時間ごとにセンサーの状態を表示するようにします。

sensor_test.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-

import time
import RPi.GPIO as GPIO

INTAVAL = 3
SLEEPTIME = 5
SENSOR_PIN = 18

GPIO.cleanup()
GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN)

st = time.time()-INTAVAL

while True:
  print GPIO.input(SENSOR_PIN)
  if(GPIO.input(SENSOR_PIN) == GPIO.HIGH) and (st + INTAVAL < time.time()):
    st = time.time()
    print("人を感知しました")

  time.sleep(SLEEPTIME)

実行すると以下のようになります。
センサーに手をかざしてみたりしながら、センサーが自分の思っている感じで反応しているかを確かめます。
思い通りに動かない場合は感度や遅延時間を調節してください。

$ sudo python sensor_test.py
0
0
0
1
人を感知しました
1
人を感知しました
0

USBスピーカーをラズパイに接続

USBスピーカーは以下を購入しました。
ネットで調べていたら他の方がこれでやっていたので確実に動作しそうですし、サイズ的にも小さい感じがしたのでこれにしました。

ラズパイが起動したままでUSBポートに挿せば認識します。
ラズパイ起動時にUSBスピーカーを挿しっぱなしにしておくと、なぜだかラズパイとスピーカーが荒ぶってラズパイが起動できないので起動してから挿すようにしています。

USBスピーカーを挿す前の状態を確認。

$ sudo lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]

USBスピーカーを挿すと、1行増えるはずです。

$ sudo lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 005: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]
Bus 001 Device 006: ID 0d8c:0126 C-Media Electronics, Inc. 

次に以下を実行します。
現状ではUSBスピーカーの優先度は2番目になっています。

$ cat /proc/asound/modules
 0 snd_bcm2835
 1 snd_usb_audio

USBスピーカーの優先度が1番になるようにします。

$ sudo vim /etc/modprobe.d/alsa-base.conf

ファイルの下記の行を修正して、-2から0に修正します。

alsa-base.conf
# Keep snd-usb-audio from beeing loaded as first soundcard
# options snd-usb-audio index=-2
options snd-usb-audio index=0

USBスピーカーを抜いてから再起動。

$ sudo reboot

起動したらUSBスピーカーを挿して、以下を実行。

$ sudo alsa unload
$ sudo modprobe snd_usb_audio

USBスピーカーが1番目になっていることを確認。

$ cat /proc/asound/modules
 0 snd_usb_audio

早速音を出したいところですが、先に音量を調節します。
下記を実行すると音量調節の画面が出るのでカーソルの上下で音量を調整します。

$ sudo alsamixer

音楽再生用に下記のプログラムを作成。
Front_Center.wav部分は好きな音楽ファイルでもOKです。

music.py
#!/usr/bin/env python
#coding:utf-8

import pygame.mixer
import time

try:
  pygame.mixer.init()
  pygame.mixer.music.load("/usr/share/sounds/alsa/Front_Center.wav")
  pygame.mixer.music.play(0)
  time.sleep(20)
except KeyboardInterrupt:
  pygame.mixer.music.stop()
  pygame.mixer.quit()
  pygame.quit()

音楽が鳴れば準備完了です。

$ python music.py

蝉が鳴くプログラムの作成

プログラムを実行したら蝉が鳴き始め、センサーが反応すると鳴き声が止みます。
そしてまた時間が経つと鳴き始めるようにしてます。
音源はOn-Jin ~音人~からお借りしました。

cicada.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-

import time
import RPi.GPIO as GPIO
import pygame.mixer

INTAVAL = 1
SLEEPTIME = 1
SENSOR_PIN = 18

GPIO.cleanup()
GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN)

st = time.time()-INTAVAL

#音楽再生スタート
pygame.mixer.init()
pygame.mixer.music.load("ani_ge_semi05.mp3")
pygame.mixer.music.play(-1)

while True:
  print GPIO.input(SENSOR_PIN)
  if(GPIO.input(SENSOR_PIN) == GPIO.HIGH) and (st + INTAVAL < time.time()):
    st = time.time()
    print("人を検知しました!")
    pygame.mixer.music.pause()
  else:
    pygame.mixer.music.unpause()

  time.sleep(SLEEPTIME)

蝉を作ってラズパイを中に入れる

ラズパイを入れる蝉を作りました。
黒い穴の部分にセンサーを出します。
IMG_0107.JPG

ラズパイを中に入れたらこんな感じです。
電源もポータブルにしたら場所移動も自由になりそうですが、持ってないので電源は有線です。
IMG_0108.JPG

完成

完成!こんな感じに動きます。
動画:Raspberry Piで人感センサーを用いて蝉を鳴かせる

最後に

人感センサー楽しいです。
蝉の鳴き声をもっと実際蝉に近づいた時鳴き止む&しばらくして鳴き始めるものが欲しいと思ったのと、蝉がハリボテすぎるのできちんとした蝉が作りたいです。
ほんとは壁とかにかけて普段鳴いていて欲しいです。
最初はミシンを使って縫ってたんですが上手くいきませんでした。
より蝉に近づけるようブラッシュアップしていこうと思います。

参考