Problem mit Spannungsversorgung

Moin zusammen,

mein neues Projekt bereitet mir gerade Kopfzerbrechen. Ich habe einen Nano und das DFPlayer mini Modul. Mit einem 4-Kanal Funkempfänger sollen vier verschiedene Töne abgespielt und ein Servo bewegt werden. Der Funkempfänger liefert 5V an die Pins D2, D3, D4 und D5, der Servo ist an D6 angeschlossen. Ist der Nano über USB versorgt, funktioniert das auch soweit. Sobald das ganze dann über einen Akku laufen soll spielt alles verrückt. Der Servo zuckt unaufhörlich und der Player versucht was abzuspielen, es ist aber nur knacken zu vernehmen. Ein Betrieb ist nicht möglich. Wenn ich den Servo nicht angeschlossen habe, dann läuft auch alles so wie geplant. Mein Problem hat also mit dem Servo zu tun.

Das ist mein erstes Projekt mit einem Nano und einer Batterie. Kennt vielleicht jemand ein solches Verhalten und hat einen Tip für mich?

#include "Arduino.h"
#include "SoftwareSerial.h"         // Include the SoftwareSerial library for serial communication
#include "DFRobotDFPlayerMini.h"    // Include the DFRobotDFPlayerMini library for the DFPlayer Mini module
#include <Servo.h>

Servo myservo;
int pos = 0;
int i = 0;

SoftwareSerial mySoftwareSerial(10, 11); // Create a software serial connection on pins 10 (RX) and 11 (TX)
DFRobotDFPlayerMini myDFPlayer;          // Create a DFPlayerMini object



void setup() {
  mySoftwareSerial.begin(9600);     // Start software serial communication at 9600 baud rate
  Serial.begin(115200);             // Start serial communication at 115200 baud rate
  
  myservo.attach(6);
  myservo.write (90);

  pinMode(3, INPUT); 
  pinMode(2, INPUT); 
  pinMode(4, INPUT); 
  pinMode(5, INPUT); 

  if (!myDFPlayer.begin(mySoftwareSerial)) { // Initialize the DFPlayer Mini module
    Serial.println(F("Not initialized:"));
    Serial.println(F("1. Check the DFPlayer Mini connections"));
    Serial.println(F("2. Insert an SD card"));
    while (true);                  // If initialization fails, print error messages and halt the program
  }
  
  Serial.println();
  Serial.println(F("DFPlayer Mini module initialized!")); // Print initialization success message
  myDFPlayer.setTimeOut(500);       // Set the timeout value for serial communication
  myDFPlayer.volume(15);            // Set the volume level (0 to 30)
  myDFPlayer.EQ(0);                 // Set the equalizer setting (0: Normal, 1: Pop, 2: Rock, 3: Jazz, 4: Classic, 5: Bass)
}

void loop() {

 if (digitalRead(3) == HIGH) {
     myDFPlayer.play(1);   
     delay(1000); 
    for (int i = 0; i<2; i++){   
     for (pos = 90; pos >= 0; pos -= 1) { 
     myservo.write(pos);              
     delay(3);                       
    }
    for (pos = 0; pos <= 90; pos += 1) { 
     myservo.write(pos);              
     delay(1);                      
    }
  }
 }

 if (digitalRead(2) == HIGH) {          
      myDFPlayer.play(2);    
      delay(1000); 
    for (int i = 0; i<2; i++){   
     for (pos = 90; pos >= 0; pos -= 1) { 
     myservo.write(pos);              
     delay(3);                       
    }
    for (pos = 0; pos <= 90; pos += 1) { 
     myservo.write(pos);              
     delay(1);                      
    }
  }
 }

 if (digitalRead(4) == HIGH) {          
      myDFPlayer.play(3);            
      delay(1000); 
    for (int i = 0; i<2; i++){   
     for (pos = 90; pos >= 0; pos -= 1) { 
     myservo.write(pos);              
     delay(3);                       
    }
    for (pos = 0; pos <= 90; pos += 1) { 
     myservo.write(pos);              
     delay(1);                      
    }
  }
 }

 if (digitalRead(5) == HIGH) {          
      myDFPlayer.play(4);            
      delay(1000); 
    for (int i = 0; i<2; i++){   
     for (pos = 90; pos >= 0; pos -= 1) { 
     myservo.write(pos);              
     delay(3);                       
    }
    for (pos = 0; pos <= 90; pos += 1) { 
     myservo.write(pos);              
     delay(1);                      
    }
  }
 }
    
}

Die Beschreibung läßt eine fehlende Masseverbindung zwischen Nano und Servo vermuten, auch wenn diese im Schaltplan vorhanden ist.

Ich habe Zweifel ob der Step-up Wandler mit 0,8V zwischen Eingang und Ausgang zurechtkommt. Ich habe nichts im Datenblatt des XL6009 gefunden. In einer Beispielbeschaltung ist 12-16V für eine Ausgangsspannung von 18,5V bei 2,5A bzw 18V angegeben.
Miß mal die 5V nach ( im Gleichstrom und im Wechselstrombereich) Im Wechselstrombereich sollten max 100mV meßbar sein.

