Intel EdisonでGR001とRS485で通信

1.今回の目標
-
Intel EdisonでGR001とRS485で通信する.
-
複数の構成が考えられるので代表的なものを試す.
-
できれば通信時間等の比較をしてみる.
2.実施する構成
-
USB-RS232C変換ケーブル + RS232C-RS485変換コネクタを使用する
-
USB-RS485変換コネクタを使用する
-
RS232C-RS485変換ICを使用する.
*通信速度は115200[bps]で行います.
3.想定する環境
break out board
- henry board
OS
- ubilinux + xenomai3.0.0
library
- cmake
- cmake-ncurses-gui
4.コードのビルドと実行
全身のサーボの目標角度の更新と現在角度の取得を繰り返し行い。
その間に消費される時間を測定します.
1 |
> mkdir work |
4.実施形態
4.1 実施形態1 (USB-RS232C + RS232C-RS485)
1 |
+--------+ USB +------------+ RS232C +------------+ RS485 +-------+ |

4.1.1 サーボON中の現在角度取得 (Echo:On)
- 1軸あたり約3.0[msec]
1 |
file open : /dev/ttyUSB0 |
4.1.1 サーボON中の現在角度取得 (Echo:Off)
- 1軸あたり約3.0[msec], Echoなしとあまり変わらない。
1 |
file open : /dev/ttyUSB0 |
4.1.2 目標角度更新+現在角度取得 (Echo:On)
- 1回あたり約2200[msec],遅い…
1 |
root@ubilinux:/home/kasai/rsx/build# ./sample/rsx_latency_test ttyUSB 0 |
4.1.2 目標角度更新+現在角度取得 (Echo:Off)
- 1回あたり約66[msec], Echoなしとだいぶ変わる.
1 |
root@ubilinux:/home/kasai/rsx/build# ./sample/rsx_latency_test ttyUSB 0 |
4.2 実施形態2 (USB-RS485)
1 |
+--------+ USB +----------+ RS485 +-------+ |

4.2.0 実施形態2 (USB-RS485) 準備
- 今回使用する変換コネクタはCH340+MAX485の構成なので,ch341なドライバが必要.
- Edison標準のLinuxイメージにはこれがないのでドライバの導入が必要.
- 標準でサポートしているのでカーネルコンフィグをいじってドライバをビルドする.参考
- インストール場所はこんな感じ
1 |
hroot@ubilinux:home/kasai/rsx/build# find /lib/modules/3.10.17-yocto-standard | grep ch341.ko$ |
- ドライバをロードすると/dev/ttyUSB*として認識する
1 |
root@ubilinux:/home/kasai/rsx/build# dmesg | grep ch341 |
4.2.1 サーボON中の現在角度取得 (Echo:Off)
- 1軸あたり4.0-5.0[msec]程度の時間が消費されるようです.
- ばらつきがあります.
1 |
file open : /dev/ttyUSB0 |
4.2.2 目標角度更新+現在角度取得 (Echo:Off)
- 1軸あたり100[msec]程度の時間が消費されるようです.
1 |
root@ubilinux:/home/kasai/rsx/build# ./sample/rsx_latency_test ttyUSB 0 |
4.3 実施形態3 (RS232C-RS485)
1 |
+--------+ uart +------------+ RS485 +-------+ |


フリスクケースあり (左)
フリスクケースなし (右)
4.3 実施形態2´ (RS232C-RS485)
1 |
+--------+ |

=>

4.3.0 uart <-> RS485 変換IC</->
ISL32603E
-半二重通信用のICで1.8[V]で駆動.256~460[Kbps]までいける.
(※ 保証はできませんが私の環境では115[Kbps]でも動作しました.).
-パッケージはSOIC(1.27[mm])もしくはMSOP(0.5[mm])になるので表面実装が必要.
[1]
[2]
[3]
[1] http://www.incom.co.jp/var/assets/storage/images/companies/node_1664/product/node_118235/1662980-2-jpn-JP/RS-485-ISL3260x_square250.jpg
[2] http://www.eleki-jack.com/KitsandKids2/assets_c/2010/11/LTSP20620020-thumb-400x493.jpg
[3] http://akizukidenshi.com/img/goods/L/P-06863.jpg
購入場所
mouser
or
digikey
仕様書
4.3.1 サーボON中の現在角度取得
- 1軸あたり2.5[msec]程度の時間が消費されるようです.
1 |
file open : /dev/ttyMFD1 |
4.3.2 目標角度更新+現在角度取得
- 1回あたり57[msec]程度の時間が消費されるようです.
1 |
root@ubilinux:/home/kasai/rsx/build# ./sample/rsx_latency_test ttyMFD 1 |
5 結果まとめ
| USB-RS232-RS485 | USB-RS485 | uart-RS232-RS485 | |
|---|---|---|---|
| 現在角度取得 | 3.0[msec] | 4-5.0[msec] | 2.5[msec] |
| 目標角度更新と現在角度取得 | 67.0[msec] | 100.0[msec] | 57.0[msec] |
6 考察
通信遅延要因
シリアル通信ドライバ
- 速度優先の設定になっていない (setserial /dev/tty* low_latency)
- バッファ処理による遅延
- ユーザ-カーネル間の遷移に関連する遅延(通信データ, コンテキストスイッチ)
==> RTDM対応のシリアル通信ドライバを作成すれば改善する可能性あり.
その他
- サーボに設定できる通信遅延時間が長く設定されている (0.1 - 12.850[msec])
==> 最小値(0.1[msec])に設定されていた
おわり

