Arduino Projekt WIFI Controlled Tank

Hallo zusammen,

mein erster Post hier im Forum. Also ersteinmal ein herzliches "Hallo" von meiner Seite.

Ich bin schon seit einiger Zeit immer ein wenig am basteln mit Arduinos und hab auch von beruflicher Seite ein wenig Ahnung von Elektronik und Programmierung. Aber wirklich nur sehr rudimentär... :slight_smile:

Nachdem ich jetzt immer so typische Anfängerprojekte gemacht habe, wollte ich mir ein etwas anspruchsvolleres Projekt antun. Daher hab ich mir diese zwei Sachen in China bestellt:

und

Ich hab jetzt mal alles zusammengebaut und verkabelt. Außerdem habe ich mir mal ein paar Codebeispiele im Internet gesucht. Soweit passt das auch alles.

Allerdings habe ich ein kleines Verständnisproblem, was glaube ich daran liegt das es für diese Teile nur recht wenig im Netz zu finden gibt. Alles was ich gefunden habe sind diese beiden Einträge auf Github:

und

Was ich jetzt nicht verstehe ist wie ich PWM und Drehrichtung der beiden Motoren steuere und wie ich die Hall Sensoren der beiden Motoren anschliesse.
Normalerweise müsste ich ja die PWM und Drehrichtungsanschlüsse von einer Motortreiberplatine mit den entsprechenden digitalen Ausgängen des Arduino verbinden. Aber dieses China Shield ist ja schon direkt mit dem Arduino verbunden, oder?

Ich glaub ich sehe den Wald vor lauter Bäumen nicht...

Außerdem wäre es cool wenn jemand einen Hinweis zu Codebeispielen im Netz hätte. Dann kann ich noch ein bisschen abschauen und bringe das Projekt zu einem positiven Abschluss.

Vielen Dank

Gruß

Joe

Hi

Hall-Sensoren an den Motoren?
Laut den Bildern des Fahrgestell würde ich auf normale Bürstenmotoren schließen - Die bekommen vom Motortreiber (H-Brücke) ggf. ein PWM-Signal.

Das Sensor-Shield wird Dir, wenn ich Das richtig sehe, eine Doppel-H-Brücke (L293D) und einen I²C-PWM-Chip bieten.
Die H-Brücke geht wohl auf die rechten Schraubklemmen, der PWM-Chip auf die 16 3er Stiftleisten.
Beides - also Motoren und Servos - brauchen recht viel Strom und brauchen daher eine eigene Versorgung - Das kann der Arduino nicht liefern.
Die Servos wünschen normal 6V, die Motoren am Fahrgestell 12V.
Aus den 12V kannst Du aber sowohl die 6V der Servos wie die 5V des Arduino erzeugen. (Schaltregler - wenn der Arduino nur sich selber versorgen muß, kann man Dem auch die 12V an Vin geben - saubere 5V sind aber 'schöner')

Lasse Mal einen I2C-Scanner laufen, wenn das Shield aufgesteckt ist, Du wirst wohl einen Treffer haben, Der sich als PWM-Treiber heraus stellen wird.

Ob der L293D direkt an irgend welchen Pins hängt, oder ob Da noch ein Portexpander (könnte dann ebenfalls I²C sein) verbaut ist, wird sich herausstellen.

MfG

das steht ja eh im PDF und auf der Platine

D6 D7 und D11 D12 sind die PWM bzw. Richtungs-PINs

auf den PWM gibst dein analogWrite, Mit den DIR schaltest die Richtung

wenns nicht klappt, poste mal deinen MINIMALEN kompilierbaren Sketch, vieleicht schaut dann wer drüber.

Hallo zusammen,

vielen Dank für die raschen Antworten.

@ postmaster-ino:
Ich hab tatsächlich zwei I2C Adressen gefunden… 0x40 und 0x70
Also wie du getippt hattest ein PWM Treiber und ein Extender. Stromversorgung und alles andere sollte auch passen, ich hänge mal ein Bild mit an wie ich das ganze verdrahtet habe.

BTW. Die Motoren haben nur 9V und haben tatsächlich einen Hall Sensor dabei. Ach dazu hab ich mal ein Bild angehängt.

@noiasca:
Genau das meinte ich mit Wald vor lauter Bäumen… :slight_smile: Aber ich glaube ich habs gecheckt. Ich werd mal einen Sketch zusammenschreiben und hier posten. Könnte aber ein bisschen dauern. Wie gesagt ist für mich das erste Mal im “Freiflug” ohne irgendwelche Anleitungen oder ähnliches im Hintergrund.

