Mise en oeuvre : Chapitre 6 - Chenillard interactif

Le forum du Snootlab Starter Kit

Mise en oeuvre : Chapitre 6 - Chenillard interactif

Message non lude Stéphane » Jeu 3 Nov 2011 20:03

[Presentation du montage]

Montage N°6: Chenillard interactif.


Dans le chapitre précédent, nous avons vu comment utiliser le capteur de température LM35DZ avec un affichage à leds.
Dans ce chapitre, nous allons faire un chenillard, dont la vitesse de défilement dépendra de l'inclinaison d'un capteur tilt.
Notre montage sera composé d'un registre à décalage, d’un tilt sensor et d'une série de 8 leds et leurs résistances.



[Présentation des composants]

Les composants utilisés sont :

Résistance de 150 Ohms (x9)
Leds de 3mm (x8)
Registre à décalage 74HC595 (x1)
Arduino Uno (x1)
Tilt sensor (x1)
Breadboard (x2)
Fils


Maintenant que nous avons toutes les billes, assemblons les !

[Le Montage]

Voici comment relier les composants entre eux. Le logiciel utilisé ici est Fritzing, il permet de donner une vue claire à vos montages, à mi-chemin entre la photo et le schéma électronique, et nous, à Snootlab, on aime ça !


Donc, notre montage se présente ainsi :

Sketch_STK_basic_6_bb.png
Sketch_STK_basic_6_bb.png (68.53 Kio) Vu 4696 fois


Les couleurs ont été choisies de cette manière :
Les fils rouges représentent le Vcc(+5V)
Les fils noirs représentent le GND(0V)


Pour un montage aussi simple, nous nous passerons de schémas électroniques, vous avez progressé depuis les premiers chapitres !

[Explications sur le montage]


Le registre a décalage sert, comme son nom l'indique à décaler des sorties de registres. Fonctionnement simple : Imaginez des registres (tiroirs), contenant soit 1 soit 0, en cascade les uns à la suite des autres.
Imaginez qu'à chaque période d'une horloge donnée, on verse le contenu du tiroir 1 dans le 2, le contenu du tiroir 2 dans le 3 etc, et qu'entre deux cycles d'horloge, on conserve les valeurs présentes dans les registres. Ainsi, à chaque période d'horloge, on va charger la valeur qui se présente en entrée, et la placer dans le tiroir 1. Au cycle d'horloge suivant, cette valeur passera dans le tiroir 2, et le tiroir 1 sera rechargé avec la nouvelle valeur présente en entrée.
Vous vous apercevez qu'il est ainsi facile avec des leds reliées à chaque sortie du registre à décalage, de faire un chenillard, c'est à dire alimenter successivement les leds, un effet « K2000 » en somme !
Le tilt sensor lui, agit comme un interrupteur. Relevé vers ses pins (intérieur), il est passant, abaissé vers l'extérieur il est en circuit ouvert et ne laisse pas passer le courant.
Ce que nous allons faire, c'est qu'à chaque fois que l'interrupteur va passer d'un état à l'autre, nous allons augmenter la vitesse du chenillard. Passée une certaine valeur , cette vitesse reviendra à sa valeur initiale.

Mieux comprendre la programmation de votre Arduino :

Cette fois-ci nous mettrons l'accent sur l'optimisation de la programmation de l'Arduino.
Je ne vais pas faire un cours sur ces micros, cela serait bien trop long, mais j'aimerai revenir sur un point. Les ports d'entrée/sortie. Ces ports fonctionnent selon trois registres par port. Le premier registre DDRx (où x est la lettre du port correspondant) va servir à définir si au sein d'un port donné la pin voulue est configurée en entrée ou en sortie. Pour cela, on va écrire dans ce registre des 0 ou des 1. Un 1 configurera la pin correspondante en sortie, et un 0 la positionnera en entrée, sachant que par défaut, les pins sont toutes en entrée.
Ainsi « DDRB = 3 ; » positionnera la pin 0 et la pin 1 du PortB en sortie, et les autres en entrées.
Dorénavent, au lieu d'écrire :
« pinMode(8, OUTPUT) ;
pinMode(9, OUTPUT) ;
pinMode(10,INPUT) ;
pinMode(11,OUTPUT) ; »
vous pouvez écrire directement « DDRB=b00001011 ; » en binaire, ou « DDRB=11 ; » en décimal ou bien encore « DDRB=0x0B ; » en hexadécimal.

