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.