Aktuell überlege ich halt gerade wo ich die 2x4 Kabel (Vin, GND, S1, S2) der Hall Sensoren anschliesse und außerdem hab ich noch zwei LEDs welche in Reihe geschaltet sind. Diese würde ich gerne über den Arduino steuern. Aber das wäre erst einmal nicht ganz so wichtig. Dringender wäre die Motoren korrekt anzusteuern.

Hättet ihr vielleicht eine Quelle für einen Sketch der mir als Grundlage dienen könnte?

Vielen Dank

Gruß

Joe

also so solltest du doch einiges finden:

https://www.google.com/search?client=firefox-b&ei=jcjMW-DiEKKqrgT0h6OIDw&q=obstacle+avoidance+arduino&oq=obstacle+avoidance+arduino&gs_l=psy-ab.3..0i203k1l2j0i22i30k1l5j0i22i10i30k1j0i22i30k1l2.258.4489.0.4986.20.17.2.0.0.0.334.2792.0j7j5j1.13.0....0...1c.1.64.psy-ab..7.12.2115...0i13k1j0i13i30k1j33i160k1.0.2hAx00SQtio

der schaute auf youtube ganz gut aus und trotzdem ist die Logik sehr überschaubar:

Mein Vorschlag:

S2 -> freier Arduino-Eingang mit INPUT_PULLUP oder INPUT
S1 -> freier Arduino-Eingang mit INPUT_PULLUP oder INPUT
G -> Arduino-GND
V -> Arduino-5V

Hallo zusammen,

vielen Dank erst noch einmal für die vielen Ideen zum Start. Ich habe jetzt ein paar wirklich rudimentäre Sketche für mein Projekt geschrieben. Mein Ansatz ist es immer ein Schritt nach dem anderen und immer nur eine Funktion testen und schauen wie der Sketch funktioniert.

Als erstes habe ich mich mit dem ansteuern des Motorboards beschäftigt. Dabei ist dieser Code herausgekommen:

int DIRB =  7;  // Richtung Motor B
int PWMB =  6;  // Geschwindigkeit Motor B

#define FORWARD  {digitalWrite(DIRA, HIGH);digitalWrite(DIRB, LOW);} //Vorwärts fahren
#define BACK  {digitalWrite(DIRA, LOW);digitalWrite(DIRB, HIGH);} //Rückwärts fahren
#define LEFT  {digitalWrite(DIRA, HIGH);digitalWrite(DIRB, HIGH);} //Links fahren
#define RIGHT  {digitalWrite(DIRA, LOW);digitalWrite(DIRB, LOW);} //Rechts fahren 

#define STOP  {analogWrite(PWMA, 0);analogWrite(PWMB, 0);} //Anhalten
#define GO  {analogWrite(PWMA, 200);analogWrite(PWMB, 200);} //Fahren mit 200 PWM

void setup()
{
  // Motor A initialisieren
  // Pin für Richtung Motor A als Ausgang
  pinMode(DIRA, OUTPUT);
  
  // Motor B initialisieren
  // Pin für Richtung Motor B als Ausgang
  pinMode(DIRB, OUTPUT);

}

void loop()
{
  FORWARD;

  GO;

  delay(2000);

  STOP;

  delay(2000);

  BACK;

  GO;

  delay(2000);

  STOP;

  delay(2000);

  LEFT;

  GO;

  delay(2000);

  STOP;

  delay(2000);

  RIGHT;

  GO;

  delay(2000);

  STOP;

  delay(2000);

}

Mein Ziel war es den Roboter in einer Schleife immer in jeweils eine Richtung fahren zu lassen. Auch um zu testen ob die Drehrichtung der Motoren und alles stimmt. Also ich würde sagen, das war ein Erfolg.

Nächster Schritt war eine primitive Form der Steuerung. Deshalb habe ich einen Joystick mit zwei Potis genomme und am Board angeschlossen. Dazu dann diesen Code:

int SW_Pin = 5; // Taster Joystick
int X_Pin = 1; // X-Achse Joystick
int Y_Pin = 0; // Y-Achse Joystick

int DefaultX = 500; //Default Wert für X-Achse
int DefaultY = 522; //Default Wert für Y-Achse

void setup() {
  
  pinMode(SW_Pin, INPUT);
  digitalWrite(SW_Pin, HIGH);

  Serial.begin(115200);

}

