2. Versuch eines Shotspenders

Hallo liebe Community,
ich habe mich nun schon seit über einem Jahr in das Thema Microcontroller reingefuchst, jedoch läuft es immer noch nicht so richtig. Ich habe ein sehr gutes Grundverständnis von Elektronik, schließlich bin ich im 2. Lehrjahr als Elektroniker für Automatisierungstechnik, aber diese Microcontroller spielen mir immer wieder Streiche. Um nun auf den Punkt zu kommen, gehe ich den Versuch eines Shotspenders das 2. mal an und habe das Grundprinzip auch zum laufen gebracht. Ein 5V Netzteil, welches maximal 3A liefern kann, speist einen Arduino Nano über den 5V Pin ein (Ich nutze nicht den Vin Pin, weil ich gelesen habe, dass man diesen erst ab ca.6V verwenden darf, da am Linearregler min. 1V abfällt und es sonst zu Problemen führen kann). Außerdem steuere ich den Motor für die Pumpe über ein MOS - Modul an. Die 3 Taster sind über die internen Pullup-Widerstände geschaltet, den Servo steuere ich über PWM an (sollte man hier einen Transistor verwenden, um nicht über die 10mA am I/O Pin zu kommen) und ich habe 2 RGB LEDs, welche ich direkt über je zwei 100 Ohm Widerstände (Rot und Blau) und einen 150 Ohm Widerstand (Grün).
Jetzt zum eigentlichen Problem:
Skech und co. hat wunderbar funktioniert, bis nach einiger Zeit der Arduino Nano aus unerklärlichen Gründen angefangen hat zu spinnen. Servo fährt hin und her ohne Tastendruck. Die gründe LED leuchtet sehr schwach, die "Unterboden-LED" leuchtet gar nicht mehr. Die Pumpe geht auch nicht mehr. Also Netzteil getrennt und Programm nochmal neu hochladen. Hochladen funktioniert auch nicht (Fehlermeldung: Arduino reagiert nicht?! oder so ähnlich). Nach 5min. warten konnte ich es wieder hochladen und es funktioniert wieder einigermaßen. Aber nicht so wie vorher (Pumpe hat immer wieder Hänger und in dieser Zeit funktionieren auch die LEDs nicht). On Board LED leuchtet während diesen Hängern!!! Mir kommt es vor wie kleine Resets. Schafft der Nano es nicht diese Leistung bereitzustellen?

#include <Servo.h>

#define TASTER_1_PIN 15
#define TASTER_2_PIN 17
#define TASTER_3_PIN 19
#define SERVO_PIN 3
#define PUMPE_PIN 5
#define POTENTIOMETER_PIN 14

#define UNTERBODEN_LED_R 9
#define UNTERBODEN_LED_G 8
#define UNTERBODEN_LED_B 7
#define FAHRERKABINE_LED_R 11
#define FAHRERKABINE_LED_G 10
#define FAHRERKABINE_LED_B 12

Servo servo;

bool taster1Pressed = false;
bool taster2Pressed = false;
bool taster3Pressed = false;
int pumpenzeit = 3000; // Standard-Pumpenzeit: 3 Sekunden

unsigned long previousMillis = 0;
const long interval = 1000; // Intervall für die Lichtshow (in Millisekunden)
bool lightsOn = false;

