可視光通信…菓子交通神?お菓子と交通の神じゃないって

可視光通信とか眼や光にまつわるもろもろ

はやぶさ帰還企画--オカエリナサ’イ’-- その2

はやぶさ帰還・本体供養企画「オカエリナサ'イ'」 その2は、可視光通信的レーザー送り火です。※「オカエリナサイ」メッセージなどについては、その1を御覧下さい。

今回は、はやぶさ君に本当に届けとばかりに、レーザを使って変調した可視光通信メッセージを送ってみます。
(単に適当データの送りっぱなんで、可視光通信というよりは、送り火ですが・・)

(なお、Arduinoの宇宙モノ電子工作というと、・・・例えば、株式会社鳥人間さん(@hisashin)の、「世界最小衛星トラッキングシステム」とか、素晴らしいものがあります。 当ネタはそれらと比べて、大人がいちいちブログに書くネタとしてどうなの?というレベルですが、・・・・・なにとぞここは、はやぶさの帰還に免じてご容赦を。)
あくまでも、気持ちの表出の個人的儀式です。


設計方針:

  • 発信のレーザは手元にあった1mW 650nm の赤色レーザポインタ
  • 制御はAruduino Dumilanove。
    • (この間Japanino買ったばかりだけど・・・Arduinoで)
    • 理由:
      • Japaninoの電気仕様(ピンの IOH/Lとか)ちょっと調べたのですが、具体的数値がすぐにググれず、Arduinoは、ピンの電気仕様が手元にあったので。
      • あと、タイマ割り込みのMsTimerライブラリをArduinoでは使っことがあるので(Japaninoでも使えるとは思うのですが確認めんどうだったので)
  • ぶっちゃけ、可視光通信の変調方式とエンコードは適当。(まあ、儀式的送信なんで、送り火なんで・・)

ではまず、設計確認
ArduinoのデジタルI/Oピンは、1ピンあたり40mAまで引っ張れるので、レーザの電流が十分低ければ直接I/Oピン駆動いけそうです。ということで、まず測ってみました。

おお、17mA、(電源は単4二本の3V)とにかくOK。おかげで外にスイッチング回路なしで制御信号が電源そのものとして制御しちゃえそうです。
I/O出力は5Vだから、保護低抵抗でかなりざっくりと、3Vくらいまでに落とせばいいだろうと。
まあ、当家はそんなに電気工作体制ないので、電圧ドロップに使うダイオードもないし、LEDも手持ちのは全部、青か白で3.xVドロップばっかり。

なお、基板を見た限りでは、レーザポインタの基板に当然電源回路があり、容量分があって、電源とする立ち上がり速度の問題ありますが、今回は問題なしです。送り火ですから。(実際のところ、前にkbps程度までの、別のレーザモジュールの変調はやったことがありますが、その程度の速度では一般的な電源回路の立ち上がりは問題ありませんでした)


さて、それではざっくりブレッドボードに組んで動作実験

保護抵抗の動作確認。レーザの制御ポートを13pinとして、H出力して、レーザONの状態を確認。
抵抗を100Ωにしたとこで、端子電圧5Vちょい弱で、抵抗の電圧降下は1.75Vでした。つまりレーザモージュルに3.2V くらいこれでOKとしましょう。(さっきの状態で、動作電流が17mA。100Ωで1.75V降下になってるので、だいたい計算通りです。
 なお、初心者の方は定電流駆動デバイスの電圧合せに抵抗使うってのは今ひとつイマイチである理由は理解しておきましょう。ここでやっているやり方は、とりあえず動かすにはよく(私は)やっちゃいますが、かなり不安定です。)


さて、次はマイコンボード(Arduino)のプログラミング
さて、光変調においては、良い子のみんなは、よくLEDチカチカに使われる、
delay(100);
は、使ってはいけません。通信処理ですので、パルスの周期保証をちゃんとやらないといけません。割り込みを強く勧めます。
まあ、今回のはなんちゃって送信ですが・・・・ここは望ましい形でいきましょう。

その割り込みには、
#include で割り込みライブラリを使います。(ググればいろいろ出てきます)
で、設定パラメータはms単位らしいので、じゃあ、変調周波数は1msごと割り込みの、MAX1kHzまでOK。
せっかくだから、フォーマットは例えばJEITAの可視光標準に近いI-4PPMにしたいですが、・・・何せなんちゃってなので、今日のところはなし。フォーマットもへったくれもなく、文字コード直だしとします。
(あと、残念ながら、肝心の'イ’の反転は、送信の意味的にも残念ながらなし。どうせ送り火なんで、まあ、文字イメージのビットマップでもいいんですが)

ちなみに、空間光通信としては、こういう、1kHz程度の周波数でのベースバンド変調で、可視光帯で、フォトダイオードだと、ノイズ(や外乱)に弱くてやってられませんので、そのへんご注意を。
イメージセンサ通信にすれば、ノイズ、外乱耐性きわめて良好ですが、この変調やフォーマットはまあ、少なくとも我々がイメージセンサ通信でやっている方法とはかなり違います。そっちは大人の事情で解説できませのであしからず)

