dimanche 25 mars 2012

Pocket Simon avec PIC10F202

Depuis un certain temps je m'amuse à explorer les possibilités du plus simple des microcontrolleurs vendu par Microochip soit le PIC10F202. La seule différence avec le PIC10F200 est la quantité de mémoire programme et le nombre de registres pour les variables. le 200 a 256 mots programme et 16 registres pour les variables. Le 202 a 512 mots programme et 24 registres de variables. Ce processeur n'a que 33 instructions assembleur. Son faible coût, 54cent/10 chez digikey.ca la simplicité de ses périphériques et de son jeux d'instructions en font un MCU idéal pour quelqu'un qui veut s'initier à la programmation des microcontrolleurs en assembleur.

caractéristiques principales du PIC10F202

  • 512 mots programmes
  • 24 registes de variables
  • 1 seul timer 8 bits
  • 3 E/S binaire programmable en entré ou sortie GP0,GP1,GP2
  • 1 entrée binaire GP3 qui peut-être programmé comme MCLR

On pourrait difficilement faire plus simple au point ou certains questionnent l'utilité d'un MCU si limité. Mon objectif est justement d'explorer les possibilités de ce MCU. Le jeux pocket Simon utilise 5 sorties: 4 DEL et 1 haut-parleur ainsi que 4 entrées boutons. Comment peut-on contrôler tout ça avec un MCU qui ne possède que 3-1/2 E/S?

Le jeux simon

Simon est un jeux qui a été mis en marché en 1978 par Milton Bradley. Ce jeux a 3 modes mais ma version pocket Simon ne reproduit que le premier mode. Une séquence aléatoire de notes est entendue et le joueur doit répéter la séquence. la séquence rallonge d'une note à chaque succès. Il y a 4 notes associée chacune à une couleur DEL et au bouton correspondant pour rejouer la séquence. Après un succès de 6 notes une petite mélodie se fait entendre à titre de félicitation. A 12 notes la mélodie se répète mais plus longue ainsi de suite. Le nombre maximum de notes est de 32 et la mélodie au complet est jouée si le joueur se rends jusque là.

J'ai ajouté une petite touche personnelle au jeux. Puisque dans le montage que j'ai fait les DELs sont alignées plutôt qu'en cercle, j'ai décidé de les utiliser comme un affichage binaire à 4 bits. Donc avant de jouer une séquence le programme affiche en binaire le nombre de notes qui sera jouées. si le nombre de notes dépasse 15 l'affichage se fait en 2 passes, la partie haute de l'octet ensuite la partie basse (high nibble, low nibble).

A la mise sous tension une routine POST Power On Self Test est exécutée. Cette routine consiste à faire entendre les 4 notes en allumant la DEL correspondante. Après le POST les DELs sont allumées séquentiellement l'une après l'autre en boucle jusqu'à ce que le joueur enfonce un bouton pour débuter la partie.

Le schéma du circuit

Examinons le schéma du circuit.
Notons d'abord que le circuit est conçu pour une alimentation 3.3volt contrôlé par le régulateur de tension U2. Il y a 2 raisons pour utiliser ce régulateur de tension, la première est que si on alimente le circuit avec une tension de plus 3.3volt les DELs seront allumées en permanances car elles sont branchées en série par 2 entre les rails de l'alimentation. D1 en série avec D2 et D3 en série avec D4. Ce montage permet de contrôler 2 DELs avec une seule sortie du MCU. GP0 contrôle la jaune et la bleu et GP1 contrôle la verte et la rouge. Si on place une sortie à 0 le DEL dont l'anode est branchée sur Vdd allume mais si on met la sortie à 1 c'est celle avec la cathode est à Vss qui s'allume. pour éteindre les 2 DEL on place la broche E/S en mode entrée haute impédance. De cette façon le seul chemin de parcour du courant est entre Vdd et Vss via les 2 DEL en série. Mais comme le voltage est inférieure à la tension de seuil des 2 jonctions en séries le courant qui circule est trop faible pour faire briller les DEL.