void loop() {

  Serial.println(analogRead(X_Pin));
  Serial.println(analogRead(Y_Pin));
  
  if(analogRead(X_Pin) < DefaultX)
    Serial.println("Motor vorwaerts");

  delay(500);
   
  if(analogRead(X_Pin) > DefaultX)
    {Serial.println("Motor rueckwaerts");}

  delay(500);

  if(analogRead(Y_Pin) < DefaultY)
    {Serial.println("Motor links");}

  delay(500);

  if(analogRead(Y_Pin) > DefaultY)
    {Serial.println("Motor rechts");}

  delay(500);

}

Ziel hier war es zu schauen wie ich Richtungsbefehle über den Joystick absende. Der Switch ist hier im Code zwar deklariert, wird aber noch nicht genutzt. Auch das hat scheinbar ganz gut funktioniert. Solange ich keine Bewegung am Joystick gemacht habe kam nur die Default Wert für die X- und Y-Achse im seriellen Monitor und sobald ich eine Bewegung ausgeführt habe bekam ich auch den entsprechenden Text in der Console angezeigt.
Ich denke hier ist aber auf jeden Fall noch Luft nach oben, da es teilweise zu längeren Verzögerungen kam. Das liegt wahrscheinlich daran das ja immer der Loop durchlaufen werden muss bis eine Aktion greift.

Ja und dann dachte ich war es endlich soweit und ich konnte beide Codes kombinieren um endlich den Roboter auch wirklich steuern zu können. Heraus kam dieser Code:

int SW_Pin = 5; // Taster Joystick
int X_Pin = 1; // X-Achse Joystick
int Y_Pin = 0; // Y-Achse Joystick

int DefaultX = 500; //Default Wert für X-Achse
int DefaultY = 522; //Default Wert für Y-Achse

int DIRA = 12;  // Richtung Motor A
int PWMA = 11;  // Geschwindigkeit Motor A

int DIRB =  7;  // Richtung Motor B
int PWMB =  6;  // Geschwindigkeit Motor B

#define FORWARD  {digitalWrite(DIRA, HIGH);digitalWrite(DIRB, LOW);analogWrite(PWMA, 200);analogWrite(PWMB, 200);} //Vorwärts fahren
#define BACK  {digitalWrite(DIRA, LOW);digitalWrite(DIRB, HIGH);analogWrite(PWMA, 200);analogWrite(PWMB, 200);} //Rückwärts fahren
#define LEFT  {digitalWrite(DIRA, HIGH);digitalWrite(DIRB, HIGH);analogWrite(PWMA, 200);analogWrite(PWMB, 200);} //Links fahren
#define RIGHT  {digitalWrite(DIRA, LOW);digitalWrite(DIRB, LOW);analogWrite(PWMA, 200);analogWrite(PWMB, 200);} //Rechts fahren 

#define STOP  {analogWrite(PWMA, 0);analogWrite(PWMB, 0);} //Anhalten

void setup()
{
  // Motor A initialisieren
  // Pin für Richtung Motor A als Ausgang
  pinMode(DIRA, OUTPUT);
  
  // Motor B initialisieren
  // Pin für Richtung Motor B als Ausgang
  pinMode(DIRB, OUTPUT);

  pinMode(SW_Pin, INPUT);
  digitalWrite(SW_Pin, HIGH);

}

void loop() {

  if(analogRead(X_Pin) < DefaultX)
    {FORWARD};

  if(analogRead(X_Pin) > DefaultX)
    {BACK};

  if(analogRead(Y_Pin) < DefaultY)
    {LEFT};

  if(analogRead(Y_Pin) > DefaultY)
     {RIGHT};

}

Hier muss ich sagen bin ich ein bisschen Enttäuscht. Mir ist ja klar das mein Ansatz noch viel viel Luft nach oben hat. Aber da die beiden ersten Versuche doch eigentlich ganz gut geklappt haben, dachte ich das wäre der einfachste Teil. Leider war dem nicht so. Irgendwie funktioniert die Steuerung nicht richtig “sauber”. Der eine Motor dreht wesentlich stärker als der andere und auch ohne Bewegung am Joystick sind die Motoren schon in Bewegung. Außerdem hatte ich das unangenehme Gefühl das irgendetwas “riecht”!

Soviel zu meinem aktuellen Stand. Ich werde jetzt versuchen die Probleme zu beheben und den Roboter mit dem Joystick zu steuern. Für Tipps, Tricks und Anregungen bin ich jederzeit offen.

Der nächste Schritt wird dann sein den Roboter über Serielle Befehle zu steuern. Erst noch per Kabel über USB. Und danach dann per SSH und WLAN.

Vielen Dank

Gruß

Joe

a) du hast nicht geschrieben auf welchem Mikroprozessor du arbeitest. Wegen WLAN ... hast du dann einen Wemos/NodeMCU/ESP?

b) ich würde die Precompiler Defines so nicht verwenden sondern Funktionen definieren.

void STOP()
{analogWrite(PWMA, 0);analogWrite(PWMB, 0);} //Anhalten

und dann mit STOP () aufrufen.

Wenn der Sketch mehr wird und Fehler hinzukommen, könnte es sonst schwer werden, den Fehler in den Textersetzungen (=die #defines) zu finden.

c) Offset zwischen den beiden Monitoren hab ich auf meinem Robot auch, musst halt per Formel ausgleichen.

Hi noiasca,

vielen Dank für deine Antwort.

Zu a: Ich nutze aktuell einen Arduino Uno, weil mir dieser mehrere Analoge Pins bietet. Eigentlich will ich aber mit einem sogenannten Espduino arbeiten. Das ist ein Arduino Clone mit einem ESP8266 Chip.

Zu b: Werde ich machen und den Code hier noch einmal posten.

Zu c: Könntest du mir das mit dem Offset noch ein bisschen näher erklären, bzw. wie du das mit einer Formel ausgleichen würdest...?

Vielen Dank

Gruß

Joe

BOSSJoe:
Zu c: Könntest du mir das mit dem Offset noch ein bisschen näher erklären, bzw. wie du das mit einer Formel ausgleichen würdest…?

ich habe eine globale

float motorbalance = 0.84;                            // reduce speed of LEFT Motor < 1 ...

und in meinen Bewegungen verwende ich diesen Offset für einen Motor.
Ich übergebe einer Funktion die Wunschgeschwindigkeit, beide Motoren werden angesteuert, aber eben der linke berücksichtigt den offset.

void forward(uint16_t speed)
{
  Serial.println(F("forward"));
  analogWrite(PWMA, float(speed) * motorbalance);
  digitalWrite(DA, HIGH);
  analogWrite(PWMB, speed);
  digitalWrite(DB, LOW);
}

void z1(uint16_t speed)                          // go to 1 o'clock - forward slight right
{
  Serial.println(F("forward"));
  analogWrite(PWMA, float(speed) * motorbalance);
  digitalWrite(DA, HIGH);
  analogWrite(PWMB, speed * 0.8);
  digitalWrite(DB, LOW);
}


void z11(uint16_t speed)                          // go to 11 o'clock - forward slight left
{
  Serial.println(F("forward"));
  analogWrite(PWMA, float(speed) * motorbalance * 0.8);
  digitalWrite(DA, HIGH);
  analogWrite(PWMB, speed);
  digitalWrite(DB, LOW);
}

usw. Bei mir hat das akzeptable Ergebnisse gebracht.

wenn du die Balance nicht zur Laufzeit ändern willst, kannst du auch sie auch const machen.

Hi,

ich hab mal deine Tipp befolgt und alles als eigene Funktion eingerichtet. Das mit dem Motorbalance werde ich im endgültigen Code berücksichtigen wenn alles andere an Fehlern ausgemerzt ist.

int SW_Pin = 5; // Taster Joystick
int X_Pin = 1; // X-Achse Joystick
int Y_Pin = 0; // Y-Achse Joystick

int DefaultX = 500; //Default Wert für X-Achse
int DefaultY = 522; //Default Wert für Y-Achse

int DIRA = 12;  // Richtung Motor A
int PWMA = 11;  // Geschwindigkeit Motor A

int DIRB =  7;  // Richtung Motor B
int PWMB =  6;  // Geschwindigkeit Motor B

int SPEED = 200; //Geschwindigkeit für PWM

void forward()
{
  Serial.println("Forward");
  digitalWrite(DIRA, HIGH);
  analogWrite(PWMA, SPEED);
  digitalWrite(DIRB, LOW);
  analogWrite(PWMB, SPEED);
}

void back()
{
  Serial.println("Back");
  digitalWrite(DIRA, LOW);
  analogWrite(PWMA, SPEED);
  digitalWrite(DIRB, HIGH);
  analogWrite(PWMB, SPEED);
}

