jeudi 25 décembre 2014

PIC10F322 + CLC = triangulaire

J'aime beaucoup le PIC10F322 car je ne connais aucun autre MCU de cette catégorie qui possède autant de fonctionnalités. Voici un exemple des possibilités offertes par ce MCU . Dans ce démo je fais varié l'intensité d'une LED sans utiliser le moindre cycle CPU en utilisant la richesse des périphériques du PIC10F322. En l'occurrence les périphériques suivants sont utilisés.

  1. TIMER2
  2. PWM1
  3. NCO (Numerically Controlled Oscillator)
  4. CLC (Configurable Logic Cell)

Dans ce vidéo on voie la LED pulsée ainsi qu'a l'oscilloscpoe l'onde en sortie PWM1 (tracé bleu) ainsi que l'onde rectangulaire qui alimente la LED (Tracé en jaune).

On voie que le rapport cyclique du signal varie de façon continu selon une fonction triangulaire et pourtant si vous examiner le code source vous ne verrez aucune instruction pour modifier le rapport cyclique du PWM, on voie d'ailleurs à l'oscilloscope qu'il est fixe. En fait une fois les périphériques configurés le programme entre dans une boucle infinie vide.

Code source

programme prnicipal
code généré par CLC designer

Comment ça fonctionne

Ceci est possible grâce à la Cellule Logique Configurable (CLC). Cette cellule est simplement configurée comme un OU exclusif (XOR gate) qui reçoit en entrés 2 ondes carrées avec un rapport cyclique de 50% à une fréquence d'environ 3200 hertz. L'une de ces ondes est générée par PWM1 et l'autre par le NCO. à l'incrément du NCO est ajouté une valeur appelée NCO_OFFSET de sorte que la fréquence de celui-ci est légèrement différente de celle générée par PWM1. Puisque les fréquences sont différentes la phase des signaux glisse l'un par rapport à l'autre. La fonction XOR fait en sorte que la sortie n'est à 1 que lorsque les 2 signaux sont en opposition de phase.

En fait l'intensité de la LED est directement proportionnelle à la différence de phase entre les 2 signaux.

Elle est où l'onde triangulaire?

Pour ceux qui se demandent quel est le rapport avec une onde triangulaire voici une photo prise à l'oscilloscope en remplaçant la LED par ce filtre passe-basse:

On observe ceci à la sortie du filtre:
Mesuré avec les curseurs la fréquence de l'onde triangulaire est de 0,78 hertz. Pour voir plusieurs cycles de l'onde triangulaire J'ai du changer l'échelle de temps sur l'oscilloscope de sorte que les cycles du signal PWM (en bleu) sont confondus.

Conclusion

Il y a ce qu'il faut dans ce MCU pour fabriquer une circuit à verrouillage de phase (PLL). Voici un schéma simplifié d'un tel circuit.

Le VCO est un oscillateur dont la fréquence est contrôlée par un voltage (indiqué Vcont. sur le dessin). Ce type de circuit peut-être utilisé entre autre comme démodulateur FM ou encore pour générer une fréquence arbitraire à partir d'un fréquence de référence. Plusieurs MCU utilisent un PLL pour générer la fréquence qui contrôle le CPU. Dans ce type d'application il faut insérer un diviseur de fréquence entre la sortie du VCO et l'entrée du XOR. de sorte que le VCO fonctionne à une fréquence multiple de la référence.

mercredi 17 décembre 2014

PIC10F322 clap-switch

L'article précédent j'ai présenté un clap switch fait avec un pro trinket. Mais utilisé une carte qui coûte 10US$ pour faire ça c'est comme vouloir tuer une mouche avec un canon. J'ai fait un autre montage en remplacant le pro trinket par le plus petit des MCU, le PIC10F322 de Micrhochip.

schématique

Pour cette démonstration j'ai dessiné un circuit complet à l'usage de ceux qui voudraient réellement fabriquer la chose pour contrôler une lampe par exemple. Pour ma part je n'ai testé que la partie basse tension (microphone + MCU) en utilisant un LED à la place du relais.

Le circuit es conçu pour l'Amérique du nord. Nous utilisons du 120VAC/60hertz et non du 220VAC/50hertz comme en Europe pour l'alimentation électrique des domiciles.

L'entrée analogique est sur RA2 (broche 3 sur format PDIP) et la sortie de contrôle sur RA0 (broche 4 sur PDIP).

code source

Le code source a été écris en mpasm, il ne fait que 128 instructions et utilise 14 octets de RAM, il peut donc être fait avec un PIC10F320 (256i/32RAM).

idée à explorer

Une modification au logiciel permettrait d'utiliser ce circuit comme verrou électronique qui répondrait à un code rythme. Imaginez qu'on mesure le temps entre chaque claquement et qu'on utilise plusieurs clap on obtiendrais une séquence rythmique pouvant être utilisée comme clé pour dé/verrouiller une porte. Le micro serait collé sur la porte et analyserais les toc-toc au lieu des claquements de mains.

dimanche 14 décembre 2014

Arduino + pro trinket

Cet article est une présentation du projet open source Arduino ainsi que de la carte d'expérimentation pro trinket d'Adrafuit.

Arduino1 est une série de carte microcontrôleurs pour le prototypage rapide et simplifié. Le projet a démarré en 2005 à l'institue de design Ivrea en Italie. Il avait pour but de fournir aux étudiants un remplacement aux BASIC stamp vendu par Parallax jugés trop coûteux. Le projet a rapidement gagné en popularité et est aujourd'hui le plus populaire auprès des amateurs et artistes dans le monde entier. Aujourd'hui il existe de nombreuses cartes clones tel que les trinkets d'Adafruit. Sur la première carte le processeur utilisé était un atMega8, mais maintenant il y a différent modèles avec des processeurs plus puissants dont le Due avec un processeur Atmel SAM3X8E ARM Cortex-M3.

Pour les démos de cet article j'utilise un pro trinket d'Adafruit comme mentionné ci-haut. Les cartes Arduino viennent avec un firmware pré-installé dans le MCU qui sert à télécharger les applications écrites dans l'IDE. L'intérêt ce ces cartes pour les amateurs est qu'il n'est pas nécessaire de potasser les spécifications du MCU car les périphériques sont pré-configurés et qu'il existe un API de programmation simplifié. C'est d'ailleurs ce qui a fait la popularité de ce projet.

