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

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

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

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Points : 6
    Points
    6
    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 émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 012
    Points : 2 341
    Points
    2 341
    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
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

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

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

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Points : 6
    Points
    6
    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 émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 012
    Points : 2 341
    Points
    2 341
    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
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    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
    Futur Membre du Club
    Femme Profil pro
    débutant
    Inscrit en
    Août 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Points : 6
    Points
    6
    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 : 514
Taille : 25,1 Ko
    j'espère que c'est clair.

  7. #7
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour MARIE MARY
    Citation Envoyé par MARIE MARY Voir le message
    j'espère que c'est clair.
    Pas encore tout à fait
    Est-ce-que tu veux bloquer l'usage des boutons quand l'USB est connecté?
    Comment alimentes-tu ce montage, quand il y a l'USB et sans l'USB?

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    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 émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 012
    Points : 2 341
    Points
    2 341
    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
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  10. #10
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Oui bien sûr - l’objet de mon post était double
    1/ informer que la pin en question est déjà nommée
    2/ ne pas s’étonner si dans un autre programme on voit ce nom de constante qui n’est pas définit au début du code , on saura d’où ça vient

    Sinon tout à fait d’accord c’est une bonne pratique de nommer ses pins.

  11. #11
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 190
    Points : 11 573
    Points
    11 573
    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 : 466
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 : 504
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.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

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

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

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    oui...je cherche 0 bloquer les intérrupteurs quand l'usb est connecté.
    je veux un foncrionnement exclusive:soit par usb ou par un arduino alimenté autrement et deux boutons pour le marche et l'arret.
    merci d'avance..

  13. #13
    Modérateur

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

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 830
    Points
    4 830
    Par défaut
    Bonsoir Marie

    L’Arduino de base (Uno, Nano) n'est pas prévu pour savoir si le port USB est branché. Il n'a juste pas les circuits pour cela. Car l'USB est interfacé par une passerelle USB / RS232 indépendante qui ne fournis pas l'info au microcontrôleur principal.

    Les collègues te proposent des solutions indirectes basées sur le point d'alimentation, mais pour que cela puisse fonctionner il faut leur répondre sur le moyen d'alimentation quand l'Arduino n'est pas branché en USB.

    Une autre solution c'est de se baser sur la présence d'une communication série active. Tant que l'Arduino ne reçoit rien sur le port série il suppose être en mode seul. Mais à la réception d'une trame il bascule en mode "USB". Le retour peut être limité à une coupure de l'alimentation (donc au redémarrage du programme).

    Une autre solution doit être de prendre un Arduino avec le support direct de l'USB (Lenardo et Micro). Je suppose que cela doit être possible mais sans en connaitre la méthode.

    Bonne suite

    Delias

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

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

    Informations forums :
    Inscription : Août 2019
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bonjour Delias
    merci de signaler que l'arduino n'est pas prévu pour savoir si le port USB est branché.je penserais à une autre solution.

  15. #15
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    +1 Excellente idée
    serais-tu expliquer la présence du 5V sur Vin et donc à l'entrée du régulateur NCP1117 lorsque l'on utilise le connecteur USB pour l'alimentation ? On dirait que ce régulateur recopie sur son entrée la tension de sortie. Un truc m'échappe.

  16. #16
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 190
    Points : 11 573
    Points
    11 573
    Par défaut
    En fait le +5V ne va pas sur VIN.

    Nom : path848.png
Affichages : 442
Taille : 53,3 Ko

    Notons que le hard de l'Arduino UNO est quelque peu hasardeux : Comparateur médiocre car fait avec des AOP, pas de diode de protection à la sortie du régulateur NCP1117 qui se prend du +5V, en provenance de l'USB, sur sa sortie alors qu'il n'est lui même pas alimenté (par VIN), une condition d'initialisation douteuse avec le transistor T1 qui est considéré conducteur par défaut (alors qu'il n'y a aucune raison) et si on regarde bien le comparateur on se rend compte du petit point obscure ;

    Le comparateur compare VIN à +3.3V, imaginons qu'on ne met rien sur VIN et qu'on alimente par l'USB.

    Ça veut dire que le comparateur est sensé comparer un VIN à 0V avec +3.3V et cette condition devrait mettre la sortie du comparateur à 0V et le transistor va conduire pour laisser passer le USBVCC pour qu'il alimente le régulateur +3.3V mais il y a un problème car pour que le +3.3V existe sur le comparateur il faut que USBVCC ait déjà traversé le transistor et atteint le régulateur +3.3V

    En réalité lors du premier démarrage sur l'USB, le comparateur va comparer VIN à 0V (car rien dessus) avec un +3.3V qui n'existe pas encore.... Et le concepteur du hard s'est dit que cette condition quelque peu non maîtrisée allait rendre le transistor conducteur


    Une bonne solution aurait été de comparer VIN avec USBVCC, si VIN > USBVCC le transistor s'ouvre favorisant VIN comme source d'alimentation et si VIN < USBVCC le transistor devient conducteur favorisant USBVCC comme source d'alimentation.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  17. #17
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 329
    Points : 4 146
    Points
    4 146
    Par défaut Implicite
    Bonjour,

    Il y a beaucoup de réflexions intéressantes pour savoir comment détecter si l'USB est branché. Cela pourrait être très utile pour gérer la consommation d'énergie. Mais dans le cas présent, il semble que ce ne soit pas le sujet même si le problème est posé ainsi.

    En fait, il y a deux fonctionnement différenciés selon que la carte est autonome ou branchée en USB et reliée à un programme de pilotage série. Par exemple, si je branche la carte sur un chargeur USB, la prise USB sera bien là mais pas le pilotage, auquel cas je présume que le fonctionnement autonome doit être actif.

    Si mon interprétation est bonne, la solution est simple :
    • la carte arduino pose une question via USB et attend la réponse avec timeout.
    • si elle obtient la réponse attendue, elle passe en mode esclave.
    • si elle obtient une autre réponse ou pas de réponse (flag de timeout), elle passe en mode autonome.

    C'est donc juste un test de liaison. Nous sommes montés dans les couches OSI

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

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