第1回では受光素子であるCdSを利用してGR-SAKURA側のLED発光を検知し、Arduino側で同期発光するサンプルを作成しました。
第2回以降では単純な同期だけではなく、発光/受光による通信について考えたいと思います。
システム全体像
利用する基板はGR-SAKURAとArduinoです。こちらは前回と変わりませんが送受信するデータを指示、確認するためにパソコンを追加しました。
通信を行うには
どんな通信にも言えることですが、約束事が必要です(約束事をプロトコルとも言います)。
- 開始の合図
- 通信の速さ
- データの構造
- 誤り訂正
- 終了の合図
ぱっと思いつくだけでも上記5項目がありますが、今回は複雑に考えずに1、2、3、5について定義をします。
通信プロトコル
- 普段の通信が発生していない状態(待機状態)をLED消灯とします。
- GR-SAKURAは送信データがある時にLEDを100ms発光(開始合図)します。
止まっている状態を意味するのでLEDも消灯させます。
シリアル非同期通信(または調歩同期)で言うスタートビット※1に相当します。100msもとる必要はないと思いますが、受光側がCdSであり、受光遅延があってはいけないので十分に長い時間※2をとることにしました。
※2 今回は”当たり”をつけて進めていますが、実際のシステムを組む際にはデータシートを確認の上ご検討ください。
続いてデータの送受信について検討してみます。
データを送受信するにはコード化とビットシリアル化が必要になります。かつてはパラレル通信というものもあり、シリアル化は省略できるケースもありましたが、現在はほとんどお目にかかれません。
今回のコード化にはASCIIコードを利用します(利用と言っても半角英数記号はASCIIが一般的なので、特に意識する必要はないです)。上記例ではアルファベットの「E」を送信しています。アルファベットの「E」はASCIIコード表で言うところの0x45(16進数)です。
16進数→0x45
10進数→4×16^1 + 5×16^0 = 64 + 5 = 69
2進数→0x2^7 + 1×2^6 + 0x2^5 + 0x2^4 + 0x2^3 + 1×2^2 + 0x2^1 + 1×2^0 = 01000101
EBCDICなんてコード体系もありますが余程特殊な事情が無い限り使うことはないと思います。
送信側はコード化されたデータを最上位ビット(MSB)から順番に1ビット単位で送信(1:発光/0:消灯)します。
受信側は100msの開始合図を確認すると最初の1ビットは50ms後に、以降は100ms毎にLEDの発光状態を確認します。送信は100ms間隔で発光/消灯を行うので中間地点でLEDの状態を確認するようにしました。
データは最上位ビット(MSB)から順番に送られてくるので最下位ビット(LSB)から順番にシフトしながら埋めていきます。
以上の手順で「文字データ→コード化→シリアル化→光データ→シリアル化→コード化→文字データ」の光通信を行います。
次回はこのプロトコルで通信を行うためのプログラムについて検討します。