mercredi 26 décembre 2018

sans MCU

AVERTISSEMENT: Ce projet ne contient aucun MCU ni OGM.

Battement cardiaque

Il est simple de produire avec un µC un effet de battement cardiaque avec une DEL. Il suffit d'utiliser un périphérique PWM pour générer une fréquence entre 100 et 200Hertz et de modifier le rapport cyclique de 0% à 100% progressivement pour ensuite redescendre vers 0% et ceci en boucle. Le rythme cardiaque étant déterminé par la vitesse à laquelle le rapport cyclique est modifié. On peut aussi faire ça sur un PIC10F200 qui n'a pas de PWM par simulation logicielle, c'est pas trop compliqué.

Minuterie 555

La minuterie 555 est un petit circuit intégré qui a été mis en marché en 1971 et qui est toujours d'actualité. Rares sont les C.I. de cette époque qui ont survécus jusqu'à aujourd'hui. Le 555 est un des plus grand succès commercial de l'histoire de l'électronique. Aujourd'hui il existe des versions CMOS qui peuvent fonctionner jusqu'à 2 Mégahertz comme c'est le cas du TLC555 que j'ai utilisé pour ce projet.

Il s'agit simplement d'une démonstration de l'effet heart beat réalisé sans µC. Il faut 2 TLC555 par contre.

schématique

Comment ça marche

On a 2 oscillateurs qui produisent une onde carrée sur leur sortie à la broche 3. 2 DELs sont branchées entre les sorties des 2 oscillateurs. D1 allume lorsque la sortie de U2 est à Vdd et celle de U1 à zéro volt. Pour D2 c'est l'inverse qui est vrai.

Imaginez que les 2 oscillateurs fonctionnent exactement à la même fréquence. Si les 2 sorties sont en phase les DELs seront toujours éteintes. Par contre si elles sont en opposition de phase les DELs allumeront en alternance.

Mais que ce passe-t'il si on ajuste RV1 pour que la fréquence de U2 soit légèrement différente de celle de U1? Leur cycle de se suivent plus. Il y a un décalage progressif entre les 2 ondes. La portion de cycle ou les 2 signaux sont en opposition de phase varie continuellement. Donc le temps que les 2 DELs allument est une fraction totale du cycle comme s'il s'agissait d'un PWM dont on fait varier le rapport-cyclique.

La fréquence des oscillateurs étant réglée à environ 300 hertz, notre œil ne perçoit pas le clignotement qui est trop rapide. Il intègre plutôt la luminosité comme une intensité moyenne et cette moyenne varie à la fréquence de

Fhb=|Fosc1-Fosc2|
Fhb fréquence de battement des DELs. Fos1 fréquence générée par U1 Fos2 fréquence générée par U2
La différence de fréquence entre les 2 oscillateurs correspond à la fréquence cardiaque des DELs qui est la même pour les 2.

Dans le vidéo suivant je manipule RV1 pour modifier la fréquence de U2 et on peut constater l'influence sur le rythme cardiaque.

sculpture

Un coup parti pourquoi se gêner. Comme vous l'avez constater dans le vidéo j'ai fabriquer une petite sculpture avec ce projet pour la soumettre au concours de sculpture électronique de hackaday.

Le montage est effectué sur le lamelle de microscope.

Lien

Pour voir d'autre photos de cette sculpture suivez ce lien.

toile d'araignée musicale.

Comme je complétais mon article précédent sur ce blog le site hackaday lançais un concours de sculptures électroniques. J'ai décidé d'y participer en continuant sur ma lancé de boite à musique. J'ai baptisé mon projet music from the web. Ceci est une présentation en français de ce projet.

Music from the web

Dans l'article précédent je présentait une boite à musique réalisée d'abord avec un PIC10F202 et ensuite avec un PIC10F322. Après j'ai songé à faire la même chose avec un PIC12F1572. Et c'est à ce moment que l'annonce du concours a été publiée. Bien que je n'ai aucune prétention artistique je me suis dis que ça ne coûtait rien de tenter ma chance. Et je ne sais trop comment l'idée d'une toile d'araignée montée sur le cône d'un haut-parleur m'est venue.

PIC12F1572

Parlons d'abord du PIC12F1572. Ce petit µC est disponible en format DIP-8 mais aussi SOIC-8. 8 broches comme un araignée a 8 pattes. C'est peut-être de cette similitude que m'est venue l'idée de l'araignée au centre de sa toile. Ce qui est intéressant avec ce petit µC se sont ses 3 périphériques PWM de 16 bits. Il est parfait pour contrôler une LED RGB. Mais on peut aussi l'utiliser pour faire de la musique. Dans ce projet j'utilise 1 PWM pour générer les notes musicales et 1 autre pour contrôler l'enveloppe. Comme la boite à musique n'utilise que 2 broches de sorties je me demandais quoi faire avec les autres. J'ai décidé d'utiliser le 3ième PWM pour générer une effet battement de cœur avec une petite DEL montée sur le dos du PIC10F1572 en centre de la toile. Cette DEL pulse comme un coeur qui bas au rythme de la musique. Mais il restait encore 2 broches inutilisées. Le PIC12F1572 possède aussi un périphérique CWG (Complementary Waveform Generator). Ce périphérique prend un signal rectangulaire et produits 2 signaux en opposition de phase. J'ai décidé de le mettre à profit en installant 2 séries de 4 DELs sur la circonférence du haut-parleur. Une série de DEL rouges et une autre de vertes en alternance. Le CWG est alimenté par le PWM qui contrôle l'enveloppe du son. On a donc que les DELs vertes allument en alternance avec les rouges au rythme de chaque note jouée. Le PIC12F1572 possède 2K de mémoire flash et le logiciel n'occupe qu'environ 20% de cette mémoire ce qui laisse beaucoup d'espace pour les mélodies. La boite à musique contient 22 mélodies, qui sont jouées en séquence chaque fois qu'on presse le bouton RESET.

schématique

schématique

réalisation

sculpture complétée

vidéo

lien

source du projet. Comme il s'agissait d'une soumission pour un site anglophone le readme.md est en anglais.

vendredi 30 novembre 2018

boite à musique réalisée avec un PIC10F202

Ce projet est en réponse à une question publié sur l'entrée Busy Bee partie 5, boite à musique.

Boite à musique

