Transfet d'information entre pc via python et arduino

Bonjour,

Débutant dans ce genre de domaine , je fais appel à votre aide.
Je dois communiquer via serial entre mon pc et un arduino via un soft écrit en python.

Generalement je m'en sors ave cle moniteur série et je progresse etape par etape mais là le souci cest que le moniteur série n'est pas accessible comme il est occupé par le soft python pour envoyer les données.

Je dois envoyer un chiffre qui peut avoir jusqu'à 3 nombre apres la virgule.
Mon code python envoie un "byte"
Mais du coup je ne sais pas ce que recoit l'arduino.

Comment je dois procéder pour passer ma variable par example "10.254" depuis mon soft python jusqu'a mon arduino ?

Pour l'instant les tutos fonctionnent bien pour envoyer juste une lettre mais je ne sais pas comment faire pour un chiffre entier

Voici les morceaux de code fonctionnels:
coté python:

def write_read(x):
arduino.write(bytes("H", 'utf-8'))
time.sleep(0.05)
data = arduino.readline()
return data

coté arduino:

if (Serial.available() > 0) {
// read the oldest byte in the serial buffer:
incomingByte = Serial.read();
// if it's a capital H (ASCII 72), turn on the LED:
if (incomingByte == 'H') {
digitalWrite(LED_BUILTIN, HIGH);
}
// if it's an L (ASCII 76) turn off the LED:
if (incomingByte == 'L') {
digitalWrite(LED_BUILTIN, LOW);
}

C'est pompé du net mais je ne vois pas comment l'adapter a mon cas

Merci pour votre aide

Bonsoir

j'up mon post car j'ai pas mal avancé mais... il y a un mais.
Quand je rentre à la main dans le moniteur serie "wheelbase:1000" ma LED s'allume correctement
mais quand j'execute le script python rien ne se passe.

J'arrivais a faire fonctionner comme je voulais avec juste une lettre mais impossible de le faire avec un string.

Auriez vous une idée?

Voici mes programmes:

import serial.tools.list_ports
import serial
import time

ports = list(serial.tools.list_ports.comports())

for p in ports:
    print(p)


mcustring = str(ports[0]).split(" ")[0]
print(mcustring)

mcu = serial.Serial(mcustring, 9600)
#mcu.baudrate = 9600
mcu.timeout = 0.1
#mcu.port = mcustring

def write_read(x):
    mcu.write(x.encode())
    time.sleep(0.1)
    data = mcu.readline()
    return data
    

num = "wheelbase:1000"
value = write_read(num)
print(num) # printing the value
time.sleep(1)

mcu.close()
String SerialRead1;
String SerialRead2;
double Wheelbase = 0;
double Level0 = 0;
double Gradient = 0;

void setup() {
  // put your setup code here, to run once:
Serial . begin ( 9600 ) ;        // turn on Serial Port
pinMode(LED_BUILTIN, OUTPUT);

}

void loop() {

  while (Serial.available() > 0) {
  SerialRead1 = Serial.readStringUntil(':') ;
  SerialRead1.trim();
  SerialRead2 = Serial.readStringUntil('\n') ;
  SerialRead2.trim();
  
  Serial.print ( "string1: " ) ;
  Serial.println(SerialRead1);
  Serial.print ( "string2: " ) ;
  Serial.println(SerialRead2);

  if (SerialRead1 == "wheelbase"){
   Wheelbase = SerialRead2.toDouble();    
  }

  if (SerialRead1 == "level"){
   Level0 = SerialRead2.toDouble();    
  }

  if (SerialRead1 == "gradient"){
   Gradient = SerialRead2.toDouble();    
  }
}
if (Wheelbase == 1000) {
    digitalWrite(LED_BUILTIN, HIGH);
}
else 
{
    digitalWrite(LED_BUILTIN, LOW);  
}

}```

Merci de votre aide

Bonjour vibram

Est-ce-que la chaîne envoyée par ton script Python se termine bien avec l'équivalent \n ?

Cordialement
jpbbricole

Salut JPB :slight_smile:

comment vérifier cela ?
C'est mon problème je n'arrive pas a debugguer car le moniteur serie est "busy" donc impossible de savoir ce que recoit l'arduino (pas d'écran pour ce projet)

Bonjour vibram

Eternel pèroblème :frowning:

Je ne connais rien en Python, mais en voyant ça

num = "wheelbase:1000"
value = write_read(num)
print(num) # printing the value

Il n'y a rien qui est ajouté au bout de num.
Essaies "wheelbase:1000\n"

Cordialement
jpbbricole

J'ai modifié un peu le code pour faire des tests et je vois un truc intéressant:

voici le python modifié ou j'ai ajouté un for pour envoyer plusieurs infos

for i in range(10):
     print(i)
     num = "wheelbase:1000"
     value = write_read(num)
     print(value) # printing the value
     time.sleep(1)        # wait 0.5 seconds
     num = "wheelbase:500"
     value = write_read(num)
     print(value) # printing the value
     time.sleep(1)

et en fait dans le moniteur serie on voit que pour i = 0 l'arduino ne recoit rien et pour i= 1 on a que la moitié de l'information

COM6
0
b''
b''
1
b''
b'string1: wheelbase\r\n'
2
b'string2: 1000\r\n'
b'string1: wheelbase\r\n'
3
b'string2: 500\r\n'
b'string1: wheelbase\r\n'
4
b'string2: 1000\r\n'
b'string1: wheelbase\r\n'
5
b'string2: 500\r\n'
b'string1: wheelbase\r\n'
6
b'string2: 1000\r\n'
b'string1: wheelbase\r\n'
7
b'string2: 500\r\n'
b'string1: wheelbase\r\n'
8
b'string2: 1000\r\n'
b'string1: wheelbase\r\n'
9
b'string2: 500\r\n'
b'string1: wheelbase\r\n'

a voir comment je peux corriger cela...

Problème résolu grace a ce lien, merci :wink: