Dans la famille des cartes à faible coût, hautes performances et destinées au déploiement, il y a les cartes Teensy conçues par la société PJRC. Les Teensy gravitent à la périphérie de la galaxie Arduino car elles ne sont pas officiellement supportées par l’IDE et nécessitent l’installation de composants supplémentaires. Il n’en reste pas moins que ces cartes sont diablement intéressantes lorsqu’il s’agit de mettre en œuvre des applications un peu gourmandes en performances comme la gestion d’un écran graphique LCD pour un poste de conduite ou un TCO.
Les cartes Teensy
.
Par : ,
DIFFICULTÉ :★★☆
Tour d’horizon des cartes Teensy en 2019
Une visite sur le site du constructeur PJRC montre deux types de cartes Teensy, celles équipées d’un microcontrôleur 8 bits travaillant à 16 Mhz comme la Teensy 2.0 et la Teensy++ 2.0, et celles équipées d’un microcontrôleur 32 bits travaillant à des vitesses comprises entre 48 et 180 MHz. Dans cet article, nous ne parlerons pas des cartes 8 bits qui sont comparables à un Arduino Nano et nous nous intéresserons aux cartes 32 bits dont les performances et le niveau d’équipement sont nettement supérieurs.
Parmi les cartes 32 bits, on trouve la Teensy 3.2 qui a remplacé la Teensy 3.1 (Figure 1) et qui est équipée d’un microcontrôleur ARM Cortex-M4 travaillant à 72 MHz. Son prix affiché en 2019 est de 19,80 US Dollars. Il existe un modèle moins cher à 11,65 US Dollars, la TeensyLC (pour Lowest Cost), équipée d’un microcontrôleur ARM Cortex M0+ travaillant à 48 MHz [1]. Mais les deux versions les plus intéressantes sont actuellement la Teesy 3.5 et la Teensy 3.6 (Figure2), toutes deux équipées d’un microcontrôleur ARM Cortex-M4F travaillant respectivement à 120 et 180 MHz. Ces deux dernières cartes ne coûtent que 24,25 et 29,25 US Dollars.
Toutes les cartes proposées par PJRC sont équipées d’un port USB permettant de les programmer aussi facilement que les cartes Arduino.
Sous le capot des cartes Teensy 3.2, 3.5 et 3.6
Regardons sous le capot des cartes Teensy pour voir de quelles ressources elles disposent.
Ces cartes sont construites autour d’un microcontrôleur NXP (ex Freescale) incorporant un cœur de calcul ARM Cortex M4. Les ressources de la carte sont donc essentiellement celles du microcontrôleur. Plus de 7,5 milliards d’unités de microcontrôleurs ARM ont déjà été vendues soit un microcontrôleur par Terrien.
Tension d’alimentation
La tension d’alimentation sur la broche Vin des cartes doit être comprise entre 3,6 et 6,0 V (entre 3,7 et 5,5 V pour les cartes Teensy 3.1 et Teensy LC). Comme pour les cartes Arduino, les cartes Teensy sont automatiquement alimentées par le 5 V de l’interface USB.
La mémoire
Comme toutes les cartes Arduino, les cartes Teensy disposent dans leur microcontrôleur de mémoire Flash, de mémoire RAM et de mémoire EEPROM. La mémoire Flash est 8 à 32 fois plus importante que sur une carte Uno, ce qui n’est pas rien.
Contrairement aux microcontrôleurs AVR, les microcontrôleurs ARM n’ont pas de mémoires séparées pour le programme et les données. Leur architecture est de type Von Neuman, ce qui signifie que l’ensemble de l’espace adressable mémoire est partagé entre Flash, RAM et EEPROM.
Les cartes disposent de canaux d’accès direct à la mémoire (DMA Direct Memory Access) permettant des lectures ou écritures en mémoire sans passer par le processeur, un gage supplémentaire de performance.
Les broches d’entrée-sorties
Les cartes Teensy sont vendues nues et il faut donc souder des connecteurs en périphérie le long des grands côtés. Moyennant un prix un peu plus élevé, il est possible d’obtenir les cartes avec les connecteurs déjà soudés. Cependant, vu le nombre élevé de broches, toutes ne se retrouvent pas sur les connecteurs et certaines ne sont accessibles qu’en soudant un fil sur le verso de la carte ou, préférablement, un connecteur CMS comme montré à la figure 3.
Les broches numériques d’entrée-sortie fonctionnent en 3,3 V et délivrent un courant de 10 mA en sortie. En entrée, les broches tolèrent une tension de 5 V excepté pour la Teensy 3.6 où il ne faut pas appliquer une tension supérieure à 3,3 V sous peine de détruire le microcontrôleur. Toutes les broches numériques sont capables de générer des interruptions. Les entrées analogiques permettent de transformer un signal analogique en valeur numérique grâce à deux convertisseurs analogique-numérique opérant sur 13 bits. Mais il existe aussi des sorties analogiques qui font l’opération inverse grâce à un convertisseur numérique-analogique opérant sur 12 bits. Attention : les broches analogiques ne sont pas tolérantes au 5 V et il ne faut donc jamais appliquer une tension supérieure à 3,3 V. La tolérance au 5 V n’existe donc que pour les broches numériques (digital input output) des cartes 3.2 et 3.5.
Certaines broches sont dotées de la fonction Touch Sensing grâce à la fonction touchRead ; il s’agit d’une détection capacitive basée sur une architecture à double oscillateur. Un des oscillateurs est relié à la broche et oscille en fonction de sa capacitance alors que l’autre oscillateur dispose de sa propre capacité de référence. En comparant les deux oscillations, on obtient la capacitance de la broche et le résultat est donné sur 16 bits.
Timers
Les timers présents dans le microcontrôleur permettent notamment de générer de la PWM sur un nombre élevé de broches.
Sur les Teensy 3.x, la fréquence par défaut des PWM est de 488,28Hz. Cette fréquence peut être changée en utilisant les fonctions analogWriteFrequency
et analogWriteResolution
. Consultez la page de PJRC pour plus de précisions. Bien évidemment, un timer pilotant plusieurs broches PWM, le changement de fréquence d’une broche conduira également à changer la fréquence des autres broches pilotées par le même timer.
Communication
C’est dans le domaine de la communication que les cartes Teensy peuvent surtout se révéler performantes. On trouve par exemple un ou plusieurs ports USB, des ports série (signaux RX et TX), une ou plusieurs interface SPI (Serial Peripheral Interface, signaux MOSI, MISO, SCK et CS), plusieurs ports I2C (signaux SDA et SCL), une ou plusieurs interfaces CAN (Controller Area Network, signaux CANRX et CANTX), deux sorties audio, parfois un port SD Card et parfois un port Ethernet.
Tableau résumant les principales caractéristiques des cartes Teensy
Le tableau ci-dessous vous permettra de choisir votre carte en fonction de vos besoins :
CARTE | Teensy 3.2 | Teensy 3.5 | Teensy 3.6 |
---|---|---|---|
Taille (mm) | 36x23 | 61x23 | 61x23 |
Fréquence d’horloge (MHz) | 72 | 120 | 180 |
Overclock (MHz) | 96 | 168 | 240 |
Mémoire Flash (kilo-octets) | 256 | 512 | 1024 |
RAM (kilo-octets) | 64 | 256 | 256 |
EEPROM (octets) | 2048 | 4096 | 4096 |
Canaux DMA | 16 | 16 | 32 |
E/S numériques | 34 | 58 | 58 |
E/S numériques sur connecteurs | 24 | 40 | 40 |
Entrées analogiques | 21 | 27 | 25 |
Sorties analogiques | 1 | 2 | 2 |
Broches Touch Sensing | 12 | 0 | 11 |
Timers | 12 | 17 | 19 |
Broches PWM | 12 | 20 | 22 |
Ports USB | 1 | 1 | 2 |
Ports série (RX, TX) | 3 | 6 | 6 |
SPI (MOSI, MISO, SCK, CS) | 1 | 3 | 3 |
I2C (SDA, SCL) | 2 | 3 | 4 |
CAN (CANRX, CANTX) | 1 | 1 | 2 |
Sorties audio | 2 | 2 | 2 |
SD Card | 0 | 1 | 1 |
Ethernet | 0 | 1 | 1 |
Brochage des cartes Teensy
La figure 4 montre, à titre d’exemple, le brochage de la carte Teensy 3.6. Pour les autres cartes il suffit de se référer à cette page du site de PJRC
Programmation des cartes Teensy
Maintenant que nous avons vu les ressources des cartes Teensy, il est temps de voir comment les programmer. La méthode est décrite en détail sur le site de PJRC ou plutôt les méthodes car elles sont au nombre de deux. La première consiste à télécharger un programme appelé "Teensy Loader", la deuxième consiste à télécharger un Add-On pour l’IDE d’Arduino. C’est cette deuxième méthode que nous allons détailler ici.
Commencez par télécharger TeensyduinoInstall. Ce programme existe pour les trois systèmes d’exploitation Windows, Mac et Linux. Il vous suffira de lancer ce programme d’installation et de suivre la procédure en cliquant sur "Next". Avec Windows 10, il n’y a pas de drivers à installer. L’installation doit se faire là où se trouve arduino.exe : un écran vous demandera de confirmer ou de modifier le chemin d’accès. Avant d’installer Teensyduino, pensez à mettre à jour votre version du logiciel Arduino. De plus, l’IDE ne doit pas être ouvert car cela génère une erreur à l’installation ; pensez donc à le refermer avant de lancer TeensyduinoInstall.
Le dernier écran d’installation vous rappelle comment charger vos programmes dans la carte Teensy suivant que c’est une première utilisation (auquel cas il faut utiliser le bouton poussoir de la carte) ou non (auquel cas vous faites comme vous avez l’habitude avec vos cartes Arduino). La figure 5 montre que vos carte Teensy sont reconnues par l’IDE lorsque l’installation a été réussie.
Petit exemple de programmation
Vous pouvez maintenant essayer de modifier le programme Blink donné en exemple pour les cartes Teensy comme le montre la figure 6.
Les cartes sont vendues programmées avec cet exemple si bien que lorsqu’on les alimente, la DEL se met à clignoter mais vous pouvez changer sa fréquence. En fonction de votre carte Teensy, vous pouvez avoir à modifier la ligne 10 comme indiqué dans les commentaires juste au dessus. Modifiez ensuite les delay() aux lignes 24 et 26 conformément au rythme que vous voulez produire. Ensuite, téléversez le programme dans votre carte Teensy.
Sur une carte Uno, le programme Blink occupe 942 octets de mémoire Flash et 9 octets de mémoire RAM. Sur la carte Teensy 3.6, ce même programme occupe 10716 octets de mémoire Flash et 3828 octet de RAM. La différence est parfois plus flagrante ; par exemple, l’exemple RightLeft de la bibliothèque SlowMotionServo occupe 20756 octets de Flash sur la carte Teensy 3.6, soit 1% de la mémoire de programme, alors que sur une carte Uno, il occupe 5294 octets soit 16% de l’espace total.
Les performances
Les Arduino à base d’AVR sont généralement suffisamment puissants pour la plupart des applications que nous sommes amenés à mettre en œuvre. Dans quelques cas il est nécessaire de passer à une carte plus puissante. La raison est souvent la quête d’un espace mémoire plus important mais il arrive également que les performances de calcul soient insuffisantes sur un Uno ou un Mega. Les Teensy 3.2 et 3.6 embarquent des microcontrôleurs 32 bits ayant une fréquence d’horloge entre 4,5 et 15 fois plus élevée que celle d’un Uno mais il disposent également de matériel supplémentaire comme une unité de division entière (Teensy 3.2 et 3.6) ou une unité de calcul sur les nombres flottants (Teensy 3.6). Une fois tout ceci mis ensemble, concrètement, quel gain de performance peut-on attendre ?
Pour répondre à cette question, nous nous sommes mis en quête d’un programme test, ou benchmark, permettant de mesurer la vitesse de différents calculs. Le benchmark choisis est le Arduino Speed Test Benchmarking Program qui mesure différents types d’opération : manipulation des broches, calculs de conversion de chaines en nombre, calcul sur différentes tailles de nombres, calculs flottant, etc. Les mesures ont été normalisées par rapport à un Arduino Uno qui a donc, sur toutes les figures ci-dessous, un résultat de 1.
Le benchmark a été compilé pour le Teensy 3.2 à 72MHz, le même mais overclocké à 96MHz, le Teensy 3.6 à 180MHz et le même overclocké à 240MHz. Plus la barre est longue et plus le microcontrôleur est rapide.
Manipulation des broches
Alors qu’il s’agit de lecture ou d’écriture de bits dans des registres, on constate malgré tout un gain supérieur au rapport de fréquence d’horloge. Le Teensy 3.6 cadencé à 240MHz est entre 16 et 77 fois plus rapide qu’un Uno pour cette tâche. On peut malgré tout noter un biais pour analogRead
. En effet, cette fonction lance une conversion analogique numérique et attend que le convertisseur ait terminé son travail avant de lire et retourner la valeur convertie. Les performances de cette fonction dépendent donc majoritairement de la vitesse de conversion, et donc de l’horloge associée au convertisseur, et non de la vitesse d’exécution des instructions du microcontrôleur. Sur le Uno, l’horloge du convertisseur est programmée à 125kHz alors que sur le Teensy 3.6, qu’il fonctionne à 240MHz ou à 180MHz, elle est programmée à 1,5MHz.
Conversion d’entier en chaine et manipulation de bits
Il s’agit ici de conversion de nombre entier en chaîne, de nombre flottant en chaîne [2], d’opérations sur les bits et du nop. ce dernier consiste juste à exécuter une instruction nop, c’est à dire no operation. En substance une instruction qui ne fait rien. Assez logiquement on a presque exactement le rapport de fréquence d’horloge pour ce dernier. Ici aussi le gain est très important avec un rapport jusqu’à 180 pour la conversion d’un entier long en chaîne (ltoa, long to ascii).
Calculs sur des octets
Le Uno étant un microcontrôleur 8 bits, on devrait trouver ici un rapport proche du rapport de fréquence d’horloge. Or le Teensy est meilleur que cela pour les opérations simples (addition et multiplication) et s’envole pour la division avec un rapport jusqu’à 169. En effet, à la différence des microcontrôleurs ARM des Teensy, l’AVR ne dispose pas d’instruction de division et cette dernière est donc effectuée via un programme.
Calculs sur des entiers
Le type de donnée utilisé ici est un int
. C’est à dire 2 octets (16 bits) sur un AVR et 4 octets (32 bits) sur un ARM. L’AVR est handicapé car comme il travaille sur 8 bits, il lui faut plusieurs instructions pour effectuer l’opération alors que l’ARM travaille sur sa taille de données préférée. Ici aussi la différence est particulièrement marquée pour la division avec un rapport allant jusqu’à 594 pour le Teensy 3.6 à 240MHz.
Calculs sur des entiers longs
Ici l’AVR et l’ARM travaillent sur des données de 4 octets et l’ARM est donc très avantagé. La division enfonce complètement l’AVR avec un rapport grimpant à un impressionnant 1610.
Calculs sur des nombres flottants
Enfin, on voit ici l’avantage de disposer d’une unité de calculs flottants matérielle plutôt que d’émuler les calculs en logiciel. Le microcontrôleur de la Teensy 3.2 ne dispose pas d’une telle unité et présente un rapport de performance significatif mais bien moins impressionnant que celui de la Teensy 3.6.
Conclusion
Les cartes Teensy sont programmables avec l’IDE d’Arduino et de ce fait, font partie de l’écosystème Arduino. Leurs performances sont cependant bien supérieures pour une gamme de prix identique. Toutefois, ces cartes sont livrées sans connecteur et sont donc réservées à ceux qui bricolent un peu en électronique. Les sorties numériques fonctionnent en 3,3 V et certaines entrées ne sont pas résistantes au 5 V. De plus, une tension continue de 5 V n’est pas disponible sur ces cartes (ou difficilement accessible comme sur le verso de la Teensy 3.6), ce qui peut être un problème en fonction de l’électronique que la carte doit contrôler. Les cartes Teensy sont une très bonne solution pour les applications qui demandent beaucoup de ressources comme les écrans couleurs tactiles dont l’utilisation en modélisme ferroviaire permet la conception de TCO ou encore une application de gestion du cantonnement et des itinéraires offrant ainsi la possibilité de se passer d’un PC.
[1] À fréquence égale, un Cortex-M0+ sera moins performant qu’un Cortex-M4
[2] On utilise assez rarement ces fonctions directement mais elles sont utilisées par les classes String, Stream et Serial par exemple.