Une boite à musique réalisée avec un µC PIC10F202 et quelques composants.

Description

Le PIC10F202 est le plus simple et limité des µC. Comme périphérique il ne possède qu'une minuterie de 8 bits. Donc presque tout doit-être fait en logiciel. La minuterie est utilisée pour contrôler la fréquence de la note. La durée de la note ainsi que la durée du soutenu de la note sont contrôlées par des compteurs logiciels de 24 bits avec une résolution de 8µSec.

Le PIC10F202 possède seulement 512 octets de mémoire flash. De plus les appels de sous-routines sont limités aux adresse 0 à 255 (page 0). Cette limitation impose 2 contraintes au projet. La première est que toutes les tables de données doivent-être situées entre les adresses 0 et 255. Les entrées de sous-routines doivent aussi être situées dans l'espace d'adressage entre 0 et 255. Ce qui m'a obligé à utiliser un artifice pour placer les sous-routines après l'adresse 255. L'instruction GOTO est là seule qui permet de couvrir les 512 mots d'adressage. Donc je place les entrées de sous-routines dans la page 0 mais ces entrées ne contiennent qu'un GOTO vers le vrai code de la sous-routine qui est après l'adresse 256 (page 1). Ceci permet de conserver l'espace de la page 0 pour les tables de données.

Considérant la mémoire flash limitée du PIC10F202, il n'y a que 4 mélodies d'enregistrées. Celle-ci sont jouées une après l'autre en boucle à chaque pression du bouton SW2. Après chaque mélodie le µC entre en mode SLEEP et ne se réveille que lorsqu'on pèse sur le bouton SW2 pour jouer la mélodie suivante.

En mode SLEEP le PIC10F202 consomme moins de 1µA de sorte que le commutateur d'alimentation SW1 est facultatif.

Circuit

La sortie GP0 est utilisée pour la tonalité. Ce signal audio est envoyé au collecteur du transistor Q1 qui fonctionne comme un amplificateur en base commune avec la sortie sur l'émetteur qui alimente un petit haut-parleur de 135 ohm. Le gain est contrôlé par la polarisation de la base qui dépend du voltage aux bornes du condensateur C2. Donc en faisant varier ce voltage on fait varier l'amplitude du signal audio.

Au début de la note la sortie GP1 est mise à Vdd pour charger C2 à travers R3. Lorsque le délais de soutenance de la note est expiré. la sortie GP1 est mise en haute impédance et cesse donc de garder la charge sur C2. Donc le condensateur commence à se décharger à travers R4 et la base de Q1. Le gain du transistor diminue en même temps que le voltage aux bornes de C2 et ainsi le signal audio. On a donc un signal audio qui monte et descend progressivement plutôt que de débuter et terminer brutalement ce qui est plus plaisant pour l'oreille.

La LED sur GP2 suis le signal sur GP1 elle s'allume donc au rythme de la musique.

Le bouton SW2 permet de faire jouer la mélodie suivante.

Sur cette capture d'écran de l'oscilloscope on aperçoit en bleu la forme du voltage sur C2 et en jaune le voltage aux bornes du haut-parleur.

Table de mélodie

Les macros suivantes aide à créer les tables de mélodies.

  • MELODY nom, cré l'entête de la table avec le nom de la mélodie comme point d'entré. nom doit être un nom d'étiquette valide pour l'assembleur.
  • NOTE n, d, ajoute une note à la table n est le nom de la notes tel que défini dans les EQU qui associent un nom symbolique à chaque note de la gamme. d est la durée de la note tel que définie dans les EQU qui associent les durées à un nom symbolique
  • PMODE m, détermine le mode phrasé des notes qui suivent. Le phrasé musical demeure constant tant qu'il n'est pas remplacé par un autre. Il y a 3 phrasé. PHRASE_NORMAL, PHRASE_STACCATO et PHRASE_LEGATO. Ce paramètre détermine la portion de la note qui est soutenue. Ce paramètre peut apparaître plusieurs fois dans la même mélodie. STACCATO correspond aux notes pointées. LEGATO corresponds aux notes reliées par un arc de cercle.
  • MELODY_END, indique la fin de la mélodie.

code source

L'ensemble du projet est disponible ici

Avec un PIC10F322 c'est mieux

Le PIC10F202 est très limité et même Microchip conseille d'utiliser le PIC10F322 à la place. Au niveau du brochage et de la quantité de mémoire flash c'est indique. J'ai donc remplacé le PIC10F202 sur la plaquette et réécris le code pour tirer avantage du PIC10F322.

Le PIC10F322 possède 2 périphériques PWM j'utilise le premier pour générer les tonalités ce qui simplifie le code. Le TMR0 lui est utilisé pour contrôler la durée de la note et du soutenu. Contrairement au PIC10F202 le PIC10F322 supporte les interruptions donc le TMR0 est configuré pour générer une interruption à interval d'une milliseconde. C'est à l'intérieur de la routine de service d'interruption que les compteurs duration_ctnr et sustain_ctnr sont décrémentés.

J'ai ajouté une fonctionnalité supplémentaire. En effet cette version permet de commuter la gamme entre 2 octaves ce qui m'a permis d'ajouter la mélodie korobeiniki qui chevauche 2 octaves.

Grâce aux périphériques disponibles sur le PIC10F322 le code machine prend moins d'espace et de plus les tables de données peuvent chevauchées entre la page 0 et la page 1 . J'ai modifié la macro MELODY pour qu'on est pas à se soucier du chevauchement de page lors de la saisie des mélodies.

Cette version m'a permis d'enregistrer 6 mélodies au lieu de 4 pour la version sur PIC10F202. La mémoire programme est utilisée à 98%. Il ne reste que 8 locations de libres.

Ce vidéo a été filmé avec la version PIC10F322.

samedi 25 août 2018

blue pill, programmation avec Arduino IDE

Dans cet article j'explique comment installer ArduinoIDE sur Ubuntu et comment le configurer pour l'utilisation avec la carte blue pill.

Arduio a fait ses début avec des cartes de développement basé sur des µC Atmel AVR mais ajourd'hui le support pour d'autre µC a été ajouté entre autre pour les µC à coeur ARM Cortex M. La carte blue pill utilise un µC stm32f103c8t6 avec un CPU Cortex M3.

