Nano funktioniert nicht mit externer Versorgung

Hallo Leute,
ich habe da ein kleines Problem in einem kleinen Projekt: mein Vater hat einen Hühnerstall, dort hängt die Tür für die Hühner an einem Garagentoröffner. Jedenfalls ist die Steuerung sehr unzuverlässig geworden, daher der Auftrag an mich, dies mit Hilfe von Arduino zu beheben.
Im Grunde gibt es zwei Versorgungen: Eine für den Motor (Netzstecker-->Trafo-->Gleichrichter mit Glättungskondensator-->2 Relais-->Motor), und eine für den Nano (Netzteil mit 7,5V, an Vin und GND- Pins). Über die + und - Pins des Gleichrichters hängt noch ein Spannungsteiler, welcher vom analogen Pin ausgelesen wird. (Eine Zeitschaltuhr schaltet für eine Minute Spannung an die Versorgung für den Motor durch, welche dann auch vom Arduino gemessen und dann gesteuert werden soll) (in meinen Augen eine ungünstige Lösung, aber so will es der Auftraggeber eben haben^^)

Das Programm ist soweit fertig und funktioniert soweit, wenn da nicht ein Problem wäre: Hängt der Nano nur am Netzteil, so leuchtet nur die PWR-LED, ansonsten passiert gar nix. Hängt der Nano zusätzlich oder nur am USB-Kabel, dann funktioniert es wie es soll.
Wo liegt hier der Fehler?

Schalltplan?
Ist das ein China Clone Nano?
Die sind schon mal recht unsauber auf der Versorgungsseite verarbeitet.
Aber evtl ist die Resetwelligkeit am Nano via Netzteil zu hoch? /,5V können auch sehr knapp sein je nachdem was am Nano für ein Spannungsregler verbaut ist. Versuche es mal mit 9-12 Netzteil zum testen. Miss mal am 5V Pin wenn du am 7,5V Netzteil hängst.
Gruß
DerDani

Was soll denn der Arduino noch verrichten, wenn du die Schaltuhr zum Schalten bzw. öffnen der Tür verwendest ?

Hast du auch die Masse (GND) beider Teile (Spannung Motor, Arduino) verbunden ?

Danke für Eure fixen Antworten (y)

Ja, es ist ein Nano-Clone.
Zwischen Netzteil und Nano habe ich keinen weiteren Regler verbaut.
Spannung mit Netzteil: 4,33V
Spannung mit Netzteil und USB: 4,82V
Spannung mit USB: 4,52V
Wenn er am Netzteil hängt, messe ich zwischen Vin und GND 9,12V. Ziemlich großer Unterschied zur Angabe....

Die Schaltuhr versorgt ja den Trafo, welcher 2 Aufgaben hat: a) den Motor versorgen und b) gibt über Spannungsteiler ein Signal an den Nano weiter. Der Nano schaltet dann entsprechend die Relais durch. Die Relais und Motor sind so verschaltet:

Auf der Schiene gibt es noch 2 simple Kontaktschalter, und am Arduino hängt noch eine GR-LED, um den Status anzuzeigen.

  • vom Gleichrichter und vom Nano sind natürlich verbunden.

Die Netzteil (9,12V) scheint nicht geregelt zu sein.
Das allein ist nicht das Problem. Aber die 4,33 Volt am Nano sin zu gering und sehe ich als Fehlerquelle.

Also mal ein besseres Netzteil suchen? Na mal schauen ob ich eins finde^^

Das hier ist übrigens das momentan angeschlossene Netzteil: Klick

DerLehmi:
Also mal ein besseres Netzteil suchen? Na mal schauen ob ich eins finde^^

Das hier ist übrigens das momentan angeschlossene Netzteil: Klick

OK, "Billigteil" ohne Regelung, nur Trafo und Gleichrichter.

Löte mal einen Elko ca. 1000µF an die 7,5 Volt an, das könnte helfen.

Da gibt es doch schon preiswertere als getaktete Netzteile mit 9V / 1A.

Irgendwie ist heute echt der Wurm drin....
Der Cap hat gut geholfen, am 5V-Pin liegen nun 4,9V an.
Als es aber nochmal mit USB und Netzteil zum Testen ging, da fing er plötzlich an unter der USB-Buchse an zu rauchen und hat rumgesponnen (wahllos Pins an und aus). Dabei ist er auch extrem heiß geworden.
Nun geht über USB gar nichts mehr, über Netzteil leuchtet die PWR-LED und er wird mit der Zeit heiß. Was ist denn nun passiert?-.-

