Je suis nouveau sur Arduino (et la programmation informatique en général), donc je m'excuse si cette question semble idiote.
Une fois que j'ai configuré une connexion Arduino-LED de base, j'ai des problèmes pour envoyer des INTEGERS à Arduino via le port série. Je peux facilement envoyer des caractères tels que «m», «o» et ainsi de suite.
Voici le code Arduino, idéalement, il devrait obtenir une valeur du port USB via python ou le moniteur série, puis régler la luminosité de la LED en fonction de la valeur. (la valeur doit être dans la plage [0,255]).
REMARQUE: j'utilise ARDUINO UNO et PYTHON 3
// --------------------------
int LED = 10;
int number;
void setup(){
pinMode(LED,OUTPUT);
Serial.begin(9600);
}
void loop(){
number = Serial.read();
Serial.print(number);
Serial.print('\n');
if(number == -1){
number = 0;
}
else if(number > 255){
number = 255;
}
else if(number < 0){
number = 0;
}
analogWrite(LED,number);
delay(1000);
}
Cependant, lorsque j'entre une valeur dans le port série ou via Python, par exemple 0, cela me donne 48 comme réponse (ce qui est intéressant, c'est le code ASCII pour 0!) Et allume la LED ce qui n'est pas ce qui devrait arriver puisque à 0 la LED doit être éteinte !! Il me manque quelque chose mais je ne trouve pas quoi ... Pourriez-vous me dire ce qui ne va pas?
Voici le code que j'utilise en Python:
import serial
import time
try:
arduino = serial.Serial(port,speed)
time.sleep(2)
print("Connection to " + port + " established succesfully!\n")
except Exception as e:
print(e)
#Note: for characters such as 'a' I set data = b'a' to convert the data in bytes
#However the same thing does not work with numbers...
data = 0
data = arduino.write(valueToWrite)
time.sleep(2)
arduino.close()
que fais-je de mal ou de malentendu? Je vous remercie.
la source
arduino.write(chr(valueToWrite))
Réponses:
L'analyse sur l'Arduino peut être lente et longue (ce qui est mauvais si vous utilisez la pré-mise à l'échelle de l'horloge ou si vous avez des tâches critiques), alors faisons-le en Python.
Le problème est que vous envoyez les nombres en ASCII alors que vous devez les envoyer en binaire brut. C'est là
struct
qu'intervient.Donc ce que vous voulez vraiment, c'est:
Ou quelque chose à cet effet.
la source
Serial.read()
lit seulement UN caractère du port série et retourne sa valeur ASCII, ce qui explique la48
vous avez.Pour lire un numéro complet, vous avez 2 options:
Serial.parseInt()
qui lit autant de caractères que nécessaire et effectue la conversion avant de renvoyer le numéro lu sous la forme d'unint
. Veuillez vérifier la référence ici.Serial.read()
) jusqu'à la dernière, placez chaque caractère de lecture dans un tampon (char
tableau) puis convertissez la chaîne résultante en un nombre avec la fonction C standardatoi
.Bien sûr, la première option est la plus simple mais elle reviendra
0
si rien n'est lu après un délai de 1 s (configurable avecSerial.setTimeout()
).la source