M5Stack:光通信

デイリーポータルZの記事に感動しました。まずはこちらをお読みください!

デイリーポータルZ:光るLEDバッジを売ったら予想以上に反響があった
http://portal.nifty.com/kiji/181002204071_1.htm

ハードウェアからソフトウェアまで、企画から製作販売まで、すべて網羅したすごい記事。


そして、この記事の中で使われてる、画面の光を使った非接触通信方法…!これはカッコイイ!

もー、これは、自分でもやってみたくなりました。画面の明るさでON / OFFを検出するので単純な明るさセンサーがあればできそうです。

そういえば、この前に買ったELEGOOキットの中に、明るさを検出するフォトセルが…

あった!

フォトセル、フォトレジスタともいいますね。明るさによって抵抗値が変わる部品です。

電子ブロック世代にはCdS(カドミウムセル)の方がなじみがあるでしょうか。電子ブロックEX-120以上に付属していたパーツでした。


回路を組んでM5Stackと接続。

回路というほどの物でもないけども…。

M5Stack側の入力ポートは35番。アナログ入力です。

受信プログラム。

pin = machine.ADC(machine.Pin(35, machine.Pin.IN))

で、ピン35番をアナログ入力に設定。

pin.atten(machine.ADC.ATTN_11DB)

で、attenuationを11dBに設定。attenuationの設定は、意味がよくわからないままやってます…。こちらを参考にしました。

いっぺーちゃんの いろいろやってみよ~:micropython on ESP32 でADC
http://ippei8jp.hatenablog.jp/entry/2017/08/25/054133

M5Stackでアナログ入力を使うと、スピーカーから雑音が出てしまうようなので対策。

dac = machine.DAC(machine.Pin(25))
dac.write(0)

t-yosh’s blog:M5Stack analogRead() ノイズ問題(20180407解決)
http://t-yosh.hatenablog.com/entry/2017/12/28/235947

後は、

value = pin.read()

これで読み取った値を使ってON/OFF判定します。1秒ごとに、ONの時は画面に「1」を、OFFの時は「0」を表示するようにしました。

フォトセルを光るものに近づけたり手で光を遮ったりすると、値の動きはだいたい下200~上1200だったので、ONとOFFの閾値は600にしました。(てきとう)


データ送信側は、M5Stack FIRE を用いました。画面を1秒ごとに「白」「黒」にする単純なプログラムです。

動作は1秒ごとですが、画面塗りつぶしの時間を考慮して、sleep は 800ミリ秒。

フォトセルを画面にくっつける感じで…。

通信できた!それぞれが約1秒ごとに勝手に動作してるだけで同期を取ってるわけではないので、しばらくするとズレが発生してきます。ひとまず、画面読み取って値取得することは可能でした!


そういえば、フォトセルは2個あったような…。

2PCS。2個ありました!2個使って、片方を同期用に使ってみます!

同じような回路をもう一つ追加。

プログラムです。

35番ピンと36番ピンの2つを使用します。

dataPin = machine.ADC(machine.Pin(36, machine.Pin.IN))
syncPin = machine.ADC(machine.Pin(35, machine.Pin.IN))

同期ピンは、600を下回ったらOFF、900を上回ったらONという判定にしました。

動作は、

  1. 同期ピンがONになるのを待つ
  2. データピンの値を読む。
  3. 同期ピンがOFFになるのを待つ
  4. くりかえし

という感じです。結果の表示は、画面に 8 x 8 で出すようにしました。


送信側です。前回は1秒ごとの点滅を繰り返してただけですが、今回は、ちゃんと光るタイミングを制御する必要があります。

Aボタン押したら、5秒後にカウントダウンしてスタートするようにしました。(同期通信のため、ではなくて単に動画撮影しやすくするための処理です…。)

転送するデータは、LEDバッジの記事が使ってたのと同じ「ニコニコマーク」にしました。

画面表示する箇所は2か所。データ用と同期用です。ONの時に、該当箇所に白い四角を表示します。

処理の流れはこちら。

  1. データを表示(ON or OFF)
  2. 同期表示をON
  3. 100ms待つ
  4. 同期表示をOFF
  5. 100ms待つ
  6. くりかえし

これで、同期表示がON状態の時に、読み取り側がデータを読み取ります。(動画を見てもらうと分かりやすいです)

100ms+100ms = 200ms で1ビットデータ転送になります。1秒間で5ビット。1バイト(8ビット)転送に1.6秒かかりますね。


ということで、セッティング。

画面上の光る位置と、フォトセルの位置を合わせます。

おおおー。バッチリ!