Club robotique de Sophia-Antipolis

Accueil > Projets, études > Nos robots > Robots du club > Robots à roues > Base "Pobot Easy" (2009) > Interruptions externes

Interruptions externes

lundi 23 novembre 2009, par Julien H.

Nous allons voir dans cet article l’exploitation d’entrées numériques particulières d’un micro-contrôleur, appelées "interruptions externes".

Cet article va utiliser l’Arduino donc c’est une utilisation simplifiée. Un autre article de ce site est dédié aux microcontrôleurs par une approche plus bas-niveau : Trucs et astuces.

Définition

Il s’agit d’une connexion particulière dans le micro-contrôleur qui va interrompre l’exécution de votre code principal lorsqu’un changement est détecté sur une des pattes disposant de cette faculté. Ces pattes sont en nombre limité sur la plupart des circuits (1 ou 2) même si les toutes nouvelles générations proposent que le port complet (8 pattes) soient interruptives.

Ce changement peut être un passage du niveau bas au niveau haut, ou l’inverse, ou n’importe quel changement. Ou même un niveau bas sans changement.

Mise en oeuvre

Nous allons tester leur utilisation avec une carte Arduino qui grâce à son micro-contrôleur de base ATmega8 dispose de 2 entrées numériques de types "interruptions externes".

Principe

Pour rappel, le code Arduino dispose de deux fonctions indépendantes de base :
 "setup" qui n’est appelée qu’une seule fois, en tout premier
 "loop" qui est tout le temps appelée, en boucle

On va rajouter une fonction indépendante par interruption. Son nom est libre et on déclare son utilisation dans la fonction "setup", en précisant :
 la patte d’interruption externe utilisée (0 ou 1)
 le type de changement détecté pour déclencher l’appel de la fonction

Elle est indépendante car elle est appelée directement par le microcontrôleur et pas depuis une des deux fonctions ci-avant décrites.

Code correspondant

La documentation en anglais de l’Arduino nous explique la fonction "attachInterrupt". Voici le code minimal nécesaire :


void setup()

attachInterrupt(0, interZero, CHANGE) ;

void interZero() // le nom importe peu

// ici ce que vous voulez faire sur un changement

Dispositif de test

Pour exploiter ces interruptions externes et les voir fonctionner, on va utiliser le robot Pobot Easy avec 2 servomoteurs à rotation continue et des odomètres qui alternent niveau haut et niveau bas plusieurs fois par tour de roue.

Chaque odomètre est connecté sur une entrée numérique à interruption externe : avec une Arduino classique, l’interruption 0 est connectée sur l’entrée numérique (digital) 2 et l’interruption 1 est connectée sur l’entrée numérique 3.

Le principe consiste à lancer les 2 moteurs à une certaine vitesse pour exécuter un certain nombre d’incréments d’odomètres, et de les arrêter quand on a atteint le zéro. On va donc déclarer 2 compteurs (un pour chaque roue), lancer les servomoteurs et attendre... puisque ce sont les fonctions d’interruption qui vont s’occuper de suivre la valeur du compteur.

Réalisation

Voici le code complet :


#include <Servo.h>

// les moteurs
Servo sGauche ;
Servo sDroite ;

// les compteurs
int compteurGauche = 0 ;
int compteurDroite = 0 ;

void setup()

// les moteurs
sGauche.attach(9) ; // patte 9
sDroite.attach(10) ; // patte 10

// les interruptions
attachInterrupt(0,gauche,RISING) ; // patte 2
attachInterrupt(1,droite,RISING) ; // patte 3

// initialisation : on avance !
sGauche.write(110) ;
sDroite.write(70) ; // les moteurs sont inversés

void loop()

// rien pour ce test

void gauche()

if (compteurGauche > 0)

compteurGauche— ;
else
sGauche.write(90) ; // arrêt du moteur

void droite()

if (compteurDroite > 0)

compteurDroite— ;
else
sDroite.write(90) ; // arrêt du moteur


Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.