[Solved] Arduino Uno + Pi3 + Relais Board --> Pi stürzt ab

Hallo,

ich bewässere meinen Garten automatisch. Dabei habe ich jedoch ein Problem mit der Verdrahtung. Wenn die Relais schalten stürzt mein Rasberry Pi ab (Er meldet, dass es einen Fehler mit dem Datenträger gibt, Fehlermeldung wiederholt sich und ich kann den Pi nur noch mit Strom an/aus neu starten).
Schaltbild:

Fotos:

Was habe ich alles schon probiert?
Ursprünglich habe ich das Relaisboard direkt über den Raspberry betrieben --> gleicher Fehler
Dann habe ich den Arduino dazwischen geschaltet um einen elektrische Trennung hinzubekommen.
Erster Versuch war es über die analogen Pins des Arduinos das Signal weiter zu geben an das Relaisboard über den Arduino zu steuern --> gleicher Fehler
Um weiter zu trennen kommuniziert der Raspberry mit dem Arduino jetzt nur über USB --> die Stromführenden Verbindung über das USB-Kabel scheint jedoch auszureichen um den Raspberry in die Knie zu zwingen.

Worüber ich mich freuen würde:
Ich benötige eine Lösung, also Erweiterung der Verkabelung, die ich auch im gezeigten Schaltschrank verwirklichen kann. Also da einfach eine Diode irgendwo zwischen packen ist keine echte Option ich würde mich über ein Hutschienenbauteil freuen oder gerne einen Vorschlag wie ich die Diode auf die Hutschiene bekomme. Das Ding hängt draußen im Schuppen. Ich kann programmieren, d.h. softwareseitig habe ich keine Probleme, aber von Elektrotechnik habe ich keine Ahnung (villeicht doch das falsche gelernt;)). Wenn also Diode irgendwo mit rein klemmen die Lösung ist, dann bitte genaue Werte und wie ich das verkabeln muss.

Vielen Dank

Sam

P.S. bestimmt fehlen hier Informationen, bitte fragt nach, ich passe den Post dann gerne an.

[Solved] Vielen Dank für Eure Hinweise, für mich war jetzt die Lösung, de Raspberry Pi in einen zweiten Schaltschrank auszulagern. Verkabelung an sich ist geblieben, nur der Raspberry Pi wandert in ein gesondertes und ebenfalls geerdetes Metallgehäuse und die Probleme treten nicht mehr auf.

Wie sollte der Arduino eine elektrische Trennung bewerkstelligen?

Gruß Tommy

Ich Tippe mal auf die fehlenden Snubber an deinen Relais für die Ventile.
Da du offensichtlich 230 Volt schaltest und das im nahen Umfeld des Pi, werden die Störungen die Ursache sein.

Das könnte passen, aber was sind Snubber und wie genau müsste ich da was wo einbauen?

Snubber sind Entstörglieder (Widerstand und Kondensator) die für deine Ventile angepasst werden müssen.

Edit:
Doch mal die Frage, warum verwendest du 230 Volt Ventile und keine für 12 Volt.
Ich setze bei mir ein 12 Volt Ventil Kugelhahn ein und das ohne Probleme.

Das Wasser was gesteuert wird kommt aus einem offene Gewässer, Magnetventile würden verdrecken. 12 Volt Kugelhähne hatte ich damals keine gefunden und hatte keine Lust auf zusätzlichen Trafo.

Ja, sorry, ich meine auch einen Kugelhahn für 12 Volt. Der ist schon seit 3 Jahren bei mir im Einsatz für einen Regenwassertank. Und mit 12 Volt ist das auch sicherer.
Einen zweiten Trafo braucht das nicht. Läuft alles mit 12 Volt und einem Stepdown.

Ja, wäre eine Option gewesen, aber jetzt sind die 5 Ventile quer im Garten verbaut, das ist keine Option das umzurüsten. Also Frage wäre, wie dimensioniere ich die Entstörung und wo muss die wie eingebaut werden und das im Schaltschrank.

Ok, verstehe ich.
Den Link dazu hatte ich dir in Post #5 geschrieben.
Die werden am Relaiskontakt montiert.
Achtung, Anschlüsse auch isolieren.

Vielen Dank für die schnelle Antwort, Snubber hilft mir für die weitere Suche gerade super weiter. Ich muss aber ehrlich sein mit der Berechnung und wo ich da was anschließen muss bin ich noch überfordert.

Anhand einer Grafik in diesem Beitrag findest du die richtigen Werte. Diese Kombie kommt, wie schon geschrieben, über den jeweiligen Relaiskontakt.

Vielen Dank für Eure Hinweise, für mich war jetzt die Lösung, de Raspberry Pi in einen zweiten Schaltschrank auszulagern. Verkabelung an sich ist geblieben, nur der Raspberry Pi wandert in ein gesondertes und ebenfalls geerdetes Metallgehäuse und die Probleme treten nicht mehr auf.

