Python3 pyserial arduino allumer une led...

a marqué ce sujet comme résolu.

Bonjiour, j’ai acheter un kit arduino il y’a 1 semaine. J’ai fait pas mal de tuto (réussie avec succes) avec l’ide arduino et son langage. (allumer led, allumer moteur, récupérer température…)

Mais maintenant j’aimerais utiliser python qui est un langage plus complet pour réaliser une petite IHM avec des boutons qui vas interagir avec ma carte arduino. Python car je le connais bien et répond bien à mon besoin sans trop me prendre la tete, je vais faire une ihm avec kivy.

Mais mon probleme c’est que j’arrive pas à allumer une led par exemple avec pyserial, et j’insiste de suite : je suis sous python3 (3.6) (sur le net je trouve que du vieux code python2.7 et sa m’énerve :colere:) et je suis sous windows 10 pro 64bits

j’ai une led qui est branché sur la masse gnd et sur la sortie 13 de mon arduino (j’ai aussi une résistance pour paq griller la led)

je vous donne déja mon code arduino (qui marche)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

et voila mon code en python3 avec pyserial :

1
2
3
4
5
6
import serial
ser = serial.Serial('COM3', 9600, timeout=0)
var="0"
var = var.encode()
while True:
    ser.write(var)

mon code ne marche pas (rien se ne passe, par contre mon code communique bien avec la carte j’ai le petit voyant orange qui s’allume) c’est le code que je trouve sur tous les sites ou je suis allé (en l’ayant adapter en python3)

déja j’ai 3 questions :

1) Pyserial m’oblige de convertir mon string en byte (alors que sur les tutos en python2.7 ils balance directement la chaine de caractère dans le ser.write()), es ce normal, dois-je bien convertir en byte ?

2) dans mon code arduino j’ai int led = 13; pour dire à arduino balance le courant sur la sortie 13 mais en python je n’ai pas cela, es ce normal aussi ?

3) auriez vous un tuto en python3 à me donner ?

par avance merci pour votre aide.

+0 -0

Pyserial m’oblige de convertir mon string en byte (alors que sur les tutos en python2.7 ils balance directement la chaine de caractère dans le ser.write()), es ce normal, dois-je bien convertir en byte ?

Oui c’est normal. En Python 2 les chaînes de caractères sont des chaînes d’octets, alors qu’en Python 3 ce sont des chaînes unicode, et les chaînes d’octets de Python 2 sont des bytes en Python 3.

+0 -0

2) dans mon code arduino j’ai int led = 13; pour dire à arduino balance le courant sur la sortie 13 mais en python je n’ai pas cela, es ce normal aussi ?

J’ai l’impression que tu ne maîtrises pas complètement ce que tu essaies de faire. Le programme python "donne des ordres / reçoit des infos" à/de Arduino. Mais ce n’est pas LE programme Arduino écris en python. Tu me comprends ?

+0 -0

merci pour ton aide. Je pense que j’envoie connectement les infos à ma carte.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
 #!/usr/bin/python3
# -*-coding:Utf-8 -*

from serial import Serial
import time

port = Serial('COM3', 9600)



# test que le port est ouvert
if (port.isOpen()):
    # demande de la chaîne à envoyer

    #chaine = input("Que voulez vous transformer ? ")
    chaine="0"

    # on écrit la chaîne en question
    while True:
        port.write(bytes(chaine, 'UTF-8'))
else:
    print ("Le port n'a pas pu être ouvert !")

mais comment je dis à arduino "allume le pin 13"

voila le montage que j’ai :Image utilisateur

Non. Le code Arduino est fait pour fonctionner sur une Arduino et le python sur un ordinateur. Si tu n’as pas besoin d’une Arduino, pourquoi utiliser une Arduino ? En gros, il faut que tu es un programme python qui envoi des commandes à l’arduino et cette dernière qui répond (ou pas) des messages que python devra traiter. As tu parcouru les tutoriels que j’ai linké dans mes messages précédents ?

+0 -0

oui j’ai vus les tuto que tu m’a linké mais ils contiennent que du code arduinohttps://zestedesavoir.com/tutoriels/686/arduino-premiers-pas-en-informatique-embarquee/744_la-communication-avec-arduino/3427_envoyer-et-recevoir-des-donnees-sur-la-voie-serie/#1-10742_preparer-la-voie-serie

les seuls bouts de code en python que je trouve c’est dans le dernier sous chapitre. et c’est le code que j’ai posté 2 posts plus haut.

edit: j’ai vus que tu était l’auteur de ce tuto, il manque je pense un exemple concret en python. Car la ligne de code qui envoit les instructions à arduino :

1
chaine = input("Que voulez vous transformer ? ")

c’est un code "générique", on sait pas trop quoi mettre dans cette variable comme par exemple "ouvrir le pin 13"

