Agace-chat Laser
Un jeu pour les chats frileux !
Quand le froid s'installe, le chat n'aime pas trop sortir et en plus des câlins, il faut passer des heures à jouer avec lui ! Je vous propose là un gadget qui, en plus d'amuser le chat de manière autonome, va permettre de se familiariser avec Arduino et les servos de radiocommande ! Un tube laser de pointeur, monté sur deux servos orientés dans des axes différents va allumer un spot au sol que la chat va devoir attraper. On pourra faire éteindre le point pendant les déplacements et également modifier les zones de débattement en ajustant les valeurs dans le programme (ou sketch). Programme que je donne en deux versions et vous laisse libre de le personnaliser à souhait . C'est un gros avantage d'Arduino: on y connecte le PC et on fait ce que l'on veut avec un minimum de texte ....
Le Schémas :
Un Arduino Nano se frise les moustaches à commander les deux servos, connectés respectivement sur JP1 et JP2, grace à sa multitude de sorties PWM (Modulation de Largeur d'Impulsion); les servos de radiocommande prennent en effet un valeur angulaire en les alimentant sous 5 volts et en leur envoyant une commande par impulsion de 20 millisecondes dont le rapport cyclique varie de 0 à 100% ! Pas de soucis, pas de calcul, le Nano s'occupe de tout; il suffit de lui donner une valeur de 0 à 255 (8 bits) et le servo s'aligne sur cette valeur.
L'alimentation du tube laser est assurée par le connecteur JP4 (attention à la polarité) qui est switché par un transistor CMS 2222. Le courant de base est limité par R1 et directement piloté par la sortie digitale D2 du Nano. Suivant le type de pointeur utilisé, il se peut que vous deviez l'alimenter sous 5 volts; une petite opération chirurgicale sur le circuit au niveau du connecteur JP4 pour le relier à la broche +5v.
Un connecteur supplémentaire JP3 a été ajouté au cas où l'on veux s'amuser à y adjoindre des boutons pour différentes commandes manuelles et deux entrées analogiques JP5/JP6 sont réservées pour y mettre des potentiomètres . Ces options ne sont pas utilisées dans notre cas, mais comme le montage à un but pédagogique et de découverte de l'Arduino, on peut être tenté de faire des essais .
Les régulateurs intégrés 5 volts et 3,3 volts sont optionnels, au cas où vous souhaitez utiliser des alimentations supplémentaires. Dans notre cas, les tensions fournies par Arduino sont tout à fait suffisantes .
Le Circuit Imprimé:
Un circuit simple face grâce à la haute intégration du Nano ... Les composants CMS sont soudés côté cuivre... Dans notre cas on peut s'abstenir de câbler le régulateur intégré 3,3v et les condensateurs de découplage C1 / C2 qui dans ce cas ne servent à rien ! Le laser est alimenté par le 5 volts du circuit Ardino .
Le programme ou Sketch:
Je joints ici deux sketchs différents, déconcertants de simplicité, afin de se familiariser avec le langage Arduino . Chacun peut modifier les valeurs angulaires des servos pour les adapter aux dimensions de l'espace de jeu .
#include <Servo.h>
Servo myservo,myservo1; // create servo object to control a servo
int pos = 0; // variable to store the servo position
int pos1 = 0;
int n = 0;
int x = 0;
void setup() {
pinMode(2, OUTPUT);
myservo.attach(3); // attaches the servo on pin 6 (PW1) to the servo object
myservo1.attach(5); // attaches the servo on pin 8 (PW2) to the servo object
}
void loop() {
digitalWrite(2, LOW);
delay(400);
pos = random(60,121);
pos1 = random(50,150);
n = random(1,4);
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(200); // waits 15ms for the servo to reach the position
myservo1.write(pos1); // tell servo to go to position in variable 'pos'
delay(400);
for (int x = 0; x < n; x++) {
// turn the pin on:
digitalWrite(2, HIGH);
delay(1000);
// turn the pin off:
digitalWrite(2, LOW);
delay(1000);
}
}
Les valeurs de mes positions angulaires sont générées par un nombre aléatoire compris pour le premier entre 60 et 121 et pour le deuxième 60 et 150. On peu ajuster ces valeurs entre 0 et 255 ... Apparaît également une boucle en fin de programme pour allumer et éteindre un certain nombre de fois le laser avec des temporisations entre chaque changement d'état; il convient, bien sûr, d'ajuster voir de supprimer ceci, si cela ne plaît pas !
Le deuxième sketch:
#include <Servo.h>
Servo myservo,myservo1; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
int pos1 = 0;
void setup() {
pinMode(2, OUTPUT);
myservo.attach(3); // attaches the servo on pin 6 (PW1) to the servo object
myservo1.attach(5); // attaches the servo on pin 8 (PW2) to the servo object
}
void loop() {
digitalWrite(2, LOW);
delay(400);
pos = random(60,121);
pos1 = random(50,150);
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(200); // waits 15ms for the servo to reach the position
myservo1.write(pos1); // tell servo to go to position in variable 'pos'
delay(400);
digitalWrite(2, HIGH);
delay(1500); // waits 15ms for the servo to reach the position
}
Encore plus simple ; juste un allumage du laser lorsque les servos sont en position .
Les fichiers de réalisation :
Agace chat (36.32 Ko)
Ajouter un commentaire