Wenn die Verbindung vom Arduino zum PC getrennt wird nimmt er vom bluetooth keine Befehle

Sehr geehrtes Forum, ich möchte meinen Arduino per Bluetooth über ein App ansteuern (Motor, Servo, 2 led) über seriellen Monitor klappt das alles wunderbar, auch über Bluetooth nimmt er alle Befehle an, jedoch nur solange ich den Arduino mit dem PC verbunden habe. Kaum trenne ich die Verbindung, nimmt er nur noch den ersten Befehl an nachfolgende Befehle werden falsch interpretiert und schließlich die Bluetooth Verbindung unterbrochen. Woran kann das liegen ? Nachfolgend mein Code.

#include <Servo.h>
Servo myServo;
constexpr uint8_t servoPin {5};
constexpr uint8_t middle {84};
constexpr uint8_t rightOne {5};
constexpr uint8_t rightTwo {30};
constexpr uint8_t rightThree {60};
constexpr uint8_t leftThree {120};
constexpr uint8_t leftTwo {150};
constexpr uint8_t leftOne {173};

#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3);  // 2 TXD grün   3 RXD gelb

#define IN1 8  // Motor Richtung
#define IN2 7
#define ENA 11  // PWM Geschwindigkeit

const int geschwindigkeit[4] = {150, 170, 210, 255}; // Vier Stufen Vorwärts

#define PL 4   //Positionslichter
#define SW 6   //Scheinwerfer

void setup()
{
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENA, OUTPUT);
  // Seriell & Bluetooth
  Serial.begin(9600);
  BTSerial.begin(9600);
  // Motor Stop
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 0);
  myServo.attach(servoPin);
  setServo(middle);
  pinMode(PL, OUTPUT);
  digitalWrite(PL, LOW); //Positionslichter anfangs aus
  pinMode(SW, OUTPUT);
  digitalWrite(SW, LOW);  //Scheinwerfer anfangs aus
  Serial.println("DC Motor bereit. Kommandos: v1, v2, v3, v4, r, s, l1, l2, l3, m, r3, r2, r1, pl1, pl0, sw1, sw0");
}

const uint8_t maxIdx = 5;
char serBuf[maxIdx + 1];
char btBuf[maxIdx + 1];
uint8_t btIdx;
uint8_t serIdx;

void getSerial()
{
  if (Serial.available())         // Es ist was im seriellen
  {
    char c = Serial.read();       // liest ein Zeichen aus

    if (isPrintable(c))           // Test auf sichtbares Zeichen
    {
      serBuf[serIdx++] = c;       // Dann in den Puffer aufnehmen
    }

    if (isControl(c) ||           // Steuerzeichen gelesen? ODER
        serIdx == maxIdx)         // Buffer voll
    {
      setSpeed(serBuf);           // Aktion ausführen
      clearBuf(serBuf, serIdx);   // Variablen leeren
    }
  }
}

void getBluetooth()
{
  if (BTSerial.available())       // Es ist was im seriellen
  {
    Serial.print(F("BT Zeichen erkannt: "));
    char c = BTSerial.read();     // liest ein Zeichen aus
    Serial.println(c, HEX);

    if (isPrintable(c))           // Test auf sichtbares Zeichen
    {
      btBuf[btIdx++] = c;         // Dann in den Puffer aufnehmen
    }

    if (isControl(c) ||           // Steuerzeichen gelesen? ODER
        btIdx == maxIdx)          // Buffer voll
    {
      if (btIdx)                  // Wenn Zeichen im Buffer sind
      { setSpeed(btBuf); }        // Aktion ausführen

      clearBuf(btBuf, btIdx);     // Variablen leeren
    }
  }
}

void clearBuf(char *buf, uint8_t &idx)
{
  memset(buf, '\0', maxIdx);
  idx = 0;
}

void setSpeed(const char *buf)
{
  if (!strcmp(buf, "v1"))
  { motorVorwaerts(geschwindigkeit[0]); }
  else if (!strcmp(buf, "v2"))
  { motorVorwaerts(geschwindigkeit[1]); }
  else if (!strcmp(buf, "v3"))
  { motorVorwaerts(geschwindigkeit[2]); }
  else if (!strcmp(buf, "v4"))
  { motorVorwaerts(geschwindigkeit[3]); }
  else if (!strcmp(buf, "r"))
  { motorRueckwaerts(150); }  // Geschwindigkeit rückwärts
  else if (!strcmp(buf, "s"))
  { motorStop(); }
  else if (!strcmp(buf, "l1"))
  {setServo(leftOne);}
  else if (!strcmp(buf, "l2"))
  {setServo(leftTwo);}
  else if (!strcmp(buf, "l3"))
  {setServo(leftThree);}
  else if (!strcmp(buf, "m"))
  {setServo(middle);}
  else if (!strcmp(buf, "r1"))
  {setServo(rightOne);}
  else if (!strcmp(buf, "r2"))
  {setServo(rightTwo);}
  else if (!strcmp(buf, "r3"))
  {setServo(rightThree);}
  else if (!strcmp(buf, "pl1")) //Positionslichter an
  {digitalWrite(PL, HIGH);}
  else if (!strcmp(buf, "pl0"))
  {digitalWrite(PL, LOW);}
  else if (!strcmp(buf, "sw1"))
  {digitalWrite(SW, HIGH);}
  else if (!strcmp(buf, "sw0"))
  {digitalWrite(SW, LOW);}
  else
  {
    Serial.print(F("FEHLER: "));
    Serial.println(buf);
  }
}

