[URGENT] Liaison série Arduino / Raspberry (99% réussis)

Bonjour à tous,

Voila j’ai besoin de votre aide au plus vite !

Je cherchais à communiquer entre ma carte Arduino et Raspberry en liaison série.
Jusque la tout va bien !

sur ma carte Raspberry je reçoit bien les infos de l’arduino avec un code en Python :

import serial

serialArduino = serial.Serial(’/dev/ttyACM0’, 9600)

while True :

print(serialArduino.readline())

Ce que j’aimerais faire, c’est pouvoir récupérer des variables,
par exemple :

X = 10 (sur arduino)

pouvoir la récupérer sur Raspberry une fois envoyé pour la retravailler :

x = x + 2 (exemple)

J’ai besoin de vous !

MERCI par avance !!

Hello!

Ton devoir est urgent ? :joy:

Reviens avec des questions précises…on ne vas pas faire tes exercices

Hey,

J’ai pas demandé de faire mon devoir, juste un coup de main :slight_smile:

Ma question, comment je peut récupérer une variable sur ma raspberry :slight_smile:

Voici mon code Arduino ( ce sont des capteurs qui renvoient des distances) :

int detectorPin = A2; // capteur 1 branché sur sortie analogique A1
int detector2Pin = A3; // capteur 2 branché sur sortie analogique A2
int detector3Pin = A4; // capteur 3 branché sur sortie analogique A3
int interval = 0;

void setup() {
Serial.begin(9600);
Serial.println(« les distances des capteurs vont etre envoyées »);

}

void loop() {

interval = analogRead(detectorPin); // lecture d’informations du capteur en analogique
float distance = (6787.0 /((float)interval - 3.0)) - 4.0; // transforme valeur reçu en cm
Serial.print(« distance capteur1 = »);// affiche distance capteur1= x
if (distance <= 50){

Serial.print (distance); // valeur mesurée par le capteur
Serial.println(« Cm »);// cm après la valeur
}

interval = analogRead(detector2Pin);
float distance2 = (6787.0 /((float)interval - 3.0)) - 4.0; // transforme valeur reçu en cm
Serial.print(« distance capteur2 = »);
if (distance <= 50){

Serial.print (distance2);
Serial.println(« Cm »);
}

interval = analogRead(detector3Pin);
float distance3 = (6787.0 /((float)interval - 3.0)) - 4.0; // transforme valeur reçu en cm
Serial.print(« distance capteur3 = »);
if (distance <= 50){
Serial.print (distance3);
Serial.println(« Cm »);
}

delay(1250);
Serial.println("----------------------------------------------------------------");

}

**côté raspberry je récupère le tout avec ça :

Import serial

serialArduino = serial.Serial(’/dev/ttyACM0’, 9600)

While True :

print(serialArduino.readline())

** et ducoup j’aimerais réussir à utiliser la distance reçu pour faire un if

Bonjour,
Déjà il faut bien ordonner tes données dans l’Arduino exemple:
txt = "Variable1 = 10 | variable2 = 5 | … "
Serial.println(txt)
dans le script python:
While True :
txt = (serialArduino.readline())
tab = txt.split(’|’)
nb = len(tab)-1
index = 0
value = {}
while index < nb:
cc = tab[index].split(’=’)
if len(cc) == 2:
value[cc[0].strip()] = cc[1].strip()
index = index + 1

Merci beaucoup pour votre réponse très très détaillé,

Mais j’avoue ne pas avoir tout compris :confused:

arduino :
le txt sert à regrouper les valeurs des variables dans une même variable ?

raspberry :
On stock les variables dans un tableau ?

Merci pour votre réponse

hello,

ton problème doit venir de l’arduino; il me semble qu’en c++ les variables que tu récupères de tes capteurs en integer nécessitent une transformation en string pour être concaténées avec d’autres string.
de plus si tu utilises la lecture par ligne ds le Rpi print(serialArduino.readline()) il te faut envoyer une ligne ( ou au moins une fin de ligne.)

donc d’abord tu formates ta ligne et après tu la transmets genre:

 String ligne = "distance capteur3 = " + String(distance3,2) + " cm.";
 Serial.println(ligne);

source : https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

actuellement j’en suis la :

import serial

serialArduino = serial.Serial(’/dev/ttyACM0’,9600)
lastLine = ‹  ›
value1 = 0
value2 = 0
value3 = 0

while True :
line = serialArduino.readline()
if lastLine != line:
lastLine = line
ArrayLine = line.split(’,’)
value1 = type(float(ArrayLine[0]))
value2 = type(float(ArrayLine[1]))
value3 = type(float(ArrayLine[2]))
mais j’ai une erreur sur les ArrayLine

si ce que tu veux là c’est convertir les nombres lue en string vers des nombres en float, il faut pour que ça fonctionne, que ta ligne lue ne contienne que des chiffres, les points décimaux et des virgules de séparation.
et je pense que :

value1 = float(ArrayLine[0])

doit suffire pour la conversion ( type te donne le type ! - dans ton prog, value1 serait à peu près égale à float … )

line = "10.23,20.24,30.25,libelle"
ArrayLine = line.split(",")
value1 = float(ArrayLine[0])
value2 = float(ArrayLine[1])
value3 = float(ArrayLine[2])
print (value1)
print (value2)
print (value3)
print (ArrayLine[3])

donne :
10.23
20.24
30.25
libelle