void left()
{
  Serial.println("Left");
  digitalWrite(DIRA, HIGH);
  analogWrite(PWMA, SPEED);
  digitalWrite(DIRB, HIGH);
  analogWrite(PWMB, SPEED);
}

void right()
{
  Serial.println("Right");
  digitalWrite(DIRA, LOW);
  analogWrite(PWMA, SPEED);
  digitalWrite(DIRB, LOW);
  analogWrite(PWMB, SPEED);
}

void stop_stop()
{
  Serial.println("Stop");
  analogWrite(PWMA, 0);
  analogWrite(PWMB, 0);
}

void setup()
{
  // Motor A initialisieren
  // Pin für Richtung Motor A als Ausgang
  pinMode(DIRA, OUTPUT);
  
  // Motor B initialisieren
  // Pin für Richtung Motor B als Ausgang
  pinMode(DIRB, OUTPUT);

  pinMode(SW_Pin, INPUT);
  digitalWrite(SW_Pin, HIGH);

  Serial.begin(115200);

}

void loop() {

  if(analogRead(X_Pin) < 490)
    {forward();}

  if(analogRead(X_Pin) > 510)
    {back();}

  if(analogRead(Y_Pin) < 512)
    {left();}

  if(analogRead(Y_Pin) > 532)
     {right();}

  else
  {stop_stop();}   

}

Die Steuerung über den Joystick ist aber immer noch sehr ungenau. Ich denke das dies an den Analogen Werten liegt welche an den Joystick Pins gelesen werden.

Nach langem suchen im Netz hab ich auch etwas vom Hersteller des Motorboards gefunden. Der Code scheint gut zu funktionieren, leider verstehe ich nur die Hälfte von dem was dort programmiert wurde:

//Material: UNO + Doit Motortreiberplatine + WiFi-Modul

/****************************IO-Pin-Definition*****************************/
//Motorstift
#define PWMA 11 //A Motordrehzahl
#define DIRA 12 //A Motorsteuerung
#define PWMB 6 //B Motordrehzahl
#define DIRB 7 //B Motorsteuerung

//Steuern Sie die Motorbewegung    Makrodefinition
#define MOTOR_GO_FORWARD  {digitalWrite(DIRA,LOW);analogWrite(PWMA,200);digitalWrite(DIRB,HIGH);analogWrite(PWMB,200);} //Karosserie vorwärts                          
#define MOTOR_GO_BACK	  {digitalWrite(DIRA,HIGH);analogWrite(PWMA,200);digitalWrite(DIRB,LOW);analogWrite(PWMB,200);}   //Karosserie zurück
#define MOTOR_GO_LEFT	  {digitalWrite(DIRA,HIGH);analogWrite(PWMA,150);digitalWrite(DIRB,HIGH);analogWrite(PWMB,150);}  //Biegen Sie links ab
#define MOTOR_GO_RIGHT	  {digitalWrite(DIRA,LOW);analogWrite(PWMA,150);digitalWrite(DIRB,LOW);analogWrite(PWMB,150);}  //Drehe das Auto nach rechts
#define MOTOR_GO_STOP	  {digitalWrite(DIRA,LOW);analogWrite(PWMA,0);digitalWrite(DIRB,LOW);analogWrite(PWMB,0);}       //Karosserie noch

//Serielle Port-Empfangsverarbeitung
#define MAX_PACKETSIZE 32  //Serieller Empfangspuffer
char buffUART[MAX_PACKETSIZE];
unsigned int buffUARTIndex = 0;
unsigned long preUARTTick = 0;

//Autolenkung
enum DN
{ 
	GO_ADVANCE, 
	GO_LEFT, 
	GO_RIGHT,
	GO_BACK,
	STOP_STOP,
	DEF
}Drive_Num=DEF;

//Motorkontrollmarke
bool flag1=false;
bool stopFlag = true;
bool JogFlag = false;
uint16_t JogTimeCnt = 0;
uint32_t JogTime=0;