void setup() {
  pinMode(TASTER_1_PIN, INPUT_PULLUP);
  pinMode(TASTER_2_PIN, INPUT_PULLUP);
  pinMode(TASTER_3_PIN, INPUT_PULLUP);
  pinMode(PUMPE_PIN, OUTPUT);
  pinMode(POTENTIOMETER_PIN, INPUT);

  pinMode(UNTERBODEN_LED_R, OUTPUT);
  pinMode(UNTERBODEN_LED_G, OUTPUT);
  pinMode(UNTERBODEN_LED_B, OUTPUT);

  pinMode(FAHRERKABINE_LED_R, OUTPUT);
  pinMode(FAHRERKABINE_LED_G, OUTPUT);
  pinMode(FAHRERKABINE_LED_B, OUTPUT);

  servo.attach(SERVO_PIN);
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    lightsShow();
  }

  pumpenzeit = map(analogRead(POTENTIOMETER_PIN), 0, 1023, 1000, 5000); // Pumpenzeit justieren

  if (!digitalRead(TASTER_1_PIN) && !taster1Pressed) {
    taster1Pressed = true;
    assignColorToDriverCabin(255, 0, 0); // Rot für Taster 1 in der Fahrerkabine
    fillGlass(1);
  } else if (!digitalRead(TASTER_2_PIN) && !taster2Pressed) {
    taster2Pressed = true;
    assignColorToDriverCabin(0, 255, 0); // Grün für Taster 2 in der Fahrerkabine
    fillGlass(2);
  } else if (!digitalRead(TASTER_3_PIN) && !taster3Pressed) {
    taster3Pressed = true;
    assignColorToDriverCabin(0, 0, 255); // Blau für Taster 3 in der Fahrerkabine
    fillGlass(3);
  }

  if (digitalRead(TASTER_1_PIN) && taster1Pressed) {
    taster1Pressed = false;
  }
  if (digitalRead(TASTER_2_PIN) && taster2Pressed) {
    taster2Pressed = false;
  }
  if (digitalRead(TASTER_3_PIN) && taster3Pressed) {
    taster3Pressed = false;
  }
}

void fillGlass(int glassNumber) {
  switch (glassNumber) {
    case 1:
      moveServoToGlass(83);
      delay(500); // Verzögerung vor dem Pumpen
      if (taster1Pressed) {
        digitalWrite(PUMPE_PIN, HIGH);
        delay(pumpenzeit); // Pumpenzeit einstellen
        digitalWrite(PUMPE_PIN, LOW);
      }
      break;
    case 2:
      moveServoToGlass(131);
      delay(500); // Verzögerung vor dem Pumpen
      if (taster2Pressed) {
        digitalWrite(PUMPE_PIN, HIGH);
        delay(pumpenzeit); // Pumpenzeit einstellen
        digitalWrite(PUMPE_PIN, LOW);
      }
      break;
    case 3:
      moveServoToGlass(180);
      delay(500); // Verzögerung vor dem Pumpen
      if (taster3Pressed) {
        digitalWrite(PUMPE_PIN, HIGH);
        delay(pumpenzeit); // Pumpenzeit einstellen
        digitalWrite(PUMPE_PIN, LOW);
      }
      break;
  }
}

void moveServoToGlass(int angle) {
  servo.write(angle);
  delay(500); // Zeit für den Servo, sich zu bewegen
}

void assignColorToDriverCabin(int red, int green, int blue) {
  digitalWrite(FAHRERKABINE_LED_R, red > 0 ? HIGH : LOW);
  digitalWrite(FAHRERKABINE_LED_G, green > 0 ? HIGH : LOW);
  digitalWrite(FAHRERKABINE_LED_B, blue > 0 ? HIGH : LOW);
}

void lightsShow() {
  if (!taster1Pressed && !taster2Pressed && !taster3Pressed) {
    // Unterbodenbeleuchtung zufällige Farbe
    randomColorForUnderbody();
  }
}

void randomColorForUnderbody() {
  int colors[3] = {UNTERBODEN_LED_R, UNTERBODEN_LED_G, UNTERBODEN_LED_B};
  int selectedColor = random(3); // Zufällige Auswahl einer Farbe
  for (int i = 0; i < 3; i++) {
    digitalWrite(colors[i], i == selectedColor ? HIGH : LOW);
  }
}

(Ich weiß nicht wie ich hier im Forum Videos hochladen kann. Das würde die Sache vereinfachen. Und ich habe kein Schaltplan-Programm, somit auch keinen Schaltplan)
Danke schonmal für eure Hilfe!

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Hast du einen Bleistift?