ちなみに、やってみて確認したところ、Arduinoの英語環境では、
hoge[] = "オカエリナサイ”
と、このように、日本語文字をふつうに書いて文字列定数配列でつっこむ、コードはUTF-8になりました。なので、’オ’(全角)のコードは3バイトの、E3h,82h,AAh となってました。
いちおう今日時点のソースは後述しますね。(いちおうあとで暇があれば、それっぽくフォーマットにするため、ヘッダと直行しない I-4PPM変調(JEITA CP-1221と同じにするつもりです。とにかく現状なんか意味のないフォーマットなんでご容赦。)
さて、いろいろな周期とか、コードでデバッグ。動作はたぶんOK。



さてそれでは工作
まず、レーザポインタのスイッチがじゃまなので、こいつを潰して常時ONにします。これは基板を見れば即、どこをショートさせればいいか一目瞭然。
そこをショートさせて常時ONにしました。

次、レーザとArduinoの接続、結局Arduinoとは2端子で抵抗を介せばよいので、端子に抵抗ハンダ付けしてArduinoのコネクタに引込、GNDはコードでピンヘッダで突っ込んで接触確保としました。


いや〜、シンプルな工作。あ〜これ、接続はいいけど、ケースにいれて屋外でクリップにつけるのどうしよう・・・ちょっと、設計が行き当たりばったり過ぎた。

ちなみに、帰還出迎えと供養ですから、後日のケーシングが終われたら、連日写真のように自在クリップでだいたいハヤブサがいるほうに向けてるつもりです。まあ、レーザなんで、一万歩ゆずってはやぶさが受信機機能あっても光軸があわないとだめなわけですが。 そして(注)イメージセンサ通信でしたら、宇宙からの都市の明かりは見えるわけですから、そのレベルの光にすれば光軸不要で、しかも同時多数、位置把握付きで通信できます。
(えっとですね「トップをねらえ」のあのシーンも、目には「オカエリナサイ」のメッセージですが、あの光の一粒一粒に、地球の人達ひとりひとりのメッセージが可視光通信で載っているのですよ。きっと)


さて、この工作が終わった時点(まだ昼間)でAR衛星アプリ「Torisat」で調べるとはやぶさは、双子座の方向、やや東よりの天頂でした。

ということで、室内でそれらしく完成の達成感を味わいたいと思い、シミュレーション?でもしてみましょう。

まず、JAXAさんのペーパークラフトをつくることとしました。
はやぶさペーパークラフト http://www.isas.jaxa.jp/j/enterp/missions/hayabusa/fun/papercraft.shtml
のページから、やや難しいバージョンをダウンロード。作りました。

できあがり。

そのへんのダンボールで残念な感じのスタンドも作りました。

それでは、擬似「オカエリナサイ」通信です。


はやぶさ君に変調レーザがあたってるのわかるでしょうか。

 ヤッター。
いつかこんなふうに可視光通信が使われるといいなぁ。

なお結局、「通信してるぞ」感がないので、1msだった変調パルス周期は50msにしました。これだと、はっきりフリッカが見えて変調してるぜ感ばりばりです。

なお、後はケーシングが終わりましたら、供養ですので、天気と機会がゆるせば、
「Torisat(衛星位置のiPhoneアプリ)ではやぶさ位置確認」→「だいたいそっち方向に向ける」というおおざっぱな作業を儀式として行います。気持ちでやります。気持ちで。

まあ、周囲に住宅もあるので、レーザとはいえ不気味な光は嫌われるのであんまり、常時運用って感じではないですが。
まず、ケーシングだな・・

**************** Arduinoコード *****************

MsTimerのサンプルコードに手を入れたものです。
あとで、もしかしたら、I-4PPM変調コード入れてそれっぽさを強化したいなぁとは思ってますが、なにせ儀式的送信なんで・・とにかく儀式的なコードですから、どんなバグが潜んでようと、いっさい感知しませんので、そのつもりでの運用をお願いします。(いくら儀式的コードとはいえ、へんなことあれば、@snobiiz とか宛でご指摘つぶやきお願いいたします。)

>||
#include
#include
//MStimer2.h ref: http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=1670sansyou

const int g_cycle = 50; //ms
//const int cycleRevise = 667; //uS hosei

const int LED = 13;

const char Header = {0, 1, 1, 1, 1, 0}; //PPM violation header
const char outStr
= "オカエリナサイ";
//coded in UTF-8 ex) オ-> E3,82,AA

const int HeadLen = 4;
const int PayloadLen = sizeof(outStr); //1 Character(7bit) is tarannsmited in 3 pulses
//const int PayloadLen = 32 * 3; //1 Character(7bit) is tarannsmited in 3 pulses

char outDat[ HeadLen + PayloadLen ];

//------------------------------------
// string encode and set Output binary Array
// A-suedo format.
// based on Inverse 4-Pulse Position Modulation.
// similer to JIETA CP-1221. without FCS.
// This is not the format of Image Sensor Communication of us!!
void encoderPut()
{
//0-3 Header
for(int i = 0; i < HeadLen; i++){
outDat[i] = Header[i];
}
//4-last Payload
for(int i = 0; i < sizeof(outStr); i++){
outDat[i+HeadLen] = outStr[i];

//Serial.println(outStr[i], HEX); //for debug
}
}


//------------------------------------
void INT_transmit()
{
static int idx;

idx = (idx+1) % (sizeof(outDat));

int output = outDat[idx];

// static boolean output = HIGH;

digitalWrite(LED, boolean( output & 1 ) );
}

//---------------------------------------
void setup() {

Serial.begin(9600); // 9600bpsでポートを開く for debug

pinMode(LED, OUTPUT);

encoderPut();

MsTimer2::set(g_cycle, INT_transmit); //Declaration of Timer INT function
MsTimer2::start();
}

void loop() {
// no use
}

|