et c’est justement ma question, on mets quoi quand dans write("") ?

+0 -0

Salut :-)

c’est un code "générique", on sait pas trop quoi mettre dans cette variable comme par exemple "ouvrir le pin 13"

mathema

C’est à mettre dans ton code Arduino en fait là. En gros, le code python va envoyer des ordres. Le code Arduino va les recevoir.

Dans ton exemple, tu décide d’envoyer le caractère 0 avec ton code python. Il faut donc que dans ton code Arduino, tu lises l’entrée série. Si le caractère reçu est 0, alors, tu fait changer d’état la LED raccordée au pin 13.

Dans le tuto qu’Eskimon t’as donné en lien, sur la fin du chapitre, tu as l’explication (pas avec un bout de code à copier/coller, mais presque). En gros, ce bout de code lit un caractère sur l’entrée Série, et le ré-écrit tel-quel sur la sortie Série.

Pour faire ce que tu veux faire, il suffit donc juste de vérifier que ce caractère reçu est 0, et changer d’état la sortie si c’est le cas ;)

Dans le code que j’ai posté plus haut j’envoie bien le caractère "0" mais rien ne se passe, ma led reste éteinte.

Le probleme ne viens pas de mon branchement (mon code arduino marche et il est bien branché sur le pin 13)

je reposte le code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
 #!/usr/bin/python3
# -*-coding:Utf-8 -*

from serial import Serial
import time

port = Serial('COM3', 9600)



# test que le port est ouvert
if (port.isOpen()):
    # demande de la chaîne à envoyer

    #chaine = input("Que voulez vous transformer ? ")
    chaine="0"

    # on écrit la chaîne en question
    while True:
        port.write(bytes(chaine, 'UTF-8'))
else:
    print ("Le port n'a pas pu être ouvert !")

Je pense que tu n’as pas compris le principe ;)

C’est normal que rien ne se passe, puisque rien dans ton code Arduino ne commande d’allumer la Led lorsqu’un caractère 0 est reçu.

D’ailleurs, l’arduino n’est même pas programmé pour écouter sur l’entrée Série. En gros, ton code Python parle dans le vide.

Explique moi dans ce cas, dans le commentaire précédent tu dis je te cite :

Dans ton exemple, tu décide d’envoyer le caractère 0 avec ton code python. Il faut donc que dans ton code Arduino, tu lises l’entrée série. Si le caractère reçu est 0, alors, tu fait changer d’état la LED raccordée au pin 13.

Il reçoit le caractère 0 mais ne change pas l’état de la led raccordée au pin 13

je dois mettre quoi dans cette variable chaine ?

edit : j’ai compris en faitehttps://gist.github.com/jreisstudio/4507236 en gros faut que je fasse un code arduino qui vas interpreter mon code python.

Y’a pas moyen de ne pas faire justement ce code arduino ? c’est a dire d’envoyer directement mon code dans le write sans crée au préalable d’interpréteur ?

+0 -0

Dans le sous-chapitre parlant du python, au tout début il est bien écris : "Afin de se concentrer sur la partie "Informatique", nous allons reprendre un programme travaillé précédemment dans le cours. Ce sera celui de l’exercice : Attention à la casse. Pensez donc à le charger dans votre carte Arduino avant de faire les tests."

Y’a pas moyen de ne pas faire justement ce code arduino ? c’est a dire d’envoyer directement mon code dans le write sans crée au préalable d’interpréteur ?

?? Comment ça ? Il faut bien que l’Arduino est un code à l’intérieur pour savoir comment réagir quand on lui parle.

+0 -0

Dernière question, pour récupérer l’output de l’arduino j’imagine qu’il suffit juste de faire un readline() ?

Si ton code Arduino envoi une ligne oui. Mais, il te faut alors définir ce qu’est une ligne. C’est intéressant les langages dit de bas niveau :p

Édit : mais, ton code Arduino n’envoi pas des lignes par défaut ;)

+0 -0

Salut @mathema :)

J’ai jeté un oeil à la lib Firmata ce week-end, et ça ressemble beaucoup à ce que tu souhaitais : tu charges un interpréteur dans l’arduino (présent dans les exemples), et tu peux ensuite communiquer dans beaucoup de langages, dont Python3, moyennant l’installation du module qui va bien.

Ton Arduino devient alors une carte d’interface avec ton PC (la logique est dans le programme du PC, pas dans l’arduino), mais ça peut être intéressant pour certaines applications.

Pas mal cette petite lib :)

Pour répondre à l’auteur je te conseil de relire l’intégralité du cours d’Eskimon (qui est une référence pour moi ! ). Tout le fonctionnement est bien expliqué. Et lire seulement les bouts de code (c’est l’impression que tu donne) ne t’aideras à avancer qu’une fois les bases acquises (je lis souvent du code sur GitHub pour découvrir de nouvelles choses).

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte