どこでもでむ − 通信プロトコルの作り方(その1)
こんにちは、中の人CHOです。
今回は、無線の通信プロトコルの作り方について説明したいと思います。
その前に、予備知識として簡単ですが無線について少々ご理解していただきたいことがあります。無線詳しい方はその2へ飛ばしてもらってかまいません。
たとえば、AからBに通信したいときは、1直線で電波が届いていると思ってません?自分はサーキットデザインに入る前はそう思ってました。
A送信! ------------------> B受信!
実際直接伝わる電波もあるんのですが、実は上下左右、リンゴのように電波が伝わっていきます。
アンテナによっては指向性を持たせることもできるのですが、だいたい↑こんな感じで360度全周に出ています。
そして、電波は反射したり曲がったりしながら、障害物があるとドンドンと弱くなっていきます。あまりにも弱くなると受信できなくなるのです。送信の出力を強くすればいいのですが、出力は電波法で決まっているので規定以上で出力したら違法で捕まります。
見通しが良ければ、かなり遠くまで届きます。これをフレネルゾーンの確保といいます。また電波というぐらいなので、周りに電気的なノイズがあれば、受信できなくなります。ノイズがひどい時は送信もできません。日本の電波法により、送信前に誰か使ってないか確認してから送信するようにしているからです。これをキャリアセンスと呼んでいます。
電波は公共のもので厳密に管理されています。それでも守ってない人もいるので、FMやAMラジオ聞いているとノイズが入ったことがありませんか?あれは近くに違法な電波を出している機器があるからです。電波法を守って、他に迷惑をかけないことが自分にとってもいいことなのです。
ちょっと昔だと携帯電話を持っていたらコンピューターが暴走したとか、病院では電子機器特に携帯電話使うなというのは、こういった電波が悪さをするのが原因です。
ちなみに山影にはいるとラジオが聞こえにくくなるのは、電波が届かないだけです。なのでアンテナは高く周りに障害物がないところに設置しろと言われるわけです。
有名LPWAが使っている920MHzにしても、サーキットデザインが良く使っている429MHzにしても、免許がいらないので色々な人が使います。色々な通信機とプロトコルがひしめき合う、まさしく公共の場なのです。
そして通信機が多くなればなるほど、電波の衝突が発生します。日本では送信前にキャリアセンスを行いますが、同時に発信した場合はわからないので結果的に衝突し通信できなくなります。SigFoxだと同じデータをチャネルをランダムに変えながら送信したり、ELTRES🄬だと同じデータを3回送信したりして、ノイズや妨害をよける仕組みを入れています。
サーキットデザインのモデムには環境のノイズを測定する機能と、受信したパケットの強度を測定する機能が入っています。その値を見て、環境のノイズが低くなるチャネルや場所を選んだり、受信したパケットの強いところに設置してネットワークを構築することをお勧めしております。
やっかいな問題として隠れ端末問題というのがあります。下記図の左のようにAとBで通信している間は問題ありません。隠れ端末は右側のようにBの通信圏内にCが現れた場合です。AとCは離れているのでお互いは認識できません。なのでAとCは同時にBに対して通信しようとします。しかしBは同時には受信できないので、AとCの通信はできなくなります。そんな簡単にぶつかるわけないと思うかもしれませんが、ちょうど1時に通信しようと設計したりすると、正確に動けば動くほどぶつかります。身近な例だとWiFiなんかはこんな状態です。展示会とか多くの人があつまるところで通信ができなくなるのはこんな現象が発生しています。
それと通信圏内で活動できる端末数を収容台数といいます。上記はまだABCと3台ですが、通信圏内に数十台は置きたい場合もあります。収容台数は多ければ多いほど良いと思いますが、LPWAの高性能ゆえに多くできないのです。
最近のLPWAは見通しであればとても遠くまで電波が届きます。「電波が届く」という表現をしていますが、厳密には弱い電波でも受信できるようになったのがLPWAの良いところです。出力は電波法で決まっているので規定以上の強い電波は出せません。遠くになったり、障害物があって弱くなった電波を受信できるようになったのです。
つまり通信到達距離の半径が長くなるということです。通信中はその半径に入る端末は通信できません。キャリアセンスがあるからです。たとえば、LoRa🄬ですと見通し半径20Kmは通信できなくなると思ってください。しかも通信速度は数百bpsです。ちょっとしたデータを送るだけでも1,2秒かかります。
隠れ端末問題を解決する方法としてCSMA/CAがあります。送信する前にキャリアセンスして送信する前にランダム待ち時間を入れる手法です。実は、この機能はSLR/MLRの機能として実装されています。ただこれを解決してもさらし端末問題という別の問題が出てきて、なかなかいい解決方法がないのが現状です。
これらは同じチャネルでの通信の話なので、別のチャネルを使えばいいのですが、別の問題もあったりします。
少々長くなってきたので、その2に続きます。