Raspberry Piで可視光通信器を作る #1
概要
Raspberry Piのカメラでローリングシャッター現象を捉えてみる.
Raspberry Piのカメラは思ったよりも細かい設定が可能であるため,可視光通信デバイスに応用が容易であると考えた.
可視光通信の受信方法にはカメラのローリングシャッター現象を応用した手法がある.身近なRaspberry Piにて可視光通信の受信機としての実装を検討する.
結論
Raspberry Piのカメラを用いて,LEDの高速点滅を一枚の画像として撮影することができた.
実行したこと
実行環境
【受信機側】
- raspberry pi 3 model b+(初期設定完了済み)
- For raspberry pi カメラモジュール
【送信機側】
- Arduino(SainSmart)
- 赤色LED 5mm
- LEDキャップ
手法
ローリングシャッター現象とは
カメラ用語の一つである.
電子シャッターで動く被写体を撮る場合,センサーからデータを読み込む速度よりも被写体の動きが早いと,被写体の形が歪んで写ってしまう現象のことを指す*1
あまり聞き慣れない用語ではあるが,私達が持っているスマートフォンカメラでこの現象を撮影することは可能である.
例として
のサイトなどがイメージしやすい.
スマートフォンカメラの多くは「電子シャッター」方式で,カメラのセンサーは「CMOSセンサー」が多いため,ローリングシャッター現象は必然的に発生する.
電子シャッターとは,センサーのチップだけでカメラの露出を制御する仕組みである.電子的にセンサーの画素ごとに光を貯めることができる.そのため,従来のような機械的なシャッターが不要になり,スマートフォンカメラのような小型で薄いカメラが浸透してきた.
CMOS(Complementary Metal Oxide Semiconductor)センサーとは従来のCCDセンサーと比較して,安価で低消費電力というメリットが有る.一方で,電子シャッターをする際は,CCDセンサーでは全画素をいっぺんに動作させることができる(グローバルシャッターと呼ばれる)が,CMOSセンサーでは1画素1画素順番に電子シャッターを動作させる(ローリングシャッター)必要がある.これにより,処理を開始したが外処理の最後の画素との間に,時間差が生じる.
結果,被写体を撮ったときに歪みが生じることにつながる.
グローバルシャッターとローリングシャッターの違いはこちらのサイト
が詳しい.
CMOSセンサーの構造はこちらのサイト
が詳しい.
可視光通信におけるローリングシャッター
先の説明では,CMOSセンサーは歪が生じやすいデメリットを持つかのようになっていたが,普段の生活で撮影する分には,全く気にならないものである.また,CMOSセンサー搭載のスマートフォンカメラは年々性能向上が凄まじく,私達は十分に満足して利用しているはずである.
一方,このローリングシャッター現象をエンジニアリングにおいて応用しようという取り組みが可視光通信界隈である.
可視光通信とは,光を用いた通信方法である.身の回りにある光での通信といえば,テレビのリモコンなどに用いられている赤外線通信があるが,可視光通信は目に見える光で通信をする.身の回りの照明が送信機となるイメージである.原理的には,照明を高速に点滅させて,オンオフを認識するというシンプルなものである.
光のオンオフを認識する方法は大きく分けて,カメラとフォトダイオードの2つがある.フォトダイオードは光が当たると電気信号に変換するデバイスである.カメラはフォトダイオードの集合体とも言える.フォトダイオード単体で利用する場合は,光の明滅を非常に高速に捉えることができるメリットが有る.カメラでは,フレームレートで表現されるように,1秒あたりの処理枚数がボトルネックとなる.可視光通信におけるスループットは基本的に受信機の処理速度に対応しているため,高速通信を目指そうとした場合,カメラは対応が困難になる.
しかし,可視光通信とカメラの汎用性はスマートフォンカメラが浸透してきた近年非常に高い.よって,カメラを用いた可視光通信の研究が盛んになっている.はじめこそ,送信機の光源の数を増やしたり,受信機のカメラを高性能にした研究が多かったものの,CMOSカメラのローリングシャッター現象を用いた研究が出てきてから,方向性が広がったと言える*2
可視光通信に限らず,通信方式の提案というものは,送信機,受信機,双方の普及が課題となることが多いが,可視光通信においては,送信機は身の回りのLED光源が潤沢にある一方,受信機がなかったことが課題だった.それが,ローリングシャッター現象を用いた手法によって,安価なカメラが適用できることになったのである.
手順
さて,論文ではいくつかローリングシャッター現象を用いた可視光通信機があるが,これらをRaspberry Piで実装していくことを目指している.
ハードウェア準備
【受信機】
raspberry pi 3 model b+に専用カメラモジュールを搭載した.
【送信機】
Arduino UNOでLチカをさせる.
用意したのは,お手製のLEDシールドである.LEDキャップを付けることで点滅を拡散させている.
送受信機の位置関係はだいぶ近づけている.
これは,ローリングシャッター現象を利用するには,LED光源そのものを撮影しなければならないためである.カメラのズームレンズなどを用いれば,通信距離の改善はできるはずである.
プログラム
作成したプログラムはこちら.
【受信機】
Raspberry Pi側でターミナルを表示し,下記のコマンドを実行する.
キーポイントはraspistill -ssである.
-ssでシャッタースピードを指定できる(こちらのサイトのコマンド集を参考にした).下記では100マイクロ秒で設定している.
$ sudo raspistill -ss 100 -o image.jpg
【送信機】
まずは,オンオフをさせるだけとする.
キーポイントはオンオフの点滅間隔時間である.下記の例では500マイクロ秒にしている.
#define LED 11#define H HIGH#define L LOWint val =500;//点滅間隔時間 [μs]void setup(){pinMode(LED,OUTPUT);}
void loop(){digitalWrite(LED,L);delayMicroseconds(val);digitalWrite(LED,H);delayMicroseconds(val);}
実験
上記設定で撮影した画像はこちらになる.
LED光源の丸い形の中に,ストライプ状に赤色の線が見える.
これこそ,ローリングシャッター現象によって,捉えられるものである.この例では,上から順にシャッターを動作させていく間に,LEDの点滅がオンオフしていることを表している.
Lチカを一枚の画像で捉えているとも言える.
ここまで鮮明にオンオフがわかると,一枚の画像で情報を埋め込めることが可能になる.この例では,おおよそ30個のオンオフが写っている.
これを連続で撮影できれば,カメラから情報を復号できるというわけである.
安定してこの画像を撮影するためには,送受信機での設定が重要であることがわかる.送信機側では点滅間隔時間,受信機側ではシャッタースピードによって写り方が変わるためである.
試しに,シャッタースピードを変えて撮影してみる.
シャッタースピードが大きくなるにつれて,ローリングシャッター現象の効果が薄れ,LED光源そのものが写るようになる.
あとがき
長らくカメラで可視光通信を実装したいと考えていたが,シャッタースピードを制御できるカメラに思い当たりがなかった.研究論文を探しても,高価なカメラばかりでとても参考にならず,スマートフォンカメラのAndroidアプリで工夫することも途方もなく感じていた.
Raspberry PiでもUSBカメラを試していたが,どうもシャッタースピードまでは制御できないようである.しかし,Raspberry Pi専用カメラモジュールが制御可能であることを,つい最近気づいた.特段,最近の技術ではないものであるので,自分の情報の探し方の視野の狭さに辟易する.
これで,ようやく準備ができたので,次は画像解析によって情報を取り出すことを目指す.ストライプ状の画像なので,信号波形に変換することは容易である.
一方で,可視光通信デバイスとしてのコントロールには多くの課題がある.まずは,どうやって鮮明な画像を安定して撮影するかである.これには,シャッタースピードと点滅間隔時間の関係性を見出す必要がある.
人間の目では,今回の通信距離,点滅間隔時間ではシャッタースピード50~200 [μs]あたりが鮮明にオンオフを撮影できていると考えられるが,画像処理に応じてこのあたりはフィードバックで調整することが望ましいだろう.
また,通信距離は今回1cm未満という通信距離とは言えない超近距離での実験であったため,受信機側のズームレンズによる改良が必須となるだろう.
とはいえ,まずは,情報を画像から取り出し,簡単な送受信が可能になるまでを目指す.
参考
上記リンクのサイトを始め,多くの文献を参考にさせていただいた.