Environnement de développement

Adruino possède son propre IDE disponible gratuitement en téléchargement. Pour l'utilisation des trinkets il est préférable de télécharger la version fournie par Adafruit qui est adaptée aux cartes vendues par cette compagnie. L'IDE comme les cartes est simplifié, il est donc facile à prendre en main, d'autant plus qu'il est multilingues. Les menus s'affichent dans la langue du système d'exploitation.

La première chose à faire une fois le logiciel installé est de sélectionner le type de carte utilisé en allant dans le menu outils - type de carte.

Ensuite on peut se débrouiller avec les 5 boutons de gauche sur la barre d'outils qui apparaît sous le menu. Le crochet sert à compiler le programme. s'il y a des erreurs elles sont affichées dans une fenêtre en bas de l'IDE.

Lorsqu'un programme compile correctement on peut le téléversé sur la carte en cliquant sur le 2ième bouton flèche vers la droite. En ce qui concerne le pro trinket il faut peser d'abord sur le bouton reset pour que le bootloader s'active. Le bootloader attend 10 secondes avant de retourner au programme utilisateur.

Le 3ième bouton feuille avec coin plié sert à créer un nouveau projet. Chaque projet apparaît dans une fenêtre séparée.

Le quatrième bouton flèche vers le haut sert à ouvrir un projet existant.

le cinquième bouton flèche vers la bas sert à sauvegarder le projet sur le disque dur.

Le langage de programmation utilise la même syntaxe que C/C++ au point ou nombreux sont ceux qui pensent que c'en est. Il s'agit en fait du langage Wiring, une version simplifié de C++. Il n'y a pas de fonction main() à la place il y a 2 fonctions obligatoires. void setup() qui est exécutée automatiquement au démarrage du processeur et sert à l'initialisation. void loop() qui une boucle dans laquelle le programme principal s'exécute indéfiniment jusqu'à la réinitialisation du MCU.

Donc lorsque vous avez créé un nouveau projet vous devriez inscrire le squelette de ces fonctions avant toute chose. La référence du langage est disponible ici. Si vous connaissez le C/C++ la prise en main sera simple et rapide. Cependant la fonction loop m'a réservée une petite surprise, j'en reparle plus bas.

cartes trinkets

Adafruit vends 4 cartes trinkets. En fait il y a 2 modèles mais une version 5 volt et 3 volt pour chaque modèle. Le trinket (6,95US$) utilise un MCU atTiny84 et a peut de I/O. Le pro trinket (9,95US$) utilise un MCU atMega328P et a plus de I/O. Les cartes on une largeur de 600mil avec espacement entre les broches de 100mil ce qui permet de les brancher sur une carte de prototypage sans soudure. Ces cartes peuvent-être commandées directement via le site d'Adafruit mais aussi chez Digikey.

Premier démo

Écrire un programme qui fait varier en intensité une LED de manière cyclique en utilisant une sortie PWM est si simple avec Arduino qu'on va sauter le traditionnel blinky pour y passer directement. Le montage est simple, il suffit de brancher une LED en série avec une résistance sur une sortie PWM. Sur les cartes trinket ces sorties sont identifiées avec une barre au dessus du numéro. J'ai choisi la sortie 3. Simple n'est-ce pas? Notez que la fonction setup() doit-être présente même si elle est vide. La fonction analogWrite détermine la valeur du rapport cyclique sur les sortie PWM. Cette valeur varie de 0 à 255.

Surprise

mise à jour 2015-08-04
Embarrassant, après avoir lu cet article sur Hackaday, je réalise mon erreur et je me demande comment j'ai pu faire cette erreur. Il n'est en effet pas nécessaire de définir i et delta comme variables globales. j'aurais pu le faire comme ceci:


void loop(){
static byte i=0;
static char delta=1;
 
  i += delta;
  analogWrite(pwmPin,i);
  delay(5);
  if (i==255 || i==0) 
    delta=-delta;  
}
Je connais parfaitement l'usage de de la classe static en C/C++ alors pourquoi n'ai-je pas procédé ainsi? La seule réponse qui me viens à l'esprit est: préjugé. Je me suis laissé influencé par la simplicité du IDE de Arduino et en ai conclu hativement que ce n'est pas du C/C++ alors qu'en réalité ce l'est. Sauf qu'il y a un environnement préfabriqué pour simplifier la vie des non programmeurs. Ainsi les sketchs Arduino son pré-processés pour y ajoutés des #include et des prototypes de fonctions et la fonction main() obligatoire à tout programme en C/C++ est dans un autre fichier. Ainsi la fonction loop() n'est qu'une fonction appellée à répétition à partir de la bouche d'application qui se trouve dans la fonction main() qui est cachée aux utilisateurs d'Arduino IDE. En conclusion toutes les formes du C/C++ peuvent-être utilisées dans un sketch Arduino. Afin c'est presque du C/C++ mais a strictement parlé ce n'en est pas puisqu'il faut un pré-traitement du fichier .ino avant de le compiler avec gcc. Entre autre C/C++ requiert que les fonctions qui sont référencées avant leur définitions soient prototypées, c'est à dire que l'interface de la fonction doit-être déclarée avant d'y faire référence. Habituellement les prototypes sont mis dans un fichier d'entête *.h ou déclarés en début de fichiers. Le pré-traitement des fichiers *.ino a entre autre pour fonctions d'ajouter ces prototypes.

La surprise dont je parlais plus haut concerne les variables i et delta. Normalement ces variables devraient-être locales à la fonction loop. Donc dans ma première version je les avaient définies et initialisées au début de loop().


