図3に、Arduinoのマイコンに搭載されている汎用シリアル通信インタフェースであるUARTとRS-232Cの波形の違いを示します。
UARTとRS-232Cでは波形が反転しています。UARTは谷で1、山で0となります。一方RS-232Cは逆に谷で0、山で1となります。
電圧に関しては、UARTの場合は谷の部分が0Vとなり、山の部分はマイコンの電源電圧となります。このマイコンの電源電圧は、場合によって5Vだったり3.3Vだったりします。一方、RS-232Cの場合は谷の部分が−15〜−3V、山の部分が+3〜+15Vとなります。RS-232Cは電圧の振れ幅が大きいので、ケーブルがある程度長くなってもノイズの影響を受けにくいのです。
図4は、UARTからRS-232Cへのレベル変換を行う回路図です。
抵抗のR1、R2、R3、R4とも抵抗値は2.7KΩです。トランジスタのTR1は汎用トランジスタの2SC1213を用いています。動作速度もそれほど早くないですし、電流も小電流しか流さないので、NPN型のトランジスタであれば他のものでも使えると思います。
RXDとGNDはRS-232Cケーブルを介して送信先のPCのRS-232Cアダプターに接続します。VCCは今回の実験では+12Vを供給しています。ArduinoのD3が1を出力するとGND−RXD間の電圧は-6Vとなります。D3が0の場合は+6Vになります。
リスト1に、Arduinoで動作させるプログラムを示します。
// 1200bps
void setup(){
pinMode(3, OUTPUT);
}
void loop(){
PORTD &= ~8;
delayMicroseconds(26*32); // 0 start bit
PORTD |= 8;
delayMicroseconds((17+9)*32); // 1
PORTD &= ~8;
delayMicroseconds((17+9)*32*5); // 00000
PORTD |= 8;
delayMicroseconds((17+9)*32); // 1
PORTD &= ~8;
delayMicroseconds((17+9)*32); // 0
PORTD |= 8; // 1 stop bit
delay(200);
}
アルファベットの“A”のデータをPCに送信するためのプログラムです。
“A”はアスキーコード表において16進数の「0x41」で表されます。これを2進数で表現すると「0100-0001」ですが、RS-232Cでは最下位ビットから送信するので逆順になり「1000-0010」となります。さらに。先頭にスタートビットと末尾にストップビットを加えて「0-1000-0010-1」となります。
なお、「PORTD &= ~8」はD3に直接0を、「PORTD |= 8」はD3に直接1を出力します。
図5に今回の通信実験の様子を示します。
取りあえずの動作確認ということで長いケーブルは使っていませんが、受信側PCのTeraTermの画面には“A”が表示されていました。
今回の“A”を送信する例を基に、RS-232Cで文字データを送る仕組みをお分かりいただけたかと思います。もちろん、Arduinoで受け取った熱電対センサーの測定値を送ることも可能ですし、他の文字データも送れると思いますので適宜改造してみてください。
RS-232Cは元祖シリアル通信ともいわれ、シリアル通信の基本を学ぶにはよい教材といえます。また、規格策定から60年以上が経過するRS-232Cの欠点を埋めるべくさまざまなシリアル通信規格が提案されているので、今後はそれらについても紹介していきたいと思います。
周波数を使って熱電対センサーの測定値を安価な電線でより遠くまで伝送する
熱電対センサーの測定値を安価な電線で伝送しアナログメーターに表示する
IoTとは何かを問いただすため、まずは薪ストーブに熱電対センサーを取り付ける
USBシリアル変換モジュールが必要なら、代わりにArduinoを使えばいいじゃないCopyright © ITmedia, Inc. All Rights Reserved.
組み込み開発の記事ランキング
コーナーリンク