Page 1 sur 1

Faire un clavier avec le starter kit

Message non luPosté: Sam 17 Mar 2012 23:07
de Bemolu
Un petit montage simple pour faire un clavier avec seulement des interrupteurs (bouton poussoir) et résistances, en ne "consommant" qu'une ligne analogique. Le montage théorique peut supporter presque autant de touches que l'on veut.
Le principe est élémentaire: chaque bouton poussoir relie l'entrée analogique au point milieu d'un diviseur de tension. Selon le rapport du pont on peut en déduire quelle bouton a été utilisé (quelle 'touche" a été enfoncée).

En ajoutant un ampli op' (bascule tout ou rien) et en consommant la ligne d'interruption E2, on peut détecter l'appui de touche et la traiter comme on le souhaite.

Le schéma montre: 4 'touches', la réalisation physique (et le code): 2 'touches' (car je me suis limité aux composants du starter kit), mais en pratique on peut aller jusqu'à dix touches au moins. Il suffit de choisir les valeurs pour que les tensions générées soient bien réparties.

Schéma:
ClavierResistif-scheam_schem.png
Schéma théorique
ClavierResistif-scheam_schem.png (54.06 Kio) Vu 5403 fois


Réalisation:
ClavierResistif_bb.png
Cablage starter kit
ClavierResistif_bb.png (39.66 Kio) Vu 5403 fois


Code:
Code: Tout sélectionner
/*
Utiliser un "clavier" à plusieurs touches en ne "consommant":
- qu'une ligne analogique
- et la ligne d'interruption selon le besoin
Nécessite:
- une résistance
- par "touche": un bouton poussoir + une résistance
Si besoin:
Un AOP (amplificateur opérationnel)
*/

// Nom des connexions utiles
const int ClavierAnalogique = A0;  // la sortie du "clavier"

int ValeurClavierBrute = 0;  // la lecture de la valeur du clavier - pour l'exemple
int Touche = 0;        // la "touche" lue
int Actif = 0;         // Une touche est activée?

void setup()
 {
  // initialise série à 9600 bps:
  Serial.begin(9600);
  attachInterrupt(1, fct_mode, RISING);   // pour déclencher un évènement lorsqu'on acive une touche
 }

void loop() {
  // Un programme qui sert uniquement à afficher la valeur "lue" sur le clavier, et son interprétation
  if (Actif > 0)
   {
    Serial.print("Valeur lue " );                       
    Serial.print(ValeurClavierBrute);
    Serial.print(" => TOUCHE: ");
    Serial.println(Touche);
    Actif = 0;
   };
  delay(100);                     
}

void fct_mode(void)
 {
   detachInterrupt(1);
   ValeurClavierBrute = analogRead(ClavierAnalogique);
   // pour lire la valeur sur le port série:
   //Serial.println(ValeurClavierBrute);
   if (ValeurClavierBrute > 490 && ValeurClavierBrute < 530)
     {
      Touche = 1;
      Actif = 1;
     }
    else if (ValeurClavierBrute > 900 && ValeurClavierBrute < 960)
     {
      Touche = 2;
      Actif = 1;
     }
    else
     {
      Actif = 0;
     }
   
   delay(10);
   attachInterrupt(1, fct_mode, RISING);
 }


Pour choisir les plages de valeurs à mettre dans le code, on peut lire les valeurs générées par chaque touche en enlevant les commentaires devant la ligne dans la procédure d'interruption.
Note: on peut aussi ajouter une 'touche' dont la résistance est nulle sans danger.

Limitation:
Ca ne marche plus si on appuie sur 2 touches simultanément, ou si on appuie sur une nouvelle touche avant d'avoir relaché la première.

Re: Faire un clavier avec le starter kit

Message non luPosté: Lun 19 Mar 2012 10:20
de Stéphane
Bonne initiative,

petite application sympa, merci d'avoir partagé tout ça :)