FutabaサーボのS.BUS解析2(ADALM2000による通信解析)
RC用Futabaサーボをマイコンからシリアル通信したくなったのでS.BUSという通信のプロトコル解析をしてみた。 まず、ADALM2000で通信速度、データ長を調べ、指令角度をどのように送信すればよいかを調べる。
機器の用意
まず、プロトコル解析するためにS.BUSで送受信するサーボとマスター側を用意する必要がある。どちらも持っていなかったので、安めなS.BUS対応のサーボと設定ツールを購入した。 それが下のスタンダードS.BUSサーボ「S-U300」と設定ツールの「CIU-3」だ。
この「CIU-3」を使用してサーボの設定したり動作させるためには下図のように電源につなげる必要がある。電源電圧はサーボによって異なるので確認が必要。
サーボの動作
「CIU-3」でサーボの動作や設定を行うためには、専用PCソフトである「S-Link」を使用する必要がある。「S-Link」は下のリンクからダウンロードできる。
双葉電子工業 ホビーサイト ホームページ | ソフトウェア・ダウンロード | S.BUSサーボ用
インストールしてPCに「CIU-3」を接続した後に「S-Link」を起動すると、下の図のような画面が出てくる。
サーボ位置のバー上の矢印をドラッグすることでサーボを動作させることが出来る。サーボからのデータを読み出すコマンドが見当たらないので、サーボの現在角度などをS.BUS経由で読み取ることはできないのかも知れない。しかし、サーボ固有のIDは読み取れている。
ADALM2000による通信解析
分岐回路に「ADALM2000」のオシロスコープ端子を接続して「Scopy」を用いて通信速度を測定する。
下に実際に測定した画面を示す。何度か波形を観測して、データ波形の中で最も短いパルス幅を1bitだと仮定して通信速度を計算する。この図ではΔtが102[μsec.]程度なので9780bpsとなる。このことから、よく使う9600bpsから誤差が少しある感じなので、9600bpsとして解析を進める。
次に「ADALM2000」のDIO端子に接続して、UARTとして解析していく。この通信は負論理なのか、パリティは使用しているのか、データ長はどのくらいなのかが解析していく際に重要なのでまず確認する。結果を下図に示す。
ADALM2000の使い方は過去の記事にある。
S.BUSの物理層についてまとめ
- 電圧 H:3.3V / L: 0V
- 通信速度 9600bps・100kbps(マイコンで動作時に判明)
- データ論理 負論理
- データ長 8ビット
- パリティ 偶数
- ストップビット 1ビット
- 送信データ 25バイト(固定かどうかはまだ不明)
意外とデータ量が多い。一度のデータ送信に30msかかっている。このままではPWM方式よりも通信周期が遅くなってしまうので設定用の通信速度と、プロポ受信機からの指令時の通信速度は変わると思われる。(マイコンで動作させて、通信可能な速度を探した結果100kbpsでも動作可能)S.BUSの動作指令通信では、サーボからACK等の応答は受け取っていない。「S-Link」で接続が確立した後に、サーボを外しても気づかずにデータを送信し続けるからだ。 ただし、接続ボタンを押したタイミングではサーボ固有IDを読み取るため完全に一方通行ではないようだ。
S.BUSのプロトコル解析
通信内容がわかるようになったので、後はひたすら動作角とS.BUS CH IDをいじってみて法則を探す。その結果をまず下図に示す。
- LSBでデータを送信している
- 1バイト目は動作指令の場合は0fhで固定
- 1つのchで指令角データは11bit
- 一度に16ch+2バイトを送信
- 24,25バイト目は用途不明(サーボ以外用かな)
11bitの指令角度データを隙間なく並べているので、解析時に判りづらかったが無駄がない方式ではある。恐らくPWM方式の無線データの配置をそのままサーボのバスラインに流した感じだろう。 問題は、指令角度データの中身。
指令値を「S-Link」で入力してバス上のデータがどのように変化していくかを下図に示す。
S-Link指令値 | バス上データ |
---|---|
2120 | 1984 |
1520 | 1024 |
920 | 64 |
このようにバス上データは1984~64の間をとり、PWMサーボと同様に絶対角度で指示するのではなく設定された動作角度に対してどの程度動くかという指令値となっている。 「S-Link」上で動作範囲を狭めても最大値は1984であり、中央値は1024で変わらなかった。そのため、実際に角度[deg.]に対しての指令値を決めるためには、最大動作角度を左右対称にして指令値にして線形になるようにした後に係数をかけて計算する必要がある。