Le comparateur programmable de luminosité est un exemple simple de montage destiné à prendre en main les microcontrôleurs. Ce montage a pour but de réaliser un petit comparateur doté de trois diodes et de deux photo-résistances pour mesurer l’intensité lumineuse en deux endroits. La diode correspondant à la source la plus lumineuse s’allume, et si les deux sources de lumières sont de la même intensité, la diode centrale s’allume à son tour. Ce montage pourrait être bien sûr réalisé de manière plus simple, sans faire appel à un microcontrôleur, mais le but ici est de s’initier à l’utilisation et à la programmation de ces p’tites bêtes.
Matériel nécessaire
* Une plaque d’essai qui permet facilement de tester et de modifier un circuit
* Un microcontrôleur (nous avons utilisé un PIC 18F252 qui est courant et peu cher, mais le montage pourrait marcher avec à peu près n’importe quel microcontrôleur, seul l’emplacement des pattes est susceptible de modifications, ainsi que le programme, qui pourra être légèrement différent en fonction des outils utilisés).
* deux photo-résistances et deux résistances (autour de 500 Ohms. Pour un fonctionnement optimal, il faut que les résistances aient une valeur proche de celle des photo-résistances quand elles reçoivent un éclairement moyen).
* trois Diodes électroluminescentes avec trois résistances autour de 500 Ohm.
* Un régulateur 5V et une pile 9V.
* Si le microcontrôleur le nécessite, un quartz (par exemple, 10 MHz pour le PIC 18F252, cf doc du microcontrôleur) et deux condensateurs (10 pF).
Le montage
Le circuit:
L’image ci-dessus présente le circuit électrique du montage. Attention, le schéma ne donne pas de détail sur le branchement de certains composants : le régulateur, par exemple, à une polarité à respecter, et le PIC doit être branché de manière bien précise. Les deux ensembles diviseur de tension (composés d’une résistance et d’une photo-résistance) se branchent sur les entrées des convertisseurs analogiques/numériques (CAN ou ADC en anglais), et les diodes se branchent sur des sorties (par exemple, les sorties 1, 2 et 3 du port B du PIC 18F252). Le PIC doit aussi être alimenté. Il faut se reporter aux documentations des composants pour repérer les différentes pattes. Sur le schéma précédent, le quartz n’apparait pas : il faut le rajouter pour permettre au PIC de fonctionner (c’est lui qui va donner un « rythme cardiaque » au PIC) :
Comment le montage fonctionne-t’il ?
Le montage peut être décomposé en trois grandes catégories, qui sont les trois grandes parties de la robotique : un groupe d’éléments sert à percevoir l’environnement (les photo-résistances), un groupe sert à réfléchir et raisonner sur l’environnement (c’est le PIC et le programme qu’on lui fournit qui sert à ça), un dernier groupe sert à agir en retour (les diodes qui ont pour action de s’allumer et de s’éteindre). En plus de ces trois groupes (qui représentent une décomposition fonctionnelle du montage), un quatrième a pour charge d’alimenter le circuit.
* Commençons par l’alimentation : elle est assuré par la pile 9V. Le microcontrôleur est une bébête assez exigeante et il préfère le 5V, et qui plus est, un 5V de « bonne qualité », c’est à dire stable et propre. C’est le boulot du régulateur qui va transformer notre 9V en une tension plus faible, 5V, tout en veillant à ce que cette tension soit scrupuleusement assurée. Sur le schéma ci-dessus, on a représenté en rouge le +5V et en noir la masse, c’est à dire, la référence, le « 0V » à partir duquel on mesure la tension. Comme on peut voir, le +5V alimente non seulement le PIC, mais aussi, les photo-résistances.
* Passons justement à ces photo-résistances. Le microcontrôleur, via ce qu’on appelle des convertisseurs analogiques/numériques, est capable de lire la valeur d’une tension en un certain point du circuit, et d’exploiter cette valeur à l’intérieur d’un programme. On voudrait donc pouvoir transformer l’intensité lumineuse en tension. Grâce aux photo-résistances associées à des résistances sous forme de pont diviseur de tension, on peut justement obtenir ce qu’on veut : une tension proportionnelle à la lumière.
* Le PIC, ensuite, lit cette tension via ses entrées ADC, et le programme (voir ci-dessous) permet de contrôler, en fonction des entrées, la valeur des pattes de sortie sur lesquelles sont connectées les diodes. Il ne faut pas oublier, pour que le PIC fonctionne, de lui adjoindre un quartz qui définit la fréquence de fonctionnement du microcontrôleur (voir schéma ci-dessus).
* Les diodes, enfin, s’allument suivant les ordres du PIC. On leur a mis des résistances, sur le schéma du circuit, mais elles ne sont pas vraiment indispensable puisque la tension que le PIC leur fournit est d’un peu moins de 5V (c’est à dire, la tension d’alimentation du PIC + un petite chute dûes à des résistances internes), ce qui est tout à fait acceptable par les diodes classiques.
Le programme
/*
Code d’un programme qui compare l’intensité lumineuse sur les
photorésistances (branchées sur le port A) et qui allume les leds en fonction de
la photorésistance la plus éclairée
*/
#define PIC
#include
#include
int Lumiere1,Lumiere2;
void attend(char nbSec){
char i;
for (i=0;i
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
}
}
void chenillard(){
PORTB=0;
PORTB=0x80;
Delay10KTCYx(250);
Delay10KTCYx(250);
PORTB=0x40;
Delay10KTCYx(250);
Delay10KTCYx(250);
PORTB=0x20;
Delay10KTCYx(250);
Delay10KTCYx(250);
PORTB=0x40;
Delay10KTCYx(250);
Delay10KTCYx(250);
PORTB=0x80;
Delay10KTCYx(250);
Delay10KTCYx(250);
PORTB=0;
}
int main(){
//TRISA en entrée (pour le convertisseur analog/num)
TRISA=0xFF;
//TRISB en sortie (LEDs)
TRISB=0x00;
//on écrit 0 sur le port B pour éteindre tout
PORTB=0;
//On allume un coup les LEDs pour vérifier que ça marche
PORTB=0xFF;
Delay10KTCYx(250);
Delay10KTCYx(250);
PORTB=0;
Delay10KTCYx(250);
PORTB=0xFF;
Delay10KTCYx(250);
Delay10KTCYx(250);
PORTB=0;
//On configure le converstisseur analogique/numérique
OpenADC( ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_8ANA_0REF, ADC_CH0 & ADC_INT_OFF );
do{ //on démarre la boucle principale du programme
SetChanADC(ADC_CH0); //on regarde sur le port 0
Delay10TCYx( 5 ); // on attend un peu le temps que le convertisseur soit prêt
ConvertADC(); // On démarre la conversion
while( BusyADC() ); // On attend qu’il ait fini la converstion
Lumiere1 = ReadADC(); // et on lit le résultat qu’on stocke dans la variable Lumiere1
SetChanADC(ADC_CH1); //on regarde sur l’autre port et on fait la même opération
ConvertADC();
while( BusyADC() );
Lumiere2 = ReadADC();
//on allume une diode ou l’autre en fonction de la photoresistance la plus brillante
if (Lumiere1 if (Lumiere1==Lumiere2) PORTB=0x40;
if (Lumiere1>Lumiere2) PORTB=0x20;
} while (1);
CloseADC(); // Désactive le converstisseur analogique numérique
return 0;
}
// Configuration du PIC
// ne pas mettre de commentaires dans cette macro !!!
// Code protect zone de boot desactive
#pragma romdata CONFIG
_CONFIG_DECL (
_CONFIG1H_DEFAULT & _OSC_HSPLL_1H ,
_CONFIG2L_DEFAULT & _PWRT_ON_2L ,
_CONFIG2H_DEFAULT & _WDT_OFF_2H,
_CONFIG3H_DEFAULT,
_CONFIG4L_DEFAULT & _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L ,
_CONFIG5L_DEFAULT & _CP0_OFF_5L & _CP1_OFF_5L,
_CONFIG5H_DEFAULT & _CPB_OFF_5H & _CPD_OFF_5H,
_CONFIG6L_DEFAULT & _WRT0_OFF_6L & _WRT1_OFF_6L,
_CONFIG6H_DEFAULT & _WPC_OFF_6H & _WPB_OFF_6H & _WPD_OFF_6H,
_CONFIG7L_DEFAULT & _EBTR0_OFF_7L & _EBTR1_OFF_7L,
_CONFIG7H_DEFAULT & _EBTRB_OFF_7H
);
#pragma romdata
Source: planete-sciences.org – CC