Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Création basic interface utilisateur

    13 février 2013 à 15:48:46

    Bonjour à tous,

    Aujourd'hui je fait appel à vous car je développe avec mon prof d'informatique un petit robot.

    Actuellement mon robots fonctionne niquel (il avance, s’arrête devant les mur, recule de lui même,évite les obstacle,etc...)

    Mais j'aimerais réaliser un interface utilisateur pour permettre le contrôle du robots par l'utilisateur lui-même.

    Je voudrais m'aider un simple code : Un simple LED que lorsque l'on clique sur ON elle s'allume et lorsque on clique sur OFF, elle s'éteint.

    Voici mon code basic :

    ps : j'utilise visual studio 2012

    void setup ()
      {  
         pinMode(13, OUTPUT);
      }
    void loop()
      {
        digitalWrite(13, 1);
        delay(1000);
        digitalWrite(13 ,0);
        delay(1000);
    
      }
    
    


    Si quelqu'un pourrais prendre un peut de sont temps pour m'expliquer à réaliser un interface se serrais vraiment sympas.

    D'avance merci !

    • Partager sur Facebook
    • Partager sur Twitter
      13 février 2013 à 16:20:36

      Je n'ai pas très bien compris.

      Tu veux créer une interface  utilisateur, avec un bouton (virtuelle) qui quand celui ci est activé, cela allume la LED sur ton Arduino ?

      • Partager sur Facebook
      • Partager sur Twitter
        13 février 2013 à 16:56:14

        Bon, bah je peux pas t'aider, j'ai pas encore le niveau (mais chut hein !)

        //user.oc-static.com/pdf/515602-arduino-pour-bien-commencer-en-electronique-et-en-programmation.pdf

         Voici le tuto Arduino sous forme .pdf, puisqu'il n'est plus disponible sur le site.

        Dans la Partie 3 au chapitre Annexe, tu trouveras ton bonheur =)

        • Partager sur Facebook
        • Partager sur Twitter
          13 février 2013 à 17:24:59

          Oui je t'invite à aller voir du coté du pdf du tuto sur la partie voie série. Tu pourras déjà faire un premier truc avec un fil USB qui pendouille. Une fois que ca marche on pourra sans trop de difficulté se passer du fil pour introduire une transmission sans fil...
          • Partager sur Facebook
          • Partager sur Twitter

          Retrouvez moi sur mon blog et ma chaine Youtube !

            13 février 2013 à 17:25:23

            Tutoriel pas mal, mais a partir de la page 236, il y a une erreur de compilation est aprés le mec nous explique que il y a un emulateur mais aucune idée pour le trouver :'(
            • Partager sur Facebook
            • Partager sur Twitter
              13 février 2013 à 17:28:51

              Eskimon a écrit:

              Oui je t'invite à aller voir du coté du pdf du tuto sur la partie voie série. Tu pourras déjà faire un premier truc avec un fil USB qui pendouille. Une fois que ca marche on pourra sans trop de difficulté se passer du fil pour introduire une transmission sans fil...


              J'arrive déjà à afficher des info grâce à mon câble USB ça ce n'est pas le probléme ;)
              • Partager sur Facebook
              • Partager sur Twitter
                13 février 2013 à 20:29:08

                Quentin134 a écrit:

                J'arrive déjà à afficher des info grâce à mon câble USB ça ce n'est pas le probléme ;)


                Je pense qu'il parlait aussi de l'envoie de donnée. Eskimon parlait du même chapitre que moi.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  13 février 2013 à 21:24:12

                  Quentin134 a écrit:

                  Tutoriel pas mal, mais a partir de la page 236, il y a une erreur de compilation est aprés le mec nous explique que il y a un emulateur mais aucune idée pour le trouver :'(

                  Comme c'est pas moi qui est écrit cette partie (je ne suis pas qualifié pour le faire) je ne peux pas t'aider de ce point de vue, en revanche je pourrais te conseiller de voir du côté du logiciel "Processing". Je suis plutôt partisan pour ce logiciel car il utilise le même langage qu'Arduino, la même interface, etc. (en fait c'est Arduino qui s'inspire de Processing, mais bon, on s'en fiche).

                  Pourquoi ? Eh bien car il permet de réaliser assez rapidement des interfaces toutes simple (dans ton cas, par exemple) tout en étant hyper puissant ! On peut manipuler la liaison série sans problème, interagir avec l'ordinateur aussi, etc. On peut même créer le programme de sorte à ce qu'il soit compatible sur Android. Comme ça tu peux même téléguider le robot avec ton téléphone.

                  Tu compte relier comment ton robot à ton ordinateur ? Quel moyen (fil, sans-fil) ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 février 2013 à 23:40:44

                    Mon prof m'a dis de le codé comme si je parler avec le COM4 car il à un USB bleutoot qui prend le relai du COM4.

                    Ok je tcheck le liens et vous tien au courant.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 février 2013 à 17:48:43

                      Bonjour; rien ne t'empêche de faire une interface avec le langage de programmation de ton choix. Tu peux très bien faire du Java sur une tablette android et dans ton code envoyer des informations via bluetooth. Sinon, je te conseil le Python sur PC (avec pyQt pour faire l'interface), car tu peux envoyer n'importe quoi sur le port série en moins de 10 lignes; Je peux te passer un exemple de chenillard (c'est l'exemple le plus simple que j'ai en ma possession) controllable via une interface en C++ (Qt) avec le script python (je sais que j'aurais pu utiliser pyQt, mais je ne l'ai plus sur mon PC principal) Sinon, le processing peut-être aussi très pratique.

                      -
                      Edité par AmarOk1412 14 février 2013 à 17:49:38

                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 février 2013 à 18:24:22

                        Ba ici, j'ai lu quelque choses sur le VB pour crée un interface, je vais essayer de le mettre en application.

                        J'ai déjà appris il y a longtemps les bases du C++ mais n'ayant plus pratiquer depuis longtemps je n'ai plus les compétence pour crée un interface relier au port COM.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 février 2013 à 10:46:47

                          Personnellement, j'avais fait la liaison au port com en python, de mémoire ça donnait :

                          import serial
                          import sys
                          import time
                          
                          ser = serial.Serial("/dev/ttyACM0", 9600) #connection au port
                          time.sleep(3) #le temps que ça se connecte
                          ser.write(sys.argv[1]) #ici on envoie l'argument passé au démarrage à l'arduino.
                          #Par exemple, dans le terminal, j'ai juste à taper "python nomFichier.py 18" pour envoyer 18... tu peux bien sur faire ser.write("machin")

                          Et dans l'interface, j'avais juste 5 boutons et au clic on avait genre :

                          QProcess::startDetached("python nomFichier.py 18"); Rien de bien compliqué



                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 février 2013 à 16:56:46

                            Niveau python je ne m'y connais vraiment pas :( J'essaye de lire des tutoriel sur visual studio mais avec le visual studio 2012 j'arrive pas a compiler
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 février 2013 à 22:38:20

                              moi javais reussi a fair une interface avec Qt en c++ je peut vous envoyer les source si vous vouler
                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 février 2013 à 13:05:23

                                Oui, celà m'interesse.

                                Modification :

                                J'ai réussi à créer un interface mais j'ai quelque probléme, voici mon code :

                                if (Serial.read() == 'a')
                                	{
                                		Serial.println("test");
                                	}

                                Enfaite, lorsque j'envoie la lettre "a" ou "avancer" mon arduino me renvoie bien "test" mais le probléme lorsque je fait ceci :

                                if (Serial.read() == 'avancer')
                                	{
                                		Serial.println("test");
                                	}

                                et que lorsque j'envoie le mot "avancer" il me renvoie rien. J'ai remarquer que celà vien du fait que l'arduino ne prend en compte que le 1er caractére.

                                Savez vous m'aider ?


                                -
                                Edité par Quentin134 16 février 2013 à 14:13:20

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 février 2013 à 14:35:40

                                  je pense mais je suis pas sure que tu devrai eyseyer avec "avanceer" ala place 'avancer'
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 février 2013 à 15:18:46

                                    Deux problèmes :

                                    - Serial.read() ne lit qu'un seul caractères (donc on ne peut pas le comparer à une chaine entière

                                    - Une chaine s'écrit avec des guillemets double ( " ) et non pas avec des simples ( ' ) (ces derniers sont utilisés pour désigner un caractère unique)

                                    Une solution :

                                    Fais la lecture du mot en entier en le stockant dans un tableau de char ou dans un objet String puis, lorsque la lecture est faite, compare le à ta chaine de référence.

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Retrouvez moi sur mon blog et ma chaine Youtube !

                                      18 février 2013 à 17:30:26

                                      Ok Ok, merci à vous pour vos réponse, pour finir j'ai utiliser la lecture de 1 seul caractère : a = avancer, r = reculer etc etc.

                                      Pour le moment tout marche mon interface est correct parcontre je suis encore sur un petit probléme :/ (oui je suis ennuyeux lol)

                                      Enfaite j'ai fait un bouton qui permet de lancer mon robots automatique (fonction du style aspirateur robots) .

                                      Mon probléme vien du fait que j'ai du crée une boucle infinie (for(;;)) pour pouvoir faire que mon robots recoit toujours des valeur différent.

                                      MAIS j'aimerais créer un bouton 'arrêter la mise en automatique' que j'ai nommée 'i' mais je ne trouve aucun moyen d'arreter cette chaine si quelqu'un pourrais m'aider :)

                                      Voici mon code :

                                      if (received == 'h')
                                        {                    
                                      	  for (;;)
                                      	  {
                                        unsigned int uS = sonar.ping(); 
                                        obstacle = uS / US_ROUNDTRIP_CM;
                                        Serial.print("Ping: ");
                                        Serial.print(obstacle); 
                                        Serial.println("cm");
                                        avancer(40);
                                      
                                        if (obstacle < 40 && obstacle >= 5){    
                                          avancer(obstacle);
                                        }
                                        
                                        if (obstacle < 5 && obstacle > 0){
                                          arret();
                                          avancer(-20);
                                          delay(500);
                                          tourner(20);
                                        }
                                        
                                        if(obstacle == 0){
                                          avancer(40);
                                        }
                                        delay(100);
                                      }
                                      
                                      	  if (received == 'i')
                                      {
                                      	while(1);
                                      	}
                                      	  }
                                      }



                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        18 février 2013 à 17:57:09

                                        Bon, j'ai pas trop trop compris ce que tu voulais faire mais bon...

                                        if (received == 'h')
                                        {                  
                                            for (;;)
                                            {
                                                unsigned int uS = sonar.ping();
                                                obstacle = uS / US_ROUNDTRIP_CM;
                                                Serial.print("Ping: ");
                                                Serial.print(obstacle);
                                                Serial.println("cm");
                                                avancer(40);
                                        
                                                if (obstacle < 40 && obstacle >= 5){  
                                                    avancer(obstacle);
                                                }
                                        
                                                if (obstacle < 5 && obstacle > 0){
                                                    arret();
                                                    avancer(-20);
                                                    delay(500);
                                                    tourner(20);
                                                }
                                        
                                                if(obstacle == 0){
                                                    avancer(40);
                                                }
                                                delay(100);
                                        
                                                if (Serial.read()== 'i') // Si ça renvoie le charactère 'i'
                                                    break; // On sort du "for"
                                            }
                                        }

                                         Si tu met la condition dans ta boucle infinie, suivie de "break", ça devait te faire sortir du for.

                                        Bon le truc embêtant avec mon code, c'est que tu vas être obligé d'attendre que tous les Delays soient finis (peut-être mettre en place des interruptions?) .

                                        Par contre, juste un conseil, même si c'est un peu compliqué avec l'éditeur du SdZ, fait attention à ton indentation, c'est pas évident à lire.

                                        En espérant t'avoir aidé.

                                        Cordialement.



                                        -
                                        Edité par Zbeb 18 février 2013 à 18:01:31

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          18 février 2013 à 18:00:09

                                          Edit : j'avais mal lu, oui ton code fonctionne, mais comme tu dis je doit attendre que mon delay fini or sa m'embetes :/

                                          Vous avez pas une solution ?

                                          -
                                          Edité par Quentin134 18 février 2013 à 22:13:47

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            19 février 2013 à 8:45:26

                                            Comme je l'ai dis, tu devrais utiliser des interruptions.

                                            En gros, lorsqu'il y aura de la donnée valide dans le buffer de l'UART, ça va te générer une interruption et ensuite tu n'as plus qu'à lire le buffer, voir si ça correspond à "i" et sortir de ta boucle.

                                            N'étant pas utilisateur d'Arduino, je ne sais pas comment on gère les ISR. J'ai trouvé ce post sur le forum Arduino (voir la deuxième réponse). A vérifier.

                                            Cordialement.

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              19 février 2013 à 10:09:50

                                              De plus, le break, mis a part dans un switch, je ne le conseille pas, ca donne du code illisible !

                                              Utilise un while ou do while, avec comme test : while(serial.read()!='i')

                                              ou du genre.

                                              @Zbeb, Je suis pas sur qu'avoir l'interrupt sur UART soit judicieux, car tu ne pourras pas sortir de la boucle jusqu'a ce que tu lises le caractere. Je pense meme que le serial.read est exactement ce que tu décris, lire le buffer.

                                              Au niveau du probleme des "delays" il faut implementé des delays passif au lieu de delay actifs. Pareil, je connais pas Arduino, mais ca doit etre possible...

                                              Il faut enclenché une interruption de type "timer" (ou du genre, voir la datasheet des ton uC) et la configurer pour qu'elle trig toutes les 1, 10 ou 100 ms. ensuite recoder ton morceau pour qu'il prenne en compte ses changements.

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                19 février 2013 à 14:28:40

                                                pas trop le temps de répondre mais une bonne piste pour cette histoire de délai passif : utiliser la fonction millis() et un système de mémoire (ou alors carrément un timer comme le dit bounce)
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Retrouvez moi sur mon blog et ma chaine Youtube !

                                                  19 février 2013 à 20:29:04

                                                  Merci j'ai tester et sa marche :) Par contre je fait encore appel à vous car ici j'essaye de renvoyé des information que mon capteur infrarouge du robots reçoit dans mon programme C++ or je ne trouve aucun tutoriel qui explique comment faire :/ j'ai essayer avec la fonction :

                                                  serialPort1->Read();

                                                  Mais il ne lis rien :/



                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    19 février 2013 à 20:32:00

                                                    Va ptet falloir nous en dire un peu plus sur le capteur si tu vexu qu'on puisse répondre ^^
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Retrouvez moi sur mon blog et ma chaine Youtube !

                                                      19 février 2013 à 20:52:34

                                                      tu travaille avec qt?

                                                      javais trouver une lib pour fair ca et jais  le code si tu veut

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        19 février 2013 à 21:02:25

                                                        J'utilise Visual studio 2012 c++ (je l'utilise uniquement pour l'interface graphique et j'inclu mon code c++ dedans)

                                                        Voici mon code capteur :

                                                        #include <NewPing.h>
                                                        
                                                        #define TRIGGER_PIN  12 
                                                        #define ECHO_PIN     11 
                                                        #define MAX_DISTANCE 200
                                                        
                                                        NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 
                                                        
                                                        void setup()
                                                        {
                                                          Serial.begin(9600); 
                                                          Servo1.attach(9);
                                                          Servo2.attach(10); 
                                                        }
                                                        void loop()
                                                        {
                                                        unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
                                                          obstacle = uS / US_ROUNDTRIP_CM;
                                                          Serial.print("Ping: ");
                                                          Serial.print(obstacle); // Convert ping time to distance in cm and print result (0 = outside set distance range)
                                                          Serial.println("cm");
                                                          avancer(40);
                                                        
                                                          if (obstacle < 40 && obstacle >= 5){    
                                                            avancer(obstacle);
                                                          }
                                                          
                                                          if (obstacle < 5 && obstacle > 0){
                                                            arret();
                                                            avancer(-20);
                                                            delay(500);
                                                            tournerdroite(40);
                                                          }
                                                          
                                                          if(obstacle == 0){
                                                            avancer(40);
                                                          }
                                                          delay(100);
                                                        }

                                                        De plus le prof ma enfin donnée mon recepteur bleutoot or il me dis que je doit configuré en 4800 mais lorsque je met du 4800 rien en fonctionne tout bug ! mais cette étape je la referais en dernier ^^

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          20 février 2013 à 17:33:18

                                                          Le_Maitre a écrit:

                                                          tu travaille avec qt?

                                                          javais trouver une lib pour fair ca et jais  le code si tu veut

                                                          Cela m'interesse, car je croit me mettre a Qt qui est plus simple.



                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            20 février 2013 à 19:04:29

                                                            le lien de telechargement de la lib
                                                            apres il y a tous la doc sur le meme site
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            [Arduino] Création basic interface utilisateur

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown