Aujourd'hui nous allons nous attaquer à un montage un peu plus compliqué : un détecteur de luminosité qui allume une lampe quand il se retrouve dans le noir le temps de retrouver l'angle le plus éclairé. Une photorésistance sera montée au bout d'une baguette sur un servomoteur qui orientera cette dernière dans la direction la plus éclairée.
- MATÉRIEL -
- Arduino Uno (x1)
- Breadboard (x1)
- Photorésistance (x1)
- Résistance 1 kOhms (x1)
- Résistance 10 kOhms (x2)
- Transistor de puissance TIP102
- Servomoteur (x1)
/!\ Non compris dans le Starter Kit :
- Lampe 5V (x1) > lampe de mobylette, de frigo...
- Pile 9V (x1) > dispo dans le commerce
- SCHÉMA -
- CODE -
- Code: Tout sélectionner
/*
Application BASIC pour le STK Snootlab : N°4
Détecteur de luminosité mobile et allumage d'une lampe avec alimentation externe
Le convertisseur Analogique/Numérique de l'Arduino à une résolution de 2^10 bits = 1024 valeurs.
*/
#include <Servo.h>
// déclaration de fonctions
void recherche_lumiere(void);
unsigned int lecture_capteur(void);
// déclaration des pins auxquelles sont reliées les différents composants
#define lampe 2
#define moteur 9
#define capteur 0
Servo myServo;
// déclaration des variables relatives à la photorésistance et au servomoteur
unsigned int valeur_capteur;
unsigned int ancienne_valeur = 0;
unsigned int position_servo;
void setup()
{
pinMode(lampe, OUTPUT);
pinMode(moteur, OUTPUT);
// pas de pinMode() pour le capteur, les pins analogiques sont automatiquement configurées en entrée
myServo.attach(moteur);
digitalWrite(lampe, LOW);
delay(100);
recherche_lumiere();
}
void loop()
{
// lecture photorésistance
valeur_capteur = lecture_capteur();
// si la luminosité a baissé depuis la dernière fois (+ sensibilité)
if (valeur_capteur < ancienne_valeur-50)
{
// on allume la lampe
digitalWrite(lampe, HIGH);
delay(2000);
// on refait une mesure
valeur_capteur = lecture_capteur();
// si la luminosité est toujours plus faible que la dernière fois
if (valeur_capteur < ancienne_valeur-50)
{
// on recherche le meilleur angle
recherche_lumiere();
}
// on éteint la lampe une fois celui-ci trouvé
digitalWrite(lampe, LOW);
delay(100);
// et on enregistre la valeur de la luminosité pour le prochain tour
ancienne_valeur = valeur_capteur;
}
// sinon
else
{
// ne rien faire
return;
}
}
unsigned int lecture_capteur(void)
{
int val = 0;
val = analogRead(capteur);
// remapping de la lecture pour avoir une valeur élevée correspondant à une luminosité élevée
val = map(val, 0, 1023, 1023, 0);
return (val);
}
void recherche_lumiere(void)
{
unsigned int luminosite_max;
// balayage à 180° pour les mesures
for (position_servo=0; position_servo<180; position_servo+=3)
{
myServo.write(position_servo);
delay(100);
valeur_capteur = lecture_capteur();
// si la valeur lue est supérieure à la précédente
if (valeur_capteur > ancienne_valeur)
{
// on l'enregistre ainsi que la position du servo
ancienne_valeur = valeur_capteur;
luminosite_max = position_servo;
}
}
// quand on a fini de faire le tour, on renvoie le servo à la position la plus éclairée
myServo.write(luminosite_max);
// attendre avant de refaire des mesures
delay(500);
}
- EXPLICATIONS -
Nous utilisons ici un transistor de puissance pour la commande de la lampe :
• Pourquoi ?
La lampe est alimentée via une pile 9V, elle resterait allumée tout le temps sans la présence du transistor qui agit comme un interrupteur : bloqué (interrupteur ouvert), aucun courant ne circule dans la circuit, la lampe reste éteinte ; passant (interrupteur fermé), la lampe s'allume.
• Comment ?
Il existe plusieurs types de transistors (NPN, PNP, Darlington...) et plusieurs régimes de fonctionnement : bloqué, passant, et saturé.
Dans cet exemple nous ne prendrons en compte que les NPN, en régime linéaire (= passant).
Le transistor possède 3 broches: une base, un collecteur, et un émetteur.
Si l'on compare le transistor à un robinet, le collecteur est l'arrivée d'eau murale, la base est la molette du robinet et l'émetteur la sortie du robinet.
On comprend donc qu'il faut agir sur la base du transistor si l'on veut avoir un courant au niveau de l'émetteur (circuit fermé). On la relie donc à la pin D2 de l'Arduino qui, suivant l'information délivrée (HIGH ou LOW), commandera l'allumage de la lampe.
Pour plus de détails sur le fonctionnement des transistors (caractéristiques, exemples de montage...), vous pouvez aller sur Wikipedia et Sonelec ou consulter les datasheets pour les caractéristiques spécifiques à votre composant.
Pour plus de détails sur la photorésistance et son utilisation, voir le chapitre 2 nouvelle version !
C'est tout pour cette fois ! J'espère que ce tutoriel vous aura plu, et bonne bidouille en attendant le prochain !