離れた場所の〇〇が測りたい その2 UART

(※)2018/09/01 タイトルを「離れた場所の電圧が測りたい」から「離れた場所の〇〇が測りたい」に変更しました。

 調歩同期式シリアル通信は、PCの初期から実装されていました。PC用電源にはいまだに-12Vが残っているモデルがあります。RS-232Cという名称が一般的ですが、デバイスではUART/UASRTと呼ばれます。インターネットが一般ユーザが使えない時代、パソコン通信でモデムと接続するのに使われました。信号は、プラス15Vとマイナス15Vで1/0を表します。その後、TTLレベルRS-232Cという時代が続いています。TTLは0/5Vですが、電圧が低くなって0/3.3VでもTTLレベルということもあるようです。

 Arduino UNOもPCとは調歩同期式のシリアル通信をします。物理的にはUSBですが、専用のICで変換しています。これは、8ビット・マイコンではUSBを扱うには荷が重たかったからです。もう一つの理由は、PCにRS-232Cのポートがなくなってしまったためです。

 ここでは、24ビットA-DコンバータADS122U04のディジタル出力のUARTを、Arduino UNOのソフト・シリアルでつないでデータをやり取りします。TTLレベルですが、そこそこ距離を伸ばせます。レベル変換を行って±3~±15Vでやり取りをすれば、10mは十分伸ばせます。ADS122U04のレジスタ関係はADS1120ADS1220ほぼ同じです。

ADS122U04のおもなスペック

 電源電圧は2.3~5.5Vなので、単三電池3本、エネループ4本で駆動できます。カタログ上24ビットですが、ノイズなどの影響があるので20ビット以上の解像度が得られます。シングルエンドでは4チャネル入力ですが、熱電対や白金測温抵抗体を4wireでつないで測定できるように作られています。ここではシングルエンドで電圧を計測します。

 ADS122U04はリード線タイプのICをDigi-keyで購入し、秋月電子通商のピッチ変換基板にはんだ付けしました。はんだ付けは、こちらを参照ください。

接続

 利用していないGPIOなどはGNDにつなぐようにデータシートに書かれていますが、ここでは実施していません。アナログ電源とディジタル電源は分離できるようにピンが用意されています。20ビット以上の解像度を得たいときには、データシートのプリント・パターン事例を参考に製作してください。

 A-DコンバータADS122U04を電池で駆動し、Tx/Rxの信号線とGNDを数m伸ばしても通信できると思われます。ノイズがのりやすい場合は、ADS122U04のもつCRC計算を有効にして、伝送途中でデータが化けていないかをチェックすれば、信頼性が上がります。

スケッチ

 3バイトのデータは、低いバイトから順に読み出します。内蔵の基準電圧源は2.048Vです。最初に送っている0x55は速度の検出用で、ここでは9600bpsで通信しています。300bpsでは失敗しましたが、1200~9600bpsの範囲でトラブルはありません。UARTのTXとRXは、デバイスのTXとRXでクロスでつなぎます。

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
Serial.begin(9600);
Serial.println("start");
mySerial.begin(9600);
mySerial.write(0x55); mySerial.write(0x07); //reset
}

void loop() {
mySerial.write(0x55); mySerial.write(0x40); mySerial.write(0x80); // Ain0 input single
mySerial.write(0x55); mySerial.write(0x08); // one shot
mySerial.write(0x55); mySerial.write(0x10); // Read
long temp0 =mySerial.read() ; long temp1 =mySerial.read() ; long temp2 =mySerial.read() ;
long temp = temp2<<16 | temp1 <<8 | temp0 ;
float volts = temp *2.048 /8388608.0 ;
Serial.println(String(volts,5)+"V");
delay(1000);
}

 このときの送受信のやり取りをPicoScopeのシリアル・デコードで確認しました。青色がArduinoからADS122U04への送信です。赤色がADS122U04からArduinoへの送信データです。

 3.3Vを8.2k 2本で分割し半分にした電圧をAin0に入力しているところです。

前へ

離れた場所の〇〇が測りたい その1 V-Fコンバータ

次へ

距離を正確に測る その1 赤外線VL6180X