LEDs auf Ardunio uno mittels Python und seriellem Port steuern

Hallo,

ich bastel gerade an etwas rum. Ziel des ganzen ist es, mittels eines Python-Programms ein Signal an den Arduino zu schicken, der daraufhin die LED so oft blinken lässt, je nachdem welche Zahl im Python Programm angegeben wird.

Der laptop und der Ardunio sind per USB verbunden und können auch kommunizieren und zwar in beide Richtungen. Allerdings funktioniert es nicht so wie ich will. Ich vermute, dass es ein Problem mit der Übertragung ist, da ich versuche einen Integer zus chicken, man es aber eventuell noch als ASCII Code oder als Byte oder ähnliches schicken muss?
Das Problem ist, dass die von mir geschickte Eingabe weder zurückgeschickt wird, noch weiterverarbeitet wird.

Ich bin da etwas überfragt und finde bei Google einfach nichts, was ich verstehe, oder mir weiterhilft.

Des weiteren sei erwähnt, dass ich sowohl mit dem Programmieren, als auch mit dem Arduino noch ganz am Anfang stehe. Hier meine beiden Programme:

Python:

import serial


ser = serial.Serial("/dev/ttyACM0", 115200)
x = input("Eingabe: ")

ser.write(int(x))
antwort = ser.readline()[:-2]
print(antwort)

Arduino:

void setup() {
Serial.begin(115200);
delay(1000);
pinMode(13, OUTPUT);
}

void loop() {
  if(Serial.available())
  {
     int eingang = Serial.read();
     delay(1000);
     Serial.print(eingang, DEC);
     for (int x = 0; x < eingang; x++)
   {
        digitalWrite(13, HIGH);   
        delay(500);                      
        digitalWrite(13, LOW);    
        delay(500);  
   }   
 }
}

Ich vermute, dass es ein Problem mit der Übertragung ist, da ich versuche einen Integer zus chicken, man es aber eventuell noch als ASCII Code oder als Byte oder ähnliches schicken muss?

Es geht so oder so, je nachdem was man machen will. Einen String zu senden und nach dem kompletten Empfang zu Parsen ist praktischer für komplexe Kommandos. Aber einzelne Bytes gehen auch

Dein Problem ist ganz einfach dass du mehrere Bytes sendest (ein int hat auf dem PC 4 Bytes), aber read() nur ein einzelnes Byte liest. Hier musst du auch beachten dass int auf dem PC und auf dem Arduino zwei verschiedene Dinge sind. Auf den 8-Bit Prozessoren hat ein int nur 2 Bytes, was das gleiche wie short auf dem PC ist.

Hier ist eine einfache Möglichkeit positive Zahlen einzulesen. Die Ziffern werden Schritt für Schritt gelesen und aufaddiert. Wichtig ist dass du auf dem PC statt einer Zahl einen String sendest und diesen mit einem LF (’\n’) abschließt! Man muss das Ende der Übertragung erkennen können

void setup() 
{
  Serial.begin(115200);
}

void loop()
{
  int value = readSerial(Serial);
  if (value > 0)
  {
    Serial.print("read: "); 
    Serial.println(value);
  }
}

int readSerial(Stream& stream)
{
  static int value;
  
  while (stream.available())
  {
    char c = stream.read();

    if (c == '\n')
    {
      int tmp = value;
      value = 0;
      return tmp;
    }
    else if (c >= '0' && c <= '9')
    {
      value *= 10;
      value += c - '0';
    }
  }
  
  return -1;
}

Alternativ kann man die Ziffern auch erst mal als String einlesen und am Ende Null-terminieren. Dann kann man einen Parser für komplexere Kommandos wie “5,0” für “Led 5, aus” schreiben