Pour envoyer une valeur sur votre port en question c'est le registre PORTx qu'il faudra utiliser.
Dans le même principe que mentionné plus haut, au lieu d'écrire de multiples « digitalWrite », écrives directement la valeur que vous souhaitez donner à toutes les pins. Si vous désirez mettre toutes les pins du PORTB à 1, écrivez juste « PORTB=0xFF ; » et toutes les pins que vous aurez configurées préalablement en sorties seront à la valeur 1.

Dans le même principe, pour lire la valeur d'un port, utilisez le registre PINx. « valeur = PINB ; »
mettra l'état des entrées/sorties du port B dans la variable valeur. Il ne vous reste plus avec l'aide d'un simple masque qu'à isoler la pin qui vous intéresse.

Ressources à lire pour approfondir ceci : p76 à 94 de la datasheet de l'atmel et mapping des pins de l'arduino en fonction des entrées/sorties de l'atmel (dispo. sur arduino.cc).

ATTENTION !!! Lorsque vous programmez le port D laissez les pins 0 (Rx) et 1 (Tx) dans leur état d'origine, sinon, vous ne pourrez plus communiquer via USB avec votre Arduino, et donc plus le programmer via l'IDE Arduino.



[Go for Code]

Code: Tout sélectionner
/*
    Application BASIC pour le STK Snootlab : N°7
   Chenillard avec modification de la vitesse par un tilt sensor
   Il est nécessaire de lire la datasheet du 74hc595 pour comprendre les différentes étapes.
*/


#define SI      4  // pin qui introduira la valeur en entrée des registres
#define RCK     5  // les deux pins qui serviront à générer les horloges
#define SCK     6  // pour faire fonctionner le registre à décalage
#define SCLR    7  // pin de remise à zéro des sorties
#define TILT_1  3  // pin du tilt sensor

volatile unsigned long demi_periode=0;
unsigned char i=0;

void faster(void)
{
  demi_periode-=10;  //on réduit la demi période, pour augmenter la fréquence
  if(!demi_periode)demi_periode=250; //trop rapide, retour à la valeur initiale
}


void setup (void)
{
  pinMode(SI,OUTPUT);   //Can be written like this ": DDRD = DDRD | 0xF0;"
  pinMode(RCK,OUTPUT);  // or like this "DDRD|= 0xF0;"
  pinMode(SCK,OUTPUT);  //
  pinMode(SCLR,OUTPUT); //
  pinMode(13,OUTPUT);   //
 
  //pinMode(TILT_1,INPUT);

  attachInterrupt(1,faster,CHANGE); //si le tilt sensor change d'état, alors éxecuter la fonction faster
 
  digitalWrite(SCLR,LOW);// idem than upper, with PORTD = ...
  digitalWrite(SCK,LOW);
  digitalWrite(SI,LOW);
  digitalWrite(RCK,LOW);
  demi_periode=250;      //the lighten led will change every half second
}

void loop (void)
{
  // pour comprendre cet enchainement sur les horloges, il est nécessaire de
  //regarder le chronogramme page 3 de la datasheet du 74hc595 et la page 2
  digitalWrite(SI,HIGH); 
  digitalWrite(SCLR,HIGH);
  digitalWrite(SCK,HIGH);
 
  delay(demi_periode);

  digitalWrite(SCK,LOW);
  digitalWrite(RCK,HIGH);
  digitalWrite(SI,LOW);

  for(i=0;i<=7;i++)
    {
        delay(demi_periode);
        digitalWrite(SCK,HIGH);
        digitalWrite(RCK,LOW);
        delay(demi_periode);
          digitalWrite(SCK,LOW);
          digitalWrite(RCK,HIGH);
     
    }
    digitalWrite(SCLR,LOW);  //fin du cycle, remise à zéro des sorties
    digitalWrite(RCK,LOW);   // réinitialisation de l'horloge
 
}




[Conclusion]

Et voici, c'est terminé pour aujourd'hui !
Désormais, vous êtes capable d'utiliser un registre à décalage et un sensor tilt. Vous pouvez combiner les deux sensors à 90° pour rajouter un deuxième plan d'inclinaison comme paramètre, ou bien choisir l'angle d'un servomoteur en fonction d'une inclinaison donnée ou encore commander des transistors de manière séquentielle grâce au registre à décalage !
Imaginez ! Explorez ! Nous vous donnons les briques et les explications, à vous de faire votre maison ! Surtout, faites partager vos expériences à notre communauté, posez des questions, échangez vos travaux, vivez open-hardware !
Fichiers joints
Sketch_STK_basic_6.fz
(317.36 Kio) Téléchargé 213 fois
Avatar de l’utilisateur
Stéphane
 
Messages: 179
Inscription: Lun 2 Mai 2011 09:40

Retourner vers Starter Kit

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité