LOW et HIGH inversé

Bonjour, j'ai un arduino Uno et il y une inversion de HIGH et LOW...
voici un exemple:
Avec ce code:

void setup() {                
pinMode(5, OUTPUT);    
digitalWrite(5, HIGH);  
}

void loop() {
   
}

La LED sur le pin 5 ne s'allume pas alors qu'avec:

void setup() {                
pinMode(5, OUTPUT);    
digitalWrite(5, LOW);  
}

void loop() {
   
}

Elle s'allume...

Par contre avec la pin 13 (LED intégré a l'arduino) HIGH l'allume et LOW l'éteint.
Pouvez vous m'aider a résoudre ce problème

Bonjour,

Au vu du probléme je parie que la led est à l'envers.
Une led a un (+) l'anode et un (-) la cathode si elle n'est pas mis dans le bon sens elle va s'allumer sur le niveau inverse du niveau normal puisque le courant va la traverser dans le sens contraire.
Pour reconnaitre le - du + c'est trés simple, le plus c'est la grande patte et le moins c'est la petite patte aussi repéré par un méplat sur le coté de la led.

Sa diode n'est pas à l'envers sinon elle ne s'éclairerait jamais.

L'explication est dans le schéma :
Les concepteurs de la carte ont pris le soin de relier la del à la masse via une résistance de 500 ohms ( 2 res de 1k en // semble-t-il). Comme celà la diode s'éclaire quand la pin 13 est à l'état HIGH (source).

Dans le cas de pierreyves la diode doit être reliée au +5V le courant ne pourra la traverser que si le niveau de sortie est "Low" (sink).

Pour pierreyves258 on dit :
"source" quand le circuit fourni du courant au monde extérieur
"sink" quand le circuit absorbe le courant venant de l'extérieur

Ce n'est pas un problème de microcontroleur mais seulement d'électronique.

@skywodd : Si elle étais branchée a l'envers elle ne s'éclererais jamais comme a dis 68tjs

@68tjs: Je n'ais pas bien compris cette histoire de source et sink ... Peut tu me l'expliquer en détail et me dire comment faire pour que la diode s'allume a l'étét HIGH ...

PS: Pour brancher ma led le circuit est dans cet ordre:
+5V --- LED --- Resistance 330 Ohms --- Pin 5
c'est bien le +5V qui fournit le courant ...

je pensais que si l'état étais a LOW la pin étais non reliée et si il étais HIGH c'etais comme une masse (GND) apparament c'est pas ça :stuck_out_tongue:

pierreyves258:
PS: Pour brancher ma led le circuit est dans cet ordre:
+5V --- LED --- Resistance 330 Ohms --- Pin 5
c'est bien le +5V qui fournit le courant ...

la "pin5" fourni 5v en sortie ... n'importe que exemple basique sur le net montre le branchement.

donc en faite les pins (2,3,4,5,6,7,...) fournissent +5v a l'etat HIGH ??? il faut donc que je branche sur la pin et la masse ?

pierreyves258:
donc en faite les pins (2,3,4,5,6,7,...) fournissent +5v a l'etat HIGH ??? il faut donc que je branche sur la pin et la masse ?

Bingo :grin:, c'est quand même une des fonctions les plus basique de l'arduino, faut lire un minimum la doc, tuto, ... ,avant de ce lancé ]:smiley:

http://arduino.cc/en/Tutorial/Blink
http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ApprendreBrochesEntreeSortie

C'est simple quand la pin 5 est à l'état haut c'est quasiment comme si elle était reliée au + 5Volt.
A l'inverse quand elle est à l'état bas c'est comme si elle était reliée au 0V (la masse).

Pour que la diode s'éclaire il faut qu'un courant la traverse. En général 10mA conviennent, avec une tension aux bornes de la diode de disons 2V (ça varie avec les modèles de 1.8 V à 2.5 V) il faut une résistance
R= (5Valim -2Vdiode)/10mA soit 300 ohms.

Maintenant ton couple (diode+résistance) tu le branches d'un coté à la pin 5 et de l'autre tu as le choix entre la masse ou l'alim.
Si tu choisi la masse la diode ne s'allumera (pour toi se sera High_diode) que si la pin 5 est au +5V donc à l'état High_micro).
Le courant qui traverse la diode sera fourni par la pin 5, en langage anglo-saxon on dit "source".
Si la pin 5 est à l'état bas le couple (diode+résistance) aura ses deux extrémité reliés à la masse et la diode ne pourra pas s'allumer.

Si tu choisi de relier la diode à l'alim elle ne s'allumera que si la pin 5 est l'état bas donc un etat High_diode correspondra à un état Low_micro. Le courant qui provient de l'alim sera absorbé par la pin 5 après avoir parcouru la diode. Toujours en langage anglo saxon on dit "sink".

Ce sont deux termes utiles à connaître pour savoir lire les datasheets des composants car des circuits intégrés peuvent n'avoir que l'une des deux fonction : source ou sink.

ahhh ok merci beaucoupen faite LOW = GND et HIGH = +5V ... javais pas compris ca sur le tuto du SDZ. et pour source et sink , source cest quand la pin fournit le courant et sink quand cest le 5V. Mais donc la j'envoyais 5v de chaque cote .......

en tout cas merci ! j'essayerais ca demain

EDIT:
ça marche mais il faut que je change le sens de toutes mes LED ...
mais pour un afficheur 7 segments (anode commune) je sais pas comment faire ...

mais pour un afficheur 7 segments (anode commune) je sais pas comment faire ..

Ou est le problème ?
Techniquement il n'y en a pas, c'est dans la tête qu'il peut y en avoir un : tu envoies LOW au lieu de HIGH, et alors qu'est ce que ça change ? Si tu as peur de ne pas pouvoir te relire commentes ton code, les commentaires c'est justement fait pour ça.
L'important était de comprendre pourquoi cela te "semblait" inversé.

Ok donc y a pas moyen de faire allumé a l'état HIGH avec un afficher 7 seg anode commune ...........

Ben si tu n'a qu'a écrire une fonction spéciale.

fonction pour afficher sur le 7 seg ? c'est déja fais !

int P = xx;
int BD = xx;
int B = xx;
int BG = xx;
int HD = xx;
int H = xx;
int HG = xx;
int M = xx;
void affich(int number)
{
 switch(number)
{
 case 1:
 digitalWrite(HG,LOW);
 digitalWrite(BG,LOW);
 digitalWrite(B,HIGH);
 digitalWrite(M,HIGH);
 digitalWrite(H,HIGH);
 digitalWrite(BD,HIGH);
 digitalWrite(HD,HIGH);
 digitalWrite(P,HIGH);
 break;
 case 2:
 digitalWrite(HG,HIGH);
 digitalWrite(BG,LOW);
 digitalWrite(B,LOW);
 digitalWrite(M,LOW);
 digitalWrite(H,LOW);
 digitalWrite(BD,HIGH);
 digitalWrite(HD,LOW);
 digitalWrite(P,HIGH);
 break;
 case 3:
 digitalWrite(HG,HIGH);
 digitalWrite(BG,HIGH);
 digitalWrite(B,LOW);
 digitalWrite(M,LOW);
 digitalWrite(H,LOW);
 digitalWrite(BD,LOW);
 digitalWrite(HD,LOW);
 digitalWrite(P,HIGH);
 break;
 case 4:
 digitalWrite(HG,LOW);
 digitalWrite(BG,HIGH);
 digitalWrite(B,HIGH);
 digitalWrite(M,LOW);
 digitalWrite(H,HIGH);
 digitalWrite(BD,LOW);
 digitalWrite(HD,LOW);
 digitalWrite(P,HIGH);
 break;
 case 5:
  digitalWrite(HG,LOW);
 digitalWrite(BG,HIGH);
 digitalWrite(B,LOW);
 digitalWrite(M,LOW);
 digitalWrite(H,LOW);
 digitalWrite(BD,LOW);
 digitalWrite(HD,HIGH);
 digitalWrite(P,HIGH);
 break;
 case 6:
 digitalWrite(HG,LOW);
 digitalWrite(BG,LOW);
 digitalWrite(B,LOW);
 digitalWrite(M,LOW);
 digitalWrite(H,LOW);
 digitalWrite(BD,LOW);
 digitalWrite(HD,HIGH);
 digitalWrite(P,HIGH);
 break;
 break;
 case 7:
 digitalWrite(HG,HIGH);
 digitalWrite(BG,HIGH);
 digitalWrite(B,HIGH);
 digitalWrite(M,HIGH);
 digitalWrite(H,LOW);
 digitalWrite(BD,LOW);
 digitalWrite(HD,LOW);
 digitalWrite(P,HIGH);
 break;
 case 8:
 digitalWrite(HG,LOW);
 digitalWrite(BG,LOW);
 digitalWrite(B,LOW);
 digitalWrite(M,LOW);
 digitalWrite(H,LOW);
 digitalWrite(BD,LOW);
 digitalWrite(HD,LOW);
 digitalWrite(P,HIGH);
 break;
 case 9:
  digitalWrite(HG,LOW);
 digitalWrite(BG,HIGH);
 digitalWrite(B,LOW);
 digitalWrite(M,LOW);
 digitalWrite(H,LOW);
 digitalWrite(BD,LOW);
 digitalWrite(HD,LOW);
 digitalWrite(P,HIGH);
 break;
 case 0:
  digitalWrite(HG,LOW);
 digitalWrite(BG,LOW);
 digitalWrite(B,LOW);
 digitalWrite(M,HIGH);
 digitalWrite(H,LOW);
 digitalWrite(BD,LOW);
 digitalWrite(HD,LOW);
 digitalWrite(P,HIGH);
 break;
 case 10:
  digitalWrite(HG,HIGH);
 digitalWrite(BG,HIGH);
 digitalWrite(B,HIGH);
 digitalWrite(M,HIGH);
 digitalWrite(H,HIGH);
 digitalWrite(BD,HIGH);
 digitalWrite(HD,HIGH);
 digitalWrite(P,LOW);
 break;
 case 11:
   digitalWrite(HG,LOW);
 digitalWrite(BG,LOW);
 digitalWrite(B,HIGH);
 digitalWrite(M,HIGH);
 digitalWrite(H,HIGH);
 digitalWrite(BD,LOW);
 digitalWrite(HD,LOW);
 digitalWrite(P,HIGH);
 break;
 default:
 digitalWrite(HG,LOW);
 digitalWrite(BG,LOW);
 digitalWrite(B,LOW);
 digitalWrite(M,LOW);
 digitalWrite(H,LOW);
 digitalWrite(BD,HIGH);
 digitalWrite(HD,HIGH);
 digitalWrite(P,LOW);
 break;
} 
}

Mais dans la fonction je doit mettre LOW pour allumé ...
Mais bon au pire c'"est pas si grave que ça... Merci

Bonjour,

je tiens quand même à signaler que dans ton code, sur le case 6, tu as deux "break" à la fin.

Effectivement, pour des leds avec anode(point d'entrée du courant) commune au 5V, si tu veux relier chaque anode(point de sortie du courant) à une pin, il faudra placer les pins à l'état bas pour que les leds s'allument.

Memento :

Une pin sur un ATMEGA à 3 états.
Etat 1 : Configurée en sortie, on la met à LOW, ce qui la "relie" à la masse.
Etat 2 : Configurée en sortie, on la met à HIGH, ce qui la "relie" au +5V.
Etat 3 : Configurée en entrée, état haute impédance.

En espérant t'avoir aidé,

Bonne journée !


Stéphane

Oh merci j'avais pas vu les 2 break sur mon code ...

J'ai pas compris l'état 3 ... ça correspond au pin Analog ?

pierreyves258 > le SDZ c'est génial pour apprendre le C/C++ applicatif, par contre, concernant l'arduino, tu trouves vachement plus de réponses ici, et sur le site www.mon-club-elec.fr

Il y a des schemas de montage, avec des sources toutes faites pour presque tout les composants de base, c'est super pour apprendre :stuck_out_tongue:

Ok merci :slight_smile:

Bonjour,

Je me permet de déterrer ce vieux topic.

Le fait de faire un branchement Pin-Masse (allumage HIGH) ou Pin-5V (allumage LOW) à t il un intérêt en terme de gestion de l'énergie de la carte ?
Par exemple si je veux alimenter plusieurs LED, et que cela dépasse les 40mA fournit par le Pin, et ce que je peux faire un branchement Pin-5V ?
Si oui, quel est l’intérêt d'un branchement Pin-Masse ?

Le fait de faire un branchement Pin-Masse (allumage HIGH) ou Pin-5V (allumage LOW) à t il un intérêt en terme de gestion de l'énergie de la carte ?
Par exemple si je veux alimenter plusieurs LED, et que cela dépasse les 40mA fournit par le Pin, et ce que je peux faire un branchement Pin-5V ?
Si oui, quel est l’intérêt d'un branchement Pin-Masse ?

Que la charge soit connectée au + ou à la masse il faudra toujours fournir le même courant à la charge donc on économise rien
40mA est un maximum à ne jamais atteindre. Le max par sortie c'est 20mA.
Dans le cas de l'ATmega la connexion à la masse ou au plus n'a pas d'impact les sorties ayant les mêmes caractéristiques en génération ou en absorption (source ou sink) 20mA dans les 2 cas. Mais ce n'est pas toujours vrai. Certains circuits logiques ont des caractéristiques de sortie dissymétriques et ne fournissent pas le même courant suivant comment la charge est raccordée.

Et j'ajoute : si tu veux plus de 20mA tu utilises un transistor et une resistance.