Récupération des données du VFD HY via un script python Fantastique https://github.com/atelierduverdier/huanyang-vfd-reader
L'histoire complète d'une fraiseuse CNC construite de zero, du premier montage à blanc jusqu'à la machine pleinement fonctionnelle.
Journal de construction d'une fraiseuse CNC PrintNC, de la première pièce au premier copeau. Documentation complète, ouverte et reproductible.
La PrintNC est une fraiseuse CNC DIY haute performance conçue autour d'un châssis acier rigide et de pièces imprimées en 3D pour faciliter l'assemblage. Lancée fin 2019 par la communauté printnc.info, elle compte aujourd'hui des centaines de machines construites dans le monde, sous licence ouverte CC BY 4.0. Pensée pour le bois et l'aluminium (et l'acier à l'occasion), elle vise une précision typique de 0.03 à 0.1 mm. Mon exemplaire est une adaptation de la V3 avec broche 2.2 kW, motorisation Nema 23 en boucle fermée et électronique pilotée par LinuxCNC.
Tout le projet est open source. Les plans d'origine de la PrintNC viennent du wiki communautaire ; mes adaptations, configuration et outils sont sur GitHub :
Accessoires, automatismes et personnalisation de QtDragon. 16 etapes
Récupération des données du VFD HY via un script python Fantastique https://github.com/atelierduverdier/huanyang-vfd-reader
Nouvelle carte, premiere decoupe, palpeur et precision. 69 etapes
Premiers mouvements sous LinuxCNC, puis un coup dur. 42 etapes
Montage du portique termine, debut du boitier electrique. 42 etapes
Plaques reimprimees, rajustees, et le cablage de la broche. 50 etapes
Premieres etapes de construction et essai d'assemblage. 11 etapes
Ce document raconte la construction de ma fraiseuse CNC PrintNC, depuis le tout premier montage à blanc jusqu'à la machine pleinement fonctionnelle. Il a été reconstitué à partir de mon journal de bord quotidien publié sur Instagram (@atelierduverdier), où j'ai documenté presque chaque jour mes avancées, mes échecs et mes petites victoires. Plus qu'une notice technique, c'est l'histoire d'un projet mené avec patience et persévérance — deux mots qui reviennent souvent, et pour cause.

Tout commence fin janvier. Avant de visser quoi que ce soit définitivement, je procède à un premier montage à blanc de la machine, juste pour voir si tout s'emboîte correctement. Sage décision : dès le 30 janvier, je note déjà « beaucoup de petits problèmes à régler, équerrage... » mais la PrintNC avance bien. Faire ce montage à blanc se révèle très utile — c'est un conseil que je retiendrai.
La devise des premiers jours est déjà posée : « J'avance doucement mais sûrement. »


Le mois de février est largement consacré à l'axe Z, et il me donne du fil à retordre. Je dois usiner les plaques de l'axe Z sur mon autre machine — pas vraiment faite pour ça — et les cotes ne sont pas toujours au rendez-vous.
C'est une succession de tentatives : une plaque réalisée « non sans mal » avec des défauts rattrapés, un problème d'entraxe de 2,5 mm entre le porte-moteur et la vis, des réimpressions 3D, des tests sur bois avant de passer à l'aluminium. Le 13 février, je lâche un « j'espère que c'est la bonne cette fois !! » qui en dit long sur la persévérance nécessaire. Et le 14 février, enfin : « Je suis enfin parvenu à faire mon axe Z, non sans mal. »

En parallèle, je m'attaque à l'esthétique et aux détails : démontage complet pour la peinture (sous-couche puis une belle couche orange), réalisation d'un gabarit de perçage imprimé en 3D pour fixer le porte-broche au bon endroit, et réglage du porte-broche en m'appuyant sur le wiki PrintNC.
Fin février, le matériel sérieux entre en scène. Je nettoie la broche G-Penny 2,2 kW refroidie à eau, je dégraisse les patins des rails linéaires HGW20, et je m'attaque à une étape cruciale : le câblage de la broche, avec la soudure du connecteur aviation GX20. Entre le câble blindé et les petites pins, il a fallu sortir la double paire de lunettes — « on ne rajeunit pas, mais la précision n'attend pas ! »

Mars marque le vrai assemblage. Montage avec des vis de 6 mm et rondelles frein, réglage de l'axe X, et surtout un principe de méthode : ne pas serrer définitivement les vis avant d'avoir réglé l'équerrage. La mise en butée pour l'équerrage, les réglages divers... c'est minutieux.





L'aluminium me résiste : après plusieurs tentatives et un certain énervement, je finis par renoncer à usiner certaines pièces en alu sur l'ancienne machine et je reviens à des platines imprimées en 3D. « Échec total de mes platines en aluminium, je remets mes platines en 3D. » Mais comme je le note moi-même : « Dans les échecs il y a toujours du bon. » L'embase en aluminium est même remplacée par un tube d'acier coupé, dans l'esprit costaud de la machine.
Le 11 mars est un beau jour : après avoir cherché longtemps un problème, tout devient enfin fluide sur les rails parallèles. Je partage d'ailleurs la méthode qui m'a débloqué. Puis je documente plein d'astuces : fixation des blocs et supports moteur, attention à la qualité de surface des impressions 3D, mise à niveau des quatre côtés de la machine.
Le 13 mars : « Partie mécanique finalisée. » Une étape majeure.
Aussitôt, le 14 mars, j'enchaîne sur le boîtier électrique : découpe des goulottes, première « connerie » assumée avec humour, positionnement des perçages à la CNC, et début du câblage. L'atelier n'est pas aussi rangé que dans les vidéos YouTube — « Moi c'est... Moi » — mais ça avance.

Le 30 mars, grande satisfaction : « Enfin mes moteurs tournent ! » Et le lendemain, les capteurs de fin de course fonctionnent. Ça sent la fin.