Wenn du beide Spannungen gleichzeitig angeschlossen hast, hat es wohl den Spannungsregler zerschossen.

Der Nano hat keine Sicherung drin, da darfst du nur eine Spannung zur zeit anschließen.

Wus? Gilt das nur für den Nano? Uno und Mega habe ich bisher meistens so behandelt, da ist noch nie was passiert.

Folgendes ist mir jetzt aufgefallen: USB funktioniert ja nun nicht mehr, am 5V-Pin liegen immer noch die 4,9V an, wenn ich kurz das Netzteil anschließe. Sicher, dass der Spannungsregler hin ist?
Zudem hat die Diode auf der Unterseite (unter dem USB-Anschluss) ein Loch drin (ein gesunder Nano hat da keins). Würde auch passen, da der Rauch von dort gekommen ist. Ist eine Schottky-Diode, wenn ich mich nicht täusche.
Hier beschriftet als usb diode:

Noch auffällig: bei Diodenprüfung zeigt mir das Multimeter beim gesunden Nano eine Zahl von 1440, beim Raucher 666 (Messspitzen an Vin und GND)

Ok, wenn es nur die Diode ist, sollte es kein Problem sein die zu wechseln. Diese sollte ein Problem verhindern.
Was genau passiert ist, kann ich auch nicht erklären, nur vermuten.
Da ist ei zu großer Strom geflossen.

Kann ich mir kaum vorstellen....gibt ja nur eine direkte Verbindung zum anderen Stromkreis, und zwar die Messleitung zum Spannungsteiler sowie der GND. Der Motor wird doch kaum Strom über den Analogpin gezogen haben können, oder? Der Spannungsteiler besteht übrigens aus einem 150k Ohm- und einem 50k Ohm-Widerstand. Fehlen hier evtl. noch Dioden? (Zener-Diode gegen Überspannung habe ich absichtlich weggelassen, eine entsprechend hohe Spannung erreicht das System ja nicht)

Habe mal das Multimeter auf Strommessung gestellt und so die Diode überbrückt. Die PWR-LED leuchtet dann, sonst nix weiter. Ist der Controller auch hinüber, oder hat es nur sämtliche Software gelöscht? (wie gesagt, beim abrauchen hat er willkürlich Ausgänge gesetzt)

Wenn der Atmega defekt ist, dann muss der Regler auch ein weg haben.

Ja, wenn. Weiß ja nicht ob es überhaupt möglich ist, dass er unter diesen Umständen sämtliche Software inkl. Bootloader löscht.
Die stabilen 5V bringt der Regler ja noch, wird nur schnell verdammt heiß dabei.

Es ist schwierig was über eine Platine zu sagen von der es keine Schaltpläne gibt.
Beim Preis der Clone ist die einfachste Lösung einen neuen zu nehmen.

Welche Relais nimmst Du und wie werden sie angesteuert?

Grüße Uwe

DerLehmi:
Ja, wenn. Weiß ja nicht ob es überhaupt möglich ist, dass er unter diesen Umständen sämtliche Software inkl. Bootloader löscht.
Die stabilen 5V bringt der Regler ja noch, wird nur schnell verdammt heiß dabei.

Normal wird die Software nicht gelöscht, nur wenn der Regler heiß wird, ist noch mehr kaputt.
Das zu untersuchen, wird aber schwierig.
Und ob es sich lohnt, wie schon Uwe schrieb, ist fraglich.

Ich nutze eine 2-Kanal-Relaiskarte. Dabei werden die Relais von Transistoren angesteuert.
Mir geht es auch nicht unbedingt darum, den Nano zu retten. Aber ich kann es überhaupt nicht gebrauchen, wenn ich den Nächsten dranschließe und er raucht dann auch ab, dann hab ich hier richtig die Brille auf^^

Jedenfalls hier der Schaltplan:

