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

Arduino Discussion :

Commande réelle / virtuelle


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    débutant
    Inscrit en
    Août 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : débutant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Par défaut Commande réelle / virtuelle
    Bonjour
    je suis débutante en ARDUINO,je voudrais réaliser un montage à base d'ARDUINO ,qui commande un diode led on et off,par usb ou par exécusion sans usb ,avec des boutons poussoir.
    le problème que j'arrive pas à identifier la commande el langage ARDUINO qui désigne la condition d'absence de port USB.

    Si vous vouliez ,je peux publier le code.
    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Marie

    C'est pas évident de tester si le câble USB est connecté, je ne pense pas qu'il y a une commande pour.

    Il y a un moyen, dépendant la façon d'alimenter l'Arduino, s'il y a un adaptateur entre 7 et 12V sur le jack d'alimentation, il y a 5V. sur la borne 5.0V de l'Arduino, même si l'USB est connecté. S'il y a seulement l'USB, il y a seulement 4.4V sur cette borne, ce qui est mesurable via une entrée analogique.

    Comment veux-tu commander ta LED depuis l'USB?, mets ton code en ligne (entre les balises Code)

    Cordialement
    jpbbricole

  3. #3
    Membre averti
    Femme Profil pro
    débutant
    Inscrit en
    Août 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : débutant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Par défaut COMMANDE AVEC OU SANS USB
    Merci de m'avoir répondu, voila le code.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    // put your setup code here, to run once:
    // Based on: Science Guy 14 youTube tutorial
    // http://youtu.be/g0pSfyXOXj8
     
    // int ledPin = 13; // the number of the LED pin
    String inputString = "";
    char numberString[10];
    String outputString = "";       // a string to hold incoming data
    boolean stringComplete = false; // whether the string is complete
    int buttonState = 0;
    int x = 0;
     
    void serialEvent() {
      while (Serial.available()) {
        //    // get the new byte:
        char inChar = (char)Serial.read();
        // add it to the inputString:
        inputString += inChar;
        // if the incoming character is a newline, set a flag
        // so the main loop can do something about it:
        if (inChar == '\n') {
          stringComplete = true;
        }
      }
    }
     
    void setup() {
     
      // pinMode(ledPin, OUTPUT); // set LED as output
      // digitalWrite(ledPin, LOW); //turn off LED
      inputString.reserve(200); // reserve 200 bytes for the inputString:
      Serial.begin(9600); // set serial speed                     //alors qu’un vide
                          // signifie n’importe quel argument
      pinMode(13, OUTPUT); // on definit la sortie digitale pour la LED.
      pinMode(2, INPUT);   // on definit le bouton poussoir de reset.
      pinMode(3, INPUT);   // on definit la commande PWM du pont en H
      pinMode(4, INPUT);
    }
     
    void loop() {
      x = x + 1;
     
      static char COM = 0; // le mot-clé static permet de garder la variable intact
                           // entre les appels
      switch (COM) {
      case (0): // FONCTIONNEMENT GRAFCET SANS COMMANDE R2EL
        ////******************grafcet*//
        {
          while (Serial.available() == 0)
            ; // do nothing if nothing sent
     
          if (inputString == "led1on") { // test for command 1 then turn on LED
     
            Serial.println("btn1on");
            digitalWrite(13, HIGH); // turn on LED
     
          } else if (inputString ==
                     "led1off") // test for command 0 then turn off LED
          {
            Serial.println("btn1off");
            digitalWrite(13, LOW);
          }
          // turn off LED
          if (stringComplete) {
            stringComplete = false;
            inputString = "";
          }
          //
          else // if not one of above command, do nothing
          {
            ;
          }
     
          //
          break;
          //
        }
     
      /*************commande par visual basic************/ ///////
      //
      case (1): // fonctionnement en mode réel
      {
        static char etat = 0; // le mot-clé static permet de garder la variable
                              // intact entre les appels
     
        switch (etat) {
        case (0): // action pour l'étape 0
          digitalWrite(13, LOW);
          //  LED_ON==false;
          if (digitalRead(2) == 1) // etape initial -  P0
            etat = 1;              //  activation etape suivant
          break;
     
        case (1): // action pour l'étape 1
          digitalWrite(13, HIGH);
          // LED_OFF==false;
          if (digitalRead(3) == 1) // position chariot P1
            etat = 0;
          break;
        default: // Ne devrait jamais arriver, mais on sait jamais.
                 // digitalWrite(12, low);
          digitalWrite(13, LOW);
          etat = 0;
          break;
        }
      } break;
      }
    }

  4. #4
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Marie
    Citation Envoyé par MARIE MARY Voir le message
    le problème que j'arrive pas à identifier la commande el langage ARDUINO qui désigne la condition d'absence de port USB.

    Si vous vouliez ,je peux publier le code.
    J'ai regardé ton code, il n'est pas nécessaire de tester si le câble USB est connecté, les 2 méthodes par lecture des boutons ou l'ordre creçu par le port USB (série) peuvent très bien cohbiter, à condition de ne pas mettre des fonctions dites "blocantes" comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    			while (Serial.available() == 0)
    Avec cette ligne, il ne se passe plus rien tant que rien n'arrive depuis le port USB.
    Il faut structurer tout ça de façon différente, tout d'abord la lecture des données reçues, dispose d'une variable que tu n'utilises pas mais fort utile, stringComplete qui te dit si une commande est disopnible (inputString) ainsi, ta loop() doit ressembler à ceci:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    // put your setup code here, to run once:
    // Based on: Science Guy 14 youTube tutorial
    // http://youtu.be/g0pSfyXOXj8
     
    // int ledPin = 13; // the number of the LED pin
    String inputString = "";
    char numberString[10];
    String outputString = "";       // a string to hold incoming data
    boolean stringComplete = false; // whether the string is complete
    int buttonState = 0;
    int x = 0;
     
    #define ledPin 13
     
    void serialEvent() {
    	while (Serial.available()) {
    		//    // get the new byte:
    		char inChar = (char)Serial.read();
    		// add it to the inputString:
    		if (inChar >= ' ') {inputString += inChar;}          // >= ' ' to avoid not wanted ctrl char.
    		// if the incoming character is a newline, set a flag
    		// so the main loop can do something about it:
    		if (inChar == '\n') {
    			stringComplete = true;
    		}
    	}
    }
     
    void setup() {
     
    	// pinMode(ledPin, OUTPUT); // set LED as output
    	// digitalWrite(ledPin, LOW); //turn off LED
    	inputString.reserve(200); // reserve 200 bytes for the inputString:
    	Serial.begin(9600); // set serial speed                     //alors qu’un vide
    	// signifie n’importe quel argument
    	pinMode(ledPin, OUTPUT); // on definit la sortie digitale pour la LED.
    	pinMode(2, INPUT);   // on definit le bouton poussoir de reset.
    	pinMode(3, INPUT);   // on definit la commande PWM du pont en H
    	pinMode(4, INPUT);
    }
     
    void loop() {
    	serialEvent();  // On va lire le port USB qui est en meme temps la console de l'IDE Arduimo
    	if (stringComplete)  // Est-ce-qu'une chaîne complète a ete recue?
    	{
    		inputString.toUpperCase();   // Ainsi la commande n'est plus sensible majuscules/minuscules
     
    		if (inputString == "ledon")
    		{
    			ledOnOff(1);
    		} 
    		else if (inputString == "ledoff")
    		{
    			ledOnOff(0);
    		}
     
    		inputString = "";
    		stringComplete = false;  // Remise du flag de reception a 0 (FALSE)
    	}
     
    	// Ici le traitement des boutons
    }
     
    /*---------------------------------------------------------------- 
    Traitement de la LED, commun au mode USB serie ou avec boutons
    '-----------------------------------------------------------------
    */
    void ledOnOff(byte ledStatus)
    {
    	digitalWrite(ledPin, ledStatus);
    }
    Tu noteras une petite modification dans void serialEvent(), qui évite d'avoir des caractères "parasites", c'est à dire plus petits que l'espace (en code ASCII) dans les chaînes de caractères reçues.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    de
    inputString += inChar;
    à
    if (inChar >= ' ') {inputString += inChar;}          // >= ' ' to avoid not wanted ctrl char.
    J'ai aussi "nommé" le numéro de la pin de la LED (#define ledPin 13), c'est plus clair, dans le programme.

    Tu peux "envoyer" les commandes ledon ledoff depuis le PC par un programme en VisualBasic à condition que le Moniteur Serie de l'IDE Arduino ne soit pas ouvert.
    Plus simplement, tu peux essayer ces commandes depuis ce moniteur.

    Je te laisse essayer d'implémenter la commande par boutons.

    Cordialement
    jpbbricole

  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
    Je prends exemple avec Arduino UNO :
    Il y a peut-être une astuce pour savoir si l'arduino est alimenté par un USB ou une alimentation externe : vérifier la tension aux bornes de Vin. Mais pour cela il faut quelques précautions.

    On va avoir sur Vin une copie de la tension d'alimentation : 5V pour l'USB ou supérieur si c'est une alimentation externe (L'Arduino peut-être alimenté avec une tension de 7 à 12V).

    L'astuce consiste déjà à brancher sur Vin un pont diviseur et à récupérer la tension de sortie de ce pont (Vout sur le schéma du pont) sur une entrée analogique. Il faut bien choisir les résistances R1 et R2 afin que la sortie du pont ne dépasse pas 5V avec une alimentation de 12V. Pour le pont, j'ai pris R1=5,3 kohms et R2=4,7 kohms (Vout = Vin * R2/(R1+R2)) .
    Si l'entrée analogique indique une valeur inférieure à 2,5V alors on est alimenté par l'USB (~5V) au delà on est forcément sur une alimentation externe.
    [edit]
    Après avoir revu mes calculs j'ai vu que si l'arduino est alimenté en 12V on a 5,64V aux bornes de R2 ce qui est trop élevé Donc les valeurs choisies pour les résistances sont à revoir. Il faut augmenter un peu la valeur de R1 (8 kohms au moins en faisant attention à la tolérance des résistances et à l'incertitude des valeurs).
    [/edit]

    Deux remarques :
    - je ne sais pas si cela peut fonctionner sur tous les Arduino ;
    - j'ignore si l'idée est bonne car avec UNO : je n'arrive pas à comprendre comment remonte le 5V du port USB sur la broche Vin ? Car Vin est l'entrée du régulateur de tension (si dessous capture d'écran du schéma de la carte UNO) et on a bien 5V sur Vin
    Images attachées Images attachées   

  6. #6
    Membre averti
    Femme Profil pro
    débutant
    Inscrit en
    Août 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : débutant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Par défaut
    ce que je veux c'est une commande par visual basic,si le port usb de l'arduino est lié à l'ordinateur.
    par contre si le port usb n'est pas connecté:je veux commander le on et off de led par des boutons poussoirs.
    voila la simulation sur isis.
    Nom : 22222.PNG
Affichages : 581
Taille : 25,1 Ko
    j'espère que c'est clair.

  7. #7
    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
    Citation Envoyé par Auteur Voir le message
    Il y a peut-être une astuce pour savoir si l'arduino est alimenté par un USB ou une alimentation externe : vérifier la tension aux bornes de Vin.
    +1 Excellente idée

    Sur le Arduino UNO, tout est même déjà prévu sur le hardware. Le composant U5A est un AOP LMV358 câblé en un piètre comparateur pour des questions de coût [1]. Si on connecte la fiche Jack sur un adaptateur secteur et que la tension CMP, issue d'une fraction de VIN, (VIN - 0.7V)/2, dépasse 3.3V alors le comparateur va mettre sa sortie à l'état haut et le transistor T1 va arrêter de conduire, ce dernier se comportera comme un interrupteur ouvert empêchant USBVCC d'aller vers le +5V. Inversement, si on ne connecte pas la Jack et qu'on ne met que l'USB, la tension CMP vaudra 0V et le comparateur va mettre sa sortie à l'état bas ce qui va faire conduire le transistor et laisser passer USBVCC vers le +5V.

    Nom : text1164.png
Affichages : 524
Taille : 23,4 Ko

    Il faut juste souder un petit fil sur la broche 1 du composant (il ne faut pas avoir peur, si on ne fait pas n'importe quoi il n'y a aucun danger, les composants électroniques ne craignent pas la chaleur tant qu'on ne laisse pas le fer à souder dessus)

    Nom : path2618.png
Affichages : 584
Taille : 381,4 Ko


    [1] même si un AOP peut se câbler en comparateur, ces défauts font que les fabricants de composants électroniques ont inventé de vrais comparateurs, ils ont le même symbole qu'un AOP, ils se ressemblent physiquement mais le comparateur n'a pas les défauts de l'AOP déguisé en comparateur.

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    J'ai aussi "nommé" le numéro de la pin de la LED (#define ledPin 13), c'est plus clair, dans le programme.
    bien que ce ne soit pas super important, et que vous pouvez nommer les pins comme vous le souhaitez, il est bon de savoir que la LED qui est intégrée en standard sur de nombreux arduino a déjà son petit nom prédéfini: LED_BUILTIN

  9. #9
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonsoir Jay M

    Citation Envoyé par Jay M Voir le message
    bien que ce ne soit pas super important, et que vous pouvez nommer les pins comme vous le souhaitez
    Mouais ce n'est pas tant quel nom on lui donne, l'important c'est de nommer une variable pour le simple fait que, en lisant un programme, en voyant ledPin c'est quand même plus parlant que de lire 7, par exemple. Autre avantage, si l'on veut changer la LED de pin sur l'Arduino, c'est quand plus pratique de changer à une place que de rechercher tout les 7 dans le programme.

    Cordialement
    jpbbricole

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/07/2012, 12h09
  2. Réponses: 2
    Dernier message: 07/05/2012, 22h10
  3. Commander un moteur (virtuellement)
    Par soft001 dans le forum LabVIEW
    Réponses: 0
    Dernier message: 12/04/2012, 10h06
  4. Réponses: 3
    Dernier message: 04/08/2009, 17h26
  5. Control des bureaux virtuels en ligne de commande ?
    Par Stéphane ERARD dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 20/06/2006, 09h22

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