🛠 Bouton poussoir et moniteur série sur la Duemilanove (avec ses 0,5 s de silence)
Objectifs
Lire un bouton poussoir et l'afficher sur le moniteur série — le fameux DigitalReadSerial — en découvrant deux spécificités documentées de la Duemilanove : les pull-up internes de 20 à 50 kΩ activables par logiciel, et l'auto-reset par la ligne DTR de la FTDI : à chaque ouverture du port, la carte se réinitialise et le bootloader ATmegaBOOT avale les premiers octets pendant ~0,5 seconde. Vos scripts d'automatisation devront s'en souvenir.
Matériel
- 1 Arduino Duemilanove (ATmega328 conseillée)
- 1 bouton poussoir (4 pattes : les paires sont reliées deux à deux)
- 1 fil mâche-mâche
- Câble mini-USB ; pilote FTDI installé
Code complet
// Bouton sur broche 2 -> GND, pull-up interne active
const byte BOUTON = 2; // les interruptions externes sont aussi sur 2 et 3
void setup {
pinMode(BOUTON, INPUT_PULLUP); // pull-up interne 20-50 kOhm
Serial.begin(9600); // USB via FTDI FT232RL
delay(1000); // laisser passer le bootloader (~0,5 s)
Serial.println("Duemilanove prete");
}
void loop {
// rappel : avec pull-up, bouton enfonce = LOW
byte état = digitalRead(BOUTON);
Serial.println(état == LOW ? "ETAT=0 (appuye)" : "ETAT=1 (libere)");
delay(100);
}
Vérification attendue
Le moniteur série (9600 bauds) affiche « ETAT=1 (libere) » en continu ; en maintenant le bouton, les lignes passent à « ETAT=0 (appuye) ». À chaque ouverture/fermeture du moniteur, la carte clignote (reset DTR) et la ligne « Duemilanove prete » réapparaît : c'est le comportement normal de l'auto-reset, pas un bug.
Erreurs fréquentes
- Attendre des données dans la demi-seconde qui suit l'ouverture du port : le bootloader ATmegaBOOT garde le port pour lui et les premiers octets envoyés par l'hôte sont perdus — patienter ~1 s avant de parler à la carte (documenté sur la page officielle).
- Bouton câblé vers le 5 V sans résistance externe alors que le pull-up n'est pas activé dans le code : l'entrée flotte et l'état change tout seul.
- Inverser la logique : avec INPUT_PULLUP, bouton appuyé = LOW ; beaucoup de débutants testent
== HIGHet croient le bouton mort. - Bouton sur les broches 0 ou 1 : elles sont reliées au FTDI (RX/TX USB) et détournent le moniteur série — préférer 2 et 3 (qui en plus sont les deux interruptions externes).
- Mauvais débit au moniteur : le code ouvre à 9600, régler le moniteur sur 9600.
- Sur les vieux PC, le port COM change à chaque port USB différent — vérifier dans le gestionnaire de périphériques.
- Dépasser 40 mA par broche (spec officielle) : ici le bouton ne consomme rien, mais ne pas y brancher LED sans résistance par habitude.
Autres tutoriels pour cette carte
- Faire clignoter la LED 13 d'une Duemilanove (et choisir le bon ATmega)
- Potentiomètre et variation LED : l'ADC 10 bits et le PWM 8 bits version AVR
- Ajouter un deuxième port série avec SoftwareSerial (GPS sur broches 10/11)
- Régler la référence de mesure avec AREF et analogReference
- Persister une calibration dans l'EEPROM de l'ATmega (512 octets ou 1 Ko)
- Convertir la Duemilanove en programmateur AVR (ArduinoISP) pour graver des puces nues
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinopwm-respiration.inoArduinopotentiometre-plotter.inoArduinoservo-balayage.inoArduinobuzzer-melodie.inoArduino