void loop(){
  byte i=0;
  char delta=1;

Ça ne fonctionnais pas et je me grattais la tête à me demander pourquoi? En C/C++ ça aurait fonctionner car les variables locales ne sont initialisées que lors de l'entrée dans la fonction. Mais ici elles le sont à chaque bouclage!!! Même si la syntaxe est à s'y méprendre ce n'est pas C/C++ c'est Wiring. J'ai donc du définir ces 2 variables au niveau global.

Clap switch

J'ai vu ça dans un commercial à la télé cette semaine, un gadget qui allume ou éteint un lampe en claquant dans les mains. J'ai décidé d'essayer ça en utilisant le trinket. Mon démo utilise la LED rouge qui est sur le trinket et branchée sur la sortie digitale 13. J'ai aussi conservé la LED sur la sortie barre-3 comme indicateur d'intensité sonore. Voici le circuit.

Le signal d'un microphone de type electret est amplifié par le transistor Q1 puis redressé et filtré pour ne garder que l'enveloppe du signal. Si on observe à l'oscilloscope le signal au bornes de C3-R4 on obtient ceci lors d'un claquement de mains.
Le niveau sonore monte rapidement pour diminuer lentement pour une durée totale d'environ 135 millisecondes.

J'ai testé 2 versions différentes du logiciel et elle se valent, en sensibilité et en taux de détection.

La première version utilise un seuil de déclenchement et celle-ci utilise un taux de changement entre 2 lectures. Il doit y avoir 2 claquements de main avec un intervalle maximum de 500 millisecondes entre chaque. La switch répond aussi aux sifflements.


1) Article plus complet sur le wikipedia anglophone.

jeudi 27 novembre 2014

oscillateur

Dans cet article j'explique le fonctionnement des oscillateurs électroniques.

Le pendule

Avant d'expliquer l'oscillateur électronique je vais débuter par une analogie mécanique, le pendule, une balançoire en fait. l'enfant assis dans la balançoire apprend rapidement comment la mettre en mouvement mais aussi comment la freiner. Pour la mettre en mouvement il se laisse tomber vers l'arrière en tirant sur les cordes puis reprends sa position initiale. En répétant de mouvement il augmente l'amplitude des oscillations. Il n'applique pas cette force à n'importe quel moment met lorsque la balançoire atteint le point mort haut arrière, juste au moment ou la descente s'entame. Ainsi l'énergie qu'il apporte au pendule est en phase avec le mouvement de celui-ci. Par contre lorsqu'il veut diminuer l'amplitude il pousse sur les cordes vers l'avant lorsqu'il est en ascension frontale. A ce moment l'énergie qu'il applique est en anti-phase.

Si on accrochait un crayon sur le bord du siège de la balançoire et qu'on faisait défiler a vitesse régulière un large bande de papier le long de la balançoire de sorte que le crayon frotte sur celle-ci, on verrait apparaître sur la bande de papier une onde sinusoïdale.

Circuit accordé

L'inductance et le condensateur sont en quelque sortent des composants complémentaires en électronique. En effet l'inductance accumule de l'énergie dans un champ magnétique et le condensateur dans dans un champ électrique. Si on les combines comme sur cette illustration on obtient un circuit accordé qui possède une fréquence de résonance.

Supposons le montage suivant:

C'est l'équivalent électronique de la balançoire. Si on enfonce le bouton le transistor Q1 entre en conduction et fourni de l'énergie au circuit accordé. Lorsqu'on relâche le bouton. Une certaine quantité d'énergie est accumulée dans le champ magnétique de l'inductance L et le champ électrique du condensateur c. Lorsque le transistor cesse de conduire le champ magnétique de l'inductance s'effondre créant une tension au bornes de celle-ci. Cette tension génère un courant qui va accumuler une charge supplémentaire dans le condensateur. Lorsque le champ magnétique est complètement effondré le condensateur ne reçoit plus de courant par contre il commence à se décharger à travers l'inductance. Ainsi l'énergie est transférée en alternance entre le champ magnétique et le champ électrique. La fréquence à laquelle cette oscillation se produit dépend des valeurs de L et C selon la formule Fosc=1/(2*PI*√(L*C)). C'est l'équivalent du pendule ou l'énergie oscille entre la forme énergie potentielle maximale lorsque le pendule est à l'arrêt aux extrémités de sa course et énergie cinétique maximale lorsque le pendule est au point le plus bas.

Oscillateur électronique

Pour obtenir un oscillateur électronique dont l'oscillation est entretenue il suffit de peser sur le bouton au bon rythme et en phase avec l'oscillation du circuit accordé. Évidemment on ne peut faire ça à la main mais il y a une façon simple d'y arrivé. En récoltant une partie de l'énergie fournie au circuit accordée et en la renvoyant à l'entrée du transistor Q1 de sorte que ce signal une fois amplifié soit en phase avec l'oscillation naturelle du circuit accordée. On appelle ça une rétro-action positive. Examinons le circuit.

Ce montage s'appelle base commune car du point de vue de l'analyse circuit A.C. (courant alternatif) la base du transistor est maintenue au commun de l'alimentation (négatif de la pile dans ce schéma) à travers le condensateur C3 dont l'impédance (résistance AC) est très faible à la fréquence de fonctionnement de l'oscillateur. L'entrée de l'amplificateur ici c'est l'émetteur et le signal de rétro-action est fournie à travers C2. C2 est choisi de sorte qu'il y a suffisamment de signal qui est retourné à l'entrée de l'amplificateur pour maintenir une oscillation stable. Si C2 fourni trop de rétro-action au lieu d'avoir une onde sinusoïdale à la sortie on va avoir de la distorsion, sa valeur ne doit donc être ni trop grande ni trop petite.

J'ai mentionné le terme base commune. Il y a 3 types de montages pour les transistors bi-jonctions, base-commune, émetteur-commun qui est le plus utilisé et finalement collecteur-commun. On peut fabriquer un oscillateur avec n'importe quel type de montage. Le critère pour obtenir une oscillation soutenue est que le gain en boucle fermée soit >= 1. Avec un gain 1 l'onde est sinusoïdale, supérieur à 1 on ajoute de la distorsion. Un gain de 1 signifie qu'on ajoute juste de qu'il faut d'énergie au circuit accordé pour compenser les pertes du aux résistances parasites. A cette valeur de gain on obtient une onde sinusoïdale d'amplitude constante.

Oscillateur à cristal

J'ai commencé cet article par une analogie mécanique, l'oscillateur à cristal est intéressant parce qu'il est à la fois mécanique et électronique. En effet il utilise l'effet piézo-électrique qui est un phénomène électro-mécanique. Un cristal est constitué d'une lamelle de quartz avec une électrode sur chaque face. Lorsqu'une tension électrique est appliquée sur ces électrodes il y a une déformation mécanique du cristal. Lorsque cette tension électrique est relâchée le cristal oscille à une fréquence précise. Comme pour un pendule cette oscillation va s'amortir si elle n'est pas entretenue. N'essayer pas de sortir un cristal de son boitier pour le voir osciller, cette oscillation est à l'échelle microscopique au niveau du réseau d'atomes.

