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
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
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)
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