Pin D0 très particulier...

Bonsoir,
je me suis rendu compte que, par exemple pour allumer une LED sur D13, qu'un simple montage contenant un bouton et une résistance de rappel, fonctionnait sur n'importe quelle entrée en mode INPUT (ou OUTPUT)... excepté D0 qui doit être en mode OUTPUT, pourquoi ?

const byte PIN=0; //Si  =0 => mode OUTPUT obligatoire

void setup() {
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);

  pinMode(PIN,OUTPUT);
  
}

void loop() {
  if(digitalRead(PIN)==HIGH){
    digitalWrite(13,HIGH);
  }
}

En soi rien n'oblige à mettre D0 en mode sortie.
Le mode "sortie" ne serait-il pas une conséquence du fait que D0 et D1 sont les pins TX/RX de la liaison série (UART) ?
Tu sais les pins qui communiquent avec l'USB pour programmer le micro :grin:

Si justement... je pense aussi qu'il y a un rapport avec le port série (non activé car pas de Serial.begin(()) mais malement la lecture d'un bouton devrait se faire en mode entrée, toutefois D0 (et pas les autres, ni même D1) ne fonctionne qu'en sortie. Je me demande juste pourquoi :slight_smile:

Personnellement je ne connais aucune raison objective pour que D0 ne puisse pas fonctionner en entrée.

Par contre ce qu'il faut savoir avec l'IDE arduino c'est que dans le fichier programme final, celui qui est réellement transmis au compilateur, il y a, entre autres actions, un appel à la fonction init() qui réalise un certain nombre de configurations.

La fonction init() se trouve dans un des nombreux fichiers du "core" arduino, voir sur ton PC pour en connaître le contenu.
Il va de soit que si tu modifies cette configuration de base un certain nombre d'action prévue dans l'IDE ne seront plus possibles.
C'est AMHA la raison pour laquelle certains indiquent que cette pin doit rester en sortie (mode TX).

Dans l'IDE tu écris ceci :

// ici on déclare les variables globales

void setup(){
  blabla
}

void loop{
  blabla
}

Et l'IDE effectue des compléments et au final envoi au compilateur un vrai fichier C/C++:

void setup() ;   // on prévient le compilateur qu'il va renconter une fonction appellée setup
void loop() ;    // idem pour la fonction loop

// ici on déclare les variables globales

void setup{    // contenu de la fonction setup
  blabla
}

void loop(){   // contenu de la fonction loop
  blabla
}


int main() {  // fonction qui s'éxécute automatiquement au lancement du programme
  init();  // configuration matérielle (timers, PWM, ADC, UART,SPI etc .....)
  setup();  // appel de la fonction setup()
  while(1){      // création de la boucle infinie
     loop();      // à l'intérieur de laquelle on appelle la fonction appellée loop
  }
  return 0  // signe que tout c'est bien passé -> survivance de la programation sur processeurs (PC)
// puisqu'avec un microcontroleur et sa boucle infinie on ne peut pas atteindre la fin du programme !
}

D0, c'est le RX du micro donc c'est une sortie du circuit d'interface USB série.
Entre les deux, il y a une résistance d'une centaine d'ohms. Donc cette entrée n'est pas comme les autres.
Le fait que l'interface série soit initialisée dans le programme n'a rien à voir ici le circuit d'interface est toujours actif

pepe a raison, il faut une résistance de rappel plus faible qu'habituellement pour que D0 soit en configuré en INPUT.
Je viens d'effectuer quelques tests avec des valeurs que je possède et ça semble fonctionner jusqu'à 680Ω. 1kΩ est déjà trop.
Autrement, si on a une valeur typique de 10k ou 6k8 la solution est comme je l'avais remarqué de mettre D0 en OUTPUT au lieu de INPUT.

Non mettre la sortie en OUTPUT n'est définitivement pas une bonne idée car on risque de mettre celle-ci en court-circuit avec une ligne d'alimentation.

J'avais eu l'idée de faire comme ça pour résoudre le problème car je ne peux plus changer la résistance de 10k (boitier du projet refermé et collé) et c'était mon seul moyen de le faire fonctionner..
Merci du conseil, je ferai plus gaffe la prochaine fois ! :slight_smile:

Sans vouloir ergotter, ces considérations de résistance ne sont valables que pour un type de carte donné, sans doute s'agit-il d'une UNO dite "officielle", bien que ce point n'est pas été précisé dans le message originel.
Mais rien n'oblige un clone à avoir les mêmes valeur de résistance, utiliser la même interface USB/UART ni même être équipé de ce type d'interface comme la mini-pro où la liberté est totale.

Même s'il y a des points commun chaque type de carte est particulier et la généralisation est incertaine.

Merci encore pour tous ces détails et effectivement j'avais oublié de préciser qu'il s'agissait d'un UNO officiel et d'un clone (qui possède aussi cette résistance)

Autrement, si on a une valeur typique de 10k ou 6k8 la solution est comme je l'avais remarqué de mettre D0 en OUTPUT au lieu de INPUT.

Bonjour,
peux-tu stp. développer, car il y a peut-être là quelque chose d’intéressant qui m'échappe (mettre en OUTPUT pour avoir le fonctionnement souhaité en INPUT) ?

J'en avais aussi conclu qu'en inversant le mode je provoquais un court circuit pour aboutir au résultat désiré mais ne pouvant ouvrir le boîtier j'ai essayé de faire en sorte que ce "choc violent" ne dure qu'une fraction de seconde en repassant aussitôt en INPUT dès l'appui sur le bouton (cela évite qu'un utilisateur garde le bouton constamment enfoncé). Si ça peut sauver un peu les meubles au point où j'en suis :confused: