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


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

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

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

# 準備物
* Raspberry Pi 2B
* 電源
* microUSBケーブル
* 無線ＬＡＮ
* メスメスのジャンパーケーブル
* 人感センサー
* USBスピーカー
* 蝉を作る材料

# 手順
## 人感センサーをラズパイに接続
### 1. センサーの確認
センサーは↓を買いました。

* [HC-SR501](http://www.amazon.co.jp/%E3%83%8E%E3%83%BC%E3%83%96%E3%83%A9%E3%83%B3%E3%83%89%E5%93%81-%E4%BA%BA%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E7%84%A6%E9%9B%BB%E8%B5%A4%E5%A4%96%E7%B7%9A-HC-SR501-%E4%B8%A6%E8%A1%8C%E8%BC%B8%E5%85%A5%E5%93%81/dp/B010RYGEGM/ref=sr_1_5?ie=UTF8&qid=1452318830&sr=8-5&keywords=HC-SR501)

センサーの全体を確認。
![IMG_0103.JPG](https://qiita-image-store.s3.amazonaws.com/0/48912/453320e7-b449-9b87-8a1d-4e057db0091b.jpeg)
オレンジのやつを回すことで、感度（左）と遅延時間（右）を調整できます。
感度は3m〜7m、遅延時間は5秒〜200秒(?)に調整できるらしいです。
遅延時間については一番左に回して短くしといたほうが思っているような動きになると思います。
![IMG_0104.JPG](https://qiita-image-store.s3.amazonaws.com/0/48912/f7fa8f29-b2ba-3b60-8e84-48290a4f05e6.jpeg)
黄色のやつは抜き差しができて、右側にするか左側にするか選択できます。
![IMG_0106.JPG](https://qiita-image-store.s3.amazonaws.com/0/48912/6f1fd65a-0f08-b96b-70db-9aec49cab78d.jpeg)
このセンターのことについては[HC-SR501](https://www.mpja.com/download/31227sc.pdf)に詳しく書いてあります。

### 2. センサーの接続
人感センサーをラズパイに接続します。
ジャンパーケーブルを挿す部分が手前で、センサーをこのように配置した場合、左からGND・OUTPUT・POWERです。
この順番は買ったセンサーによって違うようなので、このセンサーではない場合はそれぞれのセンサーの仕様に則って接続してください。
この人感センサーは動作電圧が4.5～20Vなので、POWERは5Vに繋いでいます。
OUTPUTはGPIO18を使うことにしました。
![人感センサー_回路図のコピー_レ.png](https://qiita-image-store.s3.amazonaws.com/0/48912/81724059-bae4-7e78-418a-e67ac18d721a.png)

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

```bash
$ 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で下記のプログラムを書きます。
一定時間ごとにセンサーの状態を表示するようにします。

```py: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)
```

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

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

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

* [SANWA SUPPLY USBサウンドバースピーカー MM-SPU5BK](http://www.amazon.co.jp/gp/product/B004BQ0OGO?psc=1&redirect=true&ref_=oh_aui_detailpage_o01_s00)

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

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

```bash
$ 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行増えるはずです。

```bash
$ 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番目になっています。

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

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

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

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

```bash: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スピーカーを挿して、以下を実行。

```bash
$ sudo alsa unload
$ sudo modprobe snd_usb_audio
```

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

```bash
$ cat /proc/asound/modules
 0 snd_usb_audio
```

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

```bash
$ sudo alsamixer
```

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

```py: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()
```

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

```bash
$ python music.py
```

## 蝉が鳴くプログラムの作成
プログラムを実行したら蝉が鳴き始め、センサーが反応すると鳴き声が止みます。
そしてまた時間が経つと鳴き始めるようにしてます。
音源は[On-Jin ～音人～](http://on-jin.com/)からお借りしました。

```py: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](https://qiita-image-store.s3.amazonaws.com/0/48912/663406e3-abec-cee7-19ec-313e059441da.jpeg)

ラズパイを中に入れたらこんな感じです。
電源もポータブルにしたら場所移動も自由になりそうですが、持ってないので電源は有線です。
![IMG_0108.JPG](https://qiita-image-store.s3.amazonaws.com/0/48912/2d35b718-19e4-f7e9-3eca-83cf298f0cc7.jpeg)

# 完成
完成！こんな感じに動きます。
[![動画:Raspberry Piで人感センサーを用いて蝉を鳴かせる](https://qiita-image-store.s3.amazonaws.com/0/48912/37d1f3d6-0b72-914a-5f41-75e71529b05d.png)](https://youtu.be/vjBHAXGPgig)

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

# 参考
* [人感センサーとカメラをRaspberryPiにつないでみた](http://akkun49.blog.fc2.com/blog-entry-77.html)
* [Raspberry Piに赤外線センサーを付けて、動きを検知してみた](http://raspi.seesaa.net/article/417437441.html)
* [HC-SR501 人感センサー](http://poz.sakura.ne.jp/kyou/HC-SR501/)
* [Raspberry Pi でUSBスピーカーを動かす](http://takuya-1st.hatenablog.jp/entry/2014/06/15/180632)
* [USBスピーカーの優先度を上げる](http://www.mugbot.com/2013/10/08/usb%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC%E3%81%AE%E5%84%AA%E5%85%88%E5%BA%A6%E3%82%92%E4%B8%8A%E3%81%92%E3%82%8B/)
* [Ubuntu PCをオーディオ装置として使う](http://d.hatena.ne.jp/namerican/20120515/1337084480)
* [Raspberry Pi2でUSBスピーカーがやっと使えた](http://shinogasa.hatenablog.com/entry/2015/06/19/004452)
* [HC-SR501 PIR MOTION DETECTOR](http://www.mpja.com/download/31227sc.pdf)