Le schéma suivant illustre un oscillateur à cristal dans un montage collecteur-commun. On l'appelle ainsi car le collecteur est au commun de l'alimentation car en haute fréquence la résistance entre le collecteur et le commun est à toute fin pratique nulle. Ici l'entrée de l'amplificateur c'est la base et la sortie c'est l'émetteur.

C1 et C2 forment un diviseur de tension qui permet de déterminer la valeur de la rétro-action. Ils ont aussi une influence sur la fréquence d'oscillation du cristal puisqu'ils sont en parallèle avec celui-ci.

Oscillateur avec porte logique

Habituellement dans les montages en circuits logiques ont utilise des portes logiques pour fabriquer l'oscillateur. En voici une illustration.

Ici un inverseur est utilisé dans un montage dit Pierce gate oscillator. La résistance de 1M produit une rétro-action négative de sorte que la porte fonctionne comme un amplificateur linéaire au lieu de son mode logique normal. Notez qu'il s'agit d'un inverseur donc le signal en sortie est en anti-phase avec l'entrée. Donc pour produire une oscillation soutenue il faut ajouter un déphasage supplémentaire de 180 degrés. Un déphasage de 360 degrés est équivalent à 0 degrés donc en phase. Le réseau formé par XTAL,C1,C2,C3 produit le déphasage nécessaire. La résistance de 1K réduit l'intensité de la rétro-action. Les condensateurs C1,C2,C3 ont un influence sur la fréquence d'oscillation, c'est pourquoi C1 est ajustable. En pratique dans la majorité des cas on néglige l'installation de C1 à moins que le montage requiert une très grande précision en fréquence. Les MCUs qui ont un circuit pour oscillateur à cristal en interne utilisent en fait ce type de montage.

Distortion

Un circuit électronique n'est jamais parfait il y a toujours un certain niveau de bruit dans le circuit. Ce bruit de fond est causé par l'agitation thermique et est proportionnel à la température. En fait ce bruit de fond est indispensable au démarrage des oscillations. Pour qu'il y est une rétro-action positive il faut d'abord qu'il y est un signal à la sortie de l'amplificateur. Il y a une autre façon de voir l'oscillateur. On peut le voir comme un amplificateur qui retourne le signal à sa sortie vers l'entrée à travers un filtre. Ce filtre laisse passé une fréquence déterminée et bloque les autres de sorte que seule cette fréquence est amplifiée. Au départ il faut que le gain soit supérieur à 1 pour qu'il est amplification mais si ce gain demeure supérieur à 1 l'amplificateur va saturé et le résultat ne sera pas une onde sinusoïdale.

L'astuce pour obtenir un signal de sortie qui s'approche le plus possible d'une sinoïde est de réduire le gain à 1 avant que l'amplificateur ne sature. Généralement ceci est obtenu simplement en choisissant le point d'opération du transistor de sorte que le gain diminue avec l'amplitude du signal.

J'ai fait quelques simulations dans le logiciel LTspice et voici un exemple d'oscillateur Clapp.

L'étage de sortie formée par le transistor Q2 ne participe pas à l'oscillation il ne sert qu'à isoler l'oscillateur formé par Q1, L2, C1,C2,C3.

sortie de l'oscillateur

On voit que le signal à la sortie augmente de façon logarithmique à partir de zéro jusqu'à une valeur maximale. Plus le gain initial est proche de l'unité plus il faut de temps à l'oscillateur pour atteindre la valeur maximale. Dans cette simulation il faut environ 100µS pour atteindre l'amplitude maximale.

Examin de la forme d'onde

J'ai zoomer une petite partie du signal ci-haut pour évaluer à l'oeil la forme d'onde. C'est un sinoïde presque parfait. Donc le gain de Q1 a diminué à la valeur 1 avant la saturation, c'est le résultat escompté.

Analyse de Fourier

Voici le résultat de l'analyse DFT du signal à la sortie de Q2. La pointe qui approche de la ligne du 0db correspond à la fréquence de l'oscillateur. La fréquence est donc d'environ 15,5Mhz. La valeur théorique calculée est de 15,66Mhz. A la droite du pic principal on voit une série d'autres pics de plus faible amplitude. Ce sont les harmoniques de la fondamentale. Leur hauteur indique le niveau de distorsion. On voie que la première harmonique est à environ 48db plus bas que la fondamentale. Ce qui est assez bon. 60db serait excellent. En plus des harmoniques on voit le bruit de fond aussi appelé distorsion de phase. Somme toute ce montage produit un signal d'assez bonne qualité reste à voir s'il serait stable en situation réelle. Pour améliorer la stabilité dans un montage réel il faut utiliser pour les condensateurs C1,C2,C3 et C4 des céramique de type NPO ou C0G.

Oscillateurs RC

Dans les fréquences audio le type d'oscillateur le plus fréquemment utilise des filtres RC (Résistance/condensateur). Les oscillateurs les plus simples à réaliser sont les multivibrateurs bistables. Ils produisent des ondes rectangulaires. En voici deux exemples simulés dans LTspice.

Le montage classique qui produit des ondes complémentaire en Vc1 et Vc2.
R3-C1 et R4-C2 détermine la durée de chaque demi-période. En ajustant les valeurs on peut donc obtenir un rapport cyclique différent de 50%.
Voici un deuxième type de bistable. Celui-ci produit un train d'impulsion très courtes. L'intervalle entre les impulsions est déterminé par la constante de temps R2-C1. Dans cette exemple l'intervalle est de 583µs et la largeur des impulsions est de 8,5µs.

Oscillateur sinusoïdale audio-fréquence

La méthode la plus simple de produire une onde sinusoïdale en audio fréquence est d'utiliser un amplificateur opérationnel avec un pont de Wein.

