Ardu? No!Les boutons ≫ Diviseur de tension à résistances parallèles

Diviseur de tension à résistances parallèles

Schéma de base

Voici le schéma de base:

Base pour une diviseur de tension pour boutons

Quand aucun bouton n'est appuyé, Arduino va lire une tension VCC grâce à la résistance de pull-up R. Si on veut répartir linéairement les lectures, il faudra avoir des lectures avec N boutons égales à 0V, VCC/N, 2VCC/N, ..., (N-1)VCC/N et VCC (aucun bouton appuyé).

Si on choisit arbitrairement la résistance R à 10kΩ (plus faible, on consomme plus, plus forte on a plus d'influences extérieures, 10kΩ est une valeur classique), il faudrait des résistances Rn=n.10kΩ/(N-n).

Pour le calcul: quand on appuie sur le bouton n, la tension en entrée est donnée par la loi sur les ponts diviseurs soit V=VCC x Rn/(Rn+R) et cette valeur doit être égale à n.VCC/N

Cela donne:
- pour 3 boutons: R2=20kΩ R1=5kΩ
- pour 4 boutons: R3=30kΩ R2=10kΩ R1=3,33kΩ
- pour 5 boutons: R4=40kΩ R3=15kΩ R2=6,67kΩ R1=2,5kΩ
- pour 6 boutons: R5=50kΩ R4=20kΩ R3=10kΩ R2=5kΩ R1=2kΩ
- pour 7 boutons: R6=60kΩ R5=25kΩ R4=13,33kΩ R3=7,5kΩ R2=4kΩ R1=1,67kΩ
- pour 8 boutons: R+=70kΩ R6=30kΩ R5=16,67kΩ R4=10kΩ R3=6kΩ R2=3,33kΩ R1=1,43kΩ

On remarquera que la lecture est mono, car si on presse le bouton le plus en bas, on a du 0V en entrée quel que soient les états des autres boutons.

Pour un seul bouton, c'est le montage classique "un bouton par broche", mais ici on est en lecture analogique. On lira donc 0 ou 1024 au lieu de LOW et HIGH.

On peut, au lieu d'utiliser une résistance R, utiliser la résistance de pull-up interne (environ 35kΩ pour une Uno/Nano/Mega).

Il est aussi possible d'inverser le montage (inverser VCC et GND). Les valeurs des résistances ne changent pas.

Exemple de programme de lecture

// Lecture analogique mono de boutons

// EXEMPLE AVEC 6 BOUTONS:
//
//                   Vcc
//                    |
//                   10kΩ
//                    ├━━  Vers A0
//  ┌━━ SW5 ━━ 47kΩ ━━┤
//  ├━━ SW4 ━━ 22kΩ ━━┤
//  ├━━ SW3 ━━ 10kΩ ━━┤
//  ├━━ SW2 ━━ 4,7kΩ ━┤
//  ├━━ SW1 ━━ 2,2kΩ ━┤
//  ├━━ SW0 ━━━━━━━━━━┘
//  |
// GND

const word MAX_CONVERSION = 1024; // Valeur max+1 du CNA, 1024 avec un AVR
const word N = 6; // Nombre de boutons
const byte BOUTONS = A0; // Broche pour des boutons


void setup()
{
  Serial.begin(115200); // Régler aussi la console à 115200 bauds! 
}

void loop()
{
  word valeurLue = analogRead(BOUTONS); // Lecture brute
  valeurLue = (valeurLue + MAX_CONVERSION / (2 * N)) / (MAX_CONVERSION / N); // 6 si aucun bouton appuyé, N° du bouton sinon 
  if (valeurLue != 6)
  {
    Serial.print("Le bouton SW");
    Serial.print(valeurLue);
    Serial.println(" est appuyé");
  }
  else Serial.println();

  delay(500); // Pas trop souvent 
}

Bilan

- lecture simple, pas de correction
- les boutons ont une borne commune à la masse (sécurité et antiparasite)
MAIS
- résistances différentes ne compensant pas les erreurs
- lecture mono
- une résistance par bouton en plus
- je ne connais pas de bibliothèques pour ce montage
- utilisation d'interruption impossible

Peu utilisé.