Die Batteriesymbole stehen für Netzspannung+Trafo+Gleichrichter. Ausserdem habe ich das Platinenlayout vom Uno genommen, ist ja praktisch nahezu identisch. Der 38V-Trafo hängt wie bereits erwähnt an einer Zeitschaltuhr. Schaltet diese durch, kann der Motor versorgt werden und am Nano wird die Flanke erkannt, worauf die Steuerung losgeht. Daher auch die etwas längere Wartezeit (20s, sollen im Betrieb 80s werden, da die Zeitschaltuhr erst nach mind. einer Minute abschaltet)
An 2 Stellen des Programms schalte ich den Motor kurz an (200er delay), obwohl er nicht laufen soll–> da soll der Kondensator über den Motor kurz entladen werden, damit er kein Signal an den Arduino liefern kann.

Hier auch der (vorläufige) Code. Es fehlen noch ein paar Zusätze, vor allem möchte ich die Schiene im Fehlermodus über die Kontaktschalter manuell fahren können.

Huehnerklappensteuerung.ino (4.35 KB)

Dein Spannungsteiler ist falsch dimensioniert. Da liegen am analogen Pin 9,5 Volt an, das killt den Nano.

Für diesen Fall wäre eine Z-Diode ein Schutz gewesen.

Warum postest du den Sketch nicht direkt hier im Forum, ist für alle einfacher.

Kannst du noch nachträglich machen und verwende bitte Code-Tags.

Im Schaltbild fällt mir auf, die Led hat keinen Vorwiderstand, den brauchst du aber.

Wenn du nur eine Spannung anschließt (Netzteil) und die ist nicht > 12 Volt, sollte kein weiteres Problem auftreten.

Am besten ist, du nimmst ein richtiges, geregeltes 9 Volt-Netzteil.

Hat die Relaisplatine auch Freilaufdioden ?

Ups, Zahlendreher drin. Der Spannungsteiler besteht aus einem 510k und einem 51k Ohm Widerstand. Wäre der Fehler hier gewesen hätte ich das auch viel eher bemerkt, habe ja selbst nachgemessen was anliegt und ausgeben lassen, was der Arduino misst.
Die Relais haben Schutzdioden, ja.
Der LED habe ich keinen Vorwiderstand verpasst, dass muss ich natürlich noch nachholen. Aber kann das die Ursache gewesen sein?

Den Code kann ich natürlich aus so posten, wenn Euch das lieber ist:

//Programm zur Steuerung einer Klappe am Hühnerstall
//geschrieben von Carsten Lehmann (DerLehmi)

#include <Bounce2.h>

int ledG=2;
int ledR=3;
int tasterO=11;
int tasterU=12;
int relaisA=5;                //Klappe runterfahren
int relaisB=4;                //Klappe hochfahren
int eingang=A4;
bool Eingangmerker=false;
bool flanke=false;
bool beheben=false;

Bounce TasterO=Bounce();
Bounce TasterU=Bounce();

int status=0;
unsigned long zeitspeicher_notAus=0;
unsigned long zeitspeicher_signal=4294787295;

void setup() {
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);

  pinMode(ledG, OUTPUT);
  pinMode(ledR, OUTPUT);
  pinMode(relaisA, OUTPUT);
  pinMode(relaisB, OUTPUT);
  digitalWrite(relaisA, HIGH);
  digitalWrite(relaisB, LOW);
  delay(200);
  digitalWrite(relaisB, HIGH);

  pinMode(tasterO, INPUT);
  digitalWrite(tasterO, HIGH);
  TasterO.attach(tasterO);
  TasterO.interval(10);
  pinMode(tasterU, INPUT);
  digitalWrite(tasterU, HIGH);
  TasterU.attach(tasterU);
  TasterU.interval(10);
  pinMode(eingang, INPUT);

  Serial.begin(9600);

  TasterO.update();
  TasterU.update();
  Tasterabfrage();
  if(status!=3){
    if(TasterO.read()){
      digitalWrite(ledR, HIGH);                     //Klappe unten (Rot)
       Serial.println("Klappe unten");
    }else{
      digitalWrite(ledG, HIGH);                     //Klappe oben (Grün)
      Serial.println("Klappe oben");
    }
  }
}