Les références utilisées pour l'écriture de cet article sont les suivantes:

Installation de ArduinoIDE

  1. Téléchargez la version d'ArduinoIDE qui convient à votre système. Mon Système est en Ubuntu 16.04 64 bits.
  2. Il s'agit d'une archive TAR zippée. On la place dans le dossier où on veut installer le programme. Par exemple
    
    mkdir ~/ArduinoIDE
    tar -xzf arduino-1.8.5-linux64.tar.xz
    
    Il y a maintenant un dossier ~/ArduinoIDE/arduino-1.8.5
  3. Allez dans le dossier ~/ArduinoIDE/arduino-1.8.5. Il faut rendre le fichier install.sh exécutable
    
    chmod +x intall.sh
    
  4. Exécutez le programme d'installation qui va créer un raccourci sur votre bureau.
    
    ./install.sh
    
  5. S'il y a une erreur au démarrage de l'IDE, examinez le contenu dans un éditeur de texte.
    
    gedit ~/Bureau/arduino-arduinoide.desktop
    
    Mon raccourci ne fonctionnais pas car il y avait un espace dans le chemin de l'exécutable. Pour corriger j'ai simplement mis le chemin au complet entre guillemets comme on le voie dans la capture d'écran.
  6. Une fois l'IDE démarré on ajoute l'URL qui va permettre à l'IDE de télécharger les librairies de STM32duino.
    Allez dans le menu Fichier - Préférences ajoutez http://dan.drown.org/stm32duino/package_STM32duino_index.json dans le champ URL de gestionnaire de cartes supplémentaires et refermez la fenêtre.
  7. Allez dans le menu Outils - Type de carte - gestionnaire de carte. Il faut sélectionner la dernière version de STM32F1xx/GD32F1xx
    Après avoir fait l'installation revenez sélectionné le même item dans la liste et cliquez sur le bouton mise à jour pour être certain d'avoir la dernière version installlée.

Installation du boot loader

En réalité le boot loader n'est pas nécessaire car l'environnement ArduinoIDE permet de programmer la carte en utilisant le programmeur stlink/v2. Je vais quand d'écrire l'installation du boot loader.

  1. Clonez le dépôt https://github.com/rogerclarkmelbourne/STM32duino-bootloader sur votre ordinateur
    
    cd ~/Téléchargements
    git clone https://github.com/rogerclarkmelbourne/STM32duino-bootloader
    
    Il y a un dossier binaries dans le dépôt où se trouve plusieurs fichiers .bin
    
    cd ~/Téléchargements/STM32duino-bootloader/binaries
    
    J'ai installé le fichier generic_boot20_pc13.bin car sur la carte blue pill que j'ai la LED verte est branchée à PC13.
  2. Pour programmer le boot loader il faut mettre le cavalier boot0 sur la carte blue pill à la position 1. La commande à exécuter est la suivante.
    
    st-flash --reset write generic_boot20_pc13.bin 0x8000000
    
    S'il n'y a pas d'erreur remettez le cavalier boot0 à sa position initiale et pesez sur le bouton reset de la carte. Au démarrage la LED verte clignote rapidement puis lentement 5 fois.
  3. Il faut maintenant débrancher le programmeur stlink/v2, remettre le cavalier boot0 à la position 0 et brancher la carte au PC avec un cable USB. Un périphérique ttyACM0 devrait maintenant être visible dans le dossier /dev.

Premier projet

  1. Lancez ArduinoIDE Il faut maintenant sélectionner le type de carte, la variante ainsi que le méthode de téléversement (i.e. Upload method)
    • Type de carte: Generic STM32F103 series
    • Variant: STM32F103C8 (20K RAM, 64K Flash)
    • Upload Method: STM32duino bootloader
  2. Comme premier projet nous allons sélectionner dans Fichier - exemples - A_STM32_Examples - digital - Blink
    Puisque sur ma carte la LED verte est sur PC13 J'ai du modifié l'exemple en remplaçant PB1 par PC13
  3. Dans la barre d'outils d'ArduinoIDE cliquez sur le bouton crochet pour compiler le programme. Les messages s'affiche en bas dans la fenêtre en noir.
  4. Si le programme a compiler correctement pressez le bouton reset de la carte blue pill et dans la barre d'outils cliquez sur la flèche téléverser pour programmer la carte.
Problème sur mon ordinateur ça ne fonctionne pas. Voici le message d'erreur qui apparaît dans la fenêtre du bas d'ArduinoIDE.

Failed to open serial device.
No DFU capable USB device found
Et la commande dmesg rapporte l'erreur suivante:

[ 7356.893978] cdc_acm 2-1.7:1.0: ttyACM0: USB ACM device
[ 7363.474986] usb 2-1.7: USB disconnect, device number 21
[ 7363.477217] cdc_acm 2-1.7:1.0: failed to set dtr/rts
Mes recherche m'ont conduit à ceci et à celà. Il semblerais donc que d'utiliser ce bootloader ne fonctionne pas! J'en arrive donc à la deuxième méthode qui fonctionne très bien.

Utiliser le programmeur STLINK/V2 avec ArduinoIDE

D'abord je désinstalle le bootloader en mettant le cavalier boot0 à 1 en en rebranchant le programmeur.


st-flash erase
Ensuite:
  1. Débranchez le fil 3v3 du programmeur côté de la carte blue pill
  2. Remettez le cavalier boot0 à 0.
  3. Brancher le cable USB à l'autre bout de la carte et au PC. Maintenant la carte est alimentée par le cable USB.
  4. Dans le menu Outils - Upload Method: sélectionnez STLINK
  5. Cliquez pour téléverser Blink à nouveau. Bingo ça fonctionne!

Donc maintenant on utilise STLINK/V2 pour programmer la carte blue pill et le cable USB lui sert simple à communiquer avec le Terminal sériel disponible dans Outils - Moniteur série.

L'exemple Fichier - exemples - A_STM32_Examples - General - InternalTempSensor fait la lecture de la sonde de température et envoie des informations au Moniteur Serie. Encore une fois j'ai du adapter cet exemple à la carte blue pill

Voici une capture d'écran du Moniteur série. Le moniteur série doit-être configuré à 115200 BAUD.


retour à blue pill (introduction)

mardi 21 août 2018

blue pill (introduction)