void loop()
{
  getSerial();
  getBluetooth();
}

void motorVorwaerts(int speed)
{
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, speed);
  Serial.println("Motor vorwärts, Speed: " + String(speed));
}

void motorRueckwaerts(int speed)
{
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, speed);
  Serial.println("Motor rückwärts, Speed: " + String(speed));
}

void motorStop()
{
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 0);
  Serial.println("Motor gestoppt");
}

void setServo(const uint8_t pos)
{
  myServo.write(pos);
}

Wie und womit versorgst du deinen Arduino (welcher ist das ? ) mit Spannung, wenn du den seriellen Monitor (USB-Verbindung) getrennt hast ?

Es ist ein Arduino uno r3, und ich versorge ihn mit 5 St. AA Zellen also 7,5 volt.

Und die Spannung ist auch wirklich da? Oder hast du halb leere Zellen dazwischen?

Kann es sein, dass die Spannung beim Einschalten der Motoren zusammen bricht?

Und das soll für einen Servo reichen?
Nein, ich glaube nicht, dass der Regler auf deinem Arduino das schafft.
Zudem hat er nur eine 0,5A Polifuse und der Servo wird an die 1A benötigen
Und dazu noch die Motoren?
Neee...

Danke der Nachfrage ich habs jetzt mit komplett neuen Batterien versucht und siehe da es funktioniert zieht wohl alles recht viel Strom habe die Batterien bis jetzt nur zum testen verwendet und schon so schwach . Danke nochmal, manchmal ist man wie vernagelt.:slightly_smiling_face:

ist nur ein Motor

Prima, dann wars das.
Danke für die Rückmeldung.

Noch eine kleine Nachfrage vielleicht sollte ich auf 6 St. Zellen erhöhen. Wie ist das beim bluetooth modul wird am eingang 3,3 Volt verlangt, ich habe ihn ohne wiederstand angeschlossen und vorher am pin gemessen dort gehen 3,45 Volt raus. Ich denke das sollte er aushalten bis jetzt funktioniert auch als gut. kann das zum Problem werden ?

Ich habe code wiedererkannt :slight_smile:

Dann wollen wir bitte kosequent sein:

constexpr uint8_t IN1 {8};  // Motor Richtung
constexpr uint8_t IN2 {7};
constexpr uint8_t ENA {11};  // PWM Geschwindigkeit

constexpr uint8_t geschwindigkeit[4] {150, 170, 210, 255}; // Vier Stufen Vorwärts

constexpr uint8_t PL {4};   //Positionslichter
constexpr uint8_t SW {6};   //Scheinwerfer

Und denke mal über 7,2V Akkus nach.
2x 18650 gibts mit Halter fix und fertig.

Deine 3,3V mit 3,45 gehen in Ordnung.

6 Zellen bringen dir kein Vorteil, eher Nachteil, da der Onboard Regler wärmer wird und du mehr Leistung verbrätst.
Die 3,45 Volt machen normal kein Problem. Da sollten 3,3Volt + 10% immer passen.

Danke

Auch mit den neuen Zellen ist es nur ein kurzes vergnügen dass alle befehle korrekt ausgeführt werden dann bricht er die bluetooth verbindung auch wieder ab. aber funktioniert viel besser als mit den alten zellen. aber was könnt ich tun für mehr Power wenn 6 Zellen eher contrproduktiv sind ?

So wie von mir empfohlen 18650er und die Servos werden nicht über den Arduino mit 5V versorgt, sondern mit einem kleinem StepDown Regler.

ist nur ein Servo und ich versorge ihn über den Motorcontroler mit 5V, nicht über arduino. werd ich mir das mit den 18650er ansehen sind wohl akkus. Nebenbei auf was verweist “constexpr uint8_t” ? und Danke nochmals. :slightly_smiling_face:

Sowohl constexpr als auch unit8_t findest du in deinem C++ Grundlagenbuch.

Alternativ: https://cppreference.com/

versteh ich .

Und wie versorgst du den Motorcontroller ?
Warum überhaut ein Motorcontroller ?
Einen Servo kannst du direkt vom Arduino ansteuern. Die Spannung dann direkt vom Akku.
Hier ist mal ein komplettes Schaltbild angebracht.

Der Motorcontroler hängt direkt am akkupack, am 5v Ausgang des Motorcontrolers (L298N) hängt der arduino, auch der Servo wird versorgt am 5v ausgang des Motorcontrolers. Warum einen Motorcontroler ? das hab ich so mit internetrecherche ermittelt. der minus pol des servo ist mit ground arduino verbunden.