規格
目次
通信にはいろいろな種類があります。まず思い浮かぶのはおそらく無線通信でしょう。WifiやBluetoothなどがこれに当たります。無線通信にはさまざまな規格があり、電波に乗せられた情報をそれに従って読み解いています。
有線通信においてもこれは同様で、電気信号は配線に載せられ、そのHighとLowの切り替わりによってチップ同士が情報をやり取りしているのです。
OSI参照モデル
| レイヤ | 階層名 | 役割 |
|---|---|---|
| L1 | 物理層 | ビットを物理信号に変換 |
| L2 | データリンク層 | MACアドレスなどを用い、同一ネットワーク上でフレーム通信を行う |
| L3 | ネットワーク層 | IPアドレスに基づき、異なるネットワーク上でパケットを転送 |
| L4 | トランスポート層 | end to endの信頼性(順序、再送) |
| L5 | セッション層 | 通信の開始、維持、終了、再開 |
| L6 | プレゼンテーション層 | データの表現形式(暗号、圧縮、文字コード) |
| L7 | アプリケーション層 | アプリケーションとネットワークの接続 |
ここでは制御に関わるところとして主にL2、データリンク層を見ていきたいと思います。 物理層は回路の章を、ネットワーク章より上はソフトウェアの章を参照してください。
PWM信号
PWMを取り扱う上で、制御上それほど困ることはありません。
PWM信号で駆動されるのは大抵サーボモータか簡単なモータードライバーです。一つ注意しなければいけないことは、制御対象のPWMの周期です。大体PWM周期は50Hzか60Hzなのですが、どちらか書いていない場合もあり、この時にかなり困ります。
まずはデータシートをしっかり読みましょう。大抵の場合どこかに書いてあります。どうしても見つからない、という場合、そもそもデータシートに周期の記載がないようなものは危ないのですが、それでも使いたいならば50Hzと60Hzで信号を入れてみて、それっぽい動きをする方を採用しましょう。
そもそもPWMなんていうものが信頼性の低い通信方式なので、ちょっとぐらいずれていても送る信号そのものを変化させてしまえばまぁ動作するのです。
非同期式シリアル通信
重要なポイントとして、物理層で何を用いているのか、通信速度としてどのようなものが用いられるのか、通信のはじめと終わりをどのように伝えるのか、をそれぞれ表にまとめました。
通信速度の単位はbps(bit per second)です。
特に通信速度については、通信するデバイス間で同じ速度を使わないとエラーが生じてしまいます。よく使われる通信速度を知っておきましょう。
UART
| 物理層 | UART | 物理層まで含む規格 |
| 主な通信速度 | 9600, 115200, 921600 | 代表的な値 |
| スタートビット | TXDの始めがLowに立ち下がった時 | |
| ストップビット | TXDの始めがHighになっている時 |
UARTは1byteずつ情報を送ります。そのため8bitのうち一番初めのbitは必ず0になるようになっています。
9600はArduino-PC間の通信、115200はespや様々なセンサ・サーボとの通信、921600は高速通信が必要なPCやraspberrypiにおける外部通信などで使われます。
ICS通信
| 物理層 | RS-485 | 半二重通信。one-wire化して用いる場合もある |
| 主な通信速度 | 115200, 625000, 1.25M | デフォルトでは115200になっている |
| Hレベル | 5V | Hの時を0とする |
| 接続 | 信号線を500ms, Hレベルに保つ | 接続していればいつでも通信が可能 |
| スタートビット | 信号線がLになった時 | コマンドがそうなっている |
| 切断 | 信号線が500ms以上Lレベルになった時 |
KONDOといううホビーロボット会社のシリアルサーボモータに使われる独自規格です。このサーボを動かすことのできるライブラリが無料で公開されているので、それを使って動かしましょう。
KONDOに限らず大抵の独自規格を持つサーボ会社は駆動のためのプログラムを用意してくれています。
中華の場合はないことがありますが、良心的な販売会社が用意してくれている場合もあるので頑張って探しましょう。
詳しくはマニュアルを読んでみましょう
KONDOはビットデータの中身まで公開してくれています。例として見てみましょう。
まず、データ構造は大まかに次のようになっています。
| 名前 | 内容 |
|---|---|
| CMD | コマンドヘッダ+ID |
| SC | サブコマンド |
| DATA | データ |
ここではICS通信の中で特によく使う位置指定コマンドについて見ていきます。
- CMD(コマンドヘッダ)
ポジション指定のコマンドでは、コマンドヘッダが100になります。RS-485ではHighを0として扱うので、信号入力が1、つまり信号線がLに落ちたときが通信の始めになるようになっています。 - CMD(id)
つづいてIDが入ります。IDは0~31まで入力することができます。そのため、5bitのidが入力されることになります。例えばid7の場合、00111になります。
ここまでで初めの1byteが”10000111”に決まりました。
- SC
位置指定入力の時はありません。 - DATA 角度指定の場合、position指定は7bitずつ分けられます。そしてそれぞれのでーたの始めに0が入力されます。これは通信の信頼性を高めるためで、このLow信号で速度合わせをしています。
指定範囲は3500~11500です。試しに9200を入れることを感がましょう。2進表示14bitだと10001111110000となるので、送るデータは”01000111_01110000”になります。(わかりやすいように1byteのところで_を入れた。)
よって、id7のサーボに9200の角度指令を送るデータは、”10000111_01000111_01110000”になります。
さて、KONDOサーボは自動で戻り値を返してくるのでこれを受け取らなければいけません。戻り値にはコマンドの繰り返し+現在角度が入ります。ただし、コマンドの頭(これをMSB=Most Significant Bit, 最上位ビットと呼びます。)が0になります。よって戻り値は”10000111_01000111_01110000”
これにより、サーボと通信することが出来ました。
ほかのRS-485ベースの通信規格について
使ったものがあったら付け足しておいてください
CAN
しらない
同期式シリアル信号
I2C
| 物理層 | I2C | |
| 主な通信速度 | 115200, 625000, 1.25M | デフォルトでは115200になっている |
| Hレベル | 5V | Hの時を0とする |
| スタートビット | SCL=Hのとき、SDAをH->Lにする | |
| ストップビット | SCL=Hのとき、SDAをL->Hにする |
基本的にClock信号がHighのときにdata信号を変化させてはいけません。slaveはclockがHignになった時の信号を読み取っているからです。
- ACK
通信が成功しているとき、送られる信号です。送信側ではない方からibit分、SDAをLowに下げることで受信完了を伝えます。
通信の手順としては、
- masterからスタート信号を送る
- masterからslaveアドレスを送信する
- slaveからmasterにACKを送る
- データ通信(8bitごとにACKを受信)
- masterからストップ信号を送る
となります。
逆にslaveからのデータをmasterが受け取るときは、受信完了を伝えるためにmasterがACKを出します。
SPI
| 物理層 | I2C | |
| 主な通信速度 | 115200, 625000, 1.25M | デフォルトでは115200になっている |
| スタートビット | SSがLowになった時 | |
| ストップビット | SSがHighになった時 |