3

SDI-12デバイスとシリアル通信しようとしていますが、反転した7 データ ビット、偶数パリティ、および1200 ボーでの 1 ストップ ビット (7E1) シリアルが必要です。

データシートから:

SDI-12通信は 1200 ビット/秒で文字を送信します。各文字には、1 つのスタート ビット、7 つのデータ ビット (LSB ファースト)、1 つの偶数パリティ ビット、および 1 つのストップ ビット (アクティブ LOW または反転論理レベル) があります。

All SDI-12コマンドと応答は、データ行で次の形式に従う必要があります。コマンドと応答の両方の前にアドレスがあり、キャリッジ リターンとライン フィードの組み合わせで終了します。

これは Serial または SoftwareSerial ライブラリで可能ですか? 追加のハードウェア (3.3 V へのレベルシフターを超える) を回避しようとしていますが、それが唯一の方法である場合はそうします。

SoftwareSerial は反転でき、Serial は 7E1 を実行できることがわかりましたが、どちらかが両方できるかどうかはわかりません。

Arduino Mega (R2) とArduino Uno (R3)にアクセスできます。

通信したいデバイスは次のとおりです。 .decagon.com/assets/Uploads/GS3-Integrators-Guide.pdfは、プロトコルを説明するドキュメントです。6 ページでは、SDI の実装について説明しています。

4

2 に答える 2

1

私は Arduino に詳しくありませんが、SDI-12 物理層は標準の TTL レベルから反転しています。おそらく次の 2 つの理由からです。

  1. アイドル電圧が 0V であるため、スタンバイ電力が低くなります (一般的な SDI-12 センサーの公称プルダウン抵抗による)。
  2. 標準の RS-232 シリアル ポートを使用して、単純なバスの「スニッフィング」を容易にします。

5V IOピンのビットバンギングの短さ-はい、標準のマイクロコントローラーUARTを使用する場合、外部インバーター(または2つ)と3ステートバッファーが必要になります。ハードウェアによっては、レベル シフトが必要になる場合があります。

ウィキペディアのエントリに賛成です-SDI-12は完全に標準のUARTビットタイミング(RS-232に非常によく似ています)を使用し、信号レベル(0〜5V)が異なるだけです。ポイント#2を参照してください。ただし、特定のブレーク シーケンスと厳密なタイミング要件があり、ファームウェアの開発がより困難になります。

SDI-12 ファームウェアの開発に真剣に取り組んでいる場合は、SDI-12 Verifierに投資することをお勧めします。仕様の徹底的な調査が不可欠です。

于 2012-11-28T07:03:27.740 に答える
1

少し遅れました...しかし、遅くならないよりはましです

私は実際にまさにそのためのライブラリを作成しました(実際にはセンサーを含む正確に...したがって、含まれている例で正確に動作するはずです)

https://github.com/joranbeasley/SDISerial (Arduino ライブラリ)

#include <SDISerial.h> //https://github.com/joranbeasley/SDISerial (Arduino Library)
#include <string.h>
#define DATA_PIN 2
SDISerial connection(DATA_PIN);
char output_buffer[125]; // just for uart prints
char tmp_buffer[4];
char sensor_info[]
//initialize variables
void setup(){
      connection.begin();
      Serial.begin(9600);//so we can print to standard uart
      //small delay to let the sensor do its startup stuff
      delay(3000);//3 seconds should be more than enough
      char* sensor_info = connection.sdi_query("0I!",1000); // get sensor info for address 0
}

//main loop
void loop(){
    //print to uart
    Serial.println("Begin Command: ?M!");

    //send measurement query (M) to the first device on our bus
    char* resp = connection.service_request("0M!","0D0!");//Get Measurement from address 0


    sprintf(output_buffer,"RECV: %s",resp?resp:"No Response Recieved!!");
    Serial.println(output_buffer);
    delay(10000);//sleep for 10 seconds before the next read
}
于 2014-03-05T19:47:49.313 に答える