Jeu Laser pour le Chat

Un jeu pour les chats frileux !

Chat laser attiny vu        

          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  jouet d'une simplicité étonnante pour ceux qui ont envie de se mettre à l'électronique  et qui, en plus d'amuser le chat de manière autonome, va permettre de se familiariser avec les ATMEL ATTiny85 et les servos-moteurs de radiocommande ! Un tube laser de pointeur, dont la puissance ne doit pas dépasser 1 mW pour des raisons de sécurité évidentes sur les yeux, monté sur l'arbre de sortie, est orienté dans des axes différents, allume un spot au sol que le chat va devoir attraper. On peut faire éteindre le point pendant les déplacements si on le souhaite, et également modifier les zones de jeu en ajustant les valeurs dans le programme. Programme que je donne en deux versions, libres de personnalisation à souhait . Le tout est développé avec l'IDE Arduino, compilé en format hex pour être buriné par un programmateur Dataman ou autre, ou suivant la méthode décrite dans ces pages si vous n'en avez pas  ....

 

Le Schémas :

Chat laser attiny sch

          Un ATTiny85 se frise les moustaches à commander les deux servos, connectés respectivement sur JP5 et JP8, à ses deux sorties (PB0-PB1) PWM (Modulation de Largeur d'Impulsion); les servos de radiocommande prennent en effet une valeur angulaire rien qu'en les alimentant sous 5 volts et en leur envoyant une commande par impulsion de 20 millisecondes (50Hz) dont le rapport cyclique varie de 0 à 100% ! Pas de soucis, pas de calcul, le programme s'occupe de tout; il suffit de lui donner une valeur de 0 à 255 (8 bits) et celui-ci s'aligne sur cette valeur.  

Servo

          L'alimentation du tube laser est assurée par le connecteur JP4 (attention à la polarité) dont la masse est switchée par un transistor BC547, pour allumer ou éteindre le rayon . Le courant de base est limité par R2 de 3,3Kohms et directement piloté par la sortie digitale PB2 du Tiny85. J'ai choisi le type de pointeur pour pouvoir l'alimenter sous 5 volts;

          Une résistance R1 (10k) facultative tire au niveau logique de VCC la pin reset (PB6 ), lors de la mise sous tension, si le flag POR (Power On Reset) n'est pas programmé par le dataIO, dans le cas où le logiciel ne donne pas accès aux paramètres de configuration de base .

          Pour avoir une alimentation autonome, j'utilise une batterie de 3,6 Volt /1800mA, type 18650 et un fabuleux circuit, chinois bien sûr, qui rempli une multitude de fonctions:

  • Il assure la gestion de charge de la batterie en lui fournissant une tension de 5 volts, (en réalité de 4,5 à 8 ) dans le respect du courant et de la fin de charge, signalé par des leds rouges et vertes.
  • Il élève la tension de sortie entre 3,5 et jusqu'à 25 volts en ajustant le petit potentiomètre à la tension désirée, sous un courant proche de l'ampère .
  • Il s'occupe de couper le circuit si la tension de batterie descend trop bas, pour en assurer la protection.
  • Et en plus il ne coûte pratiquement rien  ~1€

Alim tp4056 1

Le seul problème rencontré lors de la conception, c'est l'appel de courant à chaque démarrage des moteurs, ce qui avait pour inconvénient de planter le microcontrôleur. C'est la raison d'être du gros électrochimique de 1000µF/16V (C1). J'ai choisi également de ne pas commander un ordre simultané sur les deux servos : le programme version 2 s'en charge .

 

Le Circuit Imprimé:

Chat laser attiny ci

          Un circuit simple face pour que la réalisation reste à la portée de l'amateur, en s'inspirant de ce qui est écrit dans mes pages ... Les composants CMS sont soudés côté cuivre et les composants traversants sur l'autre face. Le circuit de gestion de l'alimentation et de la charge batterie est soudé par des picots de barrette sécable qui assurent la liaison mécanique et électrique avec le CI . Le microcontrôleur ATTiny85 est monté sur un support tulipe pour pouvoir le passer du programmateur au PCB et faciliter les adaptations du programme à la réalité souhaitée .

 

Le programme :

          Les deux fichiers joints, déconcertants de simplicité afin de se familiariser avec le langage de l'IDE Arduino, vont offrir le choix d'une extinction du laser pendant les phases de déplacement du spot (Version 1) ou de garder le faisceau allumé, avec un démarrage décalé des moteurs pour limiter l'appel de courant . Chacun peut modifier les valeurs angulaires des servos pour les adapter aux dimensions de l'aire de jeu . Les valeurs que j'ai donné à mes limites de positions sont générées par un nombre aléatoire compris pour le premier entre 93 et 157 et pour le deuxième 80 et 130. 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 (dans la première version); il convient, bien sûr, d'ajuster, voir de supprimer ceci, si cela ne plaît pas !

Le deuxième programme: (Mon préféré !)

Les library pour ne pas refaire ce qui à le privlège d'exister

#include <SoftwareServo.h>
SoftwareServo myservo,myservo1; // crée l'ident des servos

les déclarations de variables

int pos = 0;    // variable de position
int pos1 = 0;   // variable de position
int t = 0;  // // variable de temps d'arret

Le DDR (Direction Data Register) et les points de cablâge des servos

void setup() {
  pinMode(2, OUTPUT);  // Pin 2 en sortie
  myservo.attach(0);  // défini où est raccordé le servo1 sur la pin 0 (PW1)
  myservo1.attach(1);  // défini où est raccordé le servo1 sur la pin 1 (PW2)
}

La boucle ad vitam éternam avec la génération de nombres aléatoires compris entre ....

void loop() {
  digitalWrite(2, HIGH); // Allume le laser
  pos = random(93,157);  // Choisi une position aléatoire pour le servo1 comprise entre 93 et 157 sur 255
  pos1 = random(80,130);  // Choisi une position aléatoire pour le servo2 comprise entre 80 et 130 sur 255
  t = random(1,15);        // Choisi de 100 à 1500 ms de temps de pause

Application des valeurs du rapport cyclique sur la commande moteur 8 fois de suite

for (int x = 0; x < 8; x++) {
    myservo.write(pos);              // Dit au servo1 de se rendre en position
    delay(20);
    SoftwareServo::refresh();     // Attend 15ms que le servo atteigne la position
  }

Temporisation aléatoire pour le fun ...

delay(t*100);

Et idem pour le deuxième moteur

  for (int x = 0; x < 8; x++) {
    myservo1.write(pos1);        // Dit au servo2 de se rendre en position
    delay(20);
    SoftwareServo::refresh();   // Attend 15ms que le servo atteigne la position  
  }
  
delay(t*100);
}

Et voilà, c'est tout ... simple !

 

Les fichiers de réalisation :

Chat laserChat laser (451.77 Ko)

 

Et pour terminer ...

          Un bon petit montage pour se familiariser avec les ATTiny85 ... Du simple, qui permet au chat de jouer sans lui accorder d'attention particulière ! Ma minette a vite compris que le spot était là pour la faire bouger et à commencée à s'intéresser au jouet extraordinaire, "qui faisait ziiiip quand il tournait, frrrrre quand il marchait, je ne sais pas ce que c'était et je crois que je ne le saurai jamais ..." (Merci Cloclo pour la conclusion débile )

Chat laser attiny fin

 

Ajouter un commentaire