Il y a 1 peu plus d'un an j'ai découvert l'existence d'une carte de développement très économique basée sur un µC STM32F103C8T6. Il s'agit d'un µC 32 bits Cortex M3. Suite à la lecture de l'article suivant sur hackaday, j'en ai commander 5 sur ebay.ca. Cette carte a étée bâptisée blue pill.

Cet article est le premier d'une série sur la programmation de la blue pill en utilisant différents outils.

  • Programmation en utilisant Arduino IDE.
  • Programmation en C en utilisant les outils GNU arm-none-eabi.
  • Programmation en utilisant MECRISP Forth.
  • Programmation en utilisant la plateforme WEB mbed.
  • J'ai créé un dépôt sur github pour cet série d'articles.

Pré-requis

Je travaille sous Ubuntu 16.04 LTS les descriptions que je vais faire sont donc pour cette plateforme. Ça devrait aussi être valide pour une autre distribution Linux basé sur Debian-Linux.

Dans cette première partie je vais décrire comment installer les outils de développement qui seront nécessaires pour les prochains articles.

Blue pill

Voici la schématique de la carte blue pill

Sur les cartes que j'ai en main la résistance R10 a une valeur de 10k au lieu des 4k7 montré sur cette schématique. Ce sera à prendre en considération lorsque viendra le temps d'utiliser cette carte avec Ardruino IDE.

Discription des broches

STM32F103C8T6

Voici les principales caractéristiques du µC qui est installé sur cette carte.

  • Coeur ARM Cortex M3, Fsys maximale 72Mhz.
  • Mémoire flash 64Ko
  • Mémoire RAM 20Ko
  • 3 timers usage général et 1 avancé.
  • 2 SPI
  • 2 I2C
  • 3 USART
  • 1 USB
  • 1 CAN
  • 37 GPIO
  • 2 ADC 10 canaux résolution 12 bits
  • datasheet

STLINK-V2

Pour programmer la carte il faut un programmeur STLINK-V2. Heureusement un clone de ce programmeur est aussi disponible sur ebay.ca à petit prix.

Installation des outils logiciels.

Pour les étapes d'installation logicielle vous devez être membre du groupe sudo car des privilèges root sont requis pour certaines étapes.

utilitaire ST-LINK

