直接、電圧を測る、あるいは電流を測らないとならないセンサの場合は、どうしてもアナログを避けては通れませんが、この頃は「デジタル接続」の「センサ」の品種が大変と増えたので便利です。多くはセンサの内部に測定回路まで含まれていて難しいアナログの部分は隠してくれています。多くの場合、何かコマンドを送れば設定がいろいろでき、結果はデジタルな値で読み出せるようになっています。そういうデジタル接続の「センサ」をマイコンに接続するときに使われるのがシリアル系のインタフェースです。今日はマイコンのシリアル・インタフェースを調べていきます。
※「鳥なき里のマイコン屋」投稿順Indexはこちら
まず、「シリアル」といってもまったくカテゴリの違う「シリアル」があるというお断りをしておきましょう。
- 差動ペア信号を使う高速なシリアル
- 「普通の」低速なシリアル
2本の信号線に+とーの反対方向に動く信号を乗せた差動ペア信号は、小振幅ですけれどもノイズに強く、高速な伝送速度を達成できる方法です。この系統の技術を使っている高速なシリアル・インタフェースの仲間にはおなじみのUSBや、パソコン内部のPCIe、ビデオのHDMI、システムの内部の接続などに使われるLVDSといった回路が含まれます。しかし、こちらの「シリアル」がセンサに接続されるケースはごく限られると思います。
イメージセンサの接続に使われるMIPI
MIPI(Mobile Industry Processor Interface)くらいじゃないでしょうか。イメージセンサは高速に大容量の画像を転送しないとならないので差動です。しかしMIPIのインタフェースを持つアプリケーション・プロセッサ(SoC)はありますが、組み込み向けの小規模なマイコンでMIPIを持つものはまずないでしょう。
規模の小さいマイコンとセンサの接続に使われるのは「普通の」(通常、一本の信号線のレベルで0と1を伝える)低速なシリアル、ということになります。そこでもまた、まずは2つのカテゴリに分けることになります。
- 非同期シリアル
- 同期シリアル
「同期」というのは、信号を送る側(例えばセンサ)と信号を受ける側(マイコン)のそれぞれが同じ1本のクロック信号のタイミングに「同期」してデータを送る方式です。データを送る線はクロック信号とは別な信号線です。センサとマイコンの接続の場合、マイコン側からクロック信号を送り、センサ側はそれを受け取ってタイミング制御に使う、というのが一般的です。
これに対して「非同期」の場合、データを送る信号線はありますが、タイミングを示すクロック線はありません。その代わり、送る側と、受ける側でクロック速度について予め示し合わせておきます。例えば、1秒間に9600ビットの割合であるとか。(実際の内部回路では示し合わせたクロック速度の16倍とか、早い信号を使って処理を行ったりしているのですが、それについてはまたどこかで)信号を受ける側は、信号を見張っていてある切っ掛け(通常、1から0に落ちる最初のビットです。スタートビットと呼びます)が到着したら、自分の中のクロックでデータを拾っていくのです。当然、送る方と受ける方でクロックがピッタリ一致していることはありえず、ずれていますが、例えば8ビットとか短い長さであれば、エラーになるほどずれない間にデータを取り込めます。
どちらかというと、センサを接続する場合には「同期」式のシリアルが使われることが多いです。マイコンでの「非同期」シリアルの利用方法で一番多いのはUART(Universal Asynchronous Receiver/Transmitter)として、マイコンとホストPCの間など接続するのにつかわれることでしょう。もっともこの頃のホストPCにはシリアルポート(RS-232C)などは搭載されていないので、USB-シリアルアダプタなどを利用して接続するわけですが。しかし「非同期」系統のシリアルがセンサにまったく使われないわけでもないです。これは後で出てきます。
さて、センサ接続に一番多く使われる同期式シリアル接続ですが、またしても分類です。
- ポイント・ツー・ポイント接続
- バス接続
ポイント・ツー・ポイント接続は、センサとマイコンのシリアル・ポートを1対1でつなげるような接続方法です。センサ1個なら何の問題もないですが、頭の中で複数のセンサを1個のマイコンにつなげようと試みてください。なにか、配線がごちゃごちゃしそうでないですか。実際、多くのセンサを1個のマイコンにつなげたいことは多く、そのくせ1個のマイコンに搭載されているシリアル・ポートの個数などはたかが知れているのです。貴重なシリアル・ポートを活用できるのが、バス接続可能な同期式シリアル接続です。現状、センサ接続に多く使われるのは以下の2つです。
- I2C
- SPI
I2C(Inter-Integrated Circuit)は、IC間接続用のシリアル・バスです。クロック線とデータ線の2本で通信するのですが、その2本に複数のスレーブ(例えばセンサ)を並列に何個も(最大個数は制限あります)つなげられるのです。プロトコルが定められており、マスタ側(普通マイコン)は、まず開始信号を出し、アクセスする先のアドレスや読み書きの方向を送ります。スレーブ側は自分が指定されていれば反応しますが、指定されない場合は以降の1連のやり取りの間お休みとなります。マスタとスレーブの間でデータ送受とその返事(ACK)を繰り返し、終了するとマスタはやり取りをクローズします。
これに対してSPIもシリアル・バスなのですが、データ線は行きと帰りの2本あり、これとクロック線の3本がマスタと複数のスレーブ間に接続されます。さらにスレーブ毎に選択信号が必要です。転送は選択されたマスタとスレーブ間で行われます。こちらは、信号線の本数が多くなるので、I2Cほど多くのスレーブを接続する用途には向かないと思います。しかし一方、シンプルな通信である分、高速化が容易だと考えられます。
最後に一つマクシム社の 1-Wire も上げておかねばならないでしょう。これもシリアル通信方式なのですが、電源と信号を1本の線で兼ねるという荒業のインタフェースです。勿論、グランドは別に必要です。電源線として電流を流しつつ、そこに短いパルスを乗せていくことで通信を行います。パルス幅の規定があるので、かなり特殊ですが非同期シリアルのカテゴリに入ると考えられます。線が1本だけということで、ボタン電池のような完全密閉型の容器の中に温度センサなどを封止した製品が存在します。