Servo zu bestehendem Code hinzufügen

Liebes Forum ich möchte einen servo SG92R in meinen Code integrieren, ich bräuchte 3 winkeleinstellungen links, eine Mitteleinstellung, und 3 Winkeleinstellungen rechts. Ausgangsstellung soll Mittelstellung sein. GND ist am Motortreiber angeschlossen. Stromversorgung ist am Motortreiber 5v Ausgang angeschlossen. Steuerung ist am Pin 5 angeschlossen. Durch den bereits umfangreichen code ist mir nicht ganz klar wie ich ansetzen sollte. eigenes “void set winkel” mit vielen if und else if. oder gehts aucheinfacher ? (natürlich brauch ich erst servo.h) Anbei mal mein Code vielleicht hat jemand einen tip.

#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3);

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

const int geschwindigkeit[4] = {60, 120, 180, 255}; // Vier Stufen Vorwärts

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);
  Serial.println("DC Motor bereit. Kommandos: v1, v2, v3, v4, r, s");
}

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(90); }  // Geschwindigkeit rückwärts
  else if (!strcmp(buf, "s"))
  { motorStop(); }
  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");
}

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.

Du nennst 100 Zeilen Code umfangreich? Das fehlen 2 bis 3 0en. Aber zu der Frage: Wann und wie soll welcher Winkel aktiv werden?

Das Grundgerüst ist ja schon da, darum sollte dass nicht so schwer sein

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

#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3);

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

const int geschwindigkeit[4] = {60, 120, 180, 255}; // Vier Stufen Vorwärts

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);
  Serial.println("DC Motor bereit. Kommandos: v1, v2, v3, v4, r, s");
}

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(90); }  // Geschwindigkeit rückwärts
  else if (!strcmp(buf, "s"))
  { motorStop(); }
  else if (!strcmp(buf, "l1"))
  {setServo(leftOne);}
  else if (!strcmp(buf, "m"))
  {setServo(middle);}
  else if (!strcmp(buf, "r3"))
  {setServo(rightThree);}
  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);
}

War jetzt ein Schnellschuss.
Mit einem kleinem m, l1 oder r3 kannst Du jetzt 3 Positionen anfahren.
Das Muster ist dann für die 2 weiteren jeweils linken und rechten Positionen das gleiche, wenn das so fuktioniert!

Wow 100 Zeilen da heissts den Überblick behalten. Das mit den Winkeleinstellungen ist mir das geringste Problem wird sich im Paxistest zeigen. Ich versuch es jetzt erst mal mit der Anleitung die ich nachstehend erhalten habe. Danke für dein Hilfsangebot, schön dass es dieses Forum gibt.

Herzlichen Dank schon mal für die Hilfe. Das ansteuern der drei Winkel funktioniert einwandfrei, jedoch reagiert er jetzt auf die Motorsteuerung nicht mehr.(v1,v2,usw.) Schön dfass es diese Forum gibt

Als Ausgabe beim seriallem Monitor bekomme ich bei Eingabe v1, Motor vorwärts, Speed: 60, aber nichts passiert.

Das ist richtig.
Grund ist:

Der PWM-Pin 9 (und 10) hängt an Timer 1.
Der Timer 1 wird aber von der Servo-Lib blockiert.

Ändere den PIN 9 auf PIN 11.

Das wars alles funktioniert perfekt.:grinning_face: Herzlichen Dank für die Unterstützung . Arduino und das Forum kann sich glücklich schätzen dass es sie gibt. Leben sie lang und in Frieden.

Es scheint hier im Forum ( nicht nur im deutschen Teil ) immer mehr üblich zu werden, dass die Fragesteller einen eigenen Post als Lösung markieren …

2 Likes

Ich bin Kummer gewöhnt. :man_shrugging:

Wenigstens ist es gelöst - da ist mir das fast egal, wo das angekreuzt ist.

.

@luke58 du solltest eher eine Antwort eines Antwort-Schreibers als Lösung markieren. Das geht nur einmal pro Thread.

Weitere hilfreiche Antworten kannst du mit einem Herzen markieren. Das geht mehrmals pro Thread.

Aber seinen eigenen Post als Antwort zu markieren obwohl die andern die Arbeit gemacht haben ist nicht so der nette Zug.

1 Like

wusste ich so nicht .Hab ich geändert. Danke für Hinweis