La fréquence d'oscillation est Fo=1/2*PI*R*C ou R est la valeur de R3 ou R4 et C est la valeur de C1 ou C2. Dans cette exemple on a donc Fo=1/2*3.1415*10e3*10e-9=1,59Khertz. Le pont de Wein est constitué des composants C1,C2,R3,R4. Les résistances R1,R2 détermine le gain de l'amplificateur opérationnel. Les 2 diodes D1,D2 et la résistance R5 sont utilisés pour diminuer le gain avant la saturation de l'amplificateur. Les diodes introduisent un élément de non linéarité dans le gain. Plus elles conduisent plus la résistance équivalante R1//R5 diminue entrainant une perte de gain. Voici à quoi ressemble le signal de sortie.
Avec le limiteur de gain.
Sortie si on enlève D1,D2 et R5.

Ce circuit n'est pas optimum même avec le limiteur de gain il y a encore trop de distortion dans le signal. Un oscillateur de Wein bien conçu peut avoir une distorsion harmonique aussi faible que 0,003% selon Horowitz et Hill1.

Oscillateur sinusoïdal 1Khz avec transistor bi-jonction

Ce circuit est un oscillateur à décalage de phase réalisé avec un transistor bi-jonction 2N3904.

Il s'agit d'un montage en émetteur commun. La sortie au collecteur de Q1 Vc1 est en anti-phase avec l'entrée Vb1. Donc pour produire une rétroaction positive il faut décaler la phase du signal en Vc1 avant de l'injecter en Vb1. C'est le rôle du réseau de condensateurs et résistances C1,C2,C3 et R1,R2,R3. Chaque pôle décale la phase de 60° pour un total de 180°. Pour éviter la saturation on diminue le gain de l'amplificateur en insérant la résistance R6 de 47 ohm en série avec C4. Le calcul de la fréquence se fait par la formule suivante lorsque R1=R2=R3 et C1=C2=C3.

   Fo=1/(2*PI*R*C*√6)
Signal de sortie, environ 100mV RMS.
Analyse FFT du signal à la sortie selon le simulateur LTspice. La première harmonique est atténuée d'environ 32db par rapport à la fondamentale.

En guise de conclusion

Pour conclure voici un vidéo qui montre comment fabriquer un mouchard qui transmet dans la bande FM. Une recherche dans Google permet de trouver de nombreux exemples de ce type de montage ainsi que plusieurs autres vidéo sur youtube.


NOTES

  1. The art of electronics 3rd edition, Paul Horwitz et Winfield Hill, editeur: Cambridge university press.

dimanche 23 novembre 2014

Lazarus

Ce matin je me réjouis car j'ai découvert que Lazare est ressuscité1. Dans les années 80 je suivais des cours d'informatique à l'UQAR et le langage de programmation utilisé pour ces cours était le Borland Turbo Pascal qui était très populaire à cette époque. Puis MS-DOS a été remplacé par Windows et Turbo Pascal est devenu Borland Delphi maintenant vendu par Embarcadero. Professionnellement j'ai développé quelques applications en delphi 6 mais à titre personnel je n'ai jamais été intéressé à défrayer le coût de la version la moins coûteuse de cet environnement qui vaut 209US$ Je suis donc passé à d'autre IDE comme SharpDevelop. C# est un langage intéressant et l'IDE de SharpDevelop aussi mais comme c'est construit par dessus .NET c'est restrictif en terme de plateformes cibles.

Lazarus

Ce que j'ai découvert ce matin c'est l'existance d'un projet open source appellé Lazarus. C'est un IDE qui utilise le compilateur Free Pascal. Cet IDE est un clone libre et gratuit de Delphi. les projets Delphi peuvent même être importés dans cet environnement, le langage étant le même c'est à dire Pascal Objet.

Cet IDE est disponible sous Windows 32/64bits, GNU/Linux 32/64 bits, OSX Intel 32bits/PowerPC. Le compilateur Free Pascal compile du code natif. Il ne nécessite donc pas l'installation de machine virtuelle Java ou CLI (.NET) et tout les librairies associés à ces gros systèmes.

Formidable avec cet IDE je vais pouvoir développer des applications Desktop aussi bien pour Windows que pour Linux dans un environnement et un langage qui me sont familiers.


1) humour hautement dépendant de la culture d'origine de l'auteur.

jeudi 13 novembre 2014

CHIPcon partie 9, ccemul

Dans ce neuvième article sur le projet CHIPcon je présente l'utilitaire ccemul. Il s'agit d'un simulateur de la console CHIPcon fonctionnant sous Windows. Ce simulateur ne permet pas seulement d'exécuter des jeux CHIPcon et SCHIP mais possède aussi des facilités de débogages. Avec les utilitaires ccasm et cc-dasm il complète le CHIPcon DEV KIT. Voici une capture d'écran de la fenêtre principale de l'émulateur.

Utilisation du clavier

Le simulateur est configuré pour le clavier Nord-Américain QWERTY et utilise les touches à gauche du clavier de la façon suivante. Le chiffre entre parenthèse représente la correspondance sur le keypad de la console CHIPcon.

1 (1)2 (2)3 (3)4 (A)
Q (4)W (5)E (6)R (B)
A (7)S (8)D (9)F (C)
Z (E)X (0)C (F)V (D)

Sur la fenêtre principale de l'application le seul contrôle qui peut avoir le focus du clavier, hormis le menu, est le contrôle de vitesse (speed). Donc pour lire les touches du clavier l'émulateur utilise les événements keydown et keyup associé à ce contrôle. Si on presse la touche alt à gauche de la barre d'espacement le focus du clavier passe à la barre de menu et donc le jeux ne réponds plus événements du clavier. Il faut donc s'assurer que c'est bien le contrôle d'ajustement de la vitesse qui a le focus, ce qui par défaut est bien le cas.

Flux de travail

Le développement d'un jeux pour la console CHIPcon se fait selon le flux de travail suivant:

Après avoir écris le programme source dans son éditeur préféré en prenant soin d'utiliser un encodage ANSI pour le fichier, l'auteur utilise ccasm pour assembler ce code source en fichier binaire. Optionnellement il peut générer un fichier *.ppf en utilisant l'option -p pour voir de quoi a l'air le code pré-traité tel qu'il est transmis à l'assembleur proprement dit. Cette option est surtout utile lors du développement de l'assembleur lui-même. L'autre option -s sert à générer un fichier texte qui contient la liste des cibles (labels) qui sont dans le programme source. Ce fichier est utilisé pour le débogage du jeux dans le simulateur ccemul. Une fois le jeux complété et débogué le fichier binaire est copié sur une carte SD et utilisé sur la console CHIPcon.