Ich hoffe Du hast eine Batterieschutzschaltung eingebaut ( im TP4056 oder in der Batterie selbst).
Wecher Stromlimit ist da eingestellt?
Es könnte ein 1A limit für das Problem mit dem Sensor verantwortlich sein. Du bringst die 3,2V minimal 3,2V der Baterie auf 5V. Da hast Du bei 1A Batteriestrom auf der 5V Seite nur 588mA zur Verfügung (bei fast leerer Batterie).

Grüße Uwe

Moin Uwe,

Die Masseverbindung zum Servo ist vorhanden, habe ich nochmal geprüft. Mit Spannung über den USB am Nano funktioniert ja auch alles wie gewollt.

Der Akku hat aktuell 4,1V der XL hat unbelastet 5,2V am Ausgang im Wechselstrombereich max. 10mA.

Genutzt habe ich folgende Teile:

3.7V 2600mAh Wiederaufladbare Batterien Lithium-Ionen-Akku mit XH2.54/2P-Anschluss für DIY-Elektronikprodukte, Spielzeug, Beleuchtung, Bluetooth-Geräte: Amazon.de: Elektronik & Foto

und

TP4056 Batterieladungsmodul - USB Typ C, Schutzschaltung

Der Servo zieht 0,4A.

Danke und Gruß
Vince

Hi,

es scheint mehr als einen Hersteller vom XL6009 zu geben! In einem Datenblatt habe ich Vin(min) 3.6V gelesen, in anderen Datenblättern Vin(min) 5.0V ...
Das Verhalten Deiner Schaltung ist ein typisches Unterspannungsproblem!

Gruß André

Moin,

Diesen habe ich:

ICQUANZX 5 Pack XL6009 Boost Converter Modul DC zu DC 3.0-30 V zu 5-35 V Ausgangsspannung Einstellbare Step-Up-Platine : Amazon.de: Elektronik & Foto

Gruß Vince

... na dann schau Dir mal die schlechten Bewertungen an, diese bestätigen meine Vermutung!

Gruß André

Moin André,

hast du einen Tip für eine Alternative?

Hi,

wie hast Du verkabelt, speziell da wo mehr Strom fließt?
(Keine DupuntKabel, kein Steckbrett, keine dünnen Kabel mit Krokodilklemmen!)
Was für ein Servo ist es denn, daß man mal in ein Datenblatt schauen kann.

Gruß André

Ist alles mit 26AWG Adern auf Platinen verlötet. Der Servo ist ein SG90.

Gruß Vince

OK, an der Verkabelung sollte es nicht liegen.
Ich bin kein Motorspezi, aber mit Batterie/LiPo und StepUp/StepDown habe ich schon Sachen gebaut. Ein wirklich aussagekräftiges Datenblatt findet man nicht, einzig belastbare Aussage zur Stromaufnahme (0.5A ... 2.0A!) findet sich hier.
Bei Belastung geht der Stromverbrauch sehr schnell hoch, testen kannst Du nur unter Realbedingungen.
Bei 2.0A Strom fällt mir kein StepUp ein, der aus 3.0V ... 4.2V (nutzbarer Spannungsbereich des Akku) die benötigten 5.0V stemmen kann! Der umgekehrte Weg geht schon, mit einem StepDown und 2 Akkus in Serie. Du brauchst dann aber für den Ladevorgang entweder extern eine Lademöglichkeit, oder intern noch einen Balancer (2S) und einen Unterspannungsschutz als minimum. Extern laden ist einfacher.
Der Vorteil ist, Du hast ca. doppelte, zuverlässige Laufzeit und die StepDown haben gewöhnlich einen besseren Wirkungsgrad ggü. einem StepUp im unteren Grenzbereich.

Gruß André

An einen Step-Down hatte ich schon gedacht, aber das macht auch alles größer durch den zusätzlichen Akku, was ich vermeiden wollte.

Ich habe hier noch eine kleine Powerbank mit einer Zelle, nehme ich diese als Spannungsversorgung, Laderegler und XL6009 sind abgeklemmt, funktioniert das ganze auch.

Was würdest du hierzu sagen?
iHaospace IP5328P Power Bank Mainboard 3.7V 18650 Battery Charging Board Fast Quick Charger Circuit Board 3.7V Boost 5V 9V 12V: Amazon.de: Elektronik & Foto

Auseinandernehmen zum Laden wollte ich nachher wenn es fertig ist nichts.

Laut Userbewertung kann das Ding 18W am Ausgang liefern, das sollte gut reichen. Ob der Ruhestrom niedrig genug ist steht leider nirgends ...

Gruß André

Ich werds mal testen und dann berichten.

Danke euch

