読者です 読者をやめる 読者になる 読者になる

ちぎっては投げるブログ

Programming, Android, Digital Devices

自宅にポケモンが現れたら、実際に鳴き声を流したい #ポケモンGo

Programming RaspberryPi ポケモン Linux

denpa-shinbun.com

の続き。

せっかくRaspberry Piを使っているので、サーバでは出来ないことをしたいと思い、ポケモンの鳴き声を出してみることにした。

これで、ポケモンが現れると鳴き声が現実世界に鳴り響くという、仮想と現実がよりいりまじった、良い感じの世界観を作ることが出来る。

用意するモノ

  • Raspberry Pi
  • スピーカー
  • 鳴き声の音源ファイル

ちなみに我が家のスピーカはUSB電源、音声アナログ入力のこれ

準備

  • Raspberry Piにスピーカーを繋ぐ。
  • 鳴き声の音源ファイルをRaspberryPi上に保存する
    • ファイル名は0埋めした3桁図鑑No.wavとし、フォルダ名はpokevoiceとする
  • sudo -u root aplay -D plughw:0,0 適当なwav のコマンドで再生できることを確認しておく
    • Botをrootじゃないユーザで実行するならsudoは不要
    • plughwの値は、aplay -lで確認する
    • 音量も調整しておく

PokemonGo-SlackBotの編集

pythonは触ったことがないが、雰囲気で・・・。

send_to_slack関数を呼ぶ直前で、aplayにて音を再生すれば良い。

具体的には、mainprocess_step関数 でsend_to_slack関数を呼んでいるif文があるので、そこを編集する。

diffはこんな感じ。

$ git diff
diff --git a/pokemon_pb2.pyc b/pokemon_pb2.pyc
index a20598a..1aa12c1 100644
Binary files a/pokemon_pb2.pyc and b/pokemon_pb2.pyc differ
diff --git a/pokeslack.py b/pokeslack.py
index 4c2f5e7..fdb361b 100755
--- a/pokeslack.py
+++ b/pokeslack.py
@@ -922,8 +922,10 @@ transform_from_wgs_to_gcj(Location(Fort.Latitude, Fort.Longitude))
             else:
                 user_icon = ':pokeball:'

-
-
+            print "pokemon = " + str(poke.pokemon.PokemonId)
+            from subprocess import check_call
+            cmd =  "aplay -D plughw:2,0 ./pokevoice/" + str(poke.pokemon.PokemonId).zfill(3) + ".wav"
+            check_call( cmd.split(" ") )
             send_to_slack(alert_text, pokename, user_icon, slack_webhook_urlpath)

             spotted_pokemon[poke.SpawnPointId] = {'disappear_datetime': disappear_datetime, 'pokename': pokename}
diff --git a/transform.pyc b/transform.pyc
index 2875abb..9a0e24f 100644

処理内容は見たまま単純で、図鑑Noを取ってきて0埋めしてファイルパスにし、aplayに渡しているだけである。

AR感が出てきてなかなか良い感じなので、かなりおすすめだ。さらに戦闘突入BGMを合わせるのもいいかもしれない。

Raspberry PiでポケモンGoの出現通知をスマホに送る

Android GitHub RaspberryPi Programming Software ポケモン

やりたいこと

自宅にいるときに、たまにポケモンが現れるようなので、ポケモンGoを起動していない状態でもスマホへ通知したい。

f:id:mczh:20160730142916j:plain

実施した手順をメモしておく。

Botを動かそう

VPSもAWSアカウントも持っていない貧者なのでRaspberry PiでSlackBotを動かすことでインフラをサボることにする。

タイトルにラズパイっていれたけれど、特にセンサーを使ったり持ち歩いたりは想定せず、24時間起動しっぱなしのLinuxサーバとしてしか使っていない。

事前準備

PokemonGo-SlackBotインストール

pythonはRaspberryPiに元から入っていたか覚えていないが、なければインストールしておく(ここでは省略)。