Pour créer un fichier *.lbl il faut utiliser l'option -s symbol_file lors de l'assemblage du fichier source.


ccasm lem.chp lem.bin -slem.lbl
Si on ouvre un fichier xyz.bin dans le simulateur, celui-ci regarde s'il y a un fichier xyz.lbl dans le même répertoire et charge la liste des symboles qu'il contient. La boite de dialogue Break points affiche cette liste et permet ainsi de créer un point d'arrêt à la position d'une de ces étiquettes. Si aucun fichier xyz.lbl n'existe un message d'erreur apparait mais le jeux va quand être exécuté mais il ne sera pas possible de mettre des points d'arrêt. Si vous donnez une autre extension à ce fichier vous devrez le charger manuellement avec l'option Load labels file du menu debug.
Le nombre à droite du nom de l'étiquette est l'adresse programme où est situé cette étiquette.

Vidéo de présentaion de ccemul

Le vidéo suivant présente le fonctionnement de ccemul.

Jeux LEM

J'ai créé une version du jeux des années 197x lunar landing pour CHIPcon. Je l'ai baptisé LEM du nom du module lunaire du projet Apollo. Il s'agit de faire alunir le LEM de façon sécuritaire. Sous l'effet de la gravité lunaire le LEM accélère continuellement alors qu'il se dirige vers le sol. Il faut le ralentir en utilisant la fusée principale touche 2. Il faut aussi le posé sur le seul endroit plat. Pour se déplacer horizontalement il y a 2 fusées latérales. touche 4 vers la gauche et touche 6 vers la droite. Pour un alunissage sécuritaire non seulement il faut se poser sur le plat mais il faut que les vitesses horizontales et verticales soient inférieures à 2 unités. Au départ le réservoir contient 100 unités de carburant. Le coin supérieur gauche indique le niveau de carburant.

Un alunissage réussi fait apparaitre le message congratulation! sinon c'est écris You crashed!. Le score (nombre de succès/nombre d'essais) s'affiche à la fin de chaque essais. Il faut enfoncer n'importe qu'elle touche pour le prochain essai.

Conclusion

Bien qu'un projet n'est jamais vraiment complété, ceci est le dernier article de cette série. Il y a peut-être encore un (des) bogue(s) moins évident qui se cache dans le firmware de la console ou de l'un des programmes du DEV KIT, mais tel qu'il est se projet est suffisamment stable pour être utilisable.

Ce projet m'a conduit beaucoup plus loin que ce que j'avais prévu au départ. Tout ça est open source donc si ça vous intéresse vous pouvez le prendre en main et le mener plus loin, ou simplement construire votre propre console CHIPcon pour y jouer les jeux disponible sur www.chip.com.


liens

CHIPcon partie 1, présentation du projet.
chipcon partie 2, machine virtuelle
CHIPcon partie 3, module SRAM
CHIPcon partie 4, tvout
CHIPcon partie 5, clavier et émulateur PC.
CHIPcon partie 6, interface carte SD
CHIPcon partie 7, le boitier
CHIPcon partie 8, ccasm
dépot githup du projet.
page www.chip.com rassemblant beauceaup d'information sur CHIP-8/SCHIP/MegaCHIP
article de wikipedia sur CHIP-8
Page de Roland Riegel concernant sa librairie MMC/SD/SDHC.

NOTE: ccemul a été développé avec SharpDevelop version 5 et compilé pour le .NET version 3 et processeur Intel 32 bits. Le programme compilé devrait donc fonctionné sur tout PC avec un windows 32/64 bits avec les librairies runtime .NET version 3+ installées.

mercredi 5 novembre 2014

CHIPcon partie 8, ccasm

C'est bien beau d'avoir une console de jeux mais il faut aussi pouvoir écrire des programmes pour cette console. Comme CHIPcon ajoute 4 instructions à celles de SCHIP il a bien fallu que je cré un assembleur spécifique à CHIPcon. J'ai baptisé cet assembleur ccasm (CHIPcon assembler). Le code source et le binaire compilé pour Windows avec minGW gcc 4.8.1 se trouve dans le répertoire tools. Son utilisation est des plus simple:


ccasm test.chp  test.bin [-p test.ppf]
test.chp est le nom du fichier source assembleur CHIPcon.
test.bin est le nom du fichier binaire qui sera généré par ccasm.
L'option -p si elle est présente produit un fichier contenant les lignes pré-processées tel que passées à l'assembleur. test.ppf est le nom du fichier générer par le pré-processeur.

ccasm

Pour connaître les instructions supportées par la machine virtuelle de CHIPcon il faut se référer à la table présentée dans la partie 2 de cette série.

En plus des instructions machines l'assembleur supporte les directives suivantes:

directiveutilisationdescription
EQU
EQU identifier expression
Directive de pré-processeur.
Comme pour la plupart des assembleurs cette directive permet de définir des symboles de substitution pour des constantes numériques.
exemple:
EQU BYTE_PER_ROW 128/8
DEFNDEFN identifier stringDirective de pré-processeur.
Permet de substiuer une chaîne de caratère par un nom symbolique. Utile pour nommer les variables VX.
exemple:
DEFN xpos V4
DB
DB BYTE [,BYTE]
Directive d'assembleur.
Permet de créer une ou plusieurs donnée de type BYTE (8 bits) dans l'espace programme.
DW
DW WORD [,WORD]
Directive d'assembleur.
Permet de créer une ou plusieurs donnée de type word (16 bits) dans l'espace programme.
ASCII
ASCII "text..."
Directiver d'assembeur.
Permet de créer une chaîne de caractères terminée par un zéro dans l'espace programme. Cette chaîne peut-être affichée à l'écran en utilisant le code opérationnel PRT.

Expressions

Partout où une constante numérique est applicable une expression arithmétique peut-être utilisée. Les opérateurs reconnus sont '+' addition, '-' soustraction, '*' multiplication, '/' division et '%' modulo ainsi que les parenthèses '(',')'.
exemple:


;programme hello world

equ SCREEN_WIDTH 128
equ SCREEN_HEIGH 64
equ CHAR_HEIGH 8
equ CHAR_WIDTH 6
equ CHAR_PER_LINE  SCREEN_WIDTH/CHAR_WIDTH
equ TEXT_LEN 12

