IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Intensité led (Arduino-RPI) Python/PHP


Sujet :

Raspberry Pi

  1. #1
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut Intensité led (Arduino-RPI) Python/PHP
    Bonjour les amis,

    Dans le cadre d'un projet d'un laboratoire d’électronique embarquée, j'ai relié en serial un Arduino et un Raspberry Pi.
    Le but de mon exercice est de créer une page PHP pour changer l'intensité de la led grâce à un script python qui communique directement avec l'arduino et ses GPIOS.
    L'arduino utilise le GPIO 3 et il est relié à une led. L'arduino est lui même relié en serial (en USB).

    Voici les différents codes :

    Arduino :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    int led = 3; // led à la pin 3
    int i = 0; // valeur envoyé par le RPI
     
    void setup() {
    pinMode(led, OUTPUT); 
    }
     
    void loop() {
     
      if (Serial.available() > 0) // si le câble est bien branché
      {
     
      i = Serial.read(); // lire la donnée du RPI
     
      Serial.println(i, DEC);
     
      }
     
      analogWrite(led,i); // envoie la donnée à la led qui s'allume
      delay(20);
     
    }

    PHP :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <?php
    $var = $_POST["intensite"]; // on assigne la valeur intensité du formulaire à var
    exec("python /serial/intensite.py ".$var); // exécution du script python
    ?>
     
    <html>
    <body>
    <form method="post">
    <label> Veuillez entrer la valeur de l' intensite : </label>
    <p><input type="text" name="intensite" /></p>
    <button name="On">Confirmer</button>
    </form>
    </body> 
    </html>

    Python :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import sys
    import serial // importation de la librarie SERIAL
    ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=1) // assigne le port qui relie l'arduino
     
    print sys.argv[1] # first parameter 
    intensite = sys.argv[1] // prend le premier paramètre envoyé (donc l'intensité)
    ser.write(intensite) // envoie la donnée vers l'arduino

    Au final ça ne fonctionne pas, je suis certain que la communication en serial fonctionne et que ma led est bien branchée. Par contre je suis débutant en PHP donc c'est possible que l'erreur vienne de là ...

    J'espère que quelqu'un sera m'aider

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    bonsoir,

    Citation Envoyé par Yandrosa
    je suis certain que la communication en serial fonctionne
    Moi, je te dis que la communication Arduino / Pi ne fonctionne pas car tu n'as pas ouvert le port série de ton Arduino : https://www.arduino.cc/en/Serial/Begin

    Je n'ai pas vérifié le script PHP, je ne connais pas ce langage.

  3. #3
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    Ah oui effectivement, je l'avais oublié celui-là
    Mais ça ne fonctionne toujours pas malheureusement

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Salut,
    Je me pose une question tout autre mais tu es sur les mêmes niveaux de tension au moins ?

    Je veux dire, tu n'es pas entrain de faire communiquer le Tx d'un Arduino qui sort du +5V avec le Rx du Raspberry PI qui est alimenté en +3.3V ????

    Tu es visiblement sur que la comm fonctionne, comment le sais tu ?

    Si tu lances directement le programme en Python avec des valeurs d'intensité en dures (sans aucun PHP) Est ce que le Arduino réagit ?

  5. #5
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Je veux dire, tu n'es pas entrain de faire communiquer le Tx d'un Arduino qui sort du +5V avec le Rx du Raspberry PI qui est alimenté en +3.3V ????
    Pas sûr Vincent car il y a 2 possibilités :
    • le Pi et Arduino sont reliés par le port USB et dans ce cas il n'y a rien à faire.
    • le Pi et Arduino sont reliés par les ports séries : broches TX et RX de l'Arduino et les broches BCM14 et BMC15 du Pi
      https://fr.pinout.xyz/pinout/pin8_gpio14
      Là une mise à niveau des tensions est sans aucun doute nécessaire.


    @Yandrosa : quel Arduino utilises-tu ? Est-ce que ton Arduino et ton Pi sont reliés par le port USB ?


    [edit]
    La communication série Arduino / Pi est dans le second cas plus complexe à mettre en oeuvre :
    https://oscarliang.com/raspberry-pi-...d-serial-gpio/
    curieusement le pont diviseur n'est présent que sur TX (broche 1) pas sur RX (broche 0) de l'Arduino.
    Autre point important : le Pi utilisé dans le lien est un Pi A ou B (GPIO à 26 broches).
    [/edit]

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 282
    Par défaut
    Bonsoir à tous

    Pour la transitions des niveaux logiques, vu que c'est un dans chaque sens, l'adaptation est différente.
    En méthode simple qui marche pas selon les spec, mais en fait si (en général cela fonctionne quand même):
    • Arduino TXD -> Raspberry RXD passage de 5V à 3.3V il faut un pont diviseur de tension, sinon on grille direct l'entrée du Raspberry!!!
    • Raspberry TXD -> Arduino RXD passage de 3.3V à 5V, on branche direct et avec 99% de chance le niveau haut en sortie 3.3V est lu correctement par l'entrée 5V. De plus l'Atmel n'a pas de problème en cas de tension entre les deux états stable comme les anciens circuits MOS => càd 0 risque électrique pour les deux circuits.


    La méthode approuvée en industrie, c'est l'utilisation des convertisseurs de niveau. Puces intégrée prévue à cet usage.

    Bonne soirée

    Delias

  7. #7
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    Bonsoir

    Citation Envoyé par Vincent PETIT Voir le message
    Salut,
    Je me pose une question tout autre mais tu es sur les mêmes niveaux de tension au moins ?

    Je veux dire, tu n'es pas entrain de faire communiquer le Tx d'un Arduino qui sort du +5V avec le Rx du Raspberry PI qui est alimenté en +3.3V ????

    Tu es visiblement sur que la comm fonctionne, comment le sais tu ?

    Si tu lances directement le programme en Python avec des valeurs d'intensité en dures (sans aucun PHP) Est ce que le Arduino réagit ?
    Je suis bien connecté en USB sur l’Arduino et sur le RPI, la tension est donc la même.
    Je suis certain qu'ils communiquent bien car j'ai déjà fait plusieurs programmes avec des modules (luminosité, capteur de distance, température) et des tables SQL qui récoltent les données. Maintenant c'était que du code python et arduino, avec le PHP j'ai un peu plus de mal à l'implémenter.

    Citation Envoyé par Auteur Voir le message
    @Yandrosa : quel Arduino utilises-tu ? Est-ce que ton Arduino et ton Pi sont reliés par le port USB ?
    J'utilise un arduino UNO et oui c'est relié par port USB. Je téléverse le code depuis mon pc et je le branche sur mon Raspberry à chaque fois, je ne peux pas utiliser le moniteur de l’Arduino pour voir si ça fonctionne bien. Maintenant j'ai l'habitude d'envoyer avec mes modules de l'Arduino au Raspberry et non du RPI à l'arduino.

    J'ai fais un petit test avec un code pour tester la communication dans les deux sens :

    Arduino :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    String var = "0";
    void setup(){
    Serial.begin(9600);
     pinMode(3, OUTPUT);
    }
    
    void loop(){
    Serial.println("Hello Pi");
    delay(2000);
    var = Serial.read();
    
    if (var == "42"){
    
      digitalWrite(3, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);              // wait for a second
      digitalWrite(3, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);   
      
    }
    delay(2000);
    }
    RPI :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    import time
    import serial
    ser = serial.Serial('/dev/ttyACM0', 9600)
    while 1 :
            response = ser.readline()
            time.sleep(2)
            print response
            ser.write(str(42).encode()) 
            time.sleep(2)
    la led ne clignote pas, mais je reçois bien le Hello Pi dans mon Raspberry Pi (j'avais aussi testé avec un integer et un simple ser.write mais c'est la même chose)

    J'ai déjà testé la communication avec TX et RX avec diviseur de tension et même l'I²C, mais j'avais eu des problèmes pour certain travaux, donc mon groupe a décidé de le faire avec un câble USB pour la simplicité.

    J'essayerai de creuser pour trouver ce qui ne va pas demain soir Je vous souhaite une bonne nuit et si vous avez des suggestions, n'hésitez pas

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 282
    Par défaut
    Bonjour

    Je ne maîtrise pas le Python, mais à mon avis tu as un problème de format du nombre.

    Dans ton premier message, i est un int donc il te faut envoyer en format binaire (en Basic ou Pascal on devrait envoyer un CHR(I) sur le port série)
    Dans ton dernier message, tu tests si tu reçois un string avec écrit dedans "42" soit deux bytes casté en string, mais tu en lis que un seul. Voir cette discussion: Communication entre deux Mega2560, problème de sauvegarde chaine de caractère .

    Les deux solutions se valent, mais c'est la même qui doit être implantée des deux côtés. Et surtout la conversion string->integer doit être écrite dans le code de l'Arduino.

    Bonne journée

    Delias

  9. #9
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Je suis d'accord avec Delias débarrasse toi des problèmes des chaînes de caractères (et du \0).

    En plus, pour faire un test if avec "42" il te faut déjà 2 octets ce qui complexifie inutilement les choses.

    Applique ce que recommande Delias et envoi des integer (ou mieux des char qui doivent être codé sur 8 bits) dans le programme Python envoi la valeur 42 plutôt que la chaîne de caractères "42" et dans ton programme Arduino arrange toi pour que var soit un char ou int.

  10. #10
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Je te conseille d'utiliser la fonction readStringUntil()

    Il faudra également modifier ton code python en ajoutant le caractère de fin de chaîne.


    Je reviens un instant sur ton premier code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if (Serial.available() > 0) // si le câble est bien branché
    la fonction available sert à détecter la présence d'un caractère entrant, pas à vérifier si le câble est branché.

  11. #11
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    Bonsoir

    Citation Envoyé par Delias Voir le message
    Bonjour

    Je ne maîtrise pas le Python, mais à mon avis tu as un problème de format du nombre.

    Dans ton premier message, i est un int donc il te faut envoyer en format binaire (en Basic ou Pascal on devrait envoyer un CHR(I) sur le port série)
    Dans ton dernier message, tu tests si tu reçois un string avec écrit dedans "42" soit deux bytes casté en string, mais tu en lis que un seul. Voir cette discussion: Communication entre deux Mega2560, problème de sauvegarde chaine de caractère .

    Les deux solutions se valent, mais c'est la même qui doit être implantée des deux côtés. Et surtout la conversion string->integer doit être écrite dans le code de l'Arduino.

    Bonne journée

    Delias
    Bonsoir, j'ai suivi votre conseil et j'ai réussi à faire communiquer un nombre et le faire passer par un if dans mon code arduino

    Python :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import serial
      
    ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=1)
    print(ser)
     
    while 1:
    code = raw_input()
    ser.write(code.encode('utf-8'))
    Arduino :
    test avec deux led :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    int nombre = 0;
    void setup() {
      pinMode(2, OUTPUT);
      pinMode(4, OUTPUT);
      Serial.begin(9600);
    }
    
    void loop() {
      if (Serial.available())
      {
         digitalWrite(2, HIGH);  
         nombre = Serial.parseInt();
         if (nombre == 32){
           digitalWrite(4, HIGH);
      }
      delay(2000);
      Serial.flush();
      digitalWrite(2,LOW);
      digitalWrite(4,LOW);
      }
    
    }
    Comme cela ça fonctionne super bien ! Mais le soucis c'est que dans le code Python, il faut que l'utilisateur encode la donnée, je ne sais pas le faire si je lance mon script depuis ma page PHP.
    j'ai essayé de faire un code = 32 ou un code = "32" mais ça ne fonctionne pas ...
    Il ne rentre pas dans ma condition

    Citation Envoyé par Auteur Voir le message
    Je te conseille d'utiliser la fonction readStringUntil()
    Exemple : http://stackoverflow.com/questions/1...ter-on-arduino

    Il faudra également modifier ton code python en ajoutant le caractère de fin de chaîne.


    Je reviens un instant sur ton premier code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if (Serial.available() > 0) // si le câble est bien branché
    la fonction available sert à détecter la présence d'un caractère entrant, pas à vérifier si le câble est branché.
    Merci pour l'information

    Si je regarde le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int x;
    String str;
    
    void loop() 
    {
        if(Serial.available() > 0)
        {
            str = Serial.readStringUntil('\n');
            x = Serial.parseInt();
        }
    }
    le Serial.readStringUntil permet de chercher la ligne avec un saut de ligne et de lire le chiffre qui arrive après si je comprend bien ?
    Maintenant ce que je comprend moins bien c'est le code Python qui va avec, je dois faire un Serial.write deux fois, une fois pour la saut de ligne et le deuxième pour le nombre ?
    Je testerai encore tous ça demain Merci beaucoup pour votre aide et pour les cours et tutoriels pour apprendre Arduino !

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/01/2016, 20h41
  2. Réponses: 0
    Dernier message: 25/05/2011, 10h41
  3. [Stage] [Côtes d'armor] Développeur Java/C/C++/Python/PHP
    Par Labson dans le forum Demandes
    Réponses: 0
    Dernier message: 22/02/2009, 23h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo