Bonjour tous,
Le ky-033 semble être un capteur à infra-rouges avec réglage de seuil. Si il sort une valeur en tout ou rien, à la base il s'agit d'un capteur analogique suivi d'un comparateur ( un truc qui bascule de zéro à un suivant la comparaison entre la valeur mesurée et le seuil réglé ).
Bref, c'est de l'analogique suivi d'un brin d'électronique pour avoir une sortie digitale.
Il y a qq années, on ne trouvais que des capteurs à base de LDR et une led généralement blanche. Par exemple Capteur de niveaux de gris Gravity DFR0022 DFRobot - Capteurs de lumière et bruit | GO TRONIC.
Ces capteurs analogiques à base de LDR ont le très gros défaut d'avoir une tolérance supérieure à 200 % ( rapport 1 pour 4 ! ). Donc si on fait une comparaison entre deux capteurs, on a de bonnes chances de se tromper si on ne règle pas son montage. Perso, pour les Boum Bot Boum’Bot, le robot pédagogique de Planète Sciences - Planète Sciences Occitanie j'ai mis en place une procédure d'étalonnage assez simple. Pour chaque robot, je mémorise lors de l'étalonnage, en EEPROM, les valeurs des deux capteurs pour du blanc et pour du noir. Ensuite, en fonctionnement, je fais une lecture analogique.
Dans la bibliothèque BoumBot, il y a la définition des valeurs en EEPROM boumbot.MemBoumBot.... gauche et droit, blanc et noir;
// Structure Eeprom, pour memoriser les reponses des capteurs et les homogeneiser
struct Eeprom
{
int GaucheBlanc ; // Valeur lue par le capteur de ligne Gauche sur le Blanc (sur 1024)
int GaucheNoir ; // Valeur lue par le capteur de ligne Gauche sur le Noir (sur 1024)
int DroitBlanc ; // Valeur lue par le capteur de ligne Droit sur le Blanc (sur 1024)
int DroitNoir ; // Valeur lue par le capteur de ligne Droit sur le Noir (sur 1024)
} ;
Eeprom MemBoumBot ; // Creation de l'objet memoire Eeprom
const byte debutEeprom = 0 ; // Debut d'adresse de l'objet Eeprom
L'étalonnage ;
#include <BoumBot.h>
#include <EEPROM.h>
void setup ( )
{
Serial.begin ( 9600 ) ;
Serial.println ( F ( "Placez le Boum Bot sur du blanc et validez" ) ) ;
do
{
boumbot.MemBoumBot.GaucheBlanc = analogRead ( boumbot.pinCapteurG ) ;
boumbot.MemBoumBot.DroitBlanc = analogRead ( boumbot.pinCapteurD ) ;
}
while ( ! boumbot.valide( ) ) ;
Serial.println ( F ( "Placez le Boum Bot sur du noir et validez" ) ) ;
do
{
boumbot.MemBoumBot.GaucheNoir = analogRead ( boumbot.pinCapteurG ) ;
boumbot.MemBoumBot.DroitNoir = analogRead ( boumbot.pinCapteurD ) ;
}
while ( ! boumbot.valide( ) ) ;
EEPROM.put ( boumbot.debutEeprom , boumbot.MemBoumBot);
while ( 1 )
{
;
}
}
void loop ( )
{
}
Ensuite à l'utilisation, dans la bibliothèque il y a les fonctions pour la droite et la gauche ;
int BoumBot::capteurDroit() {
return( _limiteCapteur(map(analogRead(pinCapteurD), MemBoumBot.DroitBlanc , MemBoumBot.DroitNoir, 0, 100)));
}
On récupère ainsi deux valeurs entre 0 et 100 pour les deux capteurs, en fonction du niveau de gris visé, quelque soit la réponse "réelle" des capteurs.
Je vous recommande cette méthode, elle a sauvé l'utilisation des robots malgré un choix initial des capteurs basé sur le premier proto qui fonctionnais bien, mais par strict hasard !