La société Franco-Italienne STMicroelectronics, spécialisée dans la fabrication de composants électroniques, a mis en vente une carte d’évaluation permettant le contrôle des mécaniques d’imprimantes 3D.
Cette carte, développée en France par le centre R&D de STMicroelectronics Grand-Ouest de Rennes, assure le pilotage des moteurs pas-à-pas et des organes chauffants (têtes d'impression, plateau). Elle offre également de nombreuses autres fonctionnalités comme le montre le schéma de la figure 1.
Fig. 1 : Vue générale des différentes interfaces offertes par la carte STEVAL-3DP001. Source [2].
Après une introduction rapide à l'impression 3D, je vais décrire dans cet article la carte STEVAL-3DP001, ses fonctionnalités ainsi que sa mise en œuvre dans le cadre du pilotage d'une imprimante de type Prusa.
1. Histoire et fonctionnement des imprimantes 3D
Les débuts de l’impression 3D datent du milieu des années 1980. La société 3D-Systems a été la première à commercialiser une imprimante 3D en 1988, la SLA-250. Elle utilisait le procédé technique de stéréolithographie.
Toutes les techniques d'impression 3D reposent sur la même méthode : la superposition de tranches fines de matière. La différence se fait ensuite au niveau du procédé utilisé pour la réalisation des tranches de matière comme le montre la figure 2.
Fig. 2 : Technologies d'impression 3D. Source [1].
Quatre familles de technologies existent :
- la photo polymérisation consiste en la solidification d'un liquide par une lumière, le plus souvent un Laser ;
- la pulvérisation consiste à pulvériser de la matière liquide (ou poudre) ainsi qu'un liant qui va durcir en séchant ;
- la fusion consiste à déposer une fine couche de matière sous forme de poudre. Un laser est ensuite utilisé pour faire fondre et fusionner la poudre aux endroits où on veut de la matière ;
- et enfin la déposition de matière en fusion (Fused Deposition Modeling : FDM).
C'est dans cette dernière famille que l'on retrouve le procédé par extrusion qui nous intéresse. Pour cette méthode, on fait fondre un filament de matière qui passe dans une buse d'extrusion et qui est déposé sur l'objet en construction. La tête d'impression se déplace suivant les axes X et Y pour « dessiner » la couche de matière sur la précédente. En refroidissant, cette nouvelle couche va durcir. Pour réaliser une nouvelle couche, soit la tête d'impression va monter, soit le plateau supportant l'objet va descendre.
Fig. 3 : Principe de la technologie par déposition de matière en fusion (FDM). Source [1].
La carte STEVAL-3DP001 est conçue pour piloter ce dernier type d'imprimante 3D.
Si vous souhaitez en connaître davantage sur les technologies d'impression 3D, je vous invite à vous rendre sur la page dédiée à l'impression 3D sur le site d'Aniwaa [1].
2. Présentation de la carte d'évaluation STEVAL-3DP001
La carte 3DP001 est architecturée autour d'un processeur ARM Cortex M4 sous la forme d'un STM32F401. Elle est alimentée en 12v et peut également recevoir du 24v pour le lit chauffant.
Elle est équipée de 6 contrôleurs de moteur pas-à-pas STSPIN L6474 [3], pouvant délivrer jusqu'à 3A chacun. Le réglage des contrôleurs est entièrement numérique, ce qui assure une meilleure précision par rapport aux composants à réglage analogique.
Elle permet de piloter jusqu’à trois têtes de chauffe, trois ventilateurs de refroidissement et trois zones de chauffe du lit.
Elle intègre un module Wifi permettant de lancer et de contrôler une impression à partir d'un équipement mobile (laptop, tablette ou smartphone).
Elle dispose également d'une interface USB master et microSD permettant l'impression d'objet directement à partir de média portable.
Une interface de débuggage, sous la forme d'un STLink-V2, est présente. Cette interface offre bien sûr la possibilité de débugger le firmware tournant sur la carte à partir de l'IDE OpenSTM32, mais elle permet également de charger un nouveau binaire sur la carte par un simple drag and drop.
Enfin, un bus d'extension est disponible. Il donne accès à certains GPIO et interfaces (I2C, SPI) du STM32 et permet d'y connecter par exemple un Raspberry Pi, sur lequel on aura préalablement installé Octoprint. La mise en place d'un tel système fera l'objet d'un prochain article.
Les différentes interfaces de cette carte sont représentées par la figure 4.
Fig. 4 : Architecture fonctionnelle de la carte STEVAL-3DP001V1. Source [2].
À noter qu'il s'agit d'une carte Open Hardware. Le schéma, la BOM ainsi que les fichiers Gerber sont fournis et peuvent être librement réutilisés ou modifiés. Ils sont disponibles en suivant le lien [2].
3. Mise en œuvre de la carte STEVAL-3DP001
Maintenant que nous avons décrit les différentes possibilités de la carte STEVAL-3DP001, nous allons nous attaquer au câblage de la carte.
3.1 Pilotage par USB ou par UART
Dans un premier temps, une « configuration » matérielle de la carte peut être nécessaire. En effet, la carte intègre un convertisseur UART-USB dans le ST-Link, permettant le pilotage à partir d'un PC connecté au port USB esclave. Par défaut, ce convertisseur est utilisé. Si vous souhaitez piloter la carte directement via l'UART, pour la connecter au port série d'un Raspberry Pi par exemple, ou pour simplement augmenter la vitesse de transfert, il vous faudra enlever deux shunts (résistances de 0Ω), marquées R35 et R36. L'emplacement de ces deux résistances est indiqué sur la figure 5.
Fig. 5 : Localisation des résistances R35 et R36.
3.2 Câblage de la carte STEVAL-3DP001
La figure 6 présente le câblage de la carte STEVAL-3DP001 pour une imprimante du type Prusa i3, équipée d'une tête d'extrusion, d'un lit chauffant à une zone, d'un ventilateur de refroidissement de pièce, de deux capteurs de fin de course pour les axes X et Y, et d'un capteur d'auto-positionnement pour l'axe Z (auto-leveling).
Fig. 6 : Câblage de la carte STEVAL-3DP001.
Cette carte est également équipée d'un connecteur d'extension, dont le brochage est donné par la figure 7. La grande majorité des entrées/sorties présentes sur les borniers à vis de la carte sont présentes sur ce connecteur. On y retrouve également les signaux de la carte SD et 4 GPIOs laissés libres pour l'utilisateur (USER_1 à USER_4).
Fig. 7 : Brochage du connecteur d'extension de la carte EVAL-3DP001.
3.2.1 Moteurs pas-à-pas
Le câblage des moteurs pas-à-pas ne présente aucune difficulté. Il faut juste veiller à ne pas se tromper dans la polarité des enroulements (A-, A+, B-, B+). Cette polarité est sérigraphiée sur le PCB, et un coup d’œil à la documentation du moteur vous permettra de faire le lien avec la couleur des fils.
3.2.2 Tête d'impression et plateau chauffant
Là non plus, aucune difficulté à signaler. Les thermistances ainsi que la cartouche de chauffe de la tête d'impression ne sont pas polarisées. Ce n'est pas le cas pour le plateau chauffant.
Il est intéressant de signaler que le pilotage des alimentations de chauffe du plateau ainsi que de la tête d'impression se fait par l'intermédiaire de MOSFET reliés à la masse. La tension d'alimentation en +12v (ou +24v pour le plateau) est donc toujours présente.
La figure 6 présente le câblage dans le cas d'une alimentation unique en 12v. Si vous disposez d'une alimentation à double sortie 12v et 24v, alors vous pouvez alimenter le plateau en 24v, ce qui permet une montée en température plus rapide. Le plateau prend en effet plus de temps que la tête d'impression pour monter en température.
3.2.3 Capteurs de fin de course
Les capteurs de fin de course utilisés sont les mêmes que ceux présents sur les imprimantes Prusa. Le connecteur est constitué de 3 fils :
- fil rouge : alimentation du capteur en 3v3 (tension logique de la carte EVAL-3DP001) ;
- fil noir : masse ;
- fil jaune : signal de fin de course.
Le câblage est indiqué sur la figure 6.
3.2.4 Capteur de l'axe Z
Le capteur sur l'axe Z permet au firmware de réaliser une correction automatique de la perpendicularité du lit chauffant par rapport à l'axe Z de l'imprimante. Si le lit chauffant n'est pas entièrement perpendiculaire, le logiciel intègrera une correction aux déplacements sur l'axe Z en fonction de la position de la tête d'impression en X et Y.
Pour pouvoir effectuer cette correction, le logiciel va, avant de commencer l'impression, effectuer un ensemble de mesures en différents points du plateau. Le nombre de points de la grille est défini dans le fichier de configuration. La position du capteur d'auto-leveling par rapport à la tête d'impression ainsi que le type de capteur doivent également être configurés dans ce fichier.
Il existe différents types de capteurs d'auto-leveling : micro-switch, induction, BLTouch, IR, etc. Dans mon cas, j'utilise un BLTouch de la société Antclabs [4]. Il s'agit d'un système fonctionnant par contact mécanique. Il est à la fois précis et, surtout, indépendant de la nature du matériel du lit de chauffe. Dans le cas de mon imprimante, j'ai positionné au-dessus du plateau chauffant une vitre en verre sur laquelle est imprimée la pièce. L'utilisation d'un système par induction n'est donc pas possible pour moi.
Pour ce qui est de l'installation du capteur BLTouch sur la carte, on le connecte tout simplement au port d'extension. Mais avant cela, il faut vérifier que le capteur est bien configuré en logique 3v3. Sur le PCB du capteur BLTouch, la liaison « LOGIC » ne doit pas être connectée, comme le montre la figure 8. La page dédiée au BLTouch [4] sur le site Antclabs contient la notice d'utilisation.
Fig. 8 : Configuration de la logique 3v3 du BLTouch. Source [4].
La connectique du capteur BLTouch se compose de 5 fils séparés en 2 groupes.
Le premier groupe de 3 fils (marron, rouge et orange) est utilisé pour l'alimentation et le contrôle du capteur. Ce dernier est contrôlé de la même manière qu'un servomoteur, grâce à un signal PWM.
Le second groupe composé de 2 fils (noir et blanc) donne le signal de contact avec le plateau et sert également à informer la carte d'une erreur dans le capteur (alarme).
La connexion du capteur sur le connecteur d'extension de la carte est donnée par le tableau suivant :
Couleur du fil du capteur BLTouch | Description | Correspondance sur le connecteur d'extension |
Marron | Masse (GND) | Broche 39 |
Rouge | +5v | Broche 38 |
Orange | Signal de contrôle | Broche 36 |
Noir | Masse (GND) | Broche 39 |
Blanc | Signal Zmin | Broche 4 (correspond au Z_Stop) |
Nous en avons maintenant terminé avec le câblage de la carte, il est temps de passer à la partie logicielle avec en premier lieu la mise en place de l'environnement de développement.
4. Mise en place de l'environnement OpenSTM32
4.1 Installation d'OpenSTM32
OpenSTM32 est un outil de développement intégré (IDE) basé sur Eclipse. Il est disponible pour les trois OS les plus répandus, à savoir Linux, Mac OS et Windows. Je ne traiterai ici que de la partie installation sur Linux. Le système hôte utilisé est un Ubuntu 14.04.5 LTS.
L'IDE OpenSTM32 est disponible sur http://www.openstm32.org/. Pour pouvoir récupérer l'outil, il faut en premier lieu se créer un compte. Une fois cette étape passée et après vous être authentifié, il vous est possible d'accéder à certaines parties du site, et en particulier la page de documentation du projet « System Workbench for STM32 ». Sur cette page vous trouverez un lien sur l'installeur qui nous intéresse. Dans le cadre de cet article, la version v1.8 est utilisée.
L'installation de l'IDE ne devrait vous poser aucun problème. L'installeur dispose d'une interface graphique permettant de suivre la progression de l'installation. Il va également créer les règles udev pour permettre au débugger de se connecter au STLink-v2 de la carte en USB.
Une fois installé, et avant d'ouvrir l'IDE OpenSTM32, nous allons récupérer le code source du firmware Marlin4St, disponible sur GitHub.
4.2 Installation des sources Marlin4ST
Le firmware Marlin est le firmware officiel développé pour les imprimantes de la famille RepRap. Les informations relatives à ce firmware peuvent être trouvées à l'adresse [5].
L'objectif principal de ce firmware est de transformer des commandes G-Code [6] en actions mécaniques. Il offre également d'autres fonctionnalités (affichage sur LCD, lecture de fichier G-Code à partir d'une carte SD ou d'une clé USB, etc.) au risque de s'éloigner de sa fonction première et de gagner en lourdeur. Ce firmware a été conçu pour tourner sur des cartes de la famille Arduino, utilisant des processeurs 8 bits.
La dernière version en date de ce firmware est la 1.1.0-RC8. Elle est disponible sur GitHub [7]. Le firmware Marlin4ST est lui basé sur la version 1.1.0-RC7 qui date de juillet 2016.
Le code source de Marlin4ST est également disponible sur GitHub [8] :
$ git clone https://github.com/St3dPrinter/Marlin4ST.git
4.3 Importation et compilation du projet sous OpenSTM32
Il reste maintenant à importer le projet sous OpenSTM32.
Pour rappel, OpenSTM32 est basé sur l'IDE Eclipse. La première chose qui va vous être demandée est donc de choisir le workspace du projet. Cette étape est primordiale. En effet, les chemins d'accès au code source sont tous relatifs au workspace. Le choix d'un mauvais chemin pour le workspace induira donc une incapacité à compiler le firmware.
Le répertoire SW4STM32 doit être choisi comme workspace.
Une fois l'IDE ouvert, dans la fenêtre
, ouvrez le menu contextuel par un clic droit et choisissez .Le type de source à importer est
.Dans la fenêtre root directory le répertoire Marlin_3DPrinter. Vous devez ensuite sélectionner le projet Marlin_3DPrinter. Pour importer le projet, cliquez sur .
, choisir commeFig. 9 : Fenêtre d'importation du projet.
Le projet est maintenant visible dans l'onglet
comme présenté par la figure 10.Fig. 10 : Workspace Eclipse avec le projet Marlin_3DPrinter.
Il ne reste plus qu'à générer le binaire pour la cible qui nous intéresse et à le charger sur cette cible.
Pour cela, nous allons d'abord effectuer un clean du projet par un clic droit sur le nom du projet et sélectionner
. La compilation du code source suit la même procédure, mais cette fois, il faut sélectionner . Au préalable, vous aurez pris soin de choisir le type de compilation désiré : soit , soit , via le menu .À la fin de la compilation, qui doit durer entre 10 et 20 secondes, le compilateur vous indique qu'il a généré les binaires Marlin.elf et Marlin.bin, comme le montre la figure 11.
Fig. 11 : Console Eclipse après compilation.
Attention : Entre les différentes étapes (clean, build), pensez à effectuer un
pour qu’Eclipse prenne bien en compte les changements au niveau des fichiers.4.4 Chargement du binaire sur la carte et débuggage
Il existe deux solutions pour charger le binaire sur la carte : le drag and drop et le chargement via Eclipse.
4.4.1 Le drag and drop.
Une fois la carte EVAL-3DP001 connectée par USB à l'hôte, un nouveau disque va être monté. Ce disque virtuel permet de charger sur la carte le firmware par un simple drag and drop. Pour cela, il suffit de prendre le binaire fraîchement créé (Marlin.bin) qui est présent dans le répertoire Debug (ou Release) et de le copier (copier-coller ou drag-and-drop) dans le disque virtuel de la carte, qui porte le nom de STPRINTER.
Pour que le nouveau firmware soit pris en compte, il faut effectuer un power off/on complet de la carte en débranchant toutes les alimentations, câble USB compris.
Une fois l'alimentation de la carte rétablie, le fichier Marlin.bin doit avoir disparu du répertoire virtuel. Cela signifie que le binaire a bien été flashé dans le stm32 de la carte.
4.4.2 Le chargement via l'IDE4
L'IDE OpenSTM32 offre la possibilité de directement charger le fichier Marlin.elf généré, en mémoire flash du stm32.
Pour cela, une fois la compilation terminée, il suffit, dans le menu contextuel du projet, de sélectionner Marlin.elf (au cas où une version debug et une version release existent). Le flashage du stm32 va ensuite commencer.
et de choisir le bon fichierFig. 12 : Chargement binaire par l'IDE Eclipse.
5. Analyse du code source
5.1 Présentation de l'architecture firmware.
Le code source du firmware est structuré en couches, comme présenté par la figure 13.
Fig. 13 : Architecture du firmware. Source [9].
Au plus près du hardware (matériel), on trouve le CMSIS et le HAL (STM32F4xx_HAL_Driver). Le CMSIS (Cortex Microcontroller Software Interface Standard) contient les fonctions permettant d'initialiser les registres du cœur ARM lors du démarrage. Le HAL (Hardware Abstraction Layer) est spécifique au processeur utilisé. Dans notre cas, un STM32F4xx. Ce module contient les API génériques permettant d'accéder à tous les périphériques supportés par les processeurs de la famille STM32F4xx. Il peut être adressé directement, mais est surtout utilisé par le BSP pour offrir à l'application une interface de haut niveau.
Vient ensuite le BSP (Board Support Package). Cette couche offre une API de haut niveau permettant d'adresser directement le matériel présent sur la carte. Le répertoire BSP/STM32F4xx-3dPrinter contient les méthodes offertes par cette API. On y trouve la gestion des moteurs pas-à-pas, de la carte SD, du Wifi, de l'UART, etc. Le driver de bas niveau pilotant les contrôleurs de moteurs pas-à-pas se trouve sous BSP/Components/l6474. En fonction des moteurs utilisés, il vous faudra venir configurer à ce niveau la puissance maxi de ces moteurs.
Au-dessus du BSP on trouve la couche middleware contenant le code Marlin adapté pour la carte STEVAL-3DP001 ainsi qu'un gestionnaire de Fat. Dans le répertoire Marlin, le nom des différents fichiers est assez explicite quant à leurs rôles respectifs. Vous trouverez dans ce répertoire certains fichiers apparaissant sous Eclipse en grisé. Cela signifie qu'ils ont été sortis du projet. Ces fichiers devraient tout logiquement disparaître dans une version future.
5.2 Structure du projet
La structure du projet apparaissant sous Eclipse est présentée en figure 14. On y trouve les modules BSP, CMSIS et HAL sous le répertoire STM32/Drivers et le module Fatfs sous le répertoire STM32. Le module Marlin va lui être situé à la racine du projet.
On y trouve d'autres dossiers qui sont :
- Le dossier Binaries contient un binaire généré par STMicroelectronics pour un test rapide de la carte ;
- Les dossiers Debug et Release sont les dossiers de génération des binaires par l'IDE OpenSTM32 ;
- Le dossier Includes contient les liens vers les différents répertoires d'include. Le lien vers ces répertoires est configuré dans les préférences du projet, via l'onglet ;
- Le dossier Application/SW4STM32 est l'emplacement où sont stockés les paramètres du projet. Vous n'aurez pas à y toucher ;
- Le dossier Application/User contient le point d'entrée de l'application main() dans le fichier main.c. On y trouve également la configuration du system clock (clock_f4.c) ainsi que la gestion des interruptions (stm32f4xx_it.c).
Fig. 14 : Structure du projet dans l'IDE Eclipse.
6. Configuration
La configuration du projet dépend du matériel que devra piloter la carte STEVAL-3DP001. Elle s'opère en trois endroits :
6.1 Dans le fichier de configuration du projet
Les options de compilation vont permettre de sélectionner certaines fonctionnalités. Comme le projet contient du code C++ (partie Marlin) et du code C (tout le reste), les onglets
du et du doivent être complétés. Le tableau suivant donne la signification de chacun de ces switchs.Symbole | Description |
USE_HAL_DRIVER | Utilisé pour activer le driver HAL du STM32. |
STM32F401xE | Permet de choisir le processeur à utiliser. Utilisé en particulier par le HAL. |
STM_3DPRINT | Permet de désactiver les parties de Marlin non utilisées par la carte STEVAL-3DP001. |
MARLIN | Les drivers BSP et HAL peuvent être utilisés en association avec d'autres firmwares que Marlin. Dans le cas d'une utilisation avec Marlin, il faut l'indiquer. |
WIFI | Permet d'activer ou non la fonctionnalité Wifi. |
SD_WIDE_BUS | Fixe la taille du bus de la carte SD. Pour une utilisation en 4 fils, ce switch doit être utilisé. S'il n'est pas positionné, la SD fonctionnera en 2 fils. |
WAIT_FOR_RPI | Dans le cas d'une utilisation de la carte avec un pilotage par un Raspberry Pi, ce switch permet d'attendre le Raspberry Pi au démarrage. Cette attente peut être d'une durée fixe de 30 secondes ou peut se faire sur détection du Raspberry Pi (voir WITH_RPI_DETECTION). |
WITH_RPI_DETECTION | Permet d'attendre un signal en provenance du Raspberry Pi (gpio) avant de démarrer le firmware. Le switch WAIT_FOR_RPI doit être activé. |
6.2 Dans le fichier l6474_target_config.h
Ce fichier, localisé dans Drivers/BSP/Components/l6474, permet de configurer les pilotes des moteurs pas-à-pas utilisés dans l'imprimante. En fonction des moteurs que vous utilisez, vous serez probablement amenés à venir changer la configuration.
On y trouve en particulier les constantes L6474_CONF_PARAM_TVAL_DEVICE_x qui définissent le courant utilisé par chaque moteur, et les constantes L6474_CONF_PARAM_OCD_TH_DEVICE_x qui définissent le courant maximal à ne pas dépasser par chaque moteur.
6.3 Dans le répertoire Marlin
Le fichier temperature.h contient les tables de température permettant une conversion entre la valeur analogique reçue du capteur et la température réelle. Normalement, vous devriez trouver la table correspondant à vos capteurs dans ce fichier, et dans ce cas le nom de cette table doit être reporté dans le fichier Configuration.h. Si ce n'est pas le cas, vous aurez à générer par vous-même une table de température.
Les fichiers Configuration.h et Configuration_adv.h, présents sous Marlin, permettent une configuration précise du firmware en fonction de votre mécanique. On y trouve la direction des moteurs X, Y et Z ; le nombre et la position des capteurs de fin de course, etc. L'explication de ces deux fichiers fera l'objet d'un prochain article.
Conclusion
Nous arrivons au terme de cet article. Son objectif était de vous faire découvrir la carte d'évaluation STEVAL-3DP001. J'espère qu'il a répondu à vos attentes et vous a également permis de découvrir l'environnement de développement OpenSTM32, basé sur l'IDE Eclipse et dédié aux plateformes de la société STMicroelectronics.
Références
[1] Page dédiée aux technologies d'impression 3D sur le site d'Aniwwa : http://www.aniwaa.fr/les-technologies-dimpression-3d
[2] Site officiel de STMicroelectronics. Page dédiée à la carte STEVAL-3DP001 : http://www.st.com/content/st_com/en/products/evaluation-tools/solution-evaluation-tools/computer-and-peripherals-solution-eval-boards/steval-3dp001v1.html
[3] Pilote de moteur pas-à-pas L6474 sur le site de STMicroelectronics : http://www.st.com/en/motor-drivers/l6474.html
[4] Page BLTouch sur le site ANTCLABS : https://www.antclabs.com/bltouch
[5] Site officiel de Marlin : http://marlinfw.org/
[6] Page dédié au G-Code sur le site officiel de RERAP : http://reprap.org/wiki/G-code/fr
[7] Page Marlin sur GitHub : https://github.com/MarlinFirmware/Marlin
[8] Page Marlin pour la carte STEVAL-3DP001 sur GitHub : https://github.com/St3dPrinter/Marlin4ST
[9] Site officiel de STMicroelectronics. Page dédiée au firmware de la carte STEVAL-3DP001 : http://www.st.com/content/st_com/en/products/embedded-software/evaluation-tool-software/stsw-3dp001.html