Conrad 8-Fach Relaiskarte mit Arduino UNO steuern

EDIT: Thema geklärt, an TX liegen -9,3V also ~-10V an. Das heißt die Kommunikation über die TX/RX Klemmen erfolgt via RS232, ein Wandler ist nötig, z.B.: http://www.pollin.de/shop/dt/MzY5OTgxOTk-/Bausaetze_Module/Bausaetze/RS232_TTL_Wandler_Bausatz.html

Hallo!

Ich bin ganz neu in der Arduino-Welt und mache damit grad meine ersten Gehversuche. Ich habe einen Arduino UNO und die 8-Fach Relaiskarte von Conrad (197730 - 62). Die Relais-Karte hat neben dem RS232 und USB-Eingang ebenfalls die Möglichkeit die Steuerleitungen Tx und Rx sowie GND über eine Klemme anzuschließen. Normalerweise läuft darüber die Kommunikation mit kaskadierten anderen Karten.

Ich versuche jetzt die Relaiskarte über diese Klemme und mit einem Software-Serial anzusprechen. Leider klappt das nicht so wirklich.

Hat da jemand einen Rat?

Hast Du Dich ans Handbuch gehalten? http://www.produktinfo.conrad.com/datenblaetter/175000-199999/197730-an-01-ml-8_K_RELAISKARTE_PC230V_AC16A_de_en_fr_nl.pdf

Ich hab einen Rat. a) Kristallkugel b) genaue Beschreibung der Verdrahtung und des verwendeten Sketches.

Grüße Uwe

Ja, ich habe alles so gemacht wie es im Handbuch steht. Die Relaiskarte hat Strom (12V, 300mA) und ist wie auf dem angehängten Foto zu sehen mit dem Arduino verbunden.

Das dazugehörige Sketch sieht so aus:

#include <SoftwareSerial.h>

#define rxPin 9
#define txPin 8

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup(){
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  
  mySerial.begin(9600);
  
  sendCommand(1,0,0); //Initialisierung der Karte (Command 1, Karte 0, Daten egal)
}

void loop(){
  sendCommand(8,0,3);//Toggle Relais 1 und 2 (Command 8, Karte 0, Daten 3 [00000011])
}

void sendCommand(byte command, byte cardAddr, byte data){
  byte xorCheck = command ^ cardAddr ^ data;
  mySerial.print(command + cardAddr + data + xorCheck,BYTE); //Sendet Command an die Serielle Schntitstelle (Comnmand, Kartenadresse, Daten [welche Relais], XOR-Checksumme aller Parameter) wie im Handbuch beschrieben
}

 mySerial.print(command + cardAddr + data + xorCheck);

Bist Du sicher, daß Du so ein String mit 4 Elementen rausschickst und nicht die arithmetische Summe der 4 Variablen? Hast Du es mit

 mySerial.print(command); mySerial.print(cardAddr); mySerial.print(data); mySerial.print(xorCheck);

versucht?

Grüße Uwe

Hab ich nun probiert, klappt leider auch nicht.
Ich habe im Handbuch der Relaiskarte eben gesehen, dass sie mit 19200 Baud arbeitet. Da dieses SoftwareSerial das nicht kann habe ich es nun mal mit der physischen Schnittstelle auf dem Arduino probiert, klappt aber leider auch nicht.

void setup(){
  Serial.begin(19200);
  
  sendCommand(1,0,0); //Initialisierung der Karte (Command 1, Karte 0, Daten egal)
}

void loop(){
  sendCommand(1,0,0);
  sendCommand(8,0,3);//Toggle Relais 1 und 2 (Command 8, Karte 0, Daten 3 [00000011])
    delay(10000);
}

void sendCommand(byte command, byte cardAddr, byte data){
  byte xorCheck = command ^ cardAddr ^ data;
  Serial.print(command,BYTE); Serial.print(cardAddr,BYTE); Serial.print(data,BYTE); Serial.print(xorCheck,BYTE);
}

Ich komme einfach nicht weiter an der Stelle. Ich glaube, die vier Bytes müssen auf einmal übertragen werden und nicht so nacheinander in getrennten Writes. Aber wie übertrage ich 4 Byte auf einmal?

Mh ist nur so vermutung, aber versorgst du den Arduino über USB mit Spannung? Wo bekommt der Überhaupt seine Spannung her? Auf den Bildern ist nicht´s zu sehen. Wenn die Spannungsversorgung über USB läuft, dann ist es kein wunder das nix geht, RX unD TX sind dann doppelt belegt.

Ich betreibe die Karte ja auch nicht über die USB-Buchse bzw. im USB-Modus und auf Seite 9 steht unter "Anschluss über RS232-Buchse" "Die Steuerleitungen können auch direkt an RXa, Txa und GND angeschlossen werden"

Sorry, das ist mir auch grad klar geworden. Deshalb hat ich meinen Beitrag auch schnell gelöscht bevor jemand den Mist ließt, leider zu spät...