Les utilitaires ST-LINK sont disponibles en open-source sur https://github.com/texane/stlink.
Étapes à suivre à partir de la ligne de commande i.e. sous Ubuntu on fait <CTRL>-<ALT>-T pour ouvrir la console de comamdes.

  1. Installer les outils de développement gcc et binutils.
    sudo apt install gcc binutils
  2. Installer l'utilitaire cmake.
    sudo apt install cmake
  3. Installer libusb-dev
    sudo apt install libusb-dev
  4. Cloner le dépôt https://github.com/texane/stlink.
    J'ai créé un dossier ~/Documents/blue pill dans lequel j'ai cloné le dépôt:
    git clone https://github.com/texane/stlink
  5. Lancer cmake à partir du dossier stlink pour créer les fichiers de configurations utilisés par make. N'oubliez pas le point après cmake pour indiquer à cmake qu'il travaille à partir du répertoire courant.
    cmake .
  6. Lancer make
    make
  7. Lancer make install. Utilisez sudo car les privilèges root sont requis.
    sudo make install.
    Les utilitaires sont installés dans /usr/local
  8. Modifier /etc/ld.so.conf pour indiquer le chemin des librairies utilisées par st-link. Utilisez votre éditeur de texte préféré et ajouter à la fin du fichier /etc/ld.so.conf la ligne /usr/local/lib et sauvegarder. sudo est requis.
    sudo gedit /etc/ld.so.conf
    cat /etc/ld.so.conf
    include /etc/ld.so.conf.d/*.conf
    /usr/local/lib
    On recharge la configuration avec la commande.
    $ sudo ldconfig
  9. Maintenant branchez le programmeur ST LINK v2 dans un port USB. Faites la commande
    $ lsusb
    Bus 002 Device 007: ID 0483:3748 STMicroelectronics ST-LINK/V2
    Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
    Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 001 Device 004: ID 0461:0010 Primax Electronics, Ltd HP PR1101U / Primax PMX-KPR1101U Keyboard
    Bus 001 Device 003: ID 0000:0538
    Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Assurez-vous que votre système a bien détecter le programmeur identifié par STMicroelectronics ST-LINK/V2

Branchement de la carte blue pill

Le programmeur viens avec un petit cable à 4 fils. Les connections sont bien identifiées sur le programmeur et sur le connecteur à 4 broches qui dépassent au bout de la carte blue pill.

broche programmeurbroche carte
GND (4)GND
3v3 (8)3v3
SWCLK (6)SWCLK
SWDIO (2)SWIO

Maintenant on va essayer l'utilitaire st-info avec l'option --probe qui devrait nous afficher les informations sur le programmeur et la µC qui y est branché.

$ st-info --probe
Found 1 stlink programmers
serial: 483f6e066772574857351967
openocd: "\x48\x3f\x6e\x06\x67\x72\x57\x48\x57\x35\x19\x67"
flash: 65536 (pagesize: 1024)
sram: 20480
chipid: 0x0410
descr: F1 Medium-density device
$
On obtient les informations sur le µC branché au programmeur c'est bon signe, on devrait pouvoir le programmer en utilisant st-flash

Nous avons donc complété la première étape de cette série d'articles dans le prochain article nous allons voir comment programmer la blue pill à partir de l'environnement Arduino IDE.

blue pill, programmation avec mbed

mbed.com est une plateforme de développement en ligne pour les µC à base de CPU Cortex-M. Dans cet article j'explique comment utiliser cette plateforme pour programmer la carte blue pill. L'utilisation de cette plateforme est gratuite mais il faut s'enregistrer en créant un compte.

Configuration

  1. Créer un compte.
  2. Lorsque votre session est ouverte cliquez sur le bouton compiler
  3. Dans la fenêtre de L'IDE en haut à droite il y a un texte qui indique la plateforme sélectionnée pour le projet en cours. Il faut cliquez sur ce nom pour ouvrir la fenêtre qui permet de sélectionner la carte désirée.
  4. Dans cette fenêtre cliquez sur add board. Un nouvel onglet va s'ouvrir dans votre navigateur. Avec la liste de toutes les cartes disponibles. La carte blue pill ne fait pas parti du lot mais on va choisir la carte qui si rapproche le plus. Dans la liste Target vendor cochez STMicroelectronics. Dans la liste des cartes cliquez sur NUCLEO_F103RB
  5. Sur cette page en défilant vers le bas vous verrez à droite un bouton add to your Mbed Compiler sur lequel vous devez cliquez pour ajouter cette carte à votre environnement de développement. C'est tout ce qu'il y a à faire. Notez que la carte NUCLEO-F130RB utilise un µC différent de la carte blue pill. Il s'agit du stm32f103RBT6. Les différences sont
    • Emballage LQFP64 au lieu de LQFP48
    • 128Ko de flash au lieu de 64Ko
    • 51 E/S au lieu de 37
    • 16 canaux ADC au lieu de 10

Importer des programmes et librairies

Il y a sur le site de mbed de nombreux programmes et librairies qui sont déjà configurés pour la carte blue pill ou pour le µC STM32F103C8T6.

  1. Cliquez sur le bouton import
  2. Sélectionnez l'onglet programs dans la nouvelle vue.
  3. Dans la fenêtre search entrez blue pill et cliquez le bouton search. Voici la liste que j'obtiens
    Encore mieux si je fais une recherche sur le nom du µC STM32F103C8T6.
    18 pages!
  4. Dans la liste obtenue avec search blue pill j'ai sélectionné STM32F103C8T6_Hello pour l'importer.
  5. Dans la fenêtre import program cliquez sur le bouton import.

Cliquez sur Compile. Lorsque la compilation est terminée la fenêtre de sauvegarde s'ouvre pour vous permettre de sauvegarder le fichier binaire sur votre ordinateur.


st-flash write STM32F103C8T6_Hello.bin 0x8000000
Et ça fonctionne du premier coup.


retour à l'introduction

blue pill, MECRISP Forth

MECRISP est un Forth développé par Matthias Koch originalement pour les µC MSP430 mais a été depuis porté sur de nombreuses plateformes. Dans cet article j'installe MECRISP sur une carte blue pill et le met à l'essaie.

Les références utilisées pour cet article sont les suivantes.

Installation de MECRISP sur la carte blue pill

Le projet MECRISP est sur sourceforge. Il faut télécharger le fichier https://sourceforge.net/projects/mecrisp/files/mecrisp-stellaris-2.4.4.tar.gz/download et le décompresser.

$ tar -zxf mecrisp-stellaris-2.4.4.tar.gz
Vous devriez lire le fichier README qui se trouve dans le répertoire racine de MECRISP. Il contient des informations utiles comme une brève description de chaque mot du vocabulaire de base.
On va dans le répertoire contenant les fichiers du stm32f103
$ cd mecrisp-stellaris-2.4.4/stm32f103
$ ls
1w.fs lcd-ptinting.fs si4432_spi.fs
font16x30.fs mecrisp-stellaris-stm32f103.bin si-test.fs
lcd-base.fs mecrisp-stellaris-stm32f103.hex stm32f103.fs
lcd-graphics.fs precompiled
Le fichier mecrisp-stellaris-stm32f103.bin est celui qu'on va utiliser pour programmer la carte blue pill en utilisant l'utilitaire st-flash avec la commande write.
st-flash write mecrisp-stellaris-stm32f103.bin 0x8000000
st-flash 1.4.0-47-gae717b9-dirty
2018-08-13T16:57:12 INFO usb.c: -- exit_dfu_mode
2018-08-13T16:57:12 INFO common.c: Loading device parameters....
2018-08-13T16:57:12 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410
2018-08-13T16:57:12 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x10000 bytes (64 KiB) in pages of 1024 bytes
2018-08-13T16:57:12 INFO common.c: Attempting to write 15696 (0x3d50) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08003c00 erased
2018-08-13T16:57:12 INFO common.c: Finished erasing 16 pages of 1024 (0x400) bytes
2018-08-13T16:57:12 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id
2018-08-13T16:57:12 INFO flash_loader.c: Successfully loaded flash loader in sram
16/16 pages written
2018-08-13T16:57:13 INFO common.c: Starting verification of write complete
2018-08-13T16:57:13 INFO common.c: Flash written and verified! jolly good!
Il n'y a pas de message d'erreur tout semble avoir fonctionné. il s'agit maintenant de connecter la carte blue pill à un adapteur USB-RS232 car l'interface utilisateur de MECRISP est un terminal RS-232.

Utilisation de MECRISP FORTH

Pour voir la liste des mots du dictionnaire MECRISP consultez le fichier README. En plus des mots commun à toutes les plateformes il y a une section pour chaque µC pour les mots spécifiques à chacun.

Au démarrage MECRISP compile les nouveaux mots dans la mémoire RAM. Donc à la réinitialisation les nouvelles définitions sont perdues. Une fois qu'une définition est testée on peu la redéfinir en mémoire flash. Le mot compiletoflash permet de compiler en mémoire flash. Le mot compiletoram permet de revenir à la compilation en mémoire RAM. Pour savoir si la compilation à lieu en mémoire RAM il y a le mot compiletoram? qui retourne -1 si c'est le cas sinon retourne zéro.

branchement de la carte au port sériel.

Il n'y a que 4 fils à brancher.

description
GND commun de l'alimentation
3v3 alimentation pour la carte et l'adapteur RS-232
TX broche A9 de la carte va à RX de l'adapteur RS-232
RX broche A10 de la carte va à TX de l'adapteur RS-232.
mon installation de base

J'utilise minicom pour la communication entre le PC et la carte. Ouvrons un terminal et lançons minicom.

$ minicom -D/dev/ttyS0 -b115200
L'option -D indique quel port sériel utilisé pour la communication avec la carte blue pill.
L'option -b indique la vitesse de communication, soit 115200 BAUD.
Bienvenue avec minicom 2.7

OPTIONS: I18n
Compilé le Feb 7 2016, 13:37:27.
Port /dev/ttyS0, 09:32:44

Tapez CTRL-A Z pour voir l'aide concernant les touches spéciales
En mettant la carte blue pill sous tension la ligne suivante apparaît dans la fenêtre terminal.
Mecrisp-Stellaris 2.4.4 for STM32F103 by Matthias Koch
Il n'y a pas d'invite de commande en Forth on a donc simplement le curseur qui clignote au début de la ligne. En tapant la touche <ENTER> au terminal le message suivant s'affiche.
ok.
ok. n'est pas une invite de commande c'est un message de confirmation que la dernière commande a été interprétée sans erreur. Encore une fois le curseur clignote au début de la ligne suivante. Forth est toujours prêt à recevoir une nouvelle commande après que le message ok. a été affiché. S'il se produit une erreur un message est affiché à l'écran et l'interpréteur est réinitialisé en vidant les piles.
exemple:

567 .ok
\ voyons l'état de la pile .ok
.s Stack: [1 ] 42  TOS: 567  *>                                             
 ok.                                                                            
\  le nombre 567 a ete empile  ok.                                              
xyz xyz not found.                                                              
\ xyz n'est pas un mot reconnu  ok.                                             
.s Stack: [0 ]  TOS: 567  *>                                                    
 ok.                                                                            
\ la pile est vide
Le mot .s sert à afficher le contenu de la pile de arguments. Comme on le voie lorsqu'on entre un entier il est simplement déposé au sommet de la pile. TOS signifit Top Of Stack, i.e. Sommet de la pile. Sur la première ligne j'ai saisi 567 et cet entier a été déposé au sommet de la pile.

Sur la deuxième ligne j'ai saisi xyz. L'interpréteur de commande n'a pas trouvé ce mot dans le dictionnaire, il affiche donc le message not found et vide les piles. Notez que TOS indique toujours 567. Cependant .s indique bien que la pile contient [ 0 ] éléments. La façon dont la commande .s travaille peu prêter à confusion. .s affiche toujours un élément de trop. Cet élément est le contenu de la mémoire RAM pointé par le pointeur de pile lorsque la pile est vide. Ainsi dans la première utilisation de .s le nombre 42 est indiqué alors qu'il ne fait pas partir des arguments disponibles. Dans le deuxième appel .s indique 567 au sommet alors que la pile est vide. Il faut considérer ça comme un bogue de la commande .s.

Maintenant on va créer un programme pour faire clignoter la LED verte qui est sur la carte. Cette LED est branchée sur PC15. C'est à dire le port C bit 15.

\ les constantes pour les addresse des SFR tel 
\ que trouvé dans manuel de référence du STM32F103C8t6                                                          
$40011000 constant gpioc_crl  ok.                                               
$40011004 constant gpioc_crh  ok.                                               
$40011010 constant gpioc_bsrr  ok.                                              
$40011014 constant gpioc_brr  ok.                                               
$44644444 gpioc_crh !  ok.                                                      
: led_on ( -- ) \ allume led verte  ok.                                         
  13 pwr2 gpioc_brr ! ;  ok.                                                    
: led_off ( -- ) \ eteint led verte  ok.                                        
  13 pwr2 gpioc_bsrr ! ;  ok.                                                   
: delay ( u -- ) \ busy loop  ok.                                               
  1000 * 0 do i drop loop ;  ok.                                                
: blink ( speed -- ) \ clignote led verte jusqu'a touche enfoncee  ok.
  begin led_on dup delay led_off dup delay key? until key 2drop ;  ok.          
100 blink  ok.                                                                  
50 blink  ok.                                                                   

Je suis curieux de savoir comment MECRISP configure le system clock En consultant le manuel de référence on trouve 2 registres pour la configuration du clock, Clock Control Register rcc_cr et Clock Configuration Register rcc_cfgr Je vais définir les constantes pour ces registres et le mot prt-field pour voir le contenu binaire d'un champ du registre.

$40021000 constant rcc-base-adr \ adresse de base rcc  ok.                      
rcc-base-adr constant rcc-cr \ offset 0  ok.                                    
rcc-base-adr 4 + constant rcc-cfgr \ offset 4  ok.                              
rcc-cfgr @ h. 0  ok.                                                            
rcc-cr @ h. 4A83  ok.                                                           
Les valeurs affichées pour rcc-cr et rcc-cfgr sont les valeurs à la réinitialisation du µC donc MECRISP ne confugure par le clock ce qui signifie que blue pill avec MECRISP fonctionne en utilisant l'oscillateur interne avec une fréquence de Fclock de 8 Mhz.

Un brin de Folie

Travailler directement dans minicom n'est pas pratique en autre pour corriger les erreurs ou inclure des fichiers source Forth. Heureusement Jean-Claude Wippler auteur du blog Jeelabs a créer une console sérielle pour nous faciliter la tâche. Cette console s'appelle Folie. Nous allons donc l'installer et l'utiliser à la place de minicom.

Des binaires de l'application sont disponible ici.

  1. Téléchargé le fichier folie-linux-x64.gz
  2. dézipper le fichier
  3. rendre le fichier exécutable
  4. créer un lien dans mon dossier ~/bin avec un nom plus court.
  5. Se déplacer dans le dossier mecrisp-Stellaris qui contient le fichier stm32f103.fs
  6. Lancer folie en indiquant le port sériel utilisé.
gunzip folie-linux-x64.gz
chmod +x folie-linux-x64
ln  "/home/jacques/Documents/blue pill/mecrisp/folie-linux-x64"
 /home/jacques/bin
cd "~/Documents/blue pill/mecrisp/mecrisp-*/stm32f103"
folie -p /dev/ttyS0
ok.