Könnte es sein, dass unter deiner Nano-Adapterplatine Metallspäne oder sonst irgendetwas metallenes herumliegt und Kurzschlüsse an den Lötpunkten der Platine verursacht?

Ein von handgezeichneter Schaltplan tut es vollkommen.
Wenn du denn unbedingt den Aufwand eines Computergezeichneten Schaltplanes betreiben willst.
https://www.tinycad.net/
ist ein reines Schaltplan-Zeichenprogramm und lässt sich deshalb im Vergleich zu den meisten anderen Elektronik-CAD-Systemen wie KiCad usw. sehr schnell erlernen.

Du solltest ALLES außer Sensoren mit einem Extra-Netzteil versorgen.
GND des Netzteiles und GND Arduino müssen verbunden sein.

Das einzige was am Nano direkt angeschlossen sein darf sind Steuereingänge von Transistoren / MOS-FETs und LEDs wenn Sie nur 5 mA ziehen.

Über den Daumen gerechnet
(5V - 2V) / 100 Ohm = 30 mA = zu viel
(5V - 2V) / 150 Ohm = 20 mA = zu viel

Du hast aber Bleistift Papier und ein Smartphon? Das zusammen funktioniert fast so gut wie ein Schaltplanprogramm.

Beim MOS Modul hätte ich den Verdacht, daß kein Logic Level MOSFET drauf ist.

Grüße Uwe

Die Stromversorgung läuft über den Arduino?

Schonmal vielen Dank für das Schaltplanprogramm. Anbei der nun erstellte Schaltplan:

Du solltest auch die Speisung der Pumpe und des Nanos in den Schaltplan einzeichnen, denn mit unvolständigen angaben, besonders im Bereich der Stromversorgung, können wir keine volständigen Analysen der Belastung des Nanos machen und auch keine präzisen Antworten geben. Denn nachdem wie dein Schaltplan jetzt gezeichnet ist, müsste ich Dir mitteilen: Deine Pumpe kann / darf gar nicht laufen.

Eigentlich nicht. Ich habe es auf der Platine über Schraubklemmen parallel geschaltet.


(Ich weiß, die Lötstellen sind fürchterlich)

Also unten kommt das Netzteil rein mit +5V und 0V. Im oberen Teil des Bildes, der weiße Stecker ist die Leitung zum Programmieren des Arduinos

Entschuldige, ich habe die Verbindung von 5V zu Vin des MOS Moduls vergessen.

