esc motor über serial steuern, problem bei richtungsänderung

hallo zusammen,
ich habe einen esc brushlessmotor, den ich bequem über serial steuern kann.der servo braucht eine grundversorgung von 50 und ab 60 dreht sich der motor wie er sollte. schließe ich jedoch das fenster (auch wenn der motor gestoppt ist) fängt der auf vollspeed an zu laufen. woran kann das liegen?

#include <Servo.h>
Servo servo;
int position = 0;



void setup(){
  Serial.begin(9600);
  servo.attach(3);
}

void loop(){
  if (Serial.available()) { // Wenn ueberhaupt irgendwas zum Lesen ansteht
    position = 0; // Damit wir keine Vermischung mit alten Werten bekommen
    while (Serial.available()){ // Dann lies jedes Zeichen dass Du bekommen kannst
      position = position*10 + Serial.read()-'0'; // Und zwar den Zahlenwert, nicht ASCII, und verknuepfe es!
      delay(3); // Warte auf das ggf. naechste Zeichen
    } // Wenn nichts mehr kommt mach weiter
    servo.write(position);
    Serial.print("Fahre auf ");
    Serial.print(position);
    Serial.print(" Grad");
    Serial.println("");
}
}

diesen sketch hab ich hier aus dem forum und er läuft sehr gut (bis auf das fensterproblem).

jetzt dachte ich mir:
ach egal, ich möchte die geschwindigkeit ja eh nicht ändern, in meinem programm soll der motor bequem auf 60 laufen und alles ist gut, ich muss mir nur was überlegen um die richtung zu ändern. gesagt getan…transistor zwischen und geschwindigkeit eingefügt:

#include <Servo.h>
Servo servo;
int position = 0;


 int transistorl = 4;
 int transistorr = 5;



void setup(){
  
  servo.attach(3);
   pinMode(transistorl, OUTPUT);
 pinMode(transistorr, OUTPUT);
 Serial.begin(9600); // Baudrate 
  Serial.println("motor"); // mal was über die Serielle Leitung schicken
  
}


void loop(){
    
    if (Serial.available() > 0) {
    char message = Serial.read();
    switch (message) {
       case 'd': // r wie rechts
        digitalWrite(transistorl,LOW);
        digitalWrite(transistorr,HIGH); 
        servo.write(60);
        Serial.println("rechtslauf");
         break;
       case 'a':  // l wie links
         digitalWrite(transistorl,HIGH);   
         digitalWrite(transistorr,LOW);
         servo.write(60);
         Serial.println("linkslauf");
         break;
       case 'x': //s wie STOPP!!
         digitalWrite(transistorl,LOW);
         digitalWrite(transistorr,LOW);
         servo.write(50);
         Serial.println("STOPP");
         break;
      
       default:  // ansonsten Fehlermeldung
         Serial.print("kommando kenn ich nicht");
    }
  }
 
}

sketch funktioniert super…bei einem servo…aber irgendwie nicht bei meinem brushless esc…warum? was übersehe ich??

schließe ich jedoch das fenster (auch wenn der motor gestoppt ist) fängt der auf vollspeed an zu laufen. woran kann das liegen?

Welches Fenster? das zu Balkon oder das zur Straße? :wink: :wink: :wink:

Ich nehme an Du schließt das Terminal-Fenster suf dem PC.

Dem Arduino ist es ziemlich egal ob an der seriellen Schnittstelle was dranhängt oder nicht.

Wo hast Du den Transistor eingefügt?

Grüße Uwe

ja…der motor ist extrem empfindlich wenn ich das wohnzimmerfenster schließe ^^

keine ahnung woran es lag.nachdem ich das hier geschrieben hab, hab ich mich nochmal rangesetuzt und nun läuft es wie es soll.

#include <Servo.h>

#define MAX_SIGNAL 80
#define MIN_SIGNAL 70

#define LED 7
#define RELAY 6

Servo servo;

int transistorl = 4;
int transistorr = 5;

void setup() {
Serial.begin(9600);

servo.attach(3);
pinMode(transistorl, OUTPUT);
pinMode(transistorr, OUTPUT);

pinMode(LED, OUTPUT); // tell arduino LED is an output
pinMode(RELAY, OUTPUT); // tells arduino RELAY is an output
Serial.begin(9600); // Baudrate
Serial.println(“gesamtkunstwerk”); // mal was über die Serielle Leitung schicken

Serial.println(“schieber”); // mal was über die Serielle Leitung schicken

servo.write(MIN_SIGNAL);

}

void loop() {
if (Serial.available() > 0) {
char message = Serial.read();
switch (message) {
case ‘d’: // r wie rechts
digitalWrite(transistorl,LOW);
digitalWrite(transistorr,HIGH);
digitalWrite(LED,LOW);
digitalWrite(RELAY,LOW);
servo.write(MAX_SIGNAL);
Serial.println(“rechtslauf”);
break;

case ‘a’: // l wie links
digitalWrite(transistorl,HIGH);
digitalWrite(transistorr,LOW);
digitalWrite(LED,LOW);
digitalWrite(RELAY,LOW);
servo.write(MAX_SIGNAL);
Serial.println(“schieber-linkslauf”);
break;

case ‘w’: // hoch
digitalWrite(RELAY,LOW); // turn LED ON
digitalWrite(LED, HIGH);
digitalWrite(transistorl,LOW);
digitalWrite(transistorr,LOW);
servo.write(MIN_SIGNAL);
Serial.println(“druecker-hoch”);
break;
case ‘s’: // runter
digitalWrite(LED,HIGH); // turn LED ON
digitalWrite(RELAY,HIGH); // turn RELAY ON
digitalWrite(transistorl,LOW);
digitalWrite(transistorr,LOW);
servo.write(MIN_SIGNAL);
Serial.println(“druecker-runter”);
break;

case ‘x’: //s wie STOPP!!
digitalWrite(transistorl,LOW);
digitalWrite(transistorr,LOW);
digitalWrite(LED,LOW);
digitalWrite(RELAY,LOW);
servo.write(MIN_SIGNAL);
Serial.println(“STOPP”);
break;

default: // ansonsten Fehlermeldung
Serial.print(“kommando kenn ich nicht”);

}
}
delay(100); // bisschen schlafen um ggf. die Serielle Schnittstelle nicht zu überlasten
}

fühlt sich schon gut an wenn es läuft wie man es sich vorstellt :smiley: