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
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])に設定されていた