週末副業記

土日は副業エンジニアのブログです。副業に関することを投稿します。

Arduino UNOのTX RX


f:id:aisakakun:20190220213226p:plain:w200

TXとRXで通信ができるのは分かるが、中身がどうなっているか分からないので、深掘りします。

TxとRxの意味

用語 省略前 意味
TX Transmitter 送信機
RX Receiver 受信機

なぜXなのかというところですが、略称みたいです。
詳しい理由が分かれば追記します。

通信

シリアル通信

TXとRXはシリアル通信と呼ばれる通信を行なっています。

シリアル通信 一度に1bitずつ伝送する通信方式

1bitずつ送れば良いので、通信線は1本で良いです。
シリアル通信を行うインターフェース(中間面:コンピュータと周辺機器の接続部分)のことをSCI(Serial Communication interface)と呼びます。

これとは別に、情報をまとめて伝送する - つまり、シリアルで言うところの000111を6本の線を使い全て同時に送信するような方式をパラレル通信と言います。
それでは、1や0という信号をどのようなレベルで送信し、どのようなレベルで受信すれば良いのでしょうか。

認識方法

シリアル通信の場合、情報は1bitずつ送信されてくるのですが、受信側はその信号がHIGH or LOWであるかを判定することで認識することができます。その認識方法には主にTTLレベルとCMOSレベルの二種類です。

用語 省略前 意味
TTL Transistor transistor logic 半導体を用いた論理回路
CMOS Complementary MOS 相補型MOS

TTLレベルとCMOSレベルの違いは、HIGHかLOWかを判定するための閾値です。

レベル名 判定対象:LOW 判定対象:HIGH
TTL 0.8V 2.0V
CMOS V_{DD}\times 1/3 V_{DD}\times 2/3

上表を見ることによって分かることは、送信側はTTLレベル判断なのに、受信側はCMOSであるということが起こった時、通信がうまくいかない場合があるということです。
ただ、基本的にはRS485やRS232Cなど規格があってそのドライバ・通信線を介して通信を行なっているので、通常は判定値レベルの違いによる通信不具合は起こらないと思います。

通信速度

Arduinoでは通信速度を300,1200,2400,4800,9600・・・bpsなど設定することができます。

通信方式

なぜ通信速度を設定する必要があるのでしょうか。
それは、送信側が送信したビット列を受信側が正確に理解するためです。
その方式には、大きく二つあります。

同期式通信

同期信号とデータ信号を別々の信号線で送信し、同期を行うものです。

非同期(調歩同期)式通信

送信機側、受信機側それぞれで発生させたクロックに同期して、データの送受信を行う方式です。送信側と受信側で通信速度を一致させておかなければ通信できません。

速度はどこまで速くできる

クロックの速度以下でしょう。クロック速度以上に外部と通信したいとなると、その通信データをRAMに書き込むということもできませんし、通信データの閾値判定もできません。つまり、ただ通信だけをするシステムになります。通信と言ってしまうと情報が送れているように感じるので、「送信だけをするシステム」と言い換えます。

クロックとは

クロックとは、その名の通り「時計」です。送信機であれば送信機の、受信機であれば受信機の全ての処理のタイミングを合わせるために使用されます。

Arduinoがサポートするシリアル通信

以下の3つです。

UART Universal Asynchronous Receiver Transmitter 3線方式(TX,RX,GND)
I2C Inter-Integrated Circuit 5線方式(SDO,SDI,SCK,CS,GND)
SPI Serial Peripheral Interface 3線方式(SCK,SDA,GND)

この記事のタイトルにある通り、Arduinoの通信はTX,RXで行われます。※GNDもありますが、省略します。
したがって、ArduinoはUART通信です。I2C通信、SPI通信については別記事にて。

まとめ

以上で以下の点を述べることができました。
・送信側は0,1を1bitずつ送信している
・受信側は閾値をもとにHIGH,LOWを判定している
・送信側と受信側は同期・非同期通信で信号を読み取っている
Arduino UNOのサポートする通信方式はUART