友人宅のWiiリモコンをWebから遠隔操作する3(ソフトウェア篇)
リモートリモコン(WiiリモコンのボタンをWeb経由で操作する装置)のソフトウェア部分の作り方を解説します。
この記事は前回の続きなので、まだリモートリモコンのことを知らない人やハードウェア篇を読んでいない人は、まずそちらへ。
ただし、実際に作る場合は、すべて自己責任でお願いします。
✽ ✽ ✽
ソフトウェアのつくりかた
ラズパイの適当なディレクトリにソースコードを置いてサーバを立て、普段使いのPCやスマホからそこにアクセスできるようにします。
下図のうち、ラズパイ部分がサーバで、回路基板&Wiiリモコン部分はラズパイから命令を受けるデバイスというイメージです。
①ソースコードのダウンロード
筆者のソースコードが以下のGithubページにあるので、ラズパイのWebブラウザから開いてダウンロードします。ダウンロードしたファイルは、展開してDocumentsなど適当な場所に置きます。
また、以下のコマンドを使ってソースコードの実行に必要なパッケージをインストールします。
$ cd /home/pi/Documents/remote-wii-remote/
$ pip install -r requirements.txt
※筆者は展開したソースコードを「/home/pi/Documents/」に置いたので「cd /home/pi/Documents/remote-wii-remote/」と書いていますが、別の場所に置いた場合はその場所を指定する必要があります。これ以降も同様。
②ngrokのインストール
ngrokとは、localhostをhttpで公開するための無料ソフトです。これがないと、別の家のブラウザからラズパイにアクセスすることができません。
下のような記事を参考にしながらngrokをラズパイにインストールします。
インストールが終わったら、実行ファイル(ngrok)をDocumentsなど適当な場所に置きます。
③ngrokで取得したURLが自動でスプレッドシートに書き込まれるようにする
ngrokで取得したURLを毎回ラズパイから確認するのは面倒なので、Googleスプレッドシートに自動書き込みする機能を作ります。この作業は、普段使いのPCから行ってもかまいません。
Google Driveでスプレッドシートを新規作成し、下図のように、ツール>スクリプトエディタを開きます。
下図のようなエディタが表示されます。
エディタに以下のコードをコピペします。初期値で入力されていたmyFunctionという関数は、消してしまってかまいません。
function doPost(e) {
const json = JSON.parse(e.postData.contents);
writeUrl(json.url);
return ContentService.createTextOutput('ok');
}
function writeUrl(url) {
const file = SpreadsheetApp.getActiveSpreadsheet();
const sheet = file.getActiveSheet();
const range = sheet.getRange("A1");
range.setValue(url);
}
適当な名前でプロジェクトを保存し、下図のように、公開>ウェブアプリケーションとして導入をクリックします。
下図のような設定(New、Me、Anyone, even anonymous)にして、Deployをクリックします。
認証を求められた場合は、このスプレッドシートを操作できるアカウントで認証します。
下図のような画面が出た場合は、「詳細」をクリックし、「プロジェクト名(安全ではないページ)に移動」をクリックします。ちなみに、ここでいう「安全ではないページ」とは、さきほど自分でつくったプロジェクトのことです。
認証と許可設定が終わると、下図のようにURLがもらえるので、メモしておきます。これは、あとでラズパイの環境変数として使います。
④環境変数の設定
ラズパイでターミナル(コマンドを実行する黒い画面)を開き、2種類の環境変数(NGROK_PATH、SPREADSHEET_URL)を設定します。
NGROK_PATH:ngrokの実行ファイルの絶対パス
SPREADSHEET_URL:さきほどスプレッドシートからもらったURL
環境変数を設定するための見本コマンドは以下のとおりです(このままコピペしても動かないので、適宜修正してください)。
$ export NGROK_PATH=/home/pi/Documents/ngrok
$ export SPREADSHEET_URL=https://script.google.com/macros/s/????????/exec
⑤実行してみる
ターミナル(コマンドを実行する黒い画面)を開き、以下のコマンドを実行します。
$ cd /home/pi/Documents/remote-wii-remote/
$ pip install -r requirements.txt
$ python3 main.py
実行して数秒待つと、スプレッドシートのA1セルに操作画面のURLが書き込まれているはずなので、普段使いのPCやスマホからアクセスしてみます。
下図のような画面が表示されたら成功です。
※PCでレイアウトが変になる場合は、F12を押し、モバイルモードに切り替え、横持ちモードに切り替えてください。
すでにラズパイと回路基板がつながっている場合、Wiiリモコンの電池を入れて操作画面上のボタンを押すと、Wiiリモコンが反応するはずです。
反応しない場合は、以下の点を確認します。
・ラズパイの電源は入っているか
・ラズパイはネットにつながっているか
・操作画面を開いているPCやスマホはネットにつながっているか
・Wiiリモコンに電池は入っているか(あるいは電池切れではないか)
・ラズパイのピンと回路基板は正しくつながっているか
・回路基板とWiiリモコンは正しくつながっているか
・回路基板の回路に誤りはないか
・Wiiリモコンは正しくはんだ付けされているか
⑥ラズパイの電源を入れたときに自動でサーバが立ち上がるようにする
リモートリモコンを送る友人にラズパイのコマンド実行をお願いするのは難しい(非エンジニアならなおさら)ので、LANケーブルをつないで電源を入れたらOKなように設定します。
まず、ラズパイで以下のコマンドを実行します。
$ cd /etc
$ sudo nano rc.local
すると、rc.localの編集画面がターミナル上に表示されます。rc.localとは、ラズパイが起動したときに自動実行されるコマンドを定義できるファイルです。
rc.localの末尾のexit 0の直前に、環境変数の設定コマンドとremote-wii-remote/main.pyの実行コマンドを追加します(ファイル内にもとから書いてあった文は消さないようにします)。
見本は以下のとおり(このままコピペしても動かないので、適宜修正してください)。
export NGROK_PATH=/home/pi/Documents/ngrok
export SPREADSHEET_URL=https://script.google.com/macros/s/????????/exec
python3 /home/pi/Documents/remote-wii-remote/main.py
下図が変更後のイメージです。
Ctrl+Sで保存し、Ctrl+Xでファイルを閉じます。
次に、以下のコマンドを実行します。
$ sudo raspi-config
すると、ラズパイのコンフィグ画面が表示されるので、3 Boot Options > B2 Wait for Network at bootを開き、設定を有効にします。
最後にラズパイをシャットダウンし、以下の手順が正しく実行できるか確認します。
①Wiiリモコンに電池が入っていることを確認する
②ラズパイがLANや電源につながっていることを確認する
③ラズパイの電源を入れる
④普段使いのPCやスマホから例のスプレッドシートを開く
⑤スプレッドシートのA1セルのURLが最新の値に書き換わるのを待つ
⑥スプレッドシートのA1セルのURLにアクセスする
⑦操作画面が表示される
⑧操作画面で任意のボタンを押すとWiiリモコンが反応することを確認する
これでハードウェアとソフトウェアはすべて完成です。
つかいかた
リモートリモコンは、以下の手順で使うことができます。
①リモートリモコンを非金属の机の上に置く
②Wiiリモコン部分に電池を入れる
③ラズパイ部分をLANにつないで電源を入れる
④スプレッドシートにアクセスできる人が、操作画面URLを全プレイヤに共有する(なお、操作画面URLがシートに反映されるまで数秒〜数十秒かかる)
リモートリモコンは、以下の手順で終了することができます。
①プレイヤのだれかが操作画面URLの末尾に/shutdownをつけてアクセスする
②数秒後にラズパイ部分の電源を切る
③Wiiリモコン部分の電池を抜く
※本当は①の手順でラズパイのシャットダウンまでするようにしたかったのですが、うまくシャットダウンプログラムを作れなかったので、やむをえず②でブチ切りしています(時間もぎりぎりだったし)。ラズパイを壊したくない人は、ソースコードの修正か手動でのシャットダウン操作が必要です。
ラズパイは長時間稼働すると熱くなるので、遊び終わったら必ず電源を切ってください。
次回予告
3回にわたってリモートリモコンを紹介してきましたが、一旦ここで完結です。改善版は気が向いたら作ります。
おわり。
この記事が気に入ったらサポートをしてみませんか?