Les périphériques des microcontrôleurs

jpparisy;2100301 à dit:
Il permet, par exemple, de remplacer des électro-aimants par des servos normaux, ou de commander des moteurs à balais en utilisant des micro-swiches actionnés par les palonniers des servos.
Ces montages, permettant de commander de 1 à 8 servos sur la même voie, proposent deux modes de fonctionnement : le mode tout-ou-rien et le mode séquentiel.

Le mode tout-ou-rien est facile à comprendre, un des servos va dans un sens ou dans l'autre suivant la position du manche ou le nombre d'appuis sur le bouton.

Le mode séquentiel est utile lorsqu'on veut commander un moteur à balais (brushed). Nous avons vu que pour inverser le sens de rotation d'un tel moteur, nous avions besoin d'un pont en H. Le montage proposé était purement électronique, avec des MOSFETs et un circuit intégré comme driver.

Pour ceux que cela pourrait effrayer, ce pont peut être réalisé avec des micro-switches commandés par le palonnier d'un servo. Le schéma du pont en H est le suivant :

H-bridge-sw3.jpg

Les micro-switches sont des inverseurs commandés par une très faible force, il en existe de nombreux modèles, capables de supporter des tensions et des intensités très variées.

Ce genre de solution nécessite toutefois de monter les micro-switches sur une platine et donc un peu de mécanique pour ajuster leurs positions. Voici un exemple de réalisation, extrait de cet article de Thierry Augereau sur Navimodélisme RC :

nrc-tau_3-img300-5.jpg
 
Quand on parle de périphériques, on pense tout d'abord à ceux de sortie. Un MCU peut aussi recevoir des entrées de l'utilisateur. Le cas le plus fréquent est le bouton poussoir, servant à configurer un mode de fonctionnement, par exemple.

Pour lire la position d'un bouton, on pourrait penser qu'il suffit de configurer un port en entrée, sur lequel on brancherait le bouton et de tester la valeur reçue, 0 ou 1. Les choses ne sont pas aussi simples.

Il faut tout d'abord décider de la tension à appliquer lorsque le bouton est enfoncé. Si on choisit que ce sera le +V, il faut maintenir le port à 0 V quand le bouton est relâché, ce qui se fait en branchant une résistance de quelques kilohms entre le 0 V et le port. Cette résistance s'appelle "pull-down" (tirer vers le bas) et nous fait ajouter un composant supplémentaire.

Heureusement, la plupart des MCU ont la possibilité d'activer des résistances internes, dites de "pull-up" (tirer vers le haut) sur les ports en entrée. Comme leur nom l'indique, elles sont connectées au +V et évitent donc tout composant supplémentaire. Le bouton sera alors connecté au 0 V et, quand il sera enfoncé, le port sera mis à zéro.

Pour activer cette résistance sur le port GP0 d'un PIC 12F675, les instuctions suivantes sont nécessaires :
Code:
    nGPPU = 0;                                  // GPIO pull-ups are enabled
    WPU = 0b0000001;                            // enable pull-up on GP0
Un autre problème se pose : un bouton est un élément électromécanique et le contact ne s'établit pas instantanément, mais par rebonds. Pour être sûr que le contact soit bien établi, on peut brancher une résistance et un condensateur sur le port, pour lisser et stabiliser la tension. Ce qui nous fait deux composants supplémentaires. On peut éviter cela par programme en attendant quelques millisecondes pour que la tension sur le port soit bien stable. C'est le but du sous-programme "bounce()" ci-dessous :

Code:
unsigned char bounce (unsigned char port)
{
    if (GPIO & port)                            // if port is on
        return 1;                               // return state of port
    __delay_ms (50);                            // wait 50 msec
    return (GPIO & port);                       // return state of port
}
La fonction de bibliothèque "__delay_ms()" attend que le nombre de millisecondes qui lui est passé en paramètre soit écoulé.
 
Un clavier est un autre périphérique d'entrée utilisable par un MCU. Il se présente sous la forme d'un panneau de plusieurs touches, qui actionnent des boutons poussoirs.

Voici, par exemple, un clavier de 12 touches qui va nous servir pour la suite :

matriciel_1.jpg

Les touches sont rangées en quatre rangées, appelées R1 à R4, sur trois colonnes, appelées C1 à C3.

Pour économiser les connexions, les boutons sont branchés en parallèle sur les conducteurs des lignes et des colonnes, suivant le schéma ci-dessous :

matriciel_2.jpg

Ce genre de montage s'appelle une matrice d'interrupteurs et ce genre de clavier est un clavier matriciel (ou matricé). Il n'y a que 7 connexions, au lieu de 24 si tous les boutons poussoirs étaient indépendants.

En réalité, sur ce clavier particulier, il y a 9 connexions car les colonnes C1 et C2 sont doublées, pour des problèmes de réalisation. Son brochage est indiqué sur la photo ci-dessous :

matriciel_3.jpg

Pour trouver le bouton qui a été enfoncé, le programme va appliquer successivement une tension sur chacune des rangées et il va lire chaque colonne jusqu'à retrouver la tension correspondante. Pour éviter des composants supplémentaires, nous allons utiliser le 0 V et activer les résistances de "pull-up" sur les entrées C1, C2 et C3.

Par exemple, si j'appuie sur la touche "8", lorsque le programme envoie du 0 V sur la rangée R3, il va trouver du 0 V sur la colonne C2 et seulement sur celle-là.

Le sous-programme ci-dessous a été écrit pour un PIC 16F1825, qui a suffisamment de broches pour cet usage. Tous les bits du port C sont configurés en sortie et connectés aux rangées R1 à R4. Les bits 3, 4 et 5 du port A sont configurés en entrée et connectés aux colonnes C1, C2 et C3, leurs résistances de "pull-up" sont activées. Le sous-programme de décodage se présente comme suit :
Code:
static uint8_t read_keyboard (void)
{
    uint8_t r, c, row, port;
/*                             RC0      RC1      RC2      RC3           */
    const uint8_t rport[] = {0b111110,0b111101,0b111011,0b110111};
/*                             RA3      RA4      RA5                    */
    const uint8_t cport[] = {0b001000,0b010000,0b100000};

    WPUA = 0b111000;                            // enable weak internal pull-ups on port A digital inputs

    for (r = 0, row = 1; r <= 4; r++, row += 3) {
        PORTC = rport[r];                       // clear successive bits on PORTC to look at one keypad in a row
        for (c = 0; c < 3; c++) {               // read successive bits on PORTA
            if (!bounce (cport[c]))             // if port is off
                return row + c;                 //   keypad is in column c
        }
    }
    return 0;
}
La valeur de retour sera zéro si aucune touche n'est enfoncée ou le numéro de la touche, dans l'ordre "1", "2", "3", "4", "5", "6", "7", "8", "9", "*", "0" et "#".
 
jpparisy;2114316 à dit:
Ce genre de solution nécessite toutefois de monter les micro-switches sur une platine et donc un peu de mécanique pour ajuster leurs positions. Voici un exemple de réalisation, extrait de cet article de Thierry Augereau sur Navimodélisme RC :


Bonsoir Jean-Pierre,

Y a bien longtemps, pour faire un treuil de voile j'utilisais un micro servo et 4 micro switches 2 pour la commande et deux pour les fins de course.

J'avais mis çà dans une page web, elle est toujours là :
Un treuil en RC avec fins de course

J'avais aussi fait "un treuil à poursuite" : il faut faire le montage avec 2 inverseurs comme ton schéma.
Il faut simplement que ce bloc soit solidaire du treuil, que plus on enfonce en actionnant d'un côté que le moteur déplace le bloc pour faire l'inverse.

Pas facile à expliquer mais si un internaute veut plus de détails, je peux rechercher des photos.
 
froussel;2122197 à dit:
Bonsoir Jean-Pierre,
Bonjour Francis !

Une semaine a passé et tu n'as pas encore exposé les projets dont nous avions discutés. :)

Puisque c'est comme ça, je continue ma série d'articles, tout seul dans mon coin !
 
Haut