J'utilise geany comme éditeur. Geany reconnais les fichiers avec l'extension .fs comme étant des fichiers Forth et fait la coloration de la syntaxe. J'ai créer le fichier picatout.fs avec quelques définitions de mon cru.

Je vais d'abord compiler de fichier dans la mémoire RAM pour le tester et lorsque les erreurs seront corrigées je le compilerai dans la mémoire flash. Il suffit de faire la commande:

include picatout.fs
Pour compiler le fichier. Folie ne semble interpréter les fins de lignes correctement. J'ai essayé avec des fins de lignes LF, CR et CRLF et aucune ne fonctionne correctement cependant la compilation fonctionne sans erreur même si l'affichage est défectueux. Testons les nouveaux mots.
\ combien de mots dans le dictionnaire?  ok.
wc u. 350  ok.
\ flash libre?  ok.
flash-free u. 48800  ok.
\ ram-libre?  ok.
ram-free u. 19472  ok.
\ impression en binaire  ok.
45 bin. 101101  ok.
\ extraction d'un champ  ok.
45 3 3 bitfield bin. 101  ok.
\ puissance de 2  ok.
15 pwr2 u. 32768  ok.
Les définitions fonctionnent en va les flasher.
forgetram \ efface les mots en RAM
compiletoflash \ compile en flash
include picatout.fs \ compile le fichier en flash
compiletoram \ revient à la compilation en RAM

