前回のやつが思ったよりウケたので折角だしと調子に乗って Raspberry Pi でもっとボタンっぽいボタンを作る (Amazon Dash Button という当初の目的は失われた)
動作
Twitter に直接動画アップロードするの難しすぎた (なんかめっちゃエラー出たり画質が最悪になったりする) ので諦めて Youtube に上げた。楽。
-
その 1
movie sample 1 https://t.co/fZh6R9qIfR
— dkishitani (@dkishitani) 2016年12月26日
-
その 2
movie sample 2 https://t.co/sUmO0DZ8CI
— dkishitani (@dkishitani) 2016年12月26日
ソース
https://github.com/dkishitani/yuri-button
なにやってるか
Raspberry Pi 3 Model B + Raspbian 2016-11-26 版で動作
1. GPIO 使ってボタン入力を受け取る
2. I2C 経由で LCD に文字を出す
3. USB カメラで TV の写真を撮る
4. 写真を OpenCV のアニメ顔認識にかけて人数を判定する
5. nasne からアニメタイトルを引っ張ってくる
6. 3 人以上か否かでメッセージ変えてタイトルと画像と顔認識画像をまとめて Twitter に post する
買ったもの
Raspberry Pi も電子工作も一切やったことないので買うところから始める。
2.5A の USB-AC アダプタとかいうキワモノが必要なのでセットのこれが安いかな〜と安易に注文したらなんと China Post から出荷とか言い出して結局届くのに 12 日 かかって当初のやる気が相当萎えたのでおとなしく Amazon Prime で届くやつ買ったほうがいいです。
- 適当な microSD カードと SD カードリーダ
Raspberry Pi は教育用の安価なシングルボードコンピュータを提供するみたいな触れ込みだった気がするんだけどセットアップで「Raspbian のイメージを microSD カードに dd しろ」とか言われてえっそれって SD カード読める Linux だか UNIX だかが別に必要ってことだよね?ていうか SD カードリーダとか一般家庭にないよそんなの?と慌てて近所の電気屋に買いに行った。
いちいち何が必要なのか調べるよりとりあえずこういう色々入ったキット買ったほうが楽よね。安いし。メーカーが解説ページ作ってるのでそれ読めばなんとなく使い方がわかる。今回 LCD のコードは丸パクリした。
1000 円ちょっとで買えて Raspberry Pi での動作報告が無限にある USB カメラ。
秋葉原のラジ館向かい側だっけ?のよくわからん古いものが売ってる店が並んでる建物で買った。押すと通電、離すと断線。Raspberry Pi みたいな流通多いやつは秋葉原まで出向くより Amazon で買ったほうが安いんだけど、いろんな店を物色することで上記のような電子工作キットの存在を知れたし、ゴツい物理ボタンとか探すと色々変なものが見つかったりする。でも今回は日和ってありきたりのやつ買った。安いし。
Raspberry Pi の GPIO とか I2C とか
GPIO とか I2C とか何言ってるか全然わかんなかったけど、Raspberry Pi 関連はぐぐるとそれなりに情報でてくるのでなんとかなる。電子工作と言っても GPIO は /sys/class/gpio/gpio*/value に 0/1 読み書きするだけだし I2C も /dev/i2c-* を open してバイト列書き込んでるだけだししかもどっちも Python の便利な wrapper があるので手順通りにやれば電子工作感はあまりない。ブレッドボードあるとはんだ付けもしなくていいしね。
# echo 25 > /sys/class/gpio/export
# echo out > /sys/class/gpio/gpio25/direction
# while :; do echo 1 > /sys/class/gpio/gpio25/value; sleep 1; echo 0 > /sys/class/gpio/gpio25/value; sleep 1; done
こんだけで LED が点滅しますからね。Raspberry Pi すごい。
USB カメラで写真撮ったり顔認識したり
OpenCV の Python wrapper という超便利なものが存在している上に情報もインターネットに無限に落ちているので写真撮って画像データを楽にどうこうできる。
顔認識はアニメ用に調整された検出器 lbpcascade_animeface があって TV に映ってる映像を Web カメラで撮っても精度良く認識してくれてこれまた何も困ることがなかった。顔認識は正直やってみたかっただけでつい技術の面白さに引っ張られて悪い百合厨の見本みたいな文言を書いてしまったけど他に使い道が思いつかなかったんだ…。
nasne からアニメタイトル取ってくる
前回参照
twitter に post する
consumer key やら access token やら取得して OAuth で認証して post するだけなので requests-oauthlib でいけた。ただ、画像をアップロードするとき media_data キー指定して base64 で送ると何故かエラーになったので一旦画像をファイル保存して rb でファイル読んで requests.session の files パラメータでバイナリ直接渡してる。
ハマったとこ
LCD の表示に半日かかった。これで俺のクリスマス当日は潰えた。原因は SMBus に write_byte するときアドレス (i2cdetect コマンドで出てくるやつ) を自環境向けに書き換えてなかったのと LCD の裏のツマミでコントラストを調整してなかったからで、どうして i2cdetect はすぐ動いたのに値を書き込もうとすると Input/output error 出るんだ…と頭抱えて /var/log/messages の関係無いエラーメッセージを延々睨みつけたりとかエラー出ないのに何も表示されない…ビジーなのかな…とかずっと悩んでた。このへん全然感覚なくてつらい。LCD 周りのコードは部品販社の解説ページのを丸パクリしてて何がどういう意味なのかはよくわかっていない。
GPIO に繋いだスイッチに結線してる抵抗を 10kΩ から 1kΩ にしたり、逆に GPIO と 10kΩ 抵抗の間に LED 挟んだりするとスイッチ押してないのに ON になったり一度 ON になるとしばらく入りっぱなしだったりとやたら不安定になって首をひねっていた。未解決。紙に書いて電気の気持ちにならないとわからない問題なんだろうなあこれ…。
問題点
- ボタン押してから写真撮るまで 2 秒弱かかる。正確には以下の 2 行が開始から終了まで 1.8 秒強かかるという意味で正確な遅延はわからないんだけど、まあ秒単位の遅延があるならアニメだとキツいよね…。
video = cv2.VideoCapture(0) # こっちは 0.1 秒くらい
result, img = video.read()
ちなみに LCD を 1 行書き換えるのにも 0.1 秒くらいかかる。顔認識は 0.5 秒くらい。Twitter への投稿は数秒。ボタン押してから全部終わるまで結構かかる。
他はともかくとしてボタン押してから写真撮るまでは極力ラグがない方がいいんだけど Raspberry Pi + USB カメラでこのザマなので遅延削るなら PC に USB カメラ繋いでジョイスティックぶっ叩いて実行するしかなさそう。Raspberry Pi 用カメラモジュールだともうちょっと処理速かったりするのかしら、でもあれ 3k 円くらいするんだよなー…。
もちろん顔認識に男女区別とかないのでうっかり男 1 女 2 の画面でボタン押して 3 人からがカップリングとか言おうものなら二度と外を歩けなくなりますねこれ
ところでこういうのってニコニコ技術部向け案件な気がしてきた。あのへんの界隈よく知らないから適当言ってるけど。