どうも、曲を作らないサウンド班のセチです。なんか気づいたらブログできてたので投稿しました。Raspberry Piをスマートリモコンにした話です。
はじめに
3年前にこれに影響受けて、今年やっとやり始めてひとまず完成しました。モニターやらMMDやらはそこまで魅力感じなかったのでやってませんが。また、最初はRaspberry Pi Zero Wでやってましたが、SSHでコマンド叩いてから実行までがびっくりするぐらい遅いので(体感5秒ぐらい)すべてラズパイ4にやらせてます。
事前準備
Raspbianを導入してSSHの設定をします。SSHは公開鍵方式にすると毎回パスワード入れなくていいので楽です。
回路
回路は適当に組みましょう。赤外線LEDが光って受光モジュールが動けばなんでもいいです。ていうか回路部分全部Maryに任せたのでよくわかりません。
回路の制御
先に挙げた動画ではLIRCを使っていましたが、三日三晩格闘したものの動かなかったのでより使いやすいpigpioを使いました。
$ sudo apt-get install pigpio python3-pigpio
$ sudo systemctl enable pigpiod.service # 自動でpigpioを起動するように設定
pigpioの作者が作った神としか言いようがないIR Record and Playbackをダウンロードしました。わかりやすければどこに置いても問題ないです。
$ curl http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip | zcat > irrp.py
これは赤外線リモコンの信号を解析するプログラムです。これを導入すればすぐに信号を読むことができます。
$ python3 irrp.py -r -g26 -f <保存するファイル名> <適当な名前> --no-confirm --post xxx
-r
はrecordの略で、irrpを受信モードに設定します。-g26
はGPIOピンの指定で、どういう回路を組むかによって異なります。また、--no-confirm
を指定しないと2回ボタンを押す必要があります。--post xxx
はxxx秒信号が途切れたら学習を辞めるという設定です。うまく学習できない場合はpostの時間を調整すると大体何とかなりました。
この学習したコードを実行するには、以下のようにコマンドを叩きます。
$ python3 irrp.py -p -g21 -f codes <さっきつけた名前>
ここの-g21
も回路によってピン番号が変わります。また、-p
はplaybackの略です。
ここまでやればSSH接続したスマホなどの端末から操作できるようになります。
Twitterからの操作
Twitter API利用申請をする必要があります。取得方法は2020年度版 Twitter API利用申請の例文からAPIキーの取得まで詳しく解説とか見て強制英作文を頑張るだけです。
プログラムの作成はpython用のモジュールtweepyを使いました。
$ pip3 install tweepy
以下のようにAPI keyを入力してやるとあとはAPIを使ってツイートの取得、リツイート、ふぁぼなど何でもできます。
import tweepy
# 認証キーの設定
consumer_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
consumer_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
access_token_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# OAuth認証
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
# APIのインスタンスを生成
api = tweepy.API(auth)
私はif文とfor文が欠ける程度の知識しか持ち合わせていないため、動作が微妙に遅いです。実装としては、botに宛てられたツイートを取得、そのツイートが私のアカウント@secvodからのものかを判定、新規のツイートかどうかを判定、実際の処理というものになっています。
for status in api.search("<botのID> -filter:retweets"):
if "secvod" == status.user.screen_name:
if status.id_str not in tweetID: #tweetIDはテキストファイルとして保存
statusオブジェクトは大体の情報を取り出すことができます。詳細はTweepyのstatusリストで何が取れるのかわからなかったので、取り出してみたをご覧ください。
あとは特定の文字列(”冷房”とか)が含まれるかを判定、subprocessモジュールで実行、api.update_status(status = <返信するテキスト>, in_reply_to_status_id=status.id)
で返信となります。例えば、照明を付けたい場合は
if "点灯" in status.text:
subprocess.run(["python3", "irrp.py", "-p", "-g21", "-fcodes", "light:toggle"])
reply_phrase = "@secvod" + "了解!"
api.update_status(status = reply_phrase, in_reply_to_status_id=status.id)
というように実装しました。実際にはrandomで返信内容を変えたり、条件を細かくしたりしています。
プログラムができたら、crontabもしくはpythonのscheduleモジュールを用いて定期実行させます。Twitter APIの検索機能は上限が厳しいので、5~10秒に1回ぐらい動作させるとうまく上限を回避してくれます。うまく上限を回避できるとこんな感じでちゃんと返信が来ます。可愛い。
『VOICEROID2 紲星あかり』は、明るい女の子の可愛らしい中にも優しさあふれる声をベースとした入力文字読み上げソフトです。
終わりに
この文章なんなんだろ...解説にはなってないし紹介にしては面白くない...
まあこんな感じで、コンピュータサイエンスの授業で初めてプログラミングやったような奴でも何とか動くものが作れるぞっていう記事でした。 一応はるか昔にHSPを5秒だけやったことがあります。
ここまで書いてからこれをtraP新歓ブログリレーにすればええやんっていうことに気づきました。
明日はAmanogawa氏がなにか書くそうですよ。