void loop() {
  if(status!=3){
    if((millis()-zeitspeicher_signal)>20000){
      if(!Eingangmerker && digitalRead(eingang)){
        flanke=true;
        Eingangmerker=true;
        Serial.println("Merker auf true, Flanke erkannt: ");
        int wert=analogRead(eingang);
        Serial.println(wert);
        zeitspeicher_signal=millis(); 
      }else if(Eingangmerker){
        Eingangmerker=false;  
        Serial.println("Merker auf false");
        zeitspeicher_signal=millis()-15000;
        digitalWrite(relaisA, LOW);
        delay(200);
        digitalWrite(relaisA, HIGH);
      }
    }
  }

  if(status==0 && !flanke){
    if(digitalRead(relaisA)!=digitalRead(relaisB)){ //Motor stoppen
      digitalWrite(relaisB, HIGH);
      digitalWrite(relaisA, HIGH); 
    } 
  }else if(status==0 && flanke){                    //wenn Wartestatus und Eingangssignal
    Tasterabfrage();
    flanke=false;
    zeitspeicher_notAus=millis();
    if(status!=3){
      if(!TasterO.read()){
        digitalWrite(relaisA, LOW);                 //Klappe runterfahren
        digitalWrite(ledR, HIGH);                   //in Betrieb: LED Gelb
        Serial.println("Klappe runter");
      }else{
        digitalWrite(relaisB, LOW);                 //Klappe hochfahren
        digitalWrite(ledG, HIGH);                   //in Betrieb: LED Gelb
        Serial.println("Klappe hoch");
      }
      status=1;                                     //Schlitten in Betrieb
    }
  }

  if(status==1){                                    //Betriebsstatus
    if(digitalRead(relaisB)){
      Serial.println("Teste unteren Taster");
      if(TasterU.fell()){                           //Zielposition (unten) erreicht
        status=0;
        digitalWrite(ledG, LOW);
        Serial.println("Ziel unten erreicht");
      }
    }else{
      Serial.println("Teste oberen Taster");
      if(TasterO.fell()){                           //Zielposition (oben) erreicht
        status=0;
        digitalWrite(ledR, LOW);
        Serial.println("Ziel oben erreicht");
      }
    }
    
    if((millis()-zeitspeicher_notAus)>5000)         //wenn Schlitten durch irgendwas blockiert
      status=3;
  }

  if(status==3){                                    //Fehlerstatus
    if(TasterO.fell() || TasterU.fell())
      beheben=true;
    if(!beheben){
      if(digitalRead(relaisA)!=digitalRead(relaisB)){ //Motor stoppen
        digitalWrite(relaisA, HIGH);
        digitalWrite(relaisB, HIGH);
      }
      if(digitalRead(ledG))
        digitalWrite(ledG, LOW);
      if((millis()-zeitspeicher_notAus)>300){            //LED blinkt rot
        digitalWrite(ledR, !digitalRead(ledR));
        zeitspeicher_notAus=millis();  
      }
    }else if(TasterO.fell() && digitalRead(relaisB)){   //Zielposition oben anfahren
      digitalWrite(relaisB, LOW);
    }else if(TasterU.fell() && digitalRead(relaisA)){   //Zielposition unten anfahren
      digitalWrite(relaisA, LOW);
    }else if(TasterO.fell() && !digitalRead(relaisA)){  //Zielposition oben erreicht
      digitalWrite(relaisB, HIGH);
      status=0;
      beheben=false;
      if(digitalRead(ledR))
        digitalWrite(ledR, LOW);
      digitalWrite(ledG, HIGH);
    }else if(TasterU.fell() && !digitalRead(relaisA)){  //Zielposition unten erreicht
      digitalWrite(relaisA, HIGH);
      status=0;
      beheben=false;
      digitalWrite(ledR, HIGH);
    }

  }
  TasterO.update();
  TasterU.update();
  delay(50);
}

void Tasterabfrage(){
  Serial.println("Fehlertest");
  if(!TasterO.read())
    Serial.println("Oberer Taster gedrückt");
  if(!TasterU.read())
    Serial.println("Unterer Taster gedrückt");
  if(TasterO.read()==TasterU.read()){               //Test, ob Schlitten eindeutige Lage hat
    status=3;                                       //Fehlerstatus
    Serial.println("Fehler erkannt");
  }
}

Ein so hochohmiger Spannungsteiler funktioniert nicht richtig. Schalte einen 0,1µF Kondensator paralell zum 51kOhm Widerstand.