monitoring/sniffing einer SDI-12-Kommunikation
Ich möchte die Kommunkiation einer SDI-12-Datenverbindung zwischen Sensor und Anzeigeeinheit beobachten. Die Anzeigeeinheit wird mit 6V betrieben, am Sensor liegen 5V an, die kommen über das SDI-Kabel von der Anzeigeeinheit. Für das Monitoring habe ich einen Nano mit entsprechender Software bestückt, als Datapin die 8 definiert und diesen parallel an die Datenleitung zwichen Sensor und Anzeige angeschlossen. GND ist auch verbunden.
Im Moment des Anschließens erscheint in der Anzeige ein "FAIL" und das Oszillogramm am Nano-Pin 8 wird mikroskopisch niedrig, quasi 0V.
Nun sollen doch Arduino-Eingänge eigentlich Eingangs-Widerstände im Mega-Bereich haben ... was ist da passiert?
Ich habe sichergestellt, dass die Software definitiv nicht schreibt, nur lauscht.
Code:
#include <SDI12.h>
int8_t dataPin = 8;
SDI12 mySDI12(dataPin);
void setup()
{
Serial.begin(9600); delay(500);
mySDI12.begin(); delay(500);
mySDI12.forceListen();
Serial.println("--- start listening ---");
}
void loop()
{
String sdiMsgStr;
bool sdiMsgReady = false;
int avail = mySDI12.available();
if (avail > 0)
{
for (int a = 0; a < avail; a++)
{
char inByte = mySDI12.read();
Serial.println(inByte);
if (inByte == '\n') {sdiMsgReady = true;}
if (inByte == '!') {sdiMsgStr += "!"; sdiMsgReady = true;} else {sdiMsgStr += String(inByte);}
delay(10);
}
}
if (sdiMsgReady)
{
Serial.println(sdiMsgStr);
sdiMsgReady = false;
sdiMsgStr = "";
mySDI12.clearBuffer();
}
delay(10);
} //end loop
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe nachgedacht was wir tun können, um die Signale vom SDI Bus abzugreifen ohne Störungen zu verursachen und eine Anpassung an die Versorgungsspannung des Arduino zu erreichen. Es ist eine alternative und robuste Failsafe-Lösung, aufgebaut aus sehr günstigen diskreten Bauteilen.
Anhang 36089
Sie gewährleistet, dass der Arduino-Mikrocontroller nicht beschädigt wird und die SDI-12-Buskommunikation nicht gestört wird, selbst wenn ein Fehler in der Software auftritt.
Der SDI-12-Bus arbeitet mit 1200 Baud und verwendet eine Spannung von etwa 6V. Um dies mit einem Arduino zu überwachen, muss das Signal ohne Last auf dem Bus gelesen werden.
Der 470 kΩ Widerstand (R3) an der Basis des BC547B-Transistors ist der Schlüssel dazu. Er begrenzt den Stromfluss vom SDI-12-Bus auf nur etwa 11 µA.
Diese winzige Stromaufnahme stellt sicher, dass die Schaltung den Bus nicht stört und seine Kommunikation nicht beeinträchtigt.
Der Transistor Q1 (BC547B) wandelt die Spannung um und invertiert dabei das Signal:
Das invertierte Signal ist für den Arduino perfekt lesbar und kann mit einem einfachen Softwarebefehl (!digitalRead()) korrigiert werden.
SDI-12-Signal ist HIGH (ca. 6V): Der Strom fließt durch R3 in die Basis des Transistors. Der Transistor schaltet durch und zieht den Kollektor auf 0V (LOW).
SDI-12-Signal ist LOW (0V): Es fließt kein Basisstrom. Der Transistor sperrt und der Kollektor wird über den 4,7 kΩ Pull-up-Widerstand (R1) auf 5V (HIGH) gezogen.
Widerstandsdimensionierung
Folgend einige Kombinationen (je nach verfügbaren Widerstandswerten, Kohleschicht oder Metallfilm). Die Maximale Größe von 1 MOhm hat einen Haken: geringere Störfestigkeit. Deshalb sollte dieser Widerstandswert kleiner dimensioniert sein. Je nachdem, welche Werte vorrätig sind, ist zwischen 47 kOhm bis 100 kOhm die bessere Wahl für R2 (bei jedem der genannten Werte für R1).
R1 (Pullup) |
R2 (Pulldown) |
1k |
47k |
2.2k |
47k |
4.7k |
47k |
1k |
100k |
2.2k |
100k |
4.7k |
100k |
1k |
470k |
2.2k |
470k |
4.7k |
470k |
1k |
1M (Megaohm) nicht empfohlen |
2.2k |
1M nicht empfohlen |
4.7k |
1M nicht empfohlen |
1) Wenn der Arduino-Pin immer und garantiert als Eingang (INPUT) konfiguriert ist, kannst die Diode (D1) und der Pulldown-Widerstand (R2) weggelassen werden.
Die Schaltung funktioniert dann im Normalfall genauso gut, wird aber einfacher und effizienter. Die Schaltung ist dann minimalistischer, verbraucht weniger Strom und ist noch einfacher aufzubauen.
2) Die Diode (D1) und der Pulldown-Widerstand (R2) wurden in die Schaltung als Schutzschicht eingebaut. Die Schaltung ist extrem robust und fehlertolerant. Selbst ein Softwarefehler, der den Pin in einen Ausgang verwandelt, führt nicht zur Zerstörung des Arduinos oder zur Störung des SDI-12-Busses.