デザイン戦略(インタラクション) / オープンデザイン実践 >
Remote CHIRIMEN では PC やスマートフォンのウェブブラウザと Raspberry Pi 3 (以下 RPi3) を接続し、ブラウザ上の HTML/CSS/JavaScript だけでバーチャルなグラフィカル画面とリアルなデバイスの両方を連携させたデバイスを開発できるようにします。
W3C や CHIRIMEN のコミュニティが提案している低レベル API を使い、既存のウェブ開発の知識やツールなどをそのまま活かして簡単に IoT プロトタイピングが可能です。
CHIRIMEN とは、さまざまなモノがコンピュータネットワークで繋がる未来の社会においてもヒトは重要な存在であり、ヒトとモノがウェブを介して互いに協調しあえる環境がウェブブラウザを核として作られていくという考えの元、ウェブブラウザの JavaScript から直接モノを操作する API を実現している環境であり、そのコミュニティです。
具体的には、WebGPIO, WebI2C などモノを制御する低レベル Web API を提案し、それをウェブページで操作できるようにブラウザや Polyfill ライブラリ (と接続先のバックエンド) を開発、公開しています。詳しくは CHIRIMEN のサイト をご覧ください。
CHIRIMEN for Raspberry Pi 3 (以下 CHIRIMEN RPi3) は、CHIRIMEN の活動のうち、安価で入手性もありブラウザの動作に必要なパフォーマンスも備えた RPi3 上で CHIRIMEN の環境 (WebGPIO, WebI2C の polyfill 実装) を実装したものです。詳しくはプロジェクトのリポジトリをご覧ください。
Remote CHIRIMEN では CHIRIMEN RPi3 をベースとして、ローカルのデバイスではなくリモート接続先のデバイスを制御するようにしています。
Remote CHIRIMEN の使い方やコードの書き方は基本的に通常の CHIRIMEN RPi3 と同じです。
CHIRIMEN RPi3 では RPi3 上のブラウザからローカル Node ブリッジサーバに接続しますが、Remote CHIRIMEN では PC やスマートフォンから RPi3 の Node サーバに接続してリモートからモノを制御します。そのため最初に接続先 RPi3 を指定する必要があります。
詳しくは次のチュートリアルをご覧ください。
まずはこちらのチュートリアルを試してみてください。
PC やスマホ側のブラウザ画面で表示する HTML に A-Frame を利用することで、容易に VR の世界とリアルな世界を組み合わせてインタラクションを行うことができるようになります。
具体的には次のチュートリアルをご覧ください。
setPolyfillServerURL
でその IP アドレスを指定するよう書き換えることをお忘れ無く!関連プロジェクトなど、より詳しく知りたい方へ
Remote CHIRIMEN を使用する上でよくあるトラブルと解決策を以下にまとめます:
PC/Mac から RPi3 にネットワーク共有できない原因はいくつか考えられます。次のことを確認してください。
RPi3 の microUSB 端子に電源を供給してください。電源を入れると RPi3 ボード上の LED が光ります。様々なデバイスを接続しても電力不足になったりパフォーマンス低下しないよう、専用の 3A 対応 AC アダプタを強く推奨しますが、簡単な処理だけなら PC などの USB ポートからの電源供給でもある程度は動作します。
カードが挿されていなければ OS もサーバも起動しないので忘れないようにしてください
RPi3 の LAN ポートの LED ランプが点灯することや、ネットワーク共有する OS 側の設定画面でケーブルが繋がっていないというエラーが出ていないか確認してください。
アダプタによっては OS 標準搭載のドライバでは利用できず、ドライバのダウンロードが必要になることがあります。
RPi3 は自動的にネットワークの共有を検出して接続しますが、起動後に共有を開始した場合、すぐに上手く認識しないことがあります。その場合は RPi3 の電源を入れ直せば起動時には必ずネットワーク接続をしようとするので解決します。
例えば、慶應義塾大学の CNS や世界中の大学でローミング接続する eduroam や企業内ネットワークなど、ユーザ認証や Mac アドレス登録を行って接続するネットワークではネットワーク共有ができない場合があります。そのような場合 PC/Mac を共有可能な WiFi ネットワークに接続して RPi3 に共有するか、RPi3 と両方を同一の WiFi ネットワーク (接続端末間での通信を許可しているもの) に接続してください。
こちらのチュートリアルに従って IP アドレスを調べてください: https://hackmd.io/s/SJtZJwr0Z
RPi3 上でサーバのリセットを行ったり RPi3 の WiFi 設定を書き換えたり、i2cdetect コマンドで I2C デバイスのアドレスを確認するする場合などには RPi3 に ssh 接続して操作が必要になります。ssh が上手くいかない場合は次のことを確認してください:
raspberry
でログインできないRemote CHIRIMEN 用のイメージでは pi ユーザのパスワードを RPi3 デフォルトの raspberry
ではなく rasp
に変更しています。
ssh 192.168.2.2
のように SSH 接続しようとしたらパスワードに rasp
と入力しても Permission denied, please try again.
と表示されるRPi3 に接続するときにはユーザ名 pi
を指定する必要があります。 ssh pi@192.168.2.2
のように、RPi3 の IP アドレスの前に pi@
とユーザ名を指定して接続してください。IP アドレスとの間に空白は不要です。
SSH は初回接続時に端末のホスト ID を記録し、同じドメイン名や IP アドレスに接続するときには前回と同じホスト ID かどうか検証し、異なる場合にはこのような警告を表示して接続を中断します。
毎回同じ RPi3 ボードと SD カードイメージを利用していればこの問題は生じませんが、入れ替えてしまった場合には PC/Mac に記録されているホスト ID リストを削除する必要があります。ssh-keygen -R
コマンドで削除したいホスト名を指定してから、再度 ssh 接続してください。
ssh-keygen -R 192.168.2.2
ssh pi@192.168.2.2
ホスト ID が記録されているファイル (~/.ssh/known_hosts) から該当する行を直接削除するなどしても構いません。
サーバ側のリセットを行いたい場合は ssh ログインして _gc/srv/reset.sh
スクリプトを実行してください。
pi@raspberrypi:~ $ _gc/srv/reset.sh
info: Forever stopped process:
uid command script forever pid id logfile uptime
[0] 1Val /usr/local/bin/node srv.js 612 702 /home/pi/_gc/srv/srv.log 0:0:0:19.456
warn: --minUptime not set. Defaulting to: 1000ms
warn: --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info: Forever processing file: ./srv.js
それでも解決しない場合は電源のオンオフで再起動してください。
RPi3 が熱暴走か何かの原因で不安定になっていると考えられます。sudo reboot
もしくはそれも動作しない場合は microUSB ケーブルの抜き差しで電源をオンオフして再起動してください。
チュートリアル https://hackmd.io/s/BJAZphXRZ の手順に従ってインストールしてください。環境が汚れるのがいやな場合は brew などアンインストールできる環境でインストールをし、Remote CHIRIMEN の利用終了後にアンインストールしてください。
なお、これらのコマンドは今時の Web 開発では必ず使えるようになる必要にがある一般的なものですので、Remote CHIRIMEN に限らず Web で何かするならインストールしておいて損はありません。
本チュートリアルでは常時起動するサーバは立てません。npm run start
などの実行時のみ起動するモノで、コマンドを終了したらサーバも終了するので安心してください。
npm run start
したら アプリケーション"node"へのネットワーク受信接続を許可しますか
というダイアログが表示されるネットワーク接続を受け付けるサーバアプリケーションを初回起動時に確認されるダイアログです。許可しなければブラウザからファイルが読み込めずに動作しないので許可してください。
開発中に上手く動かないことがある場合はまず、ブラウザの開発ツールを開いてエラーコンソールのメッセージを確認してください。セキュリティ、ネットワーク、JavaScript などのエラーはすべてそこに表示されます。以下、典型的なエラーメッセージとその対応を書いているので参考にしてください。
ブラウザ上の JavaScript でハードを直接操作する WebGPIO や WebI2C API が (あたかも) 実装されているかのように API の追加を行ういわゆる polyfill スクリプトが読み込まれていない場合に表示されます。Mixed Content の読み込み許可をしているか確認してください。
手元の RPi3 の IP アドレスを調べてそのアドレスの 33330 番ポートに接続するようにしてください。例えば IP が 192.168.2.3 であれば
navigator.setPolyfillServerURL('ws://192.168.2.3:33330');
のようにします。
Firefox で HTTPS のページから RPi3 に接続しようとするときには上記のエラーがコンソールに表示されます。これは HTTPS のページ (jsfiddle など) から RPi3 のサーバ (HTTPS ではない) に接続しようとするとき、暗号化されているページに暗号化されていないスクリプトが混在することでセキュリティレベルが下がること (混在コンテンツ) を禁止するためのものです。
Firefox で混在コンテンツの実行を許可するには about:config
ページを開き security.mixed_content.block_active_content
設定値を true
から false
に切り替えてください。これは Firefox のセキュリティレベルを下げる設定となるため、Remote CHIRIMEN を利用するときだけ一時的に、もしくは開発専用のプロファイルを用意して行ってください。通常利用の Firefox の場合は必ず設定を元に戻すことをお忘れ無く!
Chrome を利用する場合も同様のセキュリティ制限がありますが、実行時にサイト単位でセキュリティ制限の解除が可能です。HTTPS の Web ページで実行したい場合は Chrome を使ってチュートリアル通りに接続許可してください。
なお、Firefox で Chrome のような特定サイトだけを対象に混在コンテンツを許可するホワイトリストを実装する予定はありません (see bug 873349)。
Chrome で HTTPS のページから RPi3 に接続しようとするときには上記のエラーがコンソールに表示されます。
これは HTTPS のページ (jsfiddle など) から RPi3 のサーバ (HTTPS ではない) に接続しようとするとき、暗号化されているページに暗号化されていないスクリプトが混在することでセキュリティレベルが下がること (混在コンテンツ) を禁止するためのものです。
アドレスバーに表示されている盾アイコンをクリックし、安全でないスクリプトを読み込む
をクリックしてセキュリティ制限を解除することで接続可能になります。詳しくはチュートリアル の手順を参照してください。
Remote CHIRIMEN に関するよくある質問です
Remote CHIRIMEN に限らず CHRIMEN RPi3 全般に言えることですが、原理的には同じモノがいろいろなボード上で動作します。但し、ボードによって提供されている OS 環境が異なること、ボード固有のピン番号の配列が異なること、パフォーマンスの違いなどがあるため、必ずしもすべてそのまま動作するわけではありません。