Ok, das ist natürlich auch eine Lösung.
Damit hast du allerdings die Störungen nicht beseitigt. Diese können dir später immer noch auf die Füße fallen.
Danke für deine Rückmeldung.

Hallo Samheinz,
könntest Du vielleicht Deinen Code für Raspi und Arduino weitergeben?
Ich bin auch gerade dabei, die beiden zu verbinden.
Wie hast Du das gemacht? Modbus? Seriell?
Danke für die Hilfe.

Seriell ... gerne, aber kein Anspruch auf Perfektion oder Fehlerfreiheit, da sind bestimmt noch so einige Dinger drin

Arduino:

int pinNumbers[] = {2, 3, 4, 5, 6};
int numPins = sizeof(pinNumbers) / sizeof(pinNumbers[0]);
String inputString = "";
bool stringComplete = false;
unsigned long* pinLowDuration;  // Zeiger auf das Array zur Speicherung der LOW-Dauer jedes Pins
unsigned long maxLowDuration = 125UL * 60UL * 1000UL;  // Maximal zulässige LOW-Dauer in Millisekunden

void send_status()
{
  String status = "";
  for (int i = 0; i < numPins; i++)
  {
    status += String(pinNumbers[i]) + (digitalRead(pinNumbers[i]) == LOW ? "1" : "0") + ";";
  }
  status.trim();
  Serial.println(status);
}

void blinkDiode() {
  digitalWrite(13, HIGH); // Diode einschalten
  delay(500); // Eine halbe Sekunde warten
  digitalWrite(13, LOW); // Diode ausschalten
  delay(500); // Eine halbe Sekunde warten
  digitalWrite(13, HIGH); // Diode einschalten
  delay(500); // Eine halbe Sekunde warten
  digitalWrite(13, LOW); // Diode ausschalten
  delay(500); // Eine halbe Sekunde warten
  
}

void setup()
{
  inputString.reserve(200);
  pinLowDuration = new unsigned long[numPins];  // Dynamisches Array zur Speicherung der LOW-Dauer jedes Pins

  for (int i = 0; i < numPins; i++)
  {
    pinMode(pinNumbers[i], OUTPUT);
    digitalWrite(pinNumbers[i], HIGH);
    delay(3000);
    pinLowDuration[i] = 0;  // Initialisierung der LOW-Dauer für jeden Pin
  }
  blinkDiode();
  Serial.begin(9600);
}

void loop()
{
  if (stringComplete)
  {
    String command = inputString;
    if (command == "GET_STATUS\n")
    {
      send_status();
    }
    else
    {
      int pinNumber = command.substring(0, 1).toInt();
      String action = command.substring(1);

      if (pinNumber >= 2 && pinNumber <= 6)
      {
        if (action == "HIGH\n")
        {
          digitalWrite(pinNumber, HIGH);
          pinLowDuration[pinNumber - 2] = 0;  // Zurücksetzen der LOW-Dauer für den Pin
          send_status();
        }
        else if (action == "LOW\n")
        {
          if (digitalRead(pinNumber) == HIGH)
          {
            pinLowDuration[pinNumber - 2] = millis();  // Startzeit der LOW-Dauer speichern
          }
          digitalWrite(pinNumber, LOW);
          send_status();
        }
      }
    }

    inputString = "";
    stringComplete = false;
  }

  // Überprüfung der LOW-Dauer der Pins
  for (int i = 0; i < numPins; i++)
  {
    if (digitalRead(pinNumbers[i]) == LOW)
    {
      if (millis() - pinLowDuration[i] > maxLowDuration)
      {
        digitalWrite(pinNumbers[i], HIGH);
        pinLowDuration[i] = 0;  // Zurücksetzen der LOW-Dauer für den Pin
      }
    }
  }
}

void serialEvent()
{
  while (Serial.available())
 {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n')
    {
      stringComplete = true;
      blinkDiode();
    }
  }
} 

PHP auf dem PI Auszug

 $devices = glob('/dev/ttyACM*');
            if (!empty($devices)) {
              foreach ($devices as $device) {
                // echo "Verfügbarer Anschluss: $device\n";
              }
            } else {
              echo "Kein Arduino-Anschluss gefunden.\n";
            }
            
        $baudrate = 9600;         // Baudrate für die Kommunikation

        // Baudrate einstellen
        exec("stty -F $device $baudrate cs8 -cstopb -parity -icanon -echo -hupcl");

// Öffnen der seriellen Schnittstelle
        $serial = fopen($device, 'rw+');
        if (!$serial) {
            die("Konnte die serielle Schnittstelle nicht öffnen.");
        }
sleep(1); // warten das schnittstelle initialisiert ist
//Schreiben des Signals in der Form z.B. "3LOW"
fwrite($serial, $relpin.$signal);
sleep(4);
// Antwort auslesen
$response = fgets($serial);
 // Antwort verarbeiten Wird bei mir ausgewertet und in DB geschrieben...
//Schnittstelle schließen:
fclose($serial);    

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.