Serieller Monitor

Hallo zusammen,
ich wollte zum Testen einer Motorsteuerung die Geschwindigkeit über den Seriellen Monitor an meinen Arduino Micro schicken, und bei jeder Änderung den neuen Wert auf den Monitor zurück bekommen.

Der erste Test der Motorsteuerung mit einem L293D hat auch soweit funktioniert.

Wenn ich nun aber die Geschwindigkeit via Seriellem Monitor einstellen will, bekomme ich merkwürdige Werte zurück. Bei 0 wird der Wert 48, bei 1->49 ... und bei 9->57 zurück gemeldet. Der Serielle Monitor ist auf 9600 Baud eingestellt. Ich will Werte von 0 - 255 schicken. Was mache ich falsch?

Gruß Stefan

int PWM_PIN_Motor1 = 3; // PIN für Motor 1 PWM-Signal
int Rechts_PIN_Motor1 = 2; // PIN für Motor 1 Rechtslauf
int Links_PIN_Motor1 = 4; // PIN für Motor 1 Linkslauf
int PWM_PIN_Motor2 = 6; // PIN für Motor 2 PWM-Signal
int Rechts_PIN_Motor2 = 5; // PIN für Motor 2 Rechtslauf
int Links_PIN_Motor2 = 7; // PIN für Motor 2 Linkslauf
int Sollspeed1 = 0;
int Sollspeed2 = 0;
void setup()
{
pinMode(Rechts_PIN_Motor1, OUTPUT);
*pinMode(Links_PIN_Motor1, OUTPUT); *
pinMode(Rechts_PIN_Motor2, OUTPUT);
pinMode(Links_PIN_Motor2, OUTPUT);
digitalWrite(Rechts_PIN_Motor1, LOW);
*digitalWrite(Links_PIN_Motor1, LOW); *
digitalWrite(Rechts_PIN_Motor2, LOW);
digitalWrite(Links_PIN_Motor2, LOW);
Serial.begin(9600);
}
void loop()
{
if (Serial.available())

  • {*
  • Sollspeed1 = Serial.read();*
  • }*
    analogWrite(PWM_PIN_Motor1, Sollspeed1);
    digitalWrite(Rechts_PIN_Motor1, HIGH);
    *digitalWrite(Links_PIN_Motor1, LOW); *
    analogWrite(PWM_PIN_Motor2, Sollspeed2);
    digitalWrite(Rechts_PIN_Motor2, HIGH);
    digitalWrite(Links_PIN_Motor2, LOW);
    if (Sollspeed1 != Sollspeed2)
  • {*
  • Serial.println(Sollspeed1);*
  • Sollspeed2 = Sollspeed1;*
  • }*
    }

Das sind die ASCII codes für die Ziffern

Ziehe 48 davon ab und du hast die Ziffer

Wobei zu beachten ist, wenn du 1 schickst, wird 49 in dem int Sollspeed1 gespeichert.
Das ist möglicherweise nicht was du willst.

Also:
Sollspeed1=serial.read()-48;

Ok vielen Dank,
ich hab mir mal die ASCII Tabelle angesehen.

Kann ich auch Werte an den Arduino schicken oder ausschließlich ASCII Zeichen?

Konvertier doch einfach. atoi heißt das glaub ich.

Hier kannst Du Dir eine passende Funktionalität aussuchen, parseInt() beispielsweise.

parseInt() ist nicht blockierungsfrei. Die Probleme, die du dir damit einhandelst, bemerkst du erst später.

Besser eigenen Parser schreiben. Oder suchen.

Hier sind zwei Optionen:

Bei beiden musst du den Serial Monitor so einstellen dass am Ende ein Newline/Linefeed gesendet wird!

Bei Thema Thema ging es darum je nach Wert etwas anderes zu machen. Du wärst nach "int value = atoi(serialBuffer)" bzw. "if (value > 0)" fertig

ElEspanol:
parseInt() ist nicht blockierungsfrei.

Für ein Programm zum Testen eines Motors halte ich parseInt() durchaus für geeignet: Es ist einfach und tut, was es soll. :slight_smile:

Ich habe mal schnell ein Testprogramm geschrieben, bei dem ich eine Unterbrechung (Blockierung) des Blinkens nicht erkennen kann:

const byte ledPin = 13;
unsigned long aktMillis, altMillis;
int zeit = 500;

void setup() {
  Serial.begin(9600);
  Serial.println("Programmanfang");
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (Serial.available())
  {
    zeit = Serial.parseInt();
    Serial.println(zeit);
  }
  aktMillis = millis();
  if (aktMillis - altMillis >= zeit) {
    digitalWrite(ledPin, !digitalRead(ledPin));
    altMillis = aktMillis;
  }
}

ElEspanol:
Die Probleme, die du dir damit einhandelst, bemerkst du erst später.

Ich merke das dann wohl auch erst später :confused:

agmue:
Ich merke das dann wohl auch erst später :confused:

Wer jetzt schon bald ein Jahr hier registriert ist, sollte das eigentlich schon gemerkt haben :stuck_out_tongue: :grinning:
Was man gleich am Anfang richtig lernt, muss man sich später nicht abgewöhnen

Eine Sache mit der man parseInt() ein wenig verbessern kann ist das:

Normal steht die Timeout Zeit auf 1s. Da reicht auch weit weniger.

Vielen Dank für die ganzen Infos. Ich werde mal verschiedenes durchtesten.