J'ai monté ce projet pour vérifier une idée, c'est à dire comment lire plusieurs boutons avec une seule entrée numérique lorsqu'il n'y a pas de convertisseur analogue/numérique? La réponse à cette question est de mesurer le temps de charge d'un condensateur. Le transistor Q1 maintient le condensateur C3 en court-circuit la majorité du temps. Lorsqu'on veut faire une lecture des boutons en enlève le court-circuit. Si un bouton est enfoncé le condensateur va se chargé à travers les résistances R4 à R7. Le nombre de résistances en série détermine le temps de charge. Le principe est simple, on libère le court-circuit et on commence à compter le temps que ça prends pour que l'entrée GP3 passe au niveau 1. Le temps le plus court est obtenu lorsque SW4 est enfoncé et le plus long lorsque SW1 est enfoncé. la sortie GP2 controle le transistor Q1 mais aussi le Q2 qui est la sortie audio. Ce partage a été nécessaire du au nombre limité de sorties. Il en résulte un petit inconvénient. Lorsque la routine de lecture des boutons est appellée en boucle on entend un son basse-fréquence dans le haut-parleur du à la commande ouverture/fermeture répétitive du transistor Q1.
Q1 ne serait pas nécessaire si GP3 pouvait être programmé en mode sortie, mais ce n'est pas le cas. Avec un controlleur PIC12F508 qui possède 5 E/S on pourrait se passer de Q1 et avoir une sortie audio indépendante. Remarquez que Q2 est un Transistor PNP monté en emitter-follower. L'objectif ici est d'éviter qu'un courant circule dans le haut-parleur lorsque la sortie audio est inactive. En effet la majorité du temps GP2 est gardé à 1 pour conserver Q1 en saturation donc Q2 est en blocage à ce moment là. Au départ je n'avais pas mis de commutateur ON/OFF SW5. Je croyais que en mettant le MCU en mode sleep serait suffisant pour réduire le courant de drainage de la pile à un niveau négligeable. Je n'avais pas pensé que les 2 jonctions base-émetteur de Q1 et Q2 étant en série un courant circule entre Vdd et Vss via ces 2 jonctions. Conséquence lorsque le MCU était en mode sleep un courant de 8MA circulait à travers le transistor Q2 et le haut-parleur, drainant ainsi la batterie. Je croyais corrigé le problème en ajoutant les diodes D5 et D6 mais c'était insuffisant pour mettre Q1 et Q2 complètement en cut-off. Je me suis résigné à ajouter SW5 et à modifier le logiciel pour ne plus utiliser le mode sleep.

Le logiciel

Examinons maintenant le code source du logiciel.
algorithme
  1. Au démarrage exécution du POST
  2. Allumer les DELs séquentiellement en attente d'un bouton pressé.
  3. Générer une nouvelle note au hazard
  4. Afficher le nombre de notes en binaire
  5. Jouer la séquence
  6. Lecture des boutons
  7. si aucun bouton pressé dans un délais de 2 secondes on va à ERREUR
  8. Si le joueur joue la mauvaise note on va a ERREUR.
  9. Est-ce que le joueur à complété toute la séquence?
  10. NON! on retourne à 6
  11. OUI! quel est la longueur de la séquence?
  12. a chaque multiple de 6 notes faire entendre la mélodie CONGRATULATION
  13. on retourne à 3
  14. ERREUR: Fait entendre un son aigu et réinitilise les variables et retourne à 2
  15. CONGRATULATION: on joue une mélodie. Le nombre de notes jouées dépend de la longueur de la séquence. Si longueur <32 on retourne à 3 sinon réinitialise le jeux à 2.

Le montage

J'ai monté le circuit sur une plaquette de prototypage Droids modèle 990.101 disponible chez robotshop. J'ai monté la plaquette dans la boite de plastique dans laquelle mon iPod Nano m'a été livré. Les boutons monté sur le circuit sont de type miniatures et j'ai du trouvé un moyen pour fabriquer des extensions. Pour ce faire j'ai utilisé des push-pin pour tableau d'affichage. Elles sont en acrylique transparent et s'apparient bien avec le boitier. Je les ai coupé juste au dessus de l'aiguille.


alimentation: 2xAAA en série


Dans ce projet j'ai utilisé le repurposing de 3 façons:
  1. Réaffectation du boitier de iPod
  2. Réaffectation de push-pin
  3. Réaffection du connecteur d'une pile de 9volt que j'ai désassemblée et que j'ai soudé à 2 piles AAA connectées en série qui servent d'alimentation au pocket simon
Le repurposing est un jeux qui me plait, car ça fait appel à l'imagination.

mise à jour 2017-01-02

J'ai revisité ce projet ces derniers jours pour le présenter au défi Hackaday 1KB challenge. J'ai modifié légèrement le circuit et fabriqué un nouveau montage. Toute l'information sur de nouveau projet est sur https://github.com/picatout/pocketsimon.

Aucun commentaire:

Publier un commentaire