Le mois d'avril s'ouvre sur de belles réussites : boîtier électrique terminé, première mise en route de la broche, activation du RS485 pour contrôler la vitesse de broche. Je commence à explorer LinuxCNC avec le firmware remora-flexi et l'interface QtDragon HD sur Raspberry Pi 4.
Le 8 avril, c'est la « VICTOIRE » : les moteurs tournent enfin sous LinuxCNC (avec un remerciement à Jean-François). Je réalise une longue démo de QtDragon.
Puis viennent les détails sans fin du montage final : modification de l'axe Z pour y passer un capteur, réflexion sur les capteurs, fabrication de boîtiers de connectique imprimés en 3D pour les moteurs Nema 23, supports de chemins de câbles. « Quand on croit que l'on a terminé... il y a toujours une petite chose qu'on oublie. »
Le 23 avril : « Premier démarrage de la PrintNC ! » La machine fonctionne, avec une démo de mouvement à 6000 mm/min — même s'il reste un problème de câble USB-C à régler. Le liquide de refroidissement de la broche est mis en place, la broche est rodée et monte à 24 000 tr/min.
Mais le 28 avril, coup dur : « Mauvaise nouvelle, carte grillée. » Le lendemain, je trouve la cause — une extension qui a fait griller la carte FlexiHAL. Un moment difficile dans un projet de cette ampleur.
Mai commence avec la PrintNC déclarée « terminée », en attendant la nouvelle carte FlexiHAL. Je tente même un sauvetage de la carte grillée. Le 6 mai, la nouvelle carte arrive et le premier test est un usinage tout simple : un carré, pour vérifier que c'est bien carré. « Et ouiii c'est bien carré ! »
S'ensuit une longue période de réglages minutieux qui montre tout le sérieux du travail : passage à 3200 step, patins caoutchouc et TPU sous les tubes acier, fixation du plateau (56 trous, 56 taraudages, 56 vis !), préparation des planches martyres. Le premier petit usinage prudent — un simple positionnement de perçage — est vécu comme « fantastique ».
Le réglage de la broche devient une quête à part entière : perpendicularité, parallélisme, équerrage, plans de référence. Je refais les réglages plusieurs fois, j'imprime des pièces dédiées, je documente longuement mon raisonnement. « C'est en répétant les gestes que l'on s'améliore. » Et le résultat est là : précision au centième.
Le 15 mai est une date charnière : « Ma PrintNC est fonctionnelle. 4 mois de réalisation. Au poil ! » Les copeaux volent, le surfaçage du chêne en bois de bout est un plaisir, et après tant de travail, voir la machine en action est une vraie satisfaction. Détail qu'on oublie toujours : l'évacuation des poussières.
La fin du mois est consacrée à l'optimisation et aux fonctions avancées : réglage fin des drivers CL57T v4.1, un bond spectaculaire de vitesse (de 6500 à 20 000 mm/min en pointe), impression d'un sabot d'aspiration. Puis la reprise de LinuxCNC après des mois sans pratique — « j'ai tout oublié ! » — et l'apprentissage de ses subtilités par rapport à GRBL (les histoires de limites à décaler).
Le palpeur de hauteur d'outil devient le grand chantier logiciel : après des essais infructueux, le 26 mai mon système de changement d'outil avec palpeur fonctionne enfin. Mieux : le 27 mai, plus aucun zéro manuel — je pose les outils et le reste est automatique. Un fichier unique « pour les gouverner tous ».
Début juin, je me laisse tenter par un changeur d'outil automatique (ATC), moi qui ne voulais pourtant pas m'y attaquer tout de suite. L'essai est instructif mais le verdict tombe le 3 juin : « Pas convaincu du système, pas assez costaud. » Je reviens donc à mon script de changement d'outil semi-automatique manuel avec palpage auto, en l'améliorant et en corrigeant ses bugs.
Les derniers jours sont consacrés à l'intégration d'accessoires et à l'interface : mise en service de relais pour piloter aspirateur, lumière et pompe, avec des boutons dédiés ajoutés directement dans QtDragon. Le 8 juin, je personnalise l'interface LinuxCNC pour y placer mes boutons.

Quatre à cinq mois de travail, des dizaines de pièces imprimées et réimprimées, une carte grillée puis remplacée, d'innombrables réglages d'équerrage et de perpendicularité, et une montée en compétence continue sur la mécanique, l'électronique et le logiciel LinuxCNC.
Ce qui ressort de ce parcours, ce n'est pas la perfection du premier coup — c'est exactement l'inverse. C'est la capacité à recommencer une plaque d'axe Z autant de fois que nécessaire, à transformer un « gros fail » en leçon, et à avancer « doucement mais sûrement ». La PrintNC de l'Atelier du Verdier est le fruit de cette persévérance.
« Après tant de travail pour réaliser cette CNC, c'est un plaisir de la voir en action. »
Document reconstitué à partir du journal de bord Instagram @atelierduverdier. Les citations en italique et entre guillemets sont des extraits des légendes d'origine.
Le VFD HuangYang 2.2 kW n'utilise pas le Modbus RTU standard mais son propre protocole série, le HYComm. Un script Modbus classique (minimalmodbus) reste muet : le VFD ne répond pas. Après analyse des trames échangées, le format de lecture d'un paramètre PD a été identifié :
Requete : [adresse][0x01][0x03][numero_PD][0x00][0x00][CRC16] Reponse : [adresse][0x01][longueur][numero_PD][valeur...][CRC16]
La longueur vaut 0x03 (PD + 2 octets de valeur) ou 0x02 (PD + 1 octet). La validation se fait par le CRC16 et par l'écho du numéro de PD dans la réponse. Un script Python (lire_vfd.py) lit ainsi les paramètres PD000 à PD189 et les enregistre dans un fichier texte. Lecture seule, LinuxCNC doit être arrêté (le composant hy_vfd occupe sinon le port /dev/ttyAMA2). Outil publié sur GitHub : github.com/atelierduverdier/huanyang-vfd-reader.
Valeurs principales lues sur la machine : fréquence max 400 Hz (PD005), tension max 220 V (PD008), moteur 220 V / 9 A / 2 pôles / 3000 tr/min à 50 Hz (PD141-144), communication adresse 1, 9600 bauds, 8N1 RTU (PD163-165). Documentés dans la section "Paramètres du VFD" du site.
PD014 (accélération) et PD015 (décélération) étaient à 1.5 s. Passés à 3 s pour ménager la broche : une décélération trop rapide renvoie de l'énergie sur le bus DC du VFD (risque de défaut surtension OU) et sollicite les roulements. 3 s élimine ce risque tout en restant confortable.
La pompe à eau (sortie FLOOD / COOLANT, M8) et les ventilateurs (AUX2) sont désormais pilotés ensemble par un signal commun, avec maintien après l'arrêt de la broche pour évacuer la chaleur résiduelle.
Comportement : - M3 (broche ON) ou M8 : pompe + ventilateurs démarrent immédiatement. - M5 (broche OFF) ou M9 : pompe + ventilateurs restent actifs encore 30 s, puis s'arrêtent ensemble. - Bouton AUX2 et M64 P2 / M65 P2 : commande manuelle des ventilateurs (inchangé).
Réalisation avec un composant timedelay (post-refroidissement) et deux or2 en cascade. Dans remora-flexi.hal :
loadrt or2 names=aux0_or,aux1_or,aux2_or,aux3_or,cool_or1,cool_or2 loadrt timedelay names=spindle_cooldown addf cool_or1 servo-thread addf cool_or2 servo-thread addf spindle_cooldown servo-thread setp spindle_cooldown.on-delay 0 setp spindle_cooldown.off-delay 30 net spindle-on => spindle_cooldown.in # FLOOD = M8 OU post-refroidissement broche net coolant-m8 iocontrol.0.coolant-flood => cool_or1.in0 net spindle-cooldown spindle_cooldown.out => cool_or1.in1 net cooling-active cool_or1.out => flexi.output.COOLANT
Dans custom_postgui.hal :
# AUX2 (ventilateurs) = (bouton OU M64) OU refroidissement actif net aux2-or-out aux2_or.out => cool_or2.in0 net cooling-active => cool_or2.in1 net aux2-out cool_or2.out => flexi.output.AUX2
Le délai se règle avec setp spindle_cooldown.off-delay (en secondes). Piège rencontré : on ne peut pas relier deux fois le pin iocontrol.0.coolant-flood (déjà lié au signal flood) ; il faut réutiliser le signal existant, pas le pin.
Le tableau d'affectation indiquait AUX2 = pompe à eau. En réalité AUX2 = ventilateurs broche, et la pompe est sur la sortie FLOOD (COOLANT). Documents AFFECTATION_AUX.md et tableau corrigés.
La logique utilisait flexi.input.CYCLE_START.not alors que cette entrée est active HAUTE (FALSE au repos, TRUE en appui). Le .not restait donc TRUE en permanence au repos, et combine a program-is-idle, relançait halui.program.run en boucle dès que la machine redevenait idle. Corrigé en retirant le .not et en supprimant l'ancien mecanisme de single-step automatique (qui n'était plus nécessaire et participait au bug) :
net cycle-start-button flexi.input.CYCLE_START => run_and.in0 net program-is-idle halui.program.is-idle => run_and.in1 net program-run run_and.out => halui.program.run
Même type de bug sur le Hold : flexi.input.FEED_HOLD.not était utilise alors que FEED_HOLD est FALSE au repos (vérifié via halshow). Le .not restait donc TRUE au démarrage, déclenchant une seule fois le toggle et bloquant hold_toggle.on / halui.program.pause a TRUE de façon permanente. Conséquence inattendue : GO HOME refusait avec "Linear move on line 0 would exceed joint 0's negative limit" car la machine se croyait en pause. Corrigé en retirant le .not :
net hold_button flexi.input.FEED_HOLD => hold_button_toggle.in
Déblocage immediat effectué via Resume avant correction du fichier.
La carte de boutons (CYC/ST, HOLD, HALT, DOOR avec LEDs témoins) était câblée en parallele de la télécommande RJ45 sur les mêmes entrées FlexiHAL. Résultat : niveaux logiques perturbés sur SYS/ST et HOLD. Solution retenue : déconnexion des sorties SYS/ST et HOLD de la carte de boutons, RJ45 seul conservé sur ces deux lignes. HALT reste fonctionnel sur la carte de boutons (vérifié au multimetre, diode de protection MOSFET 2N7000 RAS). A faire si réutilisation future de la carte boutons sur ces 2 lignes : ajouter une logique de découplage (diodes OU or2 comme déjà fait pour les sorties AUX0-3) pour éviter le conflit entre les deux sources de signal.
Mise en place d'un PC de développement (x86_64, Debian) en complément du Raspberry Pi de production, synchronisés par git. Config de simulation créée pour travailler l'interface sans le matériel : remora-flexi-sim.ini/.hal, postgui_call_list_sim.hal, qtdragon_hd_sim.hal, custom_postgui_sim.hal. Remplace le composant flexi (SPI) et le VFD série par des équivalents simulés. Lancement : linuxcnc ~/linuxcnc/configs/flexi-hal/remora-flexi-sim.ini. Affichage fenêtre : retirer l'option -f (fullscreen) de la ligne DISPLAY.
Paquet qttools5-dev-tools (binaire "designer"). Alias PC avec x86_64-linux-gnu au lieu de aarch64-linux-gnu sur le Pi.
Ajout dans le handler de 4 fonctions lançant des applications externes sans bloquer l'interface (subprocess.Popen) : terminal (xfce4-terminal), geany, navigateur, explorateur de fichiers. Connexions défensives (hasattr).
Le moteur Y2 (JOINT_3) était règle a STEPLEN/STEPSPACE = 5000 (reste d'un test sur un bruit moteur dont la vraie cause était les DIP switches du driver). Harmonisé a 2500 sur tous les axes : son nettement meilleur.
Après avoir testé 10000 mm/min (166.67 mm/s) sans perte de pas, la vitesse a finalement été ramenée a 8000 mm/min (133.33 mm/s) pour le confort sonore et thermique des moteurs (perte de couple a haute vitesse rattrapée par les drivers en boucle fermee, accentuee par la temperature). Modifications dans [AXIS_X], [JOINT_0], [AXIS_Y], [JOINT_1], [JOINT_3], [DISPLAY] et [TRAJ]. Latence du Pi vérifiée avec latency-test : excellente (jitter servo ~28 us).
A haute vitesse, en fin de déplacement GO HOME : message "EMC_TASK_PLAN_PAUSE cannot be executed". Le bouton utilise CALL_MDI_WAIT avec un delai = distance / vitesse + marge, qui ignore le temps d'accélération/décélération. Avec une marge de 1 s, le WAIT expirait avant la fin du mouvement. Correction dans qtdragon_hd_handler.py, fonction calc_mdi_move_wait_time :
avant : def calc_mdi_move_wait_time(self, dest_x, dest_y, wait_buffer_secs=1) apres : def calc_mdi_move_wait_time(self, dest_x, dest_y, wait_buffer_secs=4)
Au démarrage : erreurs "page_allocator Invalid argument (22)" + gel de la boucle (~0.18 s). Le widget QtWebEngine (page HTML de l'onglet SETUP, non utilisée) plante au démarrage. Widget web_view supprimé dans Qt Designer (onglets PDF et PROPERTIES conserves). Handler protégé par hasattr(self.w,'web_view') and hasattr(self.w,'layout_HTML').
Popup au déverrouillage E-stop, présent "depuis toujours". La carte lit ses entrées en logique active basse (FEED_HOLD = TRUE au repos), donc halui.program.pause était forcé a TRUE en permanence. Correction dans remora-flexi.hal :
avant : net hold_button flexi.input.FEED_HOLD => hold_button_toggle.in apres : net hold_button flexi.input.FEED_HOLD.not => hold_button_toggle.in
Sujet connexe non resolu : la télécommande 3 boutons RJ45 ne répond physiquement que sur HALT ; CYCLE_START et HOLD ne changent pas d'état (câblage/brochage a vérifier).
Chaque sortie AUX est pilotee par un or2 : relais actif si le bouton OU le G-code le demandé.
loadrt or2 names=aux0_or,aux1_or,aux2_or,aux3_or addf aux0_or servo-thread net aux0-gcode motion.digital-out-00 => aux0_or.in0
Dans custom_postgui.hal (charge apres le GUI) :
net aux0-btn qtdragon.aux0 => aux0_or.in1 net aux0-out aux0_or.out => flexi.output.AUX0
Important : le prefixe reel des pins de boutons est "qtdragon" (et non "qtvcp"). Verifier avec halcmd show pin | grep -i aux.
Ecran copie avec qtvcp copy (ne jamais modifier l'ecran système). Boutons : PushButton de la categorie "linuxcnc - hal", objectName aux0..aux3, checkable coche. Le PushButton HAL créé automatiquement la pin qtdragon.<objectName>.
Erreur "Pin qtdragon.aux0 does not exist" apres manipulations. Procedure de secours : commenter les lignes aux?-btn du postgui pour démarrer, recreer les boutons, vérifier avec halcmd, decommenter. Lecon : faire fonctionner d'abord, faire joli ensuite. Une modif a la fois.
Piloter les relais (lumiere, arrosage, aspiration) via les sorties AUX de la FlexiHAL, commandables depuis QtDragon et le G-code (M64/M65). Configuration HAL directe, sans inversion (modules câbles en active HIGH) :
net aux0-sig motion.digital-out-00 => flexi.output.AUX0 net aux1-sig motion.digital-out-01 => flexi.output.AUX1 net aux2-sig motion.digital-out-02 => flexi.output.AUX2 net aux3-sig motion.digital-out-03 => flexi.output.AUX3
Prerequis INI (sinon M64/M65 ignores silencieusement) :
[EMCMOT] NUM_DIO = 4
Alimentation ET signal pris sur le bornier AUX 2 fils. Par module : borne + du bornier vers DC+, pont court DC+ <-> IN sur le module, borne - vers DC-. Le rail AUX doit être alimente (jumper P17 = MAIN = 24V). Limites : 1000 mA combines pour les 4 AUX, bobine >= 150 Ohm.
La cause racine d'un long debogage était un jumper P17 defectueux (pas de contact) : le rail AUX n'était pas alimente (borne + a 0V au lieu de 24V). Pistes ecartees avant : NUM_DIO absent de l'INI, jumpers de modules incoherents, tentative d'inversion HAL (composant not) abandonnee. La config HAL et le câblage étaient corrects ; seul defaut matériel : le jumper.
Le script toolchange.ngc appele par REMAP=M6 contenait lui-même un M6, creant une recursion infinie : la preview G-code de QtDragon ne se chargeait plus. Correction : suppression du M6 parasite.
Le script utilisait #5400 (outil courant) au lieu de #<_selected_tool> (outil demandé par T_ M6). Au premier M6 sans outil en broche, #5400 = 0 et le script sortait sans palper. Corrigé.
Les blocs IF...M2...ENDIF cassaient la preview QtDragon. Supprimes : G38.2 declenche déjà automatiquement une erreur en cas d'echec de palpage, la vérification de #5070 était redondante.
[PROBE] TOOLSET_X = -25.0 ne correspondait pas a [VERSA_TOOLSETTER] X = -50.0. Corrigé a -50.0.
Un OpenATC (changement semi-automatique) avait été tente puis abandonne. Solution retenue : changement d'outil MANUEL avec palpage AUTOMATIQUE de la longueur d'outil au palpeur fixe (X-50 Y60). Script toolchange.ngc via REMAP=M6 : double palpage (rapide + lent), mode 0 (Z zero sur martyre auto) ou mode 1 (Z zero sur piece manuel), gestion du premier outil de référence via #1000 et #1002. Subroutines MDI associees : reset_ref, set_mode_martyre, set_mode_piece.
Ne jamais rappeler le code M qui a declenche le REMAP dans son propre script. Utiliser #<_selected_tool> et non #5400. Eviter les IF contenant M2/M30 (cassent la preview). G38.2 gere ses propres erreurs.
Liste complète du matériel pour la construction de la PrintNC, avec les prix payés à l'achat en 2026. Articles cliquables = lien direct vers la page produit. Prix indicatifs — les tarifs Aliexpress/Amazon fluctuent.
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Bois | 1 | 180€ | 180.00 € | |
| Roulette Table CNC | 1 | 32.79€ | 32.79 € | |
| OSB Plateau 22mm Table CNC | 4 | 24.1875€ | 96.75 € | |
| Tube rectangulaire 100x50x4mm | 4 | Structure plateau — 1600 mm | 59.52€ | 238.08 € |
| Tube rectangulaire 100x50x4mm | 2 | Axe Y — 1550 mm | 57.66€ | 115.32 € |
| Tube rectangulaire 100x50x4mm | 6 | Supports — 100 mm | 3.72€ | 22.32 € |
| Tube rectangulaire 100x50x4mm | 1 | Axe X — 1650 mm | 61.38€ | 61.38 € |
| Sous-total | 746.64 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Ball Screw SFU1610 Ball Screw | 1 | X-Axis Movement — 1500 | 108.14€ | 108.14 € |
| SFU1610 Ball Screw | 2 | Axes Y — 1500 mm (rails à recouper en 1400 mm) | 108.39€ | 216.78 € |
| SFU1204 Ball Screw | 1 | Axe Z — 300 mm | 18.89€ | 18.89 € |
| Sous-total | 352.86 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Linear Rails HGR20 Linear Rail(x2) | 1 | Axe X — 1500 mm | 100.39€ | 100.39 € |
| Linear Rails HGR20 Linear Rail(x2) | 1 | Axe Y — 1500 mm (recoupé à 1400 mm) | 100.39€ | 100.39 € |
| Linear Rails HGR20 Linear Rail(x2) | 1 | Axe Z — 400 mm | 46.39€ | 46.39 € |
| Sous-total | 247.17 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Support moteur HM10-57 angular bearing | 1 | 19.29€ | 19.29 € | |
| Support moteur HM12-57 angular bearing | 3 | 18.99€ | 56.97 € | |
| Sous-total | 76.26 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Spindle 2.2kw Water Cooled Spindle | 1 | Cutting | 249.58€ | 249.58 € |
| Tuyau Orange 8x5 | 1 | 12.1€ | 12.10 € | |
| Acrylic Meter G1/4 | 1 | 4.85€ | 4.85 € | |
| PC Water Cooling | 1 | 20.79€ | 20.79 € | |
| Pneumatique Elbow | 1 | 4.56€ | 4.56 € | |
| Sous-total | 291.88 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Equerre 90 Degrée Flat Edge Square 200x130 | 1 | 19.59€ | 19.59 € | |
| Pointau Starrett 117B | 1 | Avant trou | 7.94€ | 7.94 € |
| Pince à sertir | 1 | 22.98€ | 22.98 € | |
| Comparateurs à cadran | 2 | 17.45€ | 34.91 € | |
| Sous-total | 85.42 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Controller FlexiHAL | 1 | Controller | 122.59€ | 122.59 € |
| Dissipateur Raspberry pi 5 8go | 1 | 9€ | 9.00 € | |
| SSD 500Go | 1 | 104.99€ | 104.99 € | |
| Ordinateur Raspberry pi 5 8go | 1 | 173.99€ | 173.99 € | |
| Hat Pimoroni Hat m.2 | 1 | 22€ | 22.00 € | |
| Sous-total | 432.57 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Nema 23 Nema 23 23HS40-5004-ME1K | 4 | 32.8€ | 131.20 € | |
| Pilote CL57T-V41 | 4 | 42.44€ | 169.76 € | |
| Sous-total | 300.96 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Contacteur 24v | 1 | 38.87€ | 38.87 € | |
| Disjoncteur fusible 2Ampére | 1 | 2.61€ | 2.61 € | |
| Module filtre de puissance | 1 | 17.99€ | 17.99 € | |
| Alimentation 24v | 1 | 28.81€ | 28.81 € | |
| Alimentation Alim 350W 48v 7.3A LE-350-48 | 2 | 21.49€ | 42.98 € | |
| Alimentation Alim 350W 24v 4.5A | 1 | 11.05€ | 11.05 € | |
| Sous-total | 142.31 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Bouton | 1 | 3.89€ | 3.89 € | |
| Prise HDMI/usb Prise boîtier | 1 | 13.26€ | 13.26 € | |
| Prise coude usb Prise boîtier | 1 | 7.01€ | 7.01 € | |
| Boutons | 1 | 28.75€ | 28.75 € | |
| Ventilateurs | 1 | 30.03€ | 30.03 € | |
| Ventilateurs 2x 24v | 1 | 20.05€ | 20.05 € | |
| Bouton ON/OFF | 1 | 15.99€ | 15.99 € | |
| Sous-total | 118.98 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Probe | 1 | 28.78€ | 28.78 € | |
| Capteur LJ8A3-2-Z/AX | 4 | Alimentation 24V — NPN NC | 7.12€ | 28.48 € |
| Sous-total | 57.26 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Nappe 2x10pin | 1 | 3.17€ | 3.17 € | |
| DB9 male | 1 | 10.07€ | 10.07 € | |
| Câblé Chain 1m 30x103 | 1 | 114.87€ | 114.87 € | |
| Câblé Chain 1m 30x103 | 1 | 38.59€ | 38.59 € | |
| Câblé 6 couleurs | 1 | 17.36€ | 17.36 € | |
| Câblé 16awg vert bleu rouge | 1 | 11.48€ | 11.48 € | |
| Câblé 16awg vert bleu rouge | 1 | 22.27€ | 22.27 € | |
| Goulotte 40x40 | 2 | 18.89€ | 37.78 € | |
| DIN Rail | 1 | 5.59€ | 5.59 € | |
| Prises GX20 | 1 | 7.49€ | 7.49 € | |
| Prises GX16 | 2 | 3.39€ | 6.78 € | |
| Boîtier Vevor 60x60x20 | 1 | 103.9€ | 103.90 € | |
| Terminal Bloc 3,81 | 1 | 15.58€ | 15.58 € | |
| Terminal Bloc 3,81 | 1 | 7.29€ | 7.29 € | |
| Câblé VFD | 1 | 34.95€ | 34.95 € | |
| Câblé Kit de câble d’extension d’encodeur | 4 | 27.28€ | 109.12 € | |
| Câblé 3 Brins | 1 | 30.99€ | 30.99 € | |
| Sous-total | 577.28 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Visserie | 1 | 82.09€ | 82.09 € | |
| Sous-total | 82.09 € |
| Article | Qté | Détails | Prix unit. | Total |
|---|---|---|---|---|
| Filament 3D Sunlu Blanc Osseux | 2 | 18.99€ | 37.98 € | |
| Capteur flux d’eau | 1 | 15.07€ | 15.07 € | |
| Peinture Orange pur RAL 2004 | 4 | 18.9€ | 75.60 € | |
| Peinture Sous couche | 5 | 9.3€ | 46.50 € | |
| peinture Orange pur RAL 2004 | 5 | 18.9€ | 94.50 € | |
| Sous-total | 269.65 € |
| Montant | |
|---|---|
| Articles | 3781.33 € |
| Frais de port | 311.95 € |
| Remises | -47.53 € |
| Total final | 4045.75 € |
Prix payés au moment de l'achat début 2026. Prévoir une marge de ±20% selon les promotions et les fluctuations de change.

La PrintNC est un routeur CNC DIY haute performance base sur un châssis acier, conçu pour être rigide tout en restant constructible avec un simple imprimante 3D (les pièces imprimées servent surtout de gabarits et de supports non structurels). Cet exemplaire est un format standard, surface de travail utile environ 1275 x 1275 mm.
Caractéristiques principales :


La boucle fermee permet aux drivers de rattraper un éventuel décalage grâce a l'encodeur : la machine signale une erreur plutôt que de perdre des pas silencieusement.



Le pas plus fin en Z est un choix classique : il ralentit l'axe mais lui donne plus de poussée et de tenue, ce qui est souhaitable pour porter le poids de la broche.





Quelques décisions de conception du projet PrintNC qui peuvent surprendre au premier abord, mais qui sont issues de nombreuses itérations de la communauté.
Les premières versions de la PrintNC utilisaient deux patins par rail. Le passage à un seul patin a été un choix réfléchi, validé par des centaines de machines construites :
Sur le très long terme, deux patins augmenteraient la durée de vie des rails — mais l'usage en routeur hobbyiste reste très en deçà du régime nominal des HGR20, prévus pour de la machine industrielle en service continu.
L'acier est environ 3 fois plus rigide que l'aluminium à section égale. Pour un routeur CNC de cette taille, c'est la rigidité du châssis qui détermine la qualité d'usinage en métaux (alu, acier doux). L'épaisseur recommandée par le wiki est 2.5 mm pour les tubes ; cet exemplaire utilise du 4 mm, encore plus massif, pour ménager une marge sur les vibrations en usinage acier.
Malgré son nom, la PrintNC ne repose pas sur des pièces plastique en charge. Les éléments imprimés en 3D servent principalement de :
L'idée initiale était de pouvoir construire une CNC sans avoir besoin d'une CNC, juste avec une imprimante 3D et des outils manuels de base.
L'axe Y est entraîné par deux moteurs Nema 23 synchronisés, un de chaque côté du portique. Cette configuration en tandem évite tout problème de rattrapage mécanique (pas d'arbre de liaison ni d'engrenages), et garde le portique parfaitement parallèle. Les deux moteurs sont homés ensemble pour garantir l'orthogonalité au démarrage. Le scale négatif sur JOINT_3 compense simplement le sens de rotation inverse du moteur (les deux vis tournent dans le même sens mécanique).
---
La PrintNC peut être équipée de différentes broches selon le budget et les usages prévus. Voici les options principales pour situer le choix retenu sur cet exemplaire.
| Type | Puissance typique | Refroidissement | Usage principal |
|---|---|---|---|
| Routeur (Makita RT0701C, DeWalt DWP611) | ~700 W | Air (ventilateur interne) | Bois, occasionnel |
| Broche air-cooled | 0.5 à 2.2 kW | Air (ventilateur intégré) | Polyvalent |
| Broche water-cooled (choix retenu) | 1.5 à 2.2 kW | Eau (pompe externe) | Travail intensif, silencieux |
| Puissance | Couple | Pince | Courant en 230V |
|---|---|---|---|
| 0.5 kW | 0.5 N·m | ER11 | 2.25 A |
| 0.8 kW | 0.3 N·m | ER11/16 | 3.6 A |
| 1.5 kW | 0.6 N·m | ER11/16 | 6.8 A |
| 2.2 kW (cet exemplaire) | 0.875 N·m | ER20 | 10 A |
La taille de pince détermine le diamètre maximum de queue d'outil utilisable.
| Pince | Longueur | Diamètre |
|---|---|---|
| ER11 | 18 mm | 11.5 mm |
| ER16 | 27.5 mm | 17 mm |
| ER20 (cet exemplaire) | 31.5 mm | 21 mm |
L'ER20 accepte des outils jusqu'à 13 mm de queue, ce qui permet d'utiliser une large gamme de fraises industrielles. Pour l'usinage bois et alu sur cette machine, des queues de 6 mm, 8 mm et 12 mm sont les plus courantes.
Le choix retenu (G-Penny 2.2 kW ER20) combine plusieurs avantages :
Le wiki PrintNC déconseille fortement les broches Vevor car certains modèles utilisent des roulements inadaptés à un montage CNC. Les G-Penny "metal cutting" sont parmi les modèles recommandés par la communauté.
---


Carte d'interface conçue par Expatria, exécutant le firmware Remora. Elle communique avec le Raspberry Pi par bus SPI et généré les impulsions de pas en matériel (plus stable qu'une génération logicielle). Le firmware se flashe via DFU avec l'outil dfu-util.
Point important — logique active basse : la carte lit ses entrées en logique active basse. Une entrée au repos est à l'état TRUE et passe à FALSE quand elle est activée. Chaque entrée dispose aussi de sa version inversée (.not) directement utilisable dans le HAL. C'est essentiel pour câbler correctement la logique (voir la section Dépannage).

Point important — liaison des masses : le GND (masse) des deux alimentations 48 V est relié ensemble par un fil, afin d'établir une référence commune pour les drivers CL57T. Sans cette liaison, les niveaux logiques des signaux de pas entre la carte FlexiHAL (alimentée en 24 V) et les drivers (alimentés en 48 V) peuvent être instables ou mal interprétés. Un seul fil entre les deux bornes GND suffit.
Respecter les masses communes.



Quatre sorties AUX pilotent des relais 24 V. Chaque relais est commandable de DEUX façons, combinées par un composant logique or2 (OU) : par le G-code (M64/M65) ET par un bouton dans QtDragon. Le relais est actif si l'une OU l'autre source le demande.
| Sortie | Pin G-code | Bouton QtDragon | Affectation |
|---|---|---|---|
| AUX0 | motion.digital-out-00 | qtdragon.aux0 | Aspirateur |
| AUX1 | motion.digital-out-01 | qtdragon.aux1 | Lumière |
| AUX2 | motion.digital-out-02 | qtdragon.aux2 | Pompe a eau |
| AUX3 | motion.digital-out-03 | qtdragon.aux3 | Libre (réserve) |
Câblage retenu (modules relais en activé HIGH, jumper sur H) :
Le rail AUX qui fournit le + est alimente par le jumper P17 positionne sur MAIN (= 24 V). Sans cette alimentation, la borne + sort 0 V et rien ne fonctionne. Ne jamais peupler P17 ET une alimentation externe en même temps. Limites : 1000 mA combines pour les 4 AUX, résistance de bobine des relais >= 150 Ohm.
Point important — NUM_DIO obligatoire : la ligne NUM_DIO = 4 doit être présente dans la section [EMCMOT] de l'INI. Sans elle, les pins motion.digital-out sont ignorées silencieusement et le G-code M64/M65 reste sans effet.
Sorties dédiées du firmware (indépendantes des AUX) :
Palpeur fixe (tool setter) monte sur la table, aux coordonnées machine G53 X-50 Y60. Gere via l'interface VersaProbe de QtDragon. Sert a mesurer automatiquement la longueur des outils lors d'un changement.
Télécommande 3 boutons sur connecteur RJ45 : CYCLE START, HOLD (feed hold), HALT (arrêt). A ce jour seul HALT répond physiquement ; CYCLE START et HOLD ne changent pas d'etat a l'appui (câblage / brochage RJ45 a vérifier). A documenter une fois résolu.
Le variateur de fréquence (VFD) HuangYang 2.2 kW pilote la broche G-Penny ER20. Il est contrôlé par LinuxCNC via une liaison série RS485 (protocole HYComm propriétaire HuangYang, pas du Modbus standard) avec le composant hy_vfd. Les paramètres ci-dessous sont ceux configurés sur cette machine, lus directement depuis le VFD.
| Paramètre | Valeur | Description |
|---|---|---|
| PD141 | 220 V | Tension nominale moteur |
| PD142 | 9 A | Courant nominal moteur |
| PD143 | 2 | Nombre de pôles moteur |
| PD144 | 3000 tr/min | Vitesse nominale à 50 Hz |
Avec 2 pôles et une fréquence max de 400 Hz, la broche atteint 24000 tr/min (400 × 60 / 1 paire de pôles).
| Paramètre | Valeur | Description |
|---|---|---|
| PD004 | 400 Hz | Fréquence de base |
| PD005 | 400 Hz | Fréquence max |
| PD006 | 2.5 Hz | Fréquence intermédiaire |
| PD007 | 20 Hz | Fréquence min (torque boost) |
| PD008 | 220 V | Tension max |
| PD009 | 24 V | Tension intermédiaire |
| PD010 | 9 V | Tension min |
| PD011 | 0 Hz | Fréquence min de fonctionnement |
| Paramètre | Valeur | Description |
|---|---|---|
| PD014 | 3 s | Temps d'accélération |
| PD015 | 3 s | Temps de décélération |
| PD072 | 4 kHz | Fréquence porteuse PWM |
| Paramètre | Valeur | Description |
|---|---|---|
| PD002 | 2 | Source de la fréquence (2 = RS485) |
| PD003 | 2 | Source des commandes run (2 = RS485) |
| PD163 | 1 | Adresse de communication (esclave Modbus) |
| PD164 | 1 | Baud rate (9600 bps) |
| PD165 | 3 | Format des données (8N1 RTU) |
Point important — communication HuangYang : pour piloter le VFD depuis LinuxCNC, PD002 et PD003 doivent être à 2 (commande par le port série). Le câble RS485 doit relier les bornes A+ et B- du VFD à l'adaptateur RS485 du Raspberry Pi. Le protocole est le HYComm propriétaire HuangYang (géré par le composant hy_vfd), pas du Modbus RTU standard — un script Modbus classique ne communiquera pas avec ce VFD.
Le VFD est chargé dans remora-flexi.hal par le composant hy_vfd :
loadusr -Wn vfd hy_vfd -n vfd -d /dev/ttyAMA2 -p none -r 9600 -s 1 setp vfd.enable 1 net spindle-speed-cmd vfd.speed-command <= spindle.0.speed-out net spindle-speed-fb spindle_fb_scale.out => spindle.0.speed-in net spindle-at-speed vfd.spindle-at-speed => spindle.0.at-speed net spindle-forward vfd.spindle-forward => spindle.0.forward net spindle-on vfd.spindle-on => spindle.0.on
Note : le port est /dev/ttyAMA2 sur Raspberry Pi 5 (et /dev/ttyAMA3 sur Pi 4).
Pour lire tous les paramètres du VFD sans les recopier un par un sur le petit écran, j'ai développé un script Python qui communique directement en HYComm sur le port RS485 : il interroge les paramètres PD000 à PD189, valide chaque réponse (CRC16 + écho du numéro de paramètre) et enregistre le tout dans un fichier texte.
Le script est disponible librement sur GitHub : github.com/atelierduverdier/huanyang-vfd-reader
Point important : il faut arrêter LinuxCNC avant de lancer le script, car le composant hy_vfd occupe le port série tant que LinuxCNC tourne. Le script est en lecture seule et ne modifie aucun paramètre du VFD. C'est cet outil qui a servi à relever les valeurs documentées ci-dessus.
La configuration vit dans ~/linuxcnc/configs/flexi-hal/ et est versionnée sur GitHub : github.com/atelierduverdier/printnc-config. Fichiers principaux :
JOINTS = 4, KINEMATICS = trivkins coordinates=XYZY. L'axe Y est en tandem : deux moteurs (JOINT_1 = Y1 et JOINT_3 = Y2), homes ensemble pour garder le portique parallèle. Le scale négatif de Y2 compense le sens de rotation inverse du moteur (pas un montage en miroir mécanique : les deux vis tournent dans le même sens, les deux patins avancent dans le même sens).
La vitesse X/Y a été poussée a 10000 mm/min lors des essais (sans perte de pas, latence du Pi excellente) mais ramenée a 8000 pour le confort sonore et thermique : a haute vitesse les moteurs perdent du couple (rattrape par la boucle fermée) et chauffent. Facteur limitant théorique pour aller plus haut : la vitesse critique de fouettement des vis SFU1610 sur ~1.3 m.
STEPLEN = STEPSPACE = 2500 ns sur tous les axes. C'est la durée de l'impulsion de pas et le repos minimum entré deux impulsions. 2500 ns est une valeur sûre pour les drivers CL57T. Point important — timings Y identiques : les deux moteurs Y (Y1 et Y2) doivent avoir des timings STEPLEN/STEPSPACE identiques, indispensable pour un portique tandem synchrone. Un écart provoquerait une désynchronisation progressive du portique.
Point important — séquence de homing : Z monte EN PREMIER (HOME_SEQUENCE 0) pour dégager l'outil, puis X et Y se référencent ensemble (HOME_SEQUENCE -1). Ne jamais inverser cet ordre. Capteurs inductifs NPN NC.
Un PC x86_64 sous Debian sert au développement de l'interface en simulation, synchronise au Pi par git. Une configuration de simulation (remora-flexi-sim.ini et fichiers associes) remplace la carte Flexi-HAL (SPI) et le VFD par des équivalents simules : on peut travailler l'interface QtDragon sans la machine réelle. Le fichier d'interface .ui est partage entré les deux machines.
Règle d'or git : git pull en arrivant sur une machine, push en partant. Un script push-config (range hors dépôt) demande un message puis fait add + commit + push. L'authentification GitHub se fait par token personnel (le mot de passe n'est plus accepte). Un .gitignore exclut les fichiers propres a chaque machine (linuxcnc.var, qtdragon.pref, fichiers temporaires).
1. Mettre la machine sous tension (armoire, contacteur). 2. Lancer LinuxCNC avec la configuration remora-flexi.ini. 3. Déverrouiller l'arrêt d'urgence, puis mettre la machine sous puissance (bouton MACHINE ON). 4. Lancer le homing : le Z monte d'abord, puis X et Y se référencent ensemble. 5. La machine est prête : on peut charger un programme ou passer des commandes MDI.
1. Ramener la broche en position haute et sûre si besoin. 2. Couper la broche (M5) et l'arrosage (M9). 3. Mettre la machine hors puissance, enclencher l'arrêt d'urgence. 4. Fermer LinuxCNC, couper l'alimentation générale.
Changement MANUEL avec palpage AUTOMATIQUE de la longueur d'outil. Déclenche par M6 (REMAP vers le script toolchange.ngc). Deux modes :
Le premier outil de la session sert de référence (variables #1000 et #1002). Le palpage se fait au palpeur fixe (G53 X-50 Y60), avec un double passage (rapide puis lent) pour la précision.
Point important — équerrage avant serrage : ne jamais serrer définitivement les vis de structure avant d'avoir réglé l'équerrage. La mise en butée et les réglages se font avant le serrage final.
Vis a billes et rails linéaires (copies de HIWIN) : graisse blanche au lithium tout usage, consistance NLGI 2. Point important : elle ne doit PAS contenir de particules solides (bisulfure de molybdène MOS2, graphite). Ces additifs endommagent les billes des rails et des vis. Selon la norme DIN51502, chercher une référence type KP2K ou K2K : K initial = graisse pour roulements (obligatoire), 2 = consistance NLGI 2, et surtout aucune lettre F (qui indiquerait des particules solides).
En général, un coup de pompe par roulement suffit.
Lubrification initiale : graisser, déplacer le chariot au moins 2 fois sa longueur, répéter 2 fois (ou plus tant qu'aucune trace de graisse n'apparaît sur le rail). Les rails HIWIN se re-lubrifient en principe tous les 100 km parcourus, a adapter selon l'intensité d'usage.
Les graisseurs (zerk) se cassent facilement : ne pas forcer avec une pompe a levier. Un coupleur a verrou rapide facilite la mise en place. Sous 60 m/min la graisse convient ; au-delà il faudrait une huile haute viscosité (32 a 150 cSt).
L'équerrage garantit que les axes X et Y sont perpendiculaires. Plusieurs méthodes existent.
Utilise un triangle rectangle 3-4-5. Choisir une unité donnant le plus grand triangle possible sans dépasser les dimensions de la machine. Depuis un point de départ (zéro X/Y), avancer de 3 unités sur un axe (point 2), puis de 4 unités sur l'autre (point 3). Mesurer les cotes : A et B confirment que les pas/mm sont corrects, l'hypoténuse C (doit valoir 5 unités) confirme l'équerrage. Si C ne correspond pas, ajuster les butées de l'axe Y et recommencer.
Attention — couper l'alimentation des drivers avant de débrancher ou rebrancher un moteur. Percer 3 trous en triangle dans une planche posee sur le martyre. Mettre 2 forets comme pions de centrage, retourner la planche selon l'axe X, la reposer sur les pions. Revenir a la position notee : si le portique n'est pas d'equerre, le 3e foret ne s'aligne pas. Debrancher le moteur Y2 (droit), déplacer le côté gauche du portique jusqu'a l'alignement parfait. La différence de position vaut 2 fois le défaut : diviser par 2 et entrer cette valeur comme offset Y1.
Point important — Z ET broche : il faut à la fois mettre le Z d'équerre ET trammer la broche. Une broche parfaite par rapport à la pièce ne suffit pas : si le Z est de travers, un perçage donnera un ovale (mouvement latéral pendant la plongée).
Partir d'une surface bien plane (verre float, par exemple une vitre de plateau d'imprimante 3D). Fixer un comparateur sur le chariot Z, descendre au contact, déplacer la machine sur le verre et caler avec des shims jusqu'a ce que la surface soit de niveau.
Comparateur parallele au plan et a l'axe Y, equerre sur la surface de référence. Monter lentement le Z le long de l'equerre, observer la variation. Pour ajuster : desserrer les 4 boulons reliant l'equerre alu au chariot X inférieur, utiliser la vis centrale pour pousser la plaque, resserrer une fois le Z parallele.
Desserrer les 4 vis serrant la plaque alu sur le rouleau X supérieur et les 4 boulons sur l'equerre inferieure. La plaque pivote autour de la tête de boulon centrale. Utiliser les vis de la barre de tram a l'arriere pour faire pivoter la plaque jusqu'au parallelisme, puis resserrer.
A refaire a chaque tramming du Z. Monter une barre de tram dans la pince, tenant un comparateur. Centrer la broche au-dessus du verre, faire tourner le comparateur en cercle : la broche est bien trammee quand la valeur est identique avant/arriere et gauche/droite. Ajuster avec les vis de la pince (M5 pour pousser, M6 pour serrer) et les vis d'epaulement de la plaque de tram.
Vérifier la polarite de l'entrée dans halshow. Si flexi.input.CYCLE_START est FALSE au repos / TRUE en appui (actif HAUT), ne PAS utiliser .not dans le HAL. Le .not resterait TRUE en permanence et relancerait halui.program.run en boucle dès que la machine repasse idle.
Vérifier halui.program.pause dans halshow : si elle est bloquee a TRUE, la machine se croit en pause et refuse les mouvements. Faire Resume pour debloquer. Cause possible : même bug de polarite que CYCLE_START sur l'entrée FEED_HOLD/HOLD (vérifier si .not est utilise alors que l'entrée est FALSE au repos).
Si program.pause est normal mais que GO HOME (ou le debut d'un G-code) sort des limites des la ligne X0/Y0, vérifier l'offset G54 actuel (onglet Offsets). Refaire un touch off X/Y sur la pièce si l'offset ne correspond plus a la position reelle.
Si une carte de boutons locale (avec LEDs) est cablee en parallele d'une télécommande RJ45 sur les mêmes entrées, les niveaux logiques peuvent être perturbes (SYS/ST, HOLD concernes ici). Solution rapide : deconnecter les sorties concernees de la carte locale, garder uniquement le RJ45. Pour faire coexister les deux proprement, ajouter une logique or2 de decouplage comme pour les sorties AUX0-3.
Vérifier que NUM_DIO = 4 est présent dans [EMCMOT] de l'INI, sinon les pins motion.digital-out sont ignorees silencieusement.
Vérifier que le rail AUX est alimente (jumper P17 sur MAIN = 24 V). Un jumper P17 defectueux fait que la borne + sort 0 V. Vérifier aussi la coherence des jumpers de modules (tous sur H pour de l'activé HIGH).
La carte lit ses entrées en logique activé basse. Utiliser flexi.input.FEED_HOLD.not (et non FEED_HOLD direct) dans la logique Hold du HAL, sinon halui.program.pause est force a TRUE en permanence et une pause est demandee au démarrage. Vérifier avec : halcmd show pin halui.program.pause (doit être FALSE au repos).
Le calcul du delai d'attente (calc_mdi_move_wait_time dans le handler) ignore le temps d'accélération/décélération. A haute vitesse, le WAIT expire avant la fin du mouvement. Solution : augmenter wait_buffer_secs (de 1 a 4) dans le handler.
Le widget web QtWebEngine de QtDragon (page HTML de l'onglet SETUP, non utilisee) plante au démarrage. Le supprimer dans Designer (garder PDF et PROPERTIES) et proteger son initialisation dans le handler avec hasattr.
Vérifier que le script toolchange.ngc ne contient pas de M6 (recursion infinie), ni de M2/M30 dans un bloc IF (casse la preview). Utiliser #<_selected_tool> et non #5400 pour récupérer l'outil demande.
Symptome de la limite physique du couple a haute vitesse (rattrapee par la boucle fermee, accentuee par la chaleur). Redescendre la vitesse (ici 8000 mm/min) ameliore le confort et la fiabilite. Vérifier aussi le réglage des DIP switches de courant sur les drivers.
Avec des moteurs en boucle fermee, une vraie perte de pas est rare (le driver corrige). En cas de décalage : vérifier l'accouplement vis/moteur, les timings STEPLEN/STEPSPACE, et que la vitesse/accélération ne depasse pas les capacites mecaniques.
La précision typique d'une PrintNC se situe entre 0.03 et 0.1 mm. Elle dépend du matériau usiné, de la qualité de l'équerrage et de l'alignement, et du temps investi sur chaque pièce. C'est une machine de type routeur a portique, orientée bois et aluminium (et acier a l'occasion), idéale pour des profils plats de grande surface (environ 110 mm de dégagement en Z). Pour des petites pièces a très haute précision, une autre architecture serait plus adaptée.
.hal.REMAP=M6 redirige le changement d'outil vers toolchange.ngc.toolchange.ngc qui gère le palpage automatique.M64 P0 active AUX0.toolchange.ngc après palpage.