defn XPOS V3
defn YPOS V4

high
cls
ld I, REG_INIT 
ld V4,[i] ; initialisation registres V0..V4
ld I, MSG
prt XPOS,YPOS ; imprime message à  l'écran
exit
REG_INIT:
db 0, 0, CHAR_HEIGH*4, CHAR_WIDTH*(CHAR_PER_LINE-TEXT_LEN)/2
MSG:
ascii "hello world!"

Assemblé avec l'option -p le fichier pré-processé contiendrais:


13  HIGH 
14  CLS 
15  LD I , REG_INIT 
16  LD V4 , [ I ] 
17  LD I , MSG 
18  PRT V3 , V4 
19  EXIT 
20 REG_INIT: 
21  DB 0 , 0 , 8 * 4 , 6 * ( 21 - 12 ) / 2 
22 MSG: 
23  ASCII "hello world!"

Commentaires

Les commentaires commence par ';' et se termine à la fin de la ligne.

Identificateur

Les identificateurs commence par une lettre ou le caractère '_'. Ce premier caractère peut-être suivi de lettres,chiffres et '_'. Les identificateurs sont utilisées pour les étiquettes et les symboles définis par EQU et DEFN.

Étiquettes

Les étiquettes sont placées en début de ligne et immédiatement suivie du caractère ':'. Les étiquettes sont des repères pour les instructions JP étiquette, les appels de sous-routines CALL étiquette ainsi que pour le chargement du registre pointeur de données LD I, étiquette. Le caractères ':' ne fait pas partie du nom de l'étiquette et ne doit donc être utilisé qu'à l'endroit où l'étiquette est définie. Une instruction peut suivre une étiquette sur la même ligne.


boucle: LD V1, 4 ; ceci est valide
MSG: ascii "hello world!"  ; ceci est  valide

Nombres et bases

ccasm reconnait les nombres entiers seulement dans les bases décimal, hexadécimal et binaire. Le caractère # indique un nombre hexadécimal et le caractère '$' indique un nombre binaire. Dans les nombres binaires le zéro peut-être remplacé par un point '.' dans le but d'accentuer la forme des sprites.
exemples:


546      ; nombre décimal
#f585    ; nombre hexadécimal
$101001  ; nombre binaire
$1.1..1  ; même nombre binaire 

; le point à la place du zéro permet
; de mieux visualiser la forme du sprite
sprite:
DB $..1111..
DB $.1....1.
DB $1......1
DB $1.1..1.1
DB $1......1
DB $1..11..1
DB $.1....1.
DB $..1111..

code source

Le code source du programme doit-être en ASCII ou ANSI (Windows). L'assembleur est insensible à la casse, les lettres étant converties automatiquement en majuscules. Il n'y a qu'une instruction par ligne. Le traitement se fait par ligne en 2 phases. En première phase si la ligne est une directive EQU ou DEFN le nouveau symbole est créé dans la liste. Si la ligne est une instruction assembleur ou une directive de donnée, le pré-processeur analyse chaque mot de la ligne et substitue les symboles définis par des EQU et DEFN. Il converti aussi les lettres minuscules en majuscules. Cette ligne pré-processée est ensuite assemblée en phase 2.
La description formelle de la syntaxe reconnue par ccasm est dans le fichier tools/ccasm_bnf.txt

Avec son assembleur et son dé-assembleur CHIPcon est prêt pour le développement de jeux. Mais ce serait mieux s'il y avait un émulateur sur le PC pour éviter d'avoir à copier le fichier binaire sur carte SD afin de le tester sur la console. Opération qui doit-être répétée de nombreuses fois lors du développement. La création de cet émulateur ccemul est donc la prochaine étape de ce projet.


liens

CHIPcon partie 1, présentation du projet.
chipcon partie 2, machine virtuelle
CHIPcon partie 3, module SRAM
CHIPcon partie 4, tvout
CHIPcon partie 5, clavier et émulateur PC.
CHIPcon partie 6, interface carte SD
CHIPcon partie 7, le boitier
dépot githup du projet.
page www.chip.com rassemblant beauceaup d'information sur CHIP-8/SCHIP/MegaCHIP
article de wikipedia sur CHIP-8
Page de Roland Riegel concernant sa librairie MMC/SD/SDHC.

vendredi 31 octobre 2014

CHIPcon partie 7, le boitier

J'ai complété la fabrication du boitier pour CHIPcon. Entièrement fabriqué à partir d'une feuille de plastique noir récupérée d'une horloge pendule et de colle.

Voici un deuxième vidéo pour démontrer l'effet du bouton game speed sur la vitesse d'exécution des jeux. Ici il s'agit du jeux blinky, clone de Packman créé par Hans Christian Egeberg.


liens

CHIPcon partie 1, présentation du projet.
chipcon partie 2, machine virtuelle
CHIPcon partie 3, module SRAM
CHIPcon partie 4, tvout
CHIPcon partie 5, clavier et émulateur PC.
CHIPcon partie 6, interface carte SD
dépot githup du projet. mise à jour le 2014-10-24, utilitaire chip-dasm (schip dé-assembleur).
page www.chip.com rassemblant beauceaup d'information sur CHIP-8/SCHIP/MegaCHIP
article de wikipedia sur CHIP-8
Page de Roland Riegel concernant sa librairie MMC/SD/SDHC.

mardi 28 octobre 2014

CHIPcon partie 6, interface carte SD

Dans cette partie je documente l'interface avec la carte SD. Pour l'accès à la carte SD j'ai utilisé la librairie créé par Roland Riegel.

Il y a plusieurs librairie SD/SDHC/MMC disponible pour les atMega, j'ai choisie celle de Roland Riegel pour sa facilité d'utilisation. Pour l'intégrer à mon projet j'ai eu très peut de travail à faire. S'il avait fallu que je cré ma propre librairie le temps travail aurait plus que doublé. Chaque module de la librairie a un fichier *_config.h qu'il suffit d'adapter à ses besoins.

Pour commencer dans le fichier hardware.h de mon projet j'ai ajouter la définition suivante:


