いわゆる知識人、コンサルタントの中に、IoTをやるならRaspberryPiみたいなことを言っている人が居るが、そういう安易な考えだと爆死する・・・もし、そのレベルの理解力でIoT案件関わろうとしていたら、絶対逃げろ!という根拠をこれから書いていく。
■センサーからサーバーまでのつなぎ方
IoTの開発手順-従来開発との違い
http://blog.goo.ne.jp/xmldtp/e/5c5a4246be99188526a224c1ea75efdb
の(4)入出力インターフェースの決定(有線、無線?)に当たるところの話。
センサーからサーバーまでをどうつなぐか・・・
クラウドだと、おうちのセンサーからAmazonのデータセンターまで、何百キロも線をつなぐことは、現実的には出来ない。そこで、どこかで無線の処理が入る。
ここで、クラウドにセンサーデータを上げるコンピューターを「ゲートウェイ」とよぼう。
すると、2通りの方法が考えられる(細かく分けると3とおり)
![]()
ゲートウェイに直接センサーをつなげてしまい、その値をインターネット経由でクラウドに送る
この考え方は、よさそうだけど、課題が結構多い
【課題】
(1)センサーから直接線でつないでしまうと、ある一定以上の長さで
電気が通らなくなり、センサー値が読めなくなる。
電線には抵抗があるので、長くすると、電線の抵抗が大きすぎ、
電気が流れなくなる。電気が流れないと、センサーは使えない
(2)ゲートウェイをPCにしてしまうと、センサーとつなげない。
PCの口はUSBとかだけど、センサーはUSBでつなげるのではなく、
ただの線で、それをGPIOとかにつなげるしくみになっている。
なので、センサーはPCにそのままでは使ない。
そこで、RaspberryPiの登場といいたいところだが。。。
(3)RaspberryPiは、GPIOの口をたくさん持っている。たしかに。
でも、GPIOは、デジタル入力はOKだけど、アナログ入力直接はX
なんらかの変換がいる・・・
ということで、変換するくらいならということで、
![]()
センサーとゲートウェイの間を無線で結ぶ。無線を送受信するものをRFモジュールという。
RFモジュールに直接センサーをつけても構わない
![]()
(この場合、親機で子機の状態を取得するように指示する)
が、子機のRFモジュールとセンサーの間に処理プロセッサ(ここでは「エンド処理」とした)
を置くと、受け取ったセンサー内容を処理加工して送信できるので、自由度が増す。
これにより、先ほどの課題は、
(1)は、解決した。センサー、エンド処理プロセッサ。RFモジュール間をできるだけ
短くし、ゲートウェイには無線で送ればよい
(2)(3)エンド処理プロセッサをArduinoにすれば、アナログもGPIOもいける
というふうに、解決する。
■UART
そうすると、ここで新たな疑問が出てくる
【課題】
(4)ArduinoとRFモジュール、RFモジュールとゲートウェイ間は、
何でつなげばいいのか
(5)RFモジュール間は、どの周波数帯で、どのプロトコルを使えばいいのか
ここで、(5)は、ZigBee,Wifi,BLE,920MHz特小(プロトコルは固有の場合あり)が考えられる。
そして、(4)は、ZigBee,920MHz特小などのRFモジュールの場合、UART接続が
多い気がする。
UARTとは
・シリアル通信を行うのだが、シリアルの端子ではなく、USB端子で接続できるように
するもの
・実際には、ATコマンドを書き出し、それをRFモジュールで送信する。
なので、
方式2-1の場合には、
・GPIOやアナログ入力で繋がっているセンサーの値をArduinoが読み込み、
適切に処理し、ATコマンドをシリアルへ書き込むことにより
・UART経由でRFモジュールからセンサー値が親機に伝わり、
・親機は、RFモジュールからUART経由で何か受け取る
ことになり、
方式2-2の場合には、
・親機は、子機のデータを読み込むようにUART経由でRFモジュールに書き出し
・RFモジュールはそれを子機に伝え
・子機のRFモジュールは自分に繋がっているセンサーから値を読み込み
・親機に返す
ことになる。
よって、親機をRaspberry Piにすると(子機のエンドをRaspberry Piにできないのは、
(3)で書いた)Raspberry PiとRFモジュールをUART接続することになる。
これはRaspberry Pi2はできる。
しかし、今売られているRaspberry Pi3でこれをしようとすると・・・
Raspberry Pi3 のシリアルコンソールで通信速度が合わない
http://qiita.com/komeda-shinji/items/03546ae1014c6b4edc92
や
Raspberry Pi 3 Model Bでシリアル通信で接続してコンソールにログインする方法
http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_uart_tips/
に書かれているように、単純ではない。で・・・
■Wifi
では、(5)でZigBeeでなく、Wifiを選ぶとどうなるか
Wifiを選ぶと、親機側のRFモジュールは、Wifiのアクセスポイントでよい
(子機からWifiで通信を送るのだから)
となると、PCがあれば、PCをアクセスポイントにすれば
【AP】Windows7/8/8.1を無線親機にしてWi-Fiを飛ばす!?
http://ahiru8usagi.hatenablog.com/entry/Windows7_8_8.1_Wi-Fi
PC1台で、RFモジュール~ゲートウェイ~インターネットにいく。
Raspberry Piはいらない。
子機側もArduinoでいい(3)の理由でRaspberryPiはむかない。
つまり、Wifiを選ぶと、RaspberryPiは要らない。
ということで、IoTをやる場合、Raspberry Piは要らなかったり、
むしろ、難しかったりする。
Raspberry Piを使うのは、自作でなにかをする人にとってはいいけど、
IoTのお仕事で使うのに、本当にいいのかはぎもん・・・
なので「IoT、はいRaspberryPiつかって・・・」みたいな、その程度の
考えで取り組むと、爆死する。
■センサーからサーバーまでのつなぎ方
IoTの開発手順-従来開発との違い
http://blog.goo.ne.jp/xmldtp/e/5c5a4246be99188526a224c1ea75efdb
の(4)入出力インターフェースの決定(有線、無線?)に当たるところの話。
センサーからサーバーまでをどうつなぐか・・・
クラウドだと、おうちのセンサーからAmazonのデータセンターまで、何百キロも線をつなぐことは、現実的には出来ない。そこで、どこかで無線の処理が入る。
ここで、クラウドにセンサーデータを上げるコンピューターを「ゲートウェイ」とよぼう。
すると、2通りの方法が考えられる(細かく分けると3とおり)