Der XL6009 müßte das schon können. Der Flaschenhals ist aber zwischen ihm und der Batterie. Auf dem Laderegler ist ein BMS verbaut der bei 1A den Akku abtrennt. Da kann der Step Up können was er will, wenn auf den 5V ca 0,6A gezogen werden, dann wird die Batterie ( je nach Ladezustand; wenn sie fast leer ist) mit 1 A belastet und der BMS greift ein. Darum fragte ich ja nach den Messungen.

Dann hast Du aber noch andere Verbraucher:
Wieviel verbraucht der DFPlayer?
laut MP3 player with RGB-signal LED (optionally battery powered) | OpenHardware.io - Enables Open Source Hardware Innovation
15mA in Standby und bis zu 1 A beim abspielen (ich hatte weniger gedacht aber das Modul hat einen 3W Verstärker für den Lautsprecher drauf)
hier
DFPlayer Mini - MP3-Player
schreiben sie 100mA bei Audiowiedergabe.

Da kommt mann schnell ans Limit.

Powerbank, wenn sie den Europäische Stromsparnormen entsprechen, müssen unter einer bestimmten Last ausschalten. Diese minmale Last liegt so um 50mA über 30 Sekunden ( die Minimallast hat eine große Streuung. Hab ich mal 4 gleichen Powerbanks erfahren müssen.) . Verbraucht Deine Schaltug immer mehr als dieser Minimalverbrauch??

Grüße Uwe

Moin zusammen,

vielen Dank für eure Tipps und Hinweise. Das Power-Bank Mainboard IP5328P liefert ausreichend Strom. Funktioniert soweit alles. Den Code habe ich etwas angepasst. Macht jetzt eigentlich was es soll, aber.....

Sobald ich über die Fernbedienung, egal welcher der vier Taster das Signal gebe, zuckt der Servo kurz und fährt dann. Bekomme ich das weg?

#include "Arduino.h"
#include <Servo.h>
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

Servo servo1; 

int pos = 0;
int i = 0;
const byte buttonPin1 = 2; // Taster FB2 RX D3
const byte buttonPin2 = 3; // Taster FB1 RX D2
const byte buttonPin3 = 4; // Taster FB3 RX D1
const byte buttonPin4 = 5; // Taster FB4 RX D4

SoftwareSerial mySoftwareSerial(10, 11); // pins 10 (RX) and 11 (TX)
DFRobotDFPlayerMini myDFPlayer;

void setup() {

  mySoftwareSerial.begin(9600);
  Serial.begin(115200);

  servo1.attach(6);    //Sprühkopf
  servo1.write (100);  //Startposition
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(buttonPin3, INPUT_PULLUP);
  pinMode(buttonPin4, INPUT_PULLUP);

  if (!myDFPlayer.begin(mySoftwareSerial)) { // Initialize the DFPlayer Mini module
    Serial.println(F("Not initialized:"));
    Serial.println(F("1. Check the DFPlayer Mini connections"));
    Serial.println(F("2. Insert an SD card"));
    while (true);                  // If initialization fails, print error messages and halt the program
  }
  
  Serial.println();
  Serial.println(F("DFPlayer Mini module initialized!")); // Print initialization success message
  myDFPlayer.setTimeOut(500);       // Set the timeout value for serial communication
  myDFPlayer.volume(15);            // Set the volume level (0 to 30)
  myDFPlayer.EQ(0);  
}

void loop() {

  if (digitalRead(buttonPin1) == HIGH) {
     myDFPlayer.play(1);   
     delay(1600);
    for (int i = 0; i <2; i++){

      for (int pos = 100; pos >=  10; pos--) {
        servo1.write(pos); 
        delay(4);
      }
      for (int pos =  10; pos <= 100; pos++) {
       servo1.write(pos);  
       delay(2);
      }
    }
  }

  if (digitalRead(buttonPin2) == HIGH) {
     myDFPlayer.play(2);   
     delay(1600);
    for (int i = 0; i <2; i++){

      for (int pos = 100; pos >=  10; pos--) {
        servo1.write(pos); 
        delay(4);
      }
      for (int pos =  10; pos <= 100; pos++) {
       servo1.write(pos);  
       delay(2);
      }
    }
  }

  if (digitalRead(buttonPin3) == HIGH) {
     myDFPlayer.play(3);   
     delay(1600);
    for (int i = 0; i <2; i++){

      for (int pos = 100; pos >=  10; pos--) {
        servo1.write(pos); 
        delay(4);
      }
      for (int pos =  10; pos <= 100; pos++) {
       servo1.write(pos);  
       delay(2);
      }
    }
  }

  if (digitalRead(buttonPin4) == HIGH) {
     myDFPlayer.play(4);   
     delay(1600);
    for (int i = 0; i <2; i++){

      for (int pos = 100; pos >=  10; pos--) {
        servo1.write(pos); 
        delay(4);
      }
      for (int pos =  10; pos <= 100; pos++) {
       servo1.write(pos);  
       delay(2);
      }
    }
  }
}

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