mardi 31 mars 2015

Oeuf lumineux, montage

Après avoir observé l’œuf lumineux j'ai décidé que ça pouvait remplacer une chandelle au centre d'une table à dîner. J'en ai donc fait un montage sur un bout de planche de chêne de dimensions 19mm x 110mm x 60mm.

couper un oeuf

L'opération la plus délicate est de couper le bout de l’œuf sans fendre ou fragmenter le rebord du trou. J'ai pris un bouchon de contenant de jus que j'ai appliqué sur le gros bout de l’œuf et j'ai utilisé un marqueur pour en tracé la circonférence. Le meilleur outil que j'ai trouvé pour obtenir un bon résultat est un Dremel avec une petite meule.


Il faut appuyer très légèrement en parcourant la circonférence en essayant de percer le moins possible la membrane qui couvre l'intérieur de la coquille.

Le rebord du trou est très fragile, pour éviter qu'il se forme des fissures j'ai appliqué un filet de colle chaude à l'extérieur juste sur le rebord de l'ouverture. Finalement j'ai vernis l’œuf avec de l'uréthane transparent.

L’œuf doit pouvoir entrer par dessus le bouchon qui a été utilisé pour marquer l'ouverture. C'est dans ce bouchon qu'est installé le PIC10F1572 avec la LED. Le bouchon est encastré dans la base en bois mais pas complètement. Il sert à maintenir la coquille en position.

Montage électronique

Pour le montage final j'ai utilisé la technique dead bug et j'ai laissé tomber les résistances entre les anodes de la LED et les sorties du MCU.

Tous tiens ensemble avec de la colle chaude mais je l'ai utilisté aussi comme isolant.

La pile de 9 volts, le régulateur de tension et le commutateur sont monté en dessous. Pour que le commutateur d'alimentation soit fermé il faut que le montage soit posé sur une surface plane, s'il est soulevé l’œuf s'éteint automatiquement.

J'avais suffisamment d'espace pour installer un connecteur pour le programmeur Pickit au cas ou je voudrais modifier le logiciel.

dimanche 29 mars 2015

Oeuf lumineux

Un petit projet qui peut-être mis en œuvre rapidement pour faire la démonstration des possibilités du PIC12F1572. Comme c'est Pâques dimanche prochain un œuf lumineux comme décoration me paraissait pertinent, comme prétexte pour expérimenter avec ce MCU.

PIC12(L)F1572

Voilà un petit MCU disponible en format PDIP-8 qui possède 3 périphériques PWM avec une résolution maximale de 16 bits ce qui est plutôt rare sur les MCU 8 bits. Microchip a conçu ce MCU en pensant plus spécifiquement au contrôle de LED RGB. En effet on peut contrôler directement une LED RGB 20mA/couleur directement à partir des sorties du MCU et ce avec une résolution de 16 bits à une fréquence PWM de 488 hertz. Voici les principales caractéristiques de ce MCU.

  • coeur midrange amélioré. 49 Instructions encodées sur 14 bits. Pile des retours de 16 niveaux manipulable à partir du programme.
  • Mémoire programme de 2K instructions
  • RAM de 256 octets
  • 5 E/S RA0,RA1,RA2,RA4,RA5 et RA3 en entrée seulement
  • 2 minuteries 8 bits et 4 minuteries 16 bits, 3 utilisées par les PWM
  • 1 comparateur analogique
  • 1 convertisseur A/N de 10 bits avec 4 entrées
  • 1 convertisseur N/A de 5 bits
  • 1 EUSART Extended Universal Asynchronous Receiver Transmitter
  • 1 CWG générateur d'onde complémentaire
  • 3 canaux PWM avec résolution de 16 bits avec compteurs indépendants.
Ce qui rend ce MCU intéressant ce sont ses 3 canaux PWM, le programme démo suivant montre l'utilisation la simple de ces PWM pour piloter une LED RGB. Mais ces canaux PWM ont des modes d'utilisation plus sophistiqués comme contrôle de la phase, synchronisation et impulsion unique.

Programme démo

Le montage est très simple et peut-être réalisé rapidement sur une plaquette de prototypage sans soudure.

code source

Dans ce projet les 3 canaux PWM sont utilisés en mode standard. Dans ce mode le registre PWMxPH détermine quand l'impulsion commence et le registre PWMxDC quand elle se termine. La période est déterminée par le registre PWMxPR. Ici la lettre x représente le canal 1,2 ou 3, tous ces registres sont de 16 bits. On note que les registres PWMxPH sont mis à zéro donc l'impulsion commence dès que le compteur tombe à zéro. Lorsque le compteur arrive à la valeur du registre PWMxDC l'impulsion prend fin. Le cycle PWM se termine lorsque le compteur arrive à la valeur du registre PWMxPR. Les registres PWMxPR sont initialisés pour une période maximale soit à 65535 (0xffff) pour bénéficier de la résolution de 16 bits. Notez que les compteurs peuvent-être alimentés directement avec la fréquence Fosc au lieu de Fosc/4 comme c'est le cas pour les autres PIC12 et PIC16. Donc dans ce démo la fréquence PWM est de 32Mhz/65536 ce qui donne environ 488 hertz. Amplement suffisant pour éviter toute perception de scintillement.

Lorsque les 3 canaux PWM sont configurés le programme entre dans la boucle principale qui appelle successivement la fonction transition() et delay_ms(10) pour une brève pause entre chaque transition.

La fonction transition() choisie 3 nouvelles valeurs pour les composantes rouge,verte et bleue et ensuite emmène progressivement les registres PWMxDC à cette nouvelle valeur. Le résultat est une transition douce d'une couleur à l'autre ce qui est beaucoup plus agréable à l’œil qu'un changement brutal.

La fonction random() donne les nouvelles valeurs pour les composantes. J'ai découvert ce type de générateur aléatoire lors de ma lecture du livre de Stephen Wolfram, a new kind of science. le générateur utilise un entier non signé de 32 bits (unsigned long long). les règles sont les suivantes.

  1. Si le nombre actuel est impaire il est incrémenté.
  2. On multiplie ce nombre par 3.
  3. On divise le résultat par 2 et on ne garde que le bit le moins significatif.
  4. Le générateur produit des entiers de 16 bits donc pour chaque appel de random() les 3 étapes sont répétés 16 fois.

Vidéo démo

Ce projet est similaire à celui du projet ambiance pingpong mais ce MCU est nettement plus performant et permet une résolution PWM de 16 bits au lieu de 8 bits et une fréquence PWM plus de 4 fois supérieure. La coquille d’œuf diffuse la lumière de la LED beaucoup plus efficacement qu'une balle de pingpong. L'effet est plus agréable à l’œil que ce laisse entrevoir la vidéo qui n'a pas un bon rendu des couleurs.

conclusion

Je n'ai pas fait de montage permanent de ce projet mais le circuit incluant une pile au lithium de 3 volt CR2450 entrerais en entier dans la coquille. A 3 volt il faudrait diminuer la valeur des résistances pour conserver la même intensité.

On peut aussi expérimenter en changeant la valeur du délais dans la boucle principale et peut-être aussi introduire un délais de quelques microsecondes à l'intérieur de la boucle dans la fonction transition().

dimanche 15 mars 2015

PICVisionPortable

mises à jour

2015-04-25
Ajout d'un potentiomètre pour le contraste aux bornes de la diode D1. En effet le contraste de l'affichage est très sensible à valeur de la tension d'alimentation. En shuntant la diode avec ce potentiomètre on peut ajuster le contraste avec précision.


présentation

J'ai fait plusieurs projets qui généraient un signal vidéo NTSC monochrome. Cette fois ci je voulais expérimenter avec un affichage LCD. PICVisionPortable est une console de jeux rétro monochrome qui utilise un LCD graphique de 128x64. Le MCU est le même que pour le projet PICVision soit un PIC24FJ64GA002. Cependant il n'y a pas que le type d'affichage qui est différent. PVP utilise la même machine virtuelle (avec quelques modifications) que le projet CHIPCON. et supporte aussi la lecture d'une carte SD sur laquelle sont enregistrés les jeux.

caractéristiques

  • MCU PIC24FJ64GA002, 64Ko flash, 8Ko RAM.
  • Affichage LCD passif à rétro-éclairage Robotshop RB-Dfr-177. 128x64 pixels
  • Lecteur de carte SD pour les jeux
  • Haut-parleur intégré. Son avec 2 tonalités simultanés ou bruit blanc.
  • Espace code disponible 4096 octets. Machine virtuelle Super CHIP étendue.
  • Outils disponibles: assembleur, déassembleur et convertisseur vers fichier C pour intégration d'un jeux en mémoire flash
  • Alimentation 4 piles AA.

schéma électronique

Il y avait juste le nombre de broches sur le format DIP-28 pour répondre aux besoins du projet. De plus comme ce MCU permet de configurer les sorties binaire en mode drain ouvert il n'a pas été nécessaire d'utiliser des adaptateurs de niveau de tension entre le module LCD qui fonctionne à 5 volts et le MCU qui lui fonctionne à 3,3 volts.

L'interface utilisateur ne comprend que 5 boutons, les 4 directions et le select. au dessus du select il y a un petit bouton pour réinitialiser la console. A gauche de l'affichage il y a le haut-parleur et le commutateur d'alimentation.


Pour le connecteur de la carte SD j'ai du fabriquer un petit circuit imprimé. l'empreinte est dans le dossier documents.

Adaptation du jeux LEM que j'avais écris pour le projet CHIPCON.

carte MCU dans le boitier

Tous les composants dans le boitier

Prototype complété

description détaillée

L'affichage est un LCD passif STN a rétro-éclairage par LED acheté chez Robotshop.com/ca. Puisqu'il s'agit d'un LCD passif l'affichage a une persistance longue ce qui produit un effet de trainé dans les animations. Les jeux sont néanmoins jouables. Sur le vidéo suivant ça paraît pire que c'est en réalité à cause des réflexions sur l'écran. Désolé pour la mauvaise qualité de ce vidéo mais je ne suis pas vraiment équiper produire de bons vidéos.

Le PIC24FJ64GA002 possède 8Ko de RAM, 1Ko est réservé pour la mémoire d'affichage et 4Ko pour l'espace jeux. Contrairement à l'émulateur CHIP original les 4Ko sont disponibles pour l'espace code. Les jeux doivent-être écris avec le point d'entré à l'adresse zéro. Les jeux superCHIP existants doivent-être adaptés pour cette console pour les raisons suivantes:

  1. Le point d'entré doit-être à l'adresse zéro et non 512.
  2. Le clavier n'a que 5 boutons, 4 de directions à gauche et un sélection à droite.
  3. Ce processeur étant plus rapide les jeux doivent-être ralentis en insérant des délais supplémentaire dans le code.

Dans le dossier tools on retrouve l'assembleur pvpasm, le déassembleur pvpdasm et le convertisseur cvt-chip. Il reste de la place dans la mémoire flash pour y intégrer quelques jeux.

J'ai adapté 5 jeux superCHIP pour cette console et les ai intégrés dans la mémoire flash. Il encore près de 32Ko de flash libre, donc de l'espace pour plusieurs autres jeux.

adaptation de jeux superCHIP

Lorsqu'il n'y a pas de carte SD dans la fente la console affiche la liste des jeux en mémoire flash. Vous pouvez écrire vos propre jeux et les utiliser à partir de la carte SD ou les intégrer dans la mémoire flash du MCU.

Pour trouver des jeux superCHIP existant consultez le site http://www.chip8.com.

L'adaptation se fait en 3 étapes:

  • désassembler le fichier binaire avec l'utilitaire pvpdasm.exe qui est dans le dossier tools du dépôt github.
    exemple: pvpdasm blinky.ch8 blinky.chp
  • Ouvrir dans un éditeur de texte le fichier assembleur .chp. Faire une recherche sur les instructions SKP, SKNP et LD VX, K. remplacer les codes de touches par ceux correspondant aux touches de la console PVP.
    1. UP = 0
    2. DOWN = 1
    3. LEFT = 2
    4. RIGHT = 3
    5. SELECT = 4
    La console PVP est plus rapide qu'une calculatrice HP-48 aussi faut-il introduire des délais aux endroits appropriés. Localiser ces endroits est la partie la plus difficile.
  • Une fois les modifications faites dans l'éditeur, il faut assembler le programme avec pvpasm.exe
    exemple: pvpasm.exe blinky.chp blinky.pvp
Les programmes sauvegardés sur la carte SD doivent avoir l'extension .pvp pour être reconnus par la console.

intégration des jeux dans la mémoire flash

Pour intégrer un jeux dans la mémoire flash du MCU il faut utiliser l'outil cvt-chip.exe qui est dans le dossier tools.
exemple d'utilisation: cvt-chip -pPIC blinky.pvp

le résultat de cette opération est la création de 2 fichiers en langage C. Un fichier blinky.h et un fichier blinky.c. Il faut ajouter ces 2 fichiers au projet MPLABX.

Dans l'exemple donné ici il ajouter dans le fichier main.c
#include "games/BLINKY/blinky.h"

Chaque jeux en mémoire flash a une entrée dans le tableau flash_games[GAMES_COUNT]. Il faut aussi incrémenter la constante GAMES_COUNT.