ゲートウェイに直接センサーをつなげてしまい、その値をインターネット経由でクラウドに送る
この考え方は、よさそうだけど、課題が結構多い
【課題】
(1)センサーから直接線でつないでしまうと、ある一定以上の長さで
電気が通らなくなり、センサー値が読めなくなる。
電線には抵抗があるので、長くすると、電線の抵抗が大きすぎ、
電気が流れなくなる。電気が流れないと、センサーは使えない
(2)ゲートウェイをPCにしてしまうと、センサーとつなげない。
PCの口はUSBとかだけど、センサーはUSBでつなげるのではなく、
ただの線で、それをGPIOとかにつなげるしくみになっている。
なので、センサーはPCにそのままでは使ない。
そこで、RaspberryPiの登場といいたいところだが。。。
(3)RaspberryPiは、GPIOの口をたくさん持っている。たしかに。
でも、GPIOは、デジタル入力はOKだけど、アナログ入力直接はX
なんらかの変換がいる・・・
ということで、変換するくらいならということで、

センサーとゲートウェイの間を無線で結ぶ。無線を送受信するものをRFモジュールという。
RFモジュールに直接センサーをつけても構わない

(この場合、親機で子機の状態を取得するように指示する)
が、子機のRFモジュールとセンサーの間に処理プロセッサ(ここでは「エンド処理」とした)
を置くと、受け取ったセンサー内容を処理加工して送信できるので、自由度が増す。
これにより、先ほどの課題は、
(1)は、解決した。センサー、エンド処理プロセッサ。RFモジュール間をできるだけ
短くし、ゲートウェイには無線で送ればよい
(2)(3)エンド処理プロセッサをArduinoにすれば、アナログもGPIOもいける
というふうに、解決する。
■UART
そうすると、ここで新たな疑問が出てくる
【課題】
(4)ArduinoとRFモジュール、RFモジュールとゲートウェイ間は、
何でつなげばいいのか
(5)RFモジュール間は、どの周波数帯で、どのプロトコルを使えばいいのか
ここで、(5)は、ZigBee,Wifi,BLE,920MHz特小(プロトコルは固有の場合あり)が考えられる。
そして、(4)は、ZigBee,920MHz特小などのRFモジュールの場合、UART接続が
多い気がする。
UARTとは
・シリアル通信を行うのだが、シリアルの端子ではなく、USB端子で接続できるように
するもの
・実際には、ATコマンドを書き出し、それをRFモジュールで送信する。
なので、
方式2-1の場合には、
・GPIOやアナログ入力で繋がっているセンサーの値をArduinoが読み込み、
適切に処理し、ATコマンドをシリアルへ書き込むことにより
・UART経由でRFモジュールからセンサー値が親機に伝わり、
・親機は、RFモジュールからUART経由で何か受け取る
ことになり、
方式2-2の場合には、
・親機は、子機のデータを読み込むようにUART経由でRFモジュールに書き出し
・RFモジュールはそれを子機に伝え
・子機のRFモジュールは自分に繋がっているセンサーから値を読み込み
・親機に返す
ことになる。
よって、親機をRaspberry Piにすると(子機のエンドをRaspberry Piにできないのは、
(3)で書いた)Raspberry PiとRFモジュールをUART接続することになる。
これはRaspberry Pi2はできる。
しかし、今売られているRaspberry Pi3でこれをしようとすると・・・
Raspberry Pi3 のシリアルコンソールで通信速度が合わない
http://qiita.com/komeda-shinji/items/03546ae1014c6b4edc92
や
Raspberry Pi 3 Model Bでシリアル通信で接続してコンソールにログインする方法
http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_uart_tips/
に書かれているように、単純ではない。で・・・
■Wifi
では、(5)でZigBeeでなく、Wifiを選ぶとどうなるか
Wifiを選ぶと、親機側のRFモジュールは、Wifiのアクセスポイントでよい
(子機からWifiで通信を送るのだから)
となると、PCがあれば、PCをアクセスポイントにすれば
【AP】Windows7/8/8.1を無線親機にしてWi-Fiを飛ばす!?
http://ahiru8usagi.hatenablog.com/entry/Windows7_8_8.1_Wi-Fi
PC1台で、RFモジュール~ゲートウェイ~インターネットにいく。
Raspberry Piはいらない。
子機側もArduinoでいい(3)の理由でRaspberryPiはむかない。
つまり、Wifiを選ぶと、RaspberryPiは要らない。
ということで、IoTをやる場合、Raspberry Piは要らなかったり、
むしろ、難しかったりする。
Raspberry Piを使うのは、自作でなにかをする人にとってはいいけど、
IoTのお仕事で使うのに、本当にいいのかはぎもん・・・
なので「IoT、はいRaspberryPiつかって・・・」みたいな、その程度の
考えで取り組むと、爆死する。