Dans le dossier mecrisp-stallaris-2.4.4/stm32103 il y a plusieurs fichiers .fs qui peuvent-être inclus. Celui nommé stm32f103.fs contient la définitions des constantes pour toutes les adresses des registres spéciaux du stm32f103c8t6. Il y en plus de 500. Après cette inclusion, wc rapporte 852 mots et flash-free 32928 octets libres.

NOTE:
Je ne sais pas si le problème est avec mon ordinateur mais lorsque je fais une commande include dans Folie, quelque secondes après la fin de l'opération le disque dur de mon ordinateur se met à trasher et l'ordinateur ne répond plus m'obligeant à l'éteindre. C'est à 3ième fois que je recommence la section de cet article consacrée à Folie, hum!!

installation de hackaday-forth

A lieu d'installer MECRISP de base vous pouvez installer la version hackaday-forth.

  1. Clonez le dépôt sur votre ordinateur
    git clone https://github.com/hexagon5un/hackaday-forth
  2. Déplacez-vous dans le dossier ROMS et faites la commande:
    st-flash write mecrisp-stellaris-hackaday-edition.bin 0x8000000
    Cette version prend beaucoup plus de mémoire flash, il ne reste que 31744 octets pour les applications.
  3. Lancez minicom si ce n'est pas déja fait
Hackdaday-forth Configure le µC pour qu'il fonctionne à sa fréquence maximale de 72 Mhz. Vous trouverez dans ce dépôt plusieurs exemples de programmes.


retour à l'introduction

blue pill, programmation en C

Dans cet article j'explique comment programmer la carte blue pill sans autre outils que ceux fournis par l'open source gnu-arm-none-eabi. Cet article est une adaptation de l'article en anglais produit par Jacob Mossberg. Même si l'article original réfère à une carte STM32-H103 et un programmeur ARM-USB-OCD-H, les outils logiciels et la procédure sont les même pour la carte blue pill et le programmeur STLINK/V2 que j'utilise.

Installation des outils logiciels

  • Les utilitaires pour travailler avec les fichiers binaires. Sur mon système la version la plus récente est 2.26.1
    
    sudo apt install binutils-arm-none-eabi
    
  • Le compilateur GCC. Sur mon système la version la plus récente est 5.4.0
    
    sudo apt install gcc-arm-none-eabi
    
  • Le débogueur. Sur mon système la version la plus récente est 7.11.1
    
    sudo apt install gdb-arm-none-eabi
    
Jacobs Mossberg mentionne aussi la possibilité d'utiliser la toolchain fournie par ARM.

Compiler le programme exemple

Téléchargez les 3 fichiers exemples fournis par Jacobs Mossberg.

  • Le code d'initialisation du µC startup.c
  • Le fichier pour le linker stm32.ld
  • Finalement le fichier makefile.
  • Dans mon dépôt blue_pill dans le dossier C il y a les fichiers blink.c et stm32f103c8.h que je vais utiliser comme programme de démonstration.

compiler le programme.

  1. J'ai modifié le fichier makefile
  2. Sur la ligne de commande à partir du dossier contenant les fichiers sources il suffit de faire la commande:
    
    make build
    
    pour créer le fichier blink.bin
  3. La commande suivante suppose que la carte blue pill est branchée au stlink/v2 et que ce dernier est branché au PC.
    
    st-flash write blink.bin 0x8000000
    
Sitôt l'opération complétée la LED verte devrait clignoter à environ 1 cycle par seconde. Essayez le bouton reset de la carte si ça ne fonctionne pas d’ambler.

Déboguer un programme avec gdb et stlink/v2

Le programme est déjà déboguer mais on va supposer qu'il ne l'est pas et on va le recompiler pour le débogage avec la commande

make build_debug
st-flash write blink.bin 0x8000000
La différence entre la version débogage est que le compilateur n'optimise pas le code et le fichier blink.elf contient toute l'information qui permet à gdb de faire le lien entre les lignes du code source et le code exécuté sur le µC. Si vous utilisez une version non debug de blink.elf, gdb va afficher le message [ no source code available ].

Séance de débogage

Dans la console déjà ouverte on lance:

st-util
Il faut ouvrir une 2ième console de commande (maximisez la fenêtre) et dans cette nouvelle console lancez gdb. Par défaut st-util utilise le port 4242 il faut donc configurer gdb pour qu'il utilise aussi ce port.

arm-none-eabi-gdb -tui --eval-command="target remote localhost:4242" blink.elf

Les commandes les plus utiles sont les suivantes:

  • hbreak arg, pour créer un point d'arrêt matériel. Comme argument on peut utiliser le nom d'une fonction ou un numéro de ligne.
    exemples:
    
    (gdb) hbreak main
    (gdb) hbreak main.c:29
    
  • continue ou c, pour relancer l'exécution. S'il n'y a pas de point d'arrêt faire <CTRL-c> pour arrêter l'exécution.
  • step ou s, pour exécuter une seule ligne de code.
  • next ou n, même chose que step mais saute les appels de fonctions.
  • layout regs, pour ouvrir une fenêtre qui affiche le contenu des registres du CPU.
  • print var, pour imprimer le contenu d'une variable.
  • delete, pour supprimer les points d'arrêt.
  • clear no|nom, pour supprimer un point d'arrêt par le numéro de ligne no ou le nom de la fonction.

Une meilleure version de blink

Cette version de blink est loin d'être idéale car elle utilise une boucle de code pour le délais. Ce qui fait que le délais varie en fonction de l'optimisation du code par le compilateur et aussi avec la fréquence du clock. Pour améliorer le programme on va utiliser une minuterie et pourquoi pas brancher la sortie PC13 à un PWM ainsi une fois l'initialisation complétée le µC n'aura plus rien à faire. Au va profiter de l'occasion pour configurer le clock à 72 Mhz en utilisant l'oscillateur externe et le PLL au lieu de l'oscillateur interne.

2018-09-01