#define __CHIP_COMP__ 1
J'ai ensuite utiliser cette définition pour contrôler une compilation conditionnelle de certaines variables dans les fichiers sd_raw_config.h et fat_config.h. Je ne détaillerai pas l'interface de cette librairie. Je ne l'ai d'ailleurs pas étudier en détail. J'ai plutôt créé une interface entre cette librairie et CHIPcon en m'inspirant d'un exemple d'application fourni par Roland Riegel. Mon interface comprend les fichiers suivants: filesys.h et filesys.c
  • uint8_t fs_mount()
    Vérifie s'il y a une carte dans le support et si c'est le cas monte le système de fichier. Retourne 1 en cas de succès et 0 autrement. Un seul système de fichier peut-être ouvert à la fois.
  • void fs_umount()
    Ferme le système de fichier.
  • uint8_t fs_open_dir(char *dir_name)
    Ouvre un répertoire. Un seul répertoire peut-être ouvert à la fois. Retourne 1 en cas de succès et 0 autrement.
  • void fs_close_dir()
    Ferme un répertoire.
  • uint8_t fs_open_file(char *file_name)
    Ouvre un fichier. Un seul fichier peut-être ouvert à la fois. Retourne 1 en cas de succès et 0 en cas d'échec.
  • void fs_close_file()
    Ferme le fichier ouvert.
  • uint8_t fs_load_file(uint16_t file_no)
    Charge le contenu du fichier dans la mémoire SRAM. Retourne le nombre d'octets chargés.
  • uint8_t fs_read_dir(struct fat_dir_entry_struct *dir_entry)
    Retourne l'entrée suivante du répertoire. Retourne 0 à la fin de la liste.

CHIPcon n'affiche que la liste des fichiers qui se trouve dans le répertoire racine. Notez qu'il affiche le nom de tous les fichiers. Donc si l'utilisateur sélectionne un fichier qui n'est pas un binaire SCHIP la machine virtuelle schip() va plantée à l'exéctuion d'un tel fichier laissant une message CRASH! BAD OPCODE à l'écran.

La librairie de Roland Riegel est configurée pour utilisation en lecture seule afin de sauver de l'espace code. Tel quel elle consomme environ 5Ko de flash.


liens

CHIPcon partie 1, présentation du projet.
chipcon partie 2, machine virtuelle
CHIPcon partie 3, module SRAM
CHIPcon partie 4, tvout
CHIPcon partie 5, clavier et émulateur PC.
dépot githup du projet. mise à jour le 2014-10-24, utilitaire chip-dasm (schip dé-assembleur).
page www.chip.com rassemblant beauceaup d'information sur CHIP-8/SCHIP/MegaCHIP
article de wikipedia sur CHIP-8
Page de Roland Riegel concernant sa librairie MMC/SD/SDHC.

dimanche 26 octobre 2014

CHIPcon partie 5, clavier et émulateur PC

Cette partie documente le module keypad constitué des 2 fichiers keypad.h et keypad.h.

Agencement du clavier

La mojorité des jeux CHIP-8/SCHIP que j'ai trouvé dans l'internet ont été écris pour fonctionner dans des émulateurs tournant sous Windows. Donc la disposition du clavier est différente. Certains émulateurs sont configurés en pensant à l'utilisation du pavé numérique d'autres utilisent certaines lettres du pavé alphanumérique. Par exemple l'émulateur Fish'n chip utilise les touches à gauche du clavier alphanumérique. La correspondance avec le clavier COSMAC VIP est représenté en caractères gras.

clavier QWERTY
1 12 23 34 C
Q 4W 5E 6R D
A 7S 8D 9F E
Z AX 0C BV F

CHIPcon utilise un clavier Grayhill 96BB2-056-R représenté ici à côté du clavier COSCMAC VIP. On voie donc que la disposition est différente. Pour CHIPcon [*] correspond à [E] et [#] correspond à [F]. Donc lorsqu'on télécharge un jeux pour l'utiliser avec CHIPcon on doit tenir compte de ces différences.

interface keypad

  • void keypad_init()
    Initialisation matérielle du clavier.
  • uint8_t keypad_read()
    Lecture d'une touche avec anti-rebond.
  • uint8_t wait_key()
    Attend qu'une touche soit enfoncée et retourne sa valeur. Lecture avec anti-rebond.
  • void prompt_key()
    Affiche le message "any key..." et attend une touche.
  • uint8_t keypad_break()
    Vérifie si les touches [*] et [#] sont enfoncées en même temps. Retourne vrai si c'est le cas. Utilisé pour sortir de la fonction schip() lorsqu'un programme est bloqué dans une bouche infinie.
  • uint8_t key_down(uint8_t key)
    Vérifie si la touche key est enfoncée. Il n'y a pas d'anti-rebond, le programme SCHIP doit gérer lui-même l'anti-rebond.

Outils de développement

Dans le répertoire tools du projets il y a 2 utilitaires.

cvt-chip est utilisé pour convertir un fichier binaire SCHIP en fichiers source *.c et *.h dans le but d'intégrer un jeux dans la mémoire flash de CHIPcon. Voici un exemple pour sokoban.sc.

commande pour convertir le fichier binaire.


cvt-chip.exe sokoban.sc
Gènère les fichiers sokoban.h

sokoban.c

Le texte


"Sokoban by Hap\n"
"keys:\n"
"5 up\n"
"8 down\n"
"7 left\n"
"9 right\n"
"A select\n"
Doit-être ajouter manuellement. Ce texte défile à l'écran avant le démarrage du jeux.

Un autre utilitaire est chip-dasm qui est un dé-assembleur. A partir d'un fichier binaire SCHIP il génère un fichier lisible par l'humain ou chaque instruction est représenté par un mnémonique. Voici ce que ça donne avec le fichier field.ch8

D'autres utilitaires sont disponibles en téléchargement sur http://www.chip.com. En autre MegaCHIP devkit 1.0. Ainsi que l'émulateur fish'n chip


liens

CHIPcon partie 1, présentation du projet.
chipcon partie 2, machine virtuelle
CHIPcon partie 3, module SRAM
CHIPcon partie 4, tvout
dépot githup du projet. mise à jour le 2014-10-24, utilitaire chip-dasm (schip dé-assembleur).
page www.chip.com rassemblant beauceaup d'information sur CHIP-8/SCHIP/MegaCHIP
article de wikipedia sur CHIP-8