Du solltest aber auch GND vom MOS-Modul für die Pumpe einzeichnen, Und zur sicherheit der Pumpe eine Freilauf-Diode gönnen, der MOS wird es Dir mit längerer Lebensdauer danken. Wird der Nano ausschliesslich über USB versorgt? wennder Nano auch am 5V Netzteil hängt (das kann ich leider aus dem Schaltplan nicht entnehmen, würde ich, physikalisch in der Nähe der Pumpe, je nach Stromaufnahme der Pumpe, einen Elko von mindestens 100mF (polungsrichtig) spendiesren, das Stützt die Betriebsspannung beim Schalten der Pumpe und kann verhindern, dass der Nano beim schalten der Pumpe abstürzt/resettet.

GND habe ich am Mos Modul nur einmal angeschlossen, wie im Schaltplan gezeichnet (Gedankengang war, dass ich ja keine 2. Spannungsquelle nutze.) Der Nano wird genauso übers Netzteil gespeist (5V Pin und GND Pin des Nanos). Die weiße Leitung im Bild ist rein für's Programmieren. 1N4004 Freilaufdiode ist an der Pumpe verbaut. Das mit dem Elko ist tatsächlich ein guter Tipp, den ich (aus Faulheit) noch nicht umgesetzt habe (weil ich keinen guten Platz gefunden habe. Werde ihn jetzt aber wahrscheinlich auf die Rückseite des MOS-Moduls löten)

Den GND am Mos-Modul an der Schraubklemme ist wichtig wegen dem Motorstrom. Aufgrund wie die Leiterbahnen auf dem Modul geführt sind, Solltest Du die masse, also ND unbedingt bei der MOTOR Seite anschliessen, also An der Einspeise-Klemme für die Betreibsspannung des Motors. Und trage die Versorgung des Nanos, sowie die Masseverbindungen in den Schaltplan ein, ebenso die Freilauf Diode und, wenn du den Elko noch nachrüstest auch diesen. dann lade den Schaltplan nochmals ins Forum, damit alle d, die evt. helfen wollen, auf dem aktuellen Stand sind. nur so bekommst Du präzise Hilfe, ohne dass die immer wieder die selben Tips gegeben werden, die Du bereits umgesetzt hast.

Ich habe jetzt schonmal den Elko und die GND Verbindung vom MOS Modul eingetragen, obwohl sie noch nicht umgesetzt sind!


Könnte ich dann zumindest den GND vom Nano zum MOS Modul weglassen? Die sind ja sowieso beide mit dem selben GND-Potenzial verbunden. Also ich habe sozusagen eine GND Klemmleiste, auf die führt direkt das Netzteil und von da aus verteile ich dann auf Arduino, Servo, Taster und co.

Bitte schalte den Elko am MOS-Modul an Vin+ und Vin- , dann kann er bei ausgeschalteter Pumpe schonmal Energie auf Vorrat speichern. Und stützt damit die Spannungsversorgung richtig, weil der Puffer dann im Ein-Schaltmoment der Pumpe schon voll ist. So wie er jetzt geschaltet ist, hat er genau die gegenteilige Wirkung und stellt im Einschltmoment eine zusätzliche Belastung dar.

Ergibt Sinn, habe ich nicht bedacht. Macht es Sinn zusätzlich einen Elko an die Spannungsversorgung des Servos anzuschließen?

Elkos als Puffer in der Spannungsversorgung schaden eigentlich nie. Hängt aber halt wie immer von der Schaltung und den Randbedingungen ab, inwieweit man da Aufwand treiben muss.

Ja, schaden tut er nicht. es geht vor allen darum, dass im Anlaufmoment der Motoren ein (aufgeladener) Puffer da ist, der die Zeit, die der Regler im Netzteil für die Lastausregelung bei plötzlichem Lastanstieg benötigt zu überbrücken und die Spannung stabil zu halten, damit der Mikrokontroler immer eine ausreichend stabile Versorgung hat.
In der regel haben Netzteile zwar im Ausgang ebenfals Elkos drin, das Problem : die anschlussleitung hat einen gewissen Widersand, Dieser begrenzt die Geschwindigleit des Stromanstiegs bei plötzlicher , Belastung , besonders wirktsich das bei Verbrauchern wie Motoren und Realais aus. dnn kann die Spannung ganz kurz einknicken, was den Mikrokontroler aus dem Takt bringen kann bis hin zum reset oder Absturz. sicher, auch dein Nano hat kleine Kondensatoren drauf, wber je nachdem was sonst noch alles dran Hängt an der Versorgung, reicht das dann eben nicht mehr aus für einen stabilen Betrieb.
Dies einfach nur zur Erklärung.

Ich würde bevor überhaupt irgendwas mit dem Controller gemacht wird, prüfen ob der überhaupt noch ausreichend funktioniert.
Zusatzfrage: Hast Du einen zweiten Controller?

Also entweder reset oder kein reset.
Was meinst Du mit kleine reset?
Um zu sehen, ob der Controller ständig neu startet, kannst Du im setup Dir den Start auf dem seriellen Monitor ausgeben lassen.
Und dann kannst Du zu Debugzwecken jeden Statuswechsel auf dem Sermon anzeigen.

Dann kommt zumindest was bei raus, auf was man direkt zurückgreifen kann.
Alles andere ist stochern im Nebel und Rate mal mit Rosenthal.