これはなに
目に見える光を使ってデータを伝送できる、可視光通信の実験システムです。 光検出器としてコンピュータに接続された WEB カメラやスマートフォンのカメラなどを利用するため、特別な機器を必要とせずに可視光通信を体験できます。
技術的なはなし
同期シリアル通信のプロトコルである Universal Synchronous and Asynchronous Receiver/Transmitter(USART)の単純なバージョンを光で実現します。 現時点では、データビットは 8 bit、パリティビットは無し、ストップビットは 1 bit に固定されています。 画面の左側がクロック信号、右側がデータ信号に対応します。 また、電気信号のハイレベルに白が、ローレベルに黒が対応します。 例として、文字列 “MZ” を送信したときのタイムチャートを示しておきます。
![データ “MZ” を送信したときのタイムチャート](./img/timechart.webp)
通信速度はディスプレイとカメラとのフレームレートに依存します。
送信機に使われるディスプレイは少なくとも 60 Hz くらいで画面の表示を更新し、受信機で使われるカメラには 60 Hz くらいのフレームレートを要求していることから、おおよそ 30 baud くらいが通信速度の限界であると思われます。
なお、システム内部で利用しているインターバルタイマ(setInterval()
)の最小周期が 10 ms であることから、実装上の通信速度の限界は 50 baud です。
プログラム本体
使い方
送信機の使い方
送信機のページ を開きます。
通信の設定から Baud rate(ボーレート)を適当な値に設定します。 Baud rate は 1 秒間に変調を行う回数のことです。 10 くらいを指定すると通信誤りを抑えられると思います。
メッセージの設定から Message を設定します。 英数字だけでなく、漢字や仮名、絵文字を含めることもできます。 長いメッセージを送信しようとすると長い時間が掛かるため、ほどほどの長さにしておきます。
ここで受信機を準備しておきます。 受信機の準備ができたら送信するボタンを押下します。
画面が点滅してメッセージを受信機に送信します。 点滅部分の下には送信した各ビットが 0 と 1 とで表示されます。
おわりです。
受信機の使い方
受信機のページ を開きます。
カメラを開始ボタンを押下してカメラの利用を許可します。 カメラを利用できるようになるとカメラ越しの景色が表示されます。
ここで送信機の準備をしておきます。
カメラ越しの景色の中央部分に表示されている二つの「的」を送信機のそれぞれの領域に合わせた上で、受信開始ボタンを押下します。
送信機からデータを送信してもらいます。 送信機の画面の点滅を識別して、メッセージを受信します。 画面の下部分には受信した各ビットが 0 と 1 とで表示されます。
送信が完了したら受信中ボタンを押下して受信を終了します。
復号するボタンを押下するとメッセージを復号して表示します。 受信に失敗していた場合、文字化けすることがあります。
おわりです。
参考(元ネタ)
ブラウザから画面の点滅で無理矢理I2Cしてみた #shapolab pic.twitter.com/PQHOCMhLbP
— シャポコ🌵 (@shapoco) March 16, 2021