規格

目次

  1. OSI参照モデル
  2. PWM信号
  3. 非同期式シリアル通信
    1. UART
    2. ICS通信
    3. ほかのRS-485ベースの通信規格について
    4. CAN
  4. 同期式シリアル信号
    1. I2C
    2. SPI

通信にはいろいろな種類があります。まず思い浮かぶのはおそらく無線通信でしょう。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になった時  

先頭に戻る

作成者: 丸山響輝 / 23 / HR・レスキュー

最終更新: 2025年 09/11