les champs de la structure sont les suivants:
  • Le nom qui apparaît à l'écran.
  • la constante définie dans le fichier d'entête qui donne le nombre d'octet occupé par le jeux. Dans l'exemple de blinky cette constante s'appelle BLINKY_SIZE.
  • Le nom du tableau (array) contenant le jeux. Celui est aussi défini dans le fichier d'entête créé par cvt-chip.exe
  • le nom du tableau xxxx_info. Ceci est une description du jeux qui est affichée avant que le jeux ne démarre. Par défaut le tableau est vide. La constante NULL peut-être utilisée s'il n'y a pas d'info à afficher.


liens

samedi 7 mars 2015

Drain ouvert (open drain)

Certains microcontrôleurs permettent de configurer les sorties numériques en mode open drain. Dans cet article j'explique ce que ça signifie et je donne des exemples d'utilisation.

configuration d'une sortie numérique

Les sorties numériques des MCU sont composées de 2 transistors MOSFET complémentaires montées entre les 2 rails d'alimentation Vdd et Vss comme ceci.

Les transistors MOSFET ont 3 électrodes. Drain, Source, Gate. Le Gate contrôle le passage du courant entre le Drain et la Source. Lorsque Vin est à 1 le transistor P-MOSFET et bloqué et le N-MOSFET conduit, on a donc zéro à la sortie. À l'inverse si Vin est à 0, le transistor P-MOSFET conduit et le N-MOSFET est bloqué de sorte que la sortie est à 1. Il n'y a qu'un seul transistor qui conduit à un instant donné sinon on aurait un court-circuit entre Vdd et Vss.

Drain ouvert

Maintenant si on désactive le transistor P-MOSFET de sorte qu'il n'y a que le transistor N-MOSFET qui peut entré en conduction alors on a que la sortie sur la broche du MCU est en haute impédance lorsque le N-MOSFET est bloqué ou elle est connecté à Vss lorsque le transistor conduit. C'est ce qu'on appelle une configuration Open Drain

Pour désactiver le P-MOSFET on peut utilisé un montage comme montré sur le schéma ci-bas. Lorsque le signal open drain est actif à 1 le P-MOSFET reste bloqué donc c'est comme si le drain du N-MOSFET n'était branché à rien. Lorque le signal open drain est à 0 c'est le signal venant du PORT LATCH qui contrôle le gate du P-MOSFET comme si le OR gate n'était pas là comme dans le montage ci-haut.

Utilité du Drain ouvert

La configuration Open Drain est utile dans diverses situations, partage du bus entre plusieurs dispositifs, adaptation de niveau de tension, alimentation d'une LED par la cathode.

Par exemple il existe des dispositifs qui utilisent un protocole de bus appelé ONE-WIRE. Ces dispositifs n'utilisent qu'un seul fil pour communiquer avec le microcontrôleur et cette communication se fait dans les 2 sens en semi-duplex.

Dans cette application le bus est connecté à Vdd à travers une résistance pullup. Cette application nécessite un configuration Open drain car plus d'un dispositif partage le bus. En effet si les sorties des dispositifs étaient en montage complémentaire et qu'un dispositif plaçait sa sortie à 0 alors qu'un autre a sa sortie à 1 on aurait un court-circuit entre Vdd et Vss. Avec l'open drain le seul chemin vers Vdd est la résistance pullup et le courant entre Vdd et Vss est limité par la valeur de celle-ci.

adaptation de niveau

Toutes les sorties numérique des PIC24FJ64G00x sont configurable en mode open drain. Ces MCU fonctionnent à 3,3 volt. Supposons qu'on veut interfacer un tel MCU avec un affichage LCD qui fonctionne à 5 volt. Pour adapter les niveaux logiques sur le bus de communication il suffit de configurer les sorties du MCU en open-drain et de mettre des résistances pullup sur les lignes du bus. De cette façon lorsque le transistor N-MOSFET à la sortie du MCU est bloqué le niveau à l'entrée du LCD est tiré à 5 volt. Lorsque le transistor N-MOSFET du MCU est en conduction la ligne est tirée à zéro volt. Voici le schéma d'un montage qui utilise cette configuration. Il s'agit du schéma d'un projet dont je parlerai bientôt sur ce blog.

Toutes lignes qui relient le MCU au LCD utilisent des pullups de 10K et sont configurées en open drain sur le MCU. Il s'agit d'un bus sur 4 bits plus 3 lignes de contrôle.

alimentation LED en mode drain ouvert

Lorsqu'une sortie complémentaire commute pendant une fraction de seconde il y a un certain courant qui passe de Vdd à Vss à travers les 2 transistors car la commutation n'est pas instantanée. Cela a 2 effets, une consommation électrique supplémentaire et du bruit sur le bus d'alimentation. Si on alimente des LEDs par la cathode comme dans le schéma ci-bas en configurant les sorties du MCU en open drain on élimine ces 2 problèmes.