git clone https://github.com/rubenmak/PokemonGo-SlackBot.git
cd PokemonGo-SlackBot
sudo pip install -r requirements.txt

PokemonGo-SlackBot実行

./pokeslack.py -L ja -u トレーナークラブユーザ名 -p パスワード -l "GoogleMap座標" -st インターバル -r 探索半径(m) -sw  WEBHOOK_URL

slackからスマホへ通知が来るかを確認する。

ポケモンアイコンの設定も出来るが、面倒なのでいったん省略した。

これで、PokemonGoのアプリを起動していなくても、出現したら通知が来るようになった。

通知の例

Skackの通知でタマタマがいるぞとと出たのでPokemonGoを起動すると・・・

f:id:mczh:20160730143621j:plain

ちゃんとタマタマがいた。

f:id:mczh:20160730143432j:plain

ほかにやっておきたいこと

  • 自動起動(サービス化)
  • 会社に行っているときは通知が無駄なので、時間制御か在宅制御を入れる

あたりはやろうと思う。 あと、たまに落ちるのでcronで生存チェックなどもしたほうが良いのかも。

追記

結構落ちることがわかったので、やっつけでcrontabで強制終了&復帰するようにした。 6-23時の間、29分と59分にプロセスを殺して、30分と0分に起動させる。(動作確認中) ちゃんとやるなら、ログを書き出してgrepしてリスタートする仕組みをいれるべきだと思う・・・。せめてエラー吐いていないときはkillしないぐらいの工夫はしたほうが良さそう。

sudo crontab -e
#以下を追加
0,30 6-23 * * cd /home/pi/PokemonGo-SlackBot && ./pokeslack.py -L ja -u username -p password -l "GoogleMapPosition" -st Interval -r Radius -sw  https://hooks.slack.com/services/hogehoge > /tmp/poke.log \
&
59,29 6-23 * * * kill `ps -aux | grep pokeslack.py | awk {'print $2'}`

続き

denpa-shinbun.com

Raspberry Piで温度と湿度を取得する

Programming RaspberryPi

denpa-shinbun.com

今回はDHT11による温度と湿度の取得である。

精度はあまり良くないので、温度は前回のDS18B20のほうが良さそうだ。

denpa-shinbun.com

配線

VCCを5Vに、DATAを任意のGPIOピンに、GNDはそのままGNDピンに接続する。

f:id:mczh:20160719230019j:plain

3.3Vでも動くようだが、精度が悪くなるらしい。

チラシの裏の電子工作 激安温湿度センサDHT11を使ってみた やはり5V付近では概ね正しい値が出ているようです。 4.3Vを割ったあたりから、急激に計測値が悪化しているのが解ります。 http://nax9800.blog.fc2.com/blog-entry-44.html

ライブラリのインストール

PythonのライブラリがGitHubで公開されているので、それを使うのが楽。

Adafruit Python DHT Sensor Library

github.com

このリポジトリをクローンしてきて、README.mdに書いてあるようにセットアップする。 具体的には以下のように。

sudo apt-get install -y git
sudo apt-get update
sudo apt-get install -y build-essential python-dev
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install

値の取得

まずはサンプルを試す。 exampleフォルダにある、AdafruitDHT.pyの第一引数に11、第二引数にGPIOピンの番号を渡す。 たとえば、GPIOピンが18の場合には、以下のようになる。

[pi@ras01: ~/Adafruit_Python_DHT/examples 22:50:11]master
$ ./AdafruitDHT.py 11 18
Temp=28.0*  Humidity=39.0%

こんな感じで、温度が28℃の湿度が39%とわかる。

ちなみに、昨日の温度センサーの場合には、以下のようになった。

$ ./getDs17b20SensorValue.sh
26937

1℃ほど低い。

DHT11は、値段が安いかわりに精度はイマイチな代物らしい。

これで温度、湿度が取得可能になった。RaspberryPiをWEBサーバ化してグラフを見られるようにするのも良いが、GoogleSpreadSheetに保存するとバックアップが不要になるので、GoogleSpreadSheetへの保存を目指したい。