Jago: Mh ist nur so vermutung, aber versorgst du den Arduino über USB mit Spannung? Wo bekommt der Überhaupt seine Spannung her? Auf den Bildern ist nicht´s zu sehen. Wenn die Spannungsversorgung über USB läuft, dann ist es kein wunder das nix geht, RX unD TX sind dann doppelt belegt.

Ich habe beides versucht. Wenn ich das Arduino Board am Netzteil anschließe passiert aber auch nichts. Dann blinken nicht mal die TX und RX LEDs auf dem Board.

Die TX und RX Led´s können glaub ich auch garnicht blinken:

http://arduino.cc/en/uploads/Main/arduino-uno-schematic.pdf

Schade eigentlich, dann weis ich auch nicht weiter. Vom überfliegen her ist alles richtig.

Nachdem in der anleitung staendig von RS232 geredet wird und ich glaube auf dem photo einen MAX232 zu erkennen, sind die anschluesse fuer +-15V ausgelegt. Und nicht fuer 0-5V TTL pegel. Wenn du da mit einem arduino ran willst, dann musst du den level-shifter ueberspringen. Die pins duerften ueber den usb-adapter steckplatz zu finden sein. Ich glaube, dass bei nur einer platine die schraubklemmen fuer dich wertlos sind.

Die Karte hat eine RS232 Schnittstelle und 2 andere TTL serielle schnittsellen für die Verbindung mehrerer Karten untereinander. andi357 verwendet die 2.genannte. Grüße Uwe

Und das steht wo?

hier: http://www.produktinfo.conrad.com/datenblaetter/175000-199999/197730-an-01-ml-8_K_RELAISKARTE_PC230V_AC16A_de_en_fr_nl.pdf

Na! Das ist doch der gleiche link wie oben! Hallo?

Ich kann in dem ganzen schrieb weder 5V noch TTL finden, nur RS232.

Mehr beweise bitte ;-)

ja ist der gleiche.

Es steht nicht expliziet drin. Da die Schnittstelle zur Verbindung zur nächsten Platine dient ist es logisch nicht sinnvoll RS232 Pegel zu verwenden da dadurch ein zusätzliches PegelwandlerIC benötigt wird. Um sicher zu sein genügt es die Spannung am TX pin zu messen. ca -10V +/-2V dann RS232; +5V dann TTl.

Grüße Uwe

Sinnvoll... haha hmmm. Im zweifelsfall gilt es murphy's law zu beachten ;-)

Der MAX232 kann ausserdem 2x TX und 2x RX. Ein schaltplan waere halt am besten.

Ich werde noch wahnsinnig damit. Ich habe mir jetzt mal eine kleine Schaltung gebaut um zu gucken was die Karte antwortet. Da ich ja nur einen Seriellen Anschluss auf meinem Arduino UNO habe ging das leider nicht mit der Konsole am Rechner, deswegen lasse ich LEDs blinken.

Über Serial.available() hole ich mir erst die Anzahl der Bytes die empfangen wurden. Dann gehe ich die Bytes in einer Vorschleife durch, wandle sie um in int und lasse eine LED entsprechend des Wertes blinken. Dabei kommt heraus, dass egal was ich sende (aber auch nur WENN ich was sende) 3 Bytes zurück kommen mit den werten 0,5,64.

Ich verstehe das nicht. Die Karte empfängt also offensichtlich ein Signal und antwortet dann irgendeinen Quatsch. Sie sendet aber nur wenn ich ihr vorher auch was schicke, also scheint die Kommunikation ja generell zu funktionieren...

Also laut anleitung (seiten 12 ff.) bestehen befehle UND andworten IMMER aus 4 bytes. Wenn du nur 3 bekommst, dann ist da was faul. Aber das ist ja schon bekannt.

Du musst herausfinden, nach welchem standard auf den schraubklemmen gesprochen wird. RS232 (+-15V) oder 0-5V (TTL pegel). Dabei gilt es auch zu beachten, dass das signal bei RS232 invertiert ist, also -15V entsprechen logisch 1 und +15V logisch 0.

Nimm ein voltmeter und messe die spannungen and den klemmen. RS232 liefert im idle state auf der TX leitung eine negative spannung -5 ...- 15V.

http://www.lammertbies.nl/comm/info/RS-232_specs.html

Wenn du ueberal nur 0-5V misst, dann ist klar, dass es sich um TTL serial (nicht invertiert) handeln sollte. Du kannst natuerlich auch ein DSO mit serial dekoder nehmen. Das geht evtl. schneller, und du weisst gleich, was er antwortet ;-)

madworm: Sinnvoll... haha hmmm. Im zweifelsfall gilt es murphy's law zu beachten ;-)

Der MAX232 kann ausserdem 2x TX und 2x RX. Ein schaltplan waere halt am besten.

Ja ein Königreich für einen Schalplan. Aber es braucht 3 mal TX und 3 RX (RS2232 Schnittstelle und 2 x Verbindung zwischen den Karten)

Grüße Uwe