//Automotorsteuerung
void CAR_Control()
{
	switch (Drive_Num) 
    {
      case GO_ADVANCE:MOTOR_GO_FORWARD;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_LEFT: MOTOR_GO_LEFT;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_RIGHT:MOTOR_GO_RIGHT;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_BACK:MOTOR_GO_BACK;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case STOP_STOP: MOTOR_GO_STOP;JogTime = 0;JogFlag=false;stopFlag=true;break;
      default:break;
    }
    Drive_Num=DEF;
    //Auto behält Haltung 210ms
    if(millis()-JogTime>=210)
    {
      JogTime=millis();
      if(JogFlag == true) 
      {
        stopFlag = false;
        if(JogTimeCnt <= 0) 
        {
          JogFlag = false; stopFlag = true;
        }
        JogTimeCnt--;
      }
      if(stopFlag == true) 
      {
        JogTimeCnt=0;
        MOTOR_GO_STOP;
      }
    }
}
//Serielle Datenempfangsverarbeitung
void UART_Control()
{
	char Uart_Date=0;
	if(Serial.available()) //Der serielle Port empfängt Daten
	{
          Uart_Date = Serial.read();
	}
	if(buffUARTIndex > 0 && (millis() - preUARTTick >= 100))//Wenn für mehr als 100 ms keine Daten empfangen werden, wird davon ausgegangen, dass die vollständige Anweisung empfangen wurde.
	{ //data ready
		buffUART[buffUARTIndex] = 0x00;
		if((buffUART[0]=='C') && (buffUART[1]=='M') && (buffUART[2]=='D')) //Ignoriere, wenn der Sendebefehl unzulässig ist
	    {
	    	;
	    }
		else Uart_Date=buffUART[0];
    	        buffUARTIndex = 0;
        }
      switch (Uart_Date)    //Serieller Steuerbefehl
	{
		case '2': Drive_Num=GO_ADVANCE;break;
		case '4': Drive_Num=GO_LEFT; break;
		case '6': Drive_Num=GO_RIGHT; break;
		case '8': Drive_Num=GO_BACK; break;
		case '5': Drive_Num=STOP_STOP;break;
		default:break;
	}
      
}
//IO-Initialisierung
void IO_init()
{
	pinMode(PWMA, OUTPUT);
	pinMode(DIRA, OUTPUT);
	pinMode(PWMB, OUTPUT);
	pinMode(DIRB, OUTPUT);
	MOTOR_GO_STOP;
}
////////////////////Initialisieren////////////////////////////////////////////
void setup()
{
	Serial.begin(9600);
	IO_init();
}

void loop()
{
	UART_Control();//Serielle Port-Empfangsverarbeitung
	CAR_Control();//Auto-Kontrolle
}

Besonders dieser Teil:

//Autolenkung
enum DN
{ 
	GO_ADVANCE, 
	GO_LEFT, 
	GO_RIGHT,
	GO_BACK,
	STOP_STOP,
	DEF
}Drive_Num=DEF;

//Motorkontrollmarke
bool flag1=false;
bool stopFlag = true;
bool JogFlag = false;
uint16_t JogTimeCnt = 0;
uint32_t JogTime=0;


//Automotorsteuerung
void CAR_Control()
{
	switch (Drive_Num) 
    {
      case GO_ADVANCE:MOTOR_GO_FORWARD;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_LEFT: MOTOR_GO_LEFT;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_RIGHT:MOTOR_GO_RIGHT;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case GO_BACK:MOTOR_GO_BACK;JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;
      case STOP_STOP: MOTOR_GO_STOP;JogTime = 0;JogFlag=false;stopFlag=true;break;
      default:break;
    }
    Drive_Num=DEF;
    //Auto behält Haltung 210ms
    if(millis()-JogTime>=210)
    {
      JogTime=millis();
      if(JogFlag == true) 
      {
        stopFlag = false;
        if(JogTimeCnt <= 0) 
        {
          JogFlag = false; stopFlag = true;
        }
        JogTimeCnt--;
      }
      if(stopFlag == true) 
      {
        JogTimeCnt=0;
        MOTOR_GO_STOP;
      }
    }
}

dieser:

if(buffUARTIndex > 0 && (millis() - preUARTTick >= 100))//Wenn für mehr als 100 ms keine Daten empfangen werden, wird davon ausgegangen, dass die vollständige Anweisung empfangen wurde.
	{ //data ready
		buffUART[buffUARTIndex] = 0x00;
		if((buffUART[0]=='C') && (buffUART[1]=='M') && (buffUART[2]=='D')) //Ignoriere, wenn der Sendebefehl unzulässig ist
	    {
	    	;
	    }
		else Uart_Date=buffUART[0];
    	        buffUARTIndex = 0;

und dieser Teil:

unsigned int buffUARTIndex = 0;
unsigned long preUARTTick = 0;

machen mir ein bisschen zu schaffen.

Kann hier einer vielleicht ein bisschen Licht ins Dunkel bringen?

Vielen Dank

Gruß

Joe