J'ai terminé la version améliorée de blink. Elle est dans le dossier blink_v2. Cette version utilise le cristal externe avec le PLL pour obtenir une fréquence SYSCLK maximale de 72 Mhz. Le CPU Cortex-M3 possède un compteur interne de 24 bits incrémenté à la fréquence du clock AHB ou AHB/8. J'ai configuré se compteur pour produire un délais d'une milliseconde avec la fonction millisec() qui est appelé par la fonction delay() qui détermine la fréquence de clignotement de la LED.

Voici la nouvelle version de blink_v2.c

Une autre amélioration à apporter serait d'ajouter une interruption sur le coretimer et de créer un variable globale systicks qui serait incrémmentée à l'intérieur de cette interruption à toute les milliseconde.

2018-09-03

J'ai ajouté systick_demo. Ce programme démontre comment installer une routine d'interruption. La routine d'interruption systick_int incrémente la variable ticks et décrémente la variable timer si sa valeur est non nulle. systick_int gère l'interruption du coretimer qui est programmée pour se produire à intervalle de 1 milliseconde.

2018-09-16

Je poursuis mes expérimentations de programmation bare metal de la blue pill en C. j'ai ajouté plusieurs démos dans le dépôt git

  • Expérimentation avec le core timer
  • Expérimentation avec les interruptions
  • Expérimentation avec le RTC
  • Expérimentation avec les appels systèmes.


retour à l'introduction

mercredi 4 juillet 2018

projet VPC-32V

Dans cet article je présente mon dernier projet. Il s'agit d'un petit ordinateur fabriqué autour d'un PIC32MX170F256B.

En fait il s'agit d'une reprise d'un projet qui date de 2013 et que j'avais abandonné. Fin janvier 2018, je l'ai repris en apportant de nombreuses modification à la plateforme matérielle ainsi qu'au logiciel. Depuis janvier
je travaille presque à tout les jours sur ce projet et dernièrement j'en suis rendu à la documentation qui est elle-même presque complété.

Je ne donnerai pas beaucoup de détail dans cet article car j'ai créer un site web qui lui est dédié: https://picatout.github.io/vpc-32v/index.html

Voici un vidéo de démonstration filmé en remote console avec capture vidéo en utlisant Kazam sur Ubuntu.



Liens

source du projet.

lundi 15 janvier 2018

Busy Bee partie 5, boite à musique.

Lorsque j'étais enfant il y avait des boites à musique qui fonctionnaient avec un ressort. Un jour j'en ai démonté une pour voir comment c'était fait. Il y avait un cylindre avec des pointes de métal ainsi qu'un peigne en métal avec les dents de longueurs différentes. La longueur de chaque dent déterminait la fréquence de la note. Le ressort faisait tourner le cylindre et les pointes de métal du cylindre accrochaient les dents du peigne au passage. Les pointes étaient disposées pour jouer une mélodie en particulier.

Dans cet article je présente une version électronique de la boite à musique. Contrairement à la boite à musique mécanique celle-ci peu jouer plusieurs mélodies.

schématique

La boite à musique dans sa version minimale n'utilisait que les broches du port 1. Comme le port 0 était entièrement libre j'ai décidé d'y brancher 8 LEDS. Les LEDs branchées sur P0.0 à P0.4 servent à indiquer l'indice dans la table scale de la note qui est jouée. Les LEDS branchées sur P0.5 à P0.7 indique l'indice de la mélodie dans la table tunes_list. Les 2 groupes sont séparés par une LED rouge pour les distingués aisément. La LED rouge marque le bit le plus significatif du groupe.

Pour que le son soit moins saccadé j'ai ajouté un générateur d'enveloppe constitué du transistor Q1 et des résistances,R6,R10 et R12 ainsi que du condensateur C3. Au début de chaque note la sortie P1.1 est mise à 1 pendant 40 millisecondes. Pour permettre à C3 de se charger. Ensuite P1.1 est mise en haute impédance et C3 se décharge lentement à travers R10 et la base de Q1. l'effet produit est que le son monte en intensité en suivant la courbe de charge du condensateur et ensuite l'intensité diminue plus lentement par la décharge de C3. La montée sonore appelée attaque est déterminée par la constante de temps R6*C3 tandis que la descente est déterminée par la constante de temps C3*(R10+Rb)Rb est la résistance réfléchie par la base du transistor. Rb est approximativement G*R12, G étant le gain du transistor. Donc le transistor C3 se décharge beaucoup plus lentement qu'il ne se charge.

Les notes sont produites par le canal 0 du PCA0 dont la sortie est acheminée sur la broche P1.0.

Le bouton déclencheur est branché sur la broche P1.2. Chaque fois que le bouton est enfoncé une seule mélodie est jouée. Le bouton doit-être relâché et enfoncé à nouveau pour jouer la mélodie suivante.

Sur la broche P1.3 il y a un sélecteur de mode. On peut choisir entre le mode aléatoire et le mode séquentiel. Le mode doit-être sélectionné avant que l'appareil soit mis sous tension. Dans le mode séquentiel les mélodies sont jouées toujours dans le même ordre, celui où elles apparaîssent dans la table tunes_list. En mode aléatoire la mélodie est sélectionnée au hasard. En fait de hasard, il s'agit de lire le registre TL0 qui est la partie basse de la minuterie TIMER0 qui compte en boucle rapidement à la fréquence Fsys. Il est impossible de prévoir ou est rendu le compte dans TL0 au moment ou on presse le bouton d’où l'effet aléatoire.

Je n'ai pas fait de montage final de ce projet mais je pense que ça pourrait plaire à un jeune enfant. Sur le montage temporaire tel que vue dans la vidéo ci-bas je n'ai pas fait le montage au complet, je n'utilise qu'une alimentation de 3,3 volt et un petit ampli à transistors fait maison qui fonctionne à cette tension contrairement au LM386 qui nécessite un minimum de 4 volts.

Actuellement il y a 8 mélodies d'enregistrées dans la mémoire flash du MCU et il y a 1305 octets d'utilisés sur les 8Ko. Il est donc possible de rallonger cette liste. Il y a probablement assez d'espace pour une symphonie ;-)

Les mélodies que j'ai utilisées proviennent du site http://www.apprendrelaflute.com

Comme toujours l'ensemble du projet est sur github.

démo