atali Blog

Loading

スマホ102台を同期したサイネージウォール – LINE DEVELOPER DAY 2019

スマートフォン102個を同期した、インタラクティブサイネージの開発

こんにちは、開発の樋口です。
昨年開催されたLINE DEVELOPER DAY 2019のサイネージウォールの開発について書こうと思います 。

写真のように壁にスマートフォンを102個を貼り付けて一つの大きな画面のように見せるデジタルサイネージです。

全ての端末が綺麗に同期することで成り立つコンテンツですが…
同期と聞くと皆さんどのような方法を思いつかれるでしょうか?

おそらく真っ先に思いつくのがネットワーク通信による同期だと思いますが、ネットワークを一切使わないで同期する方法をご紹介したいと思います。

今回のコンテンツの場合、予め決められたコンテンツを同期再生するという事でしたので、まず、単純な時刻での同期を考えました。
この方法の場合、各端末に正確な時刻を設定する必要がでてくるのですが、当初、時刻合わせにスマートフォンの自動時刻合わせ機能を使う方法で実現できると考えていました。
が…
実際に試してみると全然使えない!
そう、思っていたよりズレているのです!

ズレているといっても生活で必要な時刻の精度は出てはいるのですが、今回欲しいのはmsレベルの完全な時刻の一致。
各端末は60FPSで描画されているので許容できる時計の誤差は約16.6msになり、検証した所、NTPサーバで正確な時刻を設定しようとしても100台を超える端末を数十ms以内の誤差に収める事は到底できない状況でした。

なので、少し手間はかかりますが全ての端末の自動時刻補正を切り、手動で時刻を補正するような仕組みを入れ…
これで開発終了!の予定でした…
が、テストで数時間流していると微妙にズレてる!
予想以上に発振器(※1)に個体差があることが判明しました。
これでイベント中の朝から夜まで同期することは困難になりました。

そこで何か良い同期方法が無いか考えていたところ、
スマートフォンに元々付いているカメラを使って同期することを閃きました
具体的にどうしたかというと…

前面についているカメラにフラッシュを当て、その光をトリガーにして同期をするというものです。
イメージデバイスが受けた光を読み取り、それを同一時刻として同期すれば完璧に同期できると思ったのです。
ただ、カメラのイメージ取得にかかる時間に個体差があるとこの手法はとれません。
テストした結果、幸いも許容できる誤差でイメージが取得できました。

これで万事解決かと思い実装しました。
が…今回は手ごわく
実はテストをしていると別の問題が浮上しました。
102台を同時に同期しようとするとどうしても数台反応しない物が出てきました。
そうです、原因はローリングシャッター(※2)の影響です。

光をトリガーとして使うので、一眼レフ用のストロボを使用してみたのですが
強い光量がある代わりに閃光時間がとても短く、CMOSセンサーが取りこぼす事がありました。
ストロボの閃光時間が1/60より長ければ問題は無いのですが、その様な要件を満たす製品も一般的には無く、
撮影用のライトを使う事で(ストロボと比べ光量が足りず苦労しましたが)何とか期待する動作を実現する事ができました。

今回は、光とカメラを同期に使いましたが、多端末を簡単にコントロールする手法としてネットワーク以外の方法もあるという事例の紹介でした。

同期以外にも発光色を変更したりする事により、例えばインタラクティブな操作などにも利用することが出来ると思います。

興味がありましたらご連絡おまちしています。

contact@atali.jp

※1
水晶振動子など正確なタイミングを計るための部材

※2
撮像素子であるCMOSセンサーからラインごとに露光し順次読み出しする方式の事。
水平1ライン毎に順次読み込むので同時に全画素を読み出すことが出来ない。
ストロボを発光してもストロボが反映されている部分とそうでない部分が出来てしまう。

Related article