
Suite de l'article sur l'écriture de votre propre firmware pour une imprimante 3D LCD photopolymère.
Dans cette partie, je vais continuer à décrire les étapes de mon projet:
2. Travailler avec une clé USB et des fichiers dessus
3. Contrôler un moteur pas à pas pour déplacer la plateforme.
- Partie 1: 1. Interface utilisateur.
- Partie 2: 2. Travailler avec le système de fichiers sur une clé USB. 3. Commande de moteur pas à pas pour le mouvement de la plate-forme.
- Partie 3: 4. Affichage des images des couches sur l'écran rétroéclairé. 5. Chaque petite chose, comme le contrôle de l'éclairage et des ventilateurs, le chargement et l'enregistrement des paramètres, etc. 6. Caractéristiques supplémentaires pour le confort et la commodité.
2. Travailler avec une clé USB et des fichiers dessus
Je n'ai jamais travaillé avec un hôte USB sur des microcontrôleurs auparavant. En tant que périphérique USB - j'ai créé un firmware avec à la fois la classe CDC (émulation de port COM) et la classe HID, mais cela ne fonctionnait pas avec l'hôte. Par conséquent, pour accélérer le processus, j'ai créé toute l'initialisation de ce périphérique dans STM32CUBE. En conséquence, j'ai un hôte fonctionnant en mode USB FS qui prend en charge les périphériques de stockage de masse. Dans le même cube, j'ai immédiatement connecté la bibliothèque FatFS pour travailler avec le système de fichiers et les fichiers. Ensuite, il vous suffit de copier les sources reçues dans votre projet et de comprendre comment travailler avec elles. Cela s'est avéré facile et il n'y a pas grand chose à décrire ici. Le fichier usb_host.c de Cuba a une variable globale Appli_state de type ApplicationTypeDef:
typedef enum {
APPLICATION_IDLE = 0,
APPLICATION_START,
APPLICATION_READY,
APPLICATION_DISCONNECT
}ApplicationTypeDef;
Lors de divers événements du périphérique hôte USB (en interruptions), cette variable peut prendre l'un des états répertoriés, indiquant l'état actuel de l'hôte. Dans la boucle principale du programme, il reste simplement à suivre les modifications de cette variable et à réagir en conséquence. Par exemple, si sa valeur est passée à APPLICATION_READY, alors le lecteur flash ou le lecteur de carte est connecté et initialisé avec succès, vous pouvez en lire les fichiers.
Il n'y a pas non plus de difficultés avec FatFS - le Cube le configure déjà complètement et se "connecte" à l'hôte USB, donc immédiatement après avoir connecté le lecteur flash, vous pouvez accéder aux fonctions de cette bibliothèque pour travailler avec des fichiers. Certes, le cube nouvellement mis à jour inclut la bibliothèque de l'ancienne version. Après avoir mis à jour ses fichiers vers une nouvelle version, j'ai dû corriger les noms des définitions de la configuration FatFS à certains endroits dans le code source cubain, car ils ont changé dans la nouvelle version. Mais la mise à jour n'a pas posé de problèmes particuliers, tout s'est passé rapidement et facilement.
Mais pour que FatFS fonctionne avec le cyrillique dans les noms de fichiers et de répertoires, j'ai dû bricoler un peu. Pour que FatFS puisse lire correctement les noms cyrilliques, il est nécessaire d'activer Unicode dans sa configuration, et après cela, toutes les chaînes associées à FatFS doivent être uniquement dans cet encodage - noms de disque, noms de fichiers, etc. En même temps, l'éditeur de texte dans l'IDE et FatFS supporte Unicode avec différentes positions de l'octet haut - une avec Little Endian, l'autre avec Big Endian, il est donc impossible d'écrire simplement des sources avec des textes Unicode. Et je ne veux pas, pour être honnête. C'est à ce moment-là que j'ai dû écrire des convertisseurs ANSI et UTF-8 vers Unicode et vice versa, ainsi que plusieurs fonctions pour travailler avec des chaînes de différents encodages dans différentes combinaisons. Par exemple, copiez une chaîne UTF-8 dans une chaîne Unicode ou ajoutez une chaîne ANSI à une chaîne Unicode. Cependant, les chaînes ANSI semblent êtrenulle part, toutes les sources sont complètement converties en encodage UTF-8.
Ainsi, l'ouverture d'un fichier avec un nom donné ressemble maintenant à ceci:
tstrcpy(u_tfname, UsbPath); // (Unicode) (Unicode)
tstrcat_utf(u_tfname, SDIR_IMAGES); // (Unicode) (UTF-8)
tstrcat_utf(u_tfname, (char*)"\\"); // (Unicode) (UTF-8)
tstrcat(u_tfname, fname); // (Unicode) (Unicode)
Quand tout fonctionnait rapidement, je voulais vérifier la vitesse de lecture des fichiers à partir d'un lecteur flash. La lecture d'un fichier de 10 Mo dans des blocs de 4 Ko a montré une vitesse d'environ 9 Mbps, ce qui, en général, était plutôt bon et me convenait.
J'ai essayé d'étudier la question du transfert de ce boîtier vers DMA, mais il s'est avéré que les périphériques de l'hôte USB n'ont tout simplement pas accès au DMA. Eh bien, ou je ne l'ai pas trouvé :) Par conséquent, il semblait logique d'organiser tous les tampons de lecture / écriture pour les fichiers USB dans CCM (Core Coupled Memory) - une zone de 64 Ko de RAM, qui n'a pas non plus de sortie DMA. Dans la même zone de mémoire, il est logique de placer d'autres variables / tableaux qui ne fonctionnent pas avec DMA, juste pour laisser plus de mémoire dans la RAM ordinaire. Au fait, il me semblait que le noyau lui-même fonctionnait avec cette mémoire un peu plus vite qu'avec la mémoire ordinaire.
2.1 Interface utilisateur de fichier
L'imprimante Anycubic Photon S que je possède affiche une liste de fichiers sous forme d'icônes de prévisualisation, 4 pièces par écran. Et en principe, c'est assez pratique - vous pouvez voir le nom du fichier, dans l'image d'aperçu, vous pouvez voir à peu près quel type de modèle. Par conséquent, j'ai suivi le même chemin - les fichiers sont affichés 4 pièces par page sous la forme d'images d'aperçu avec le nom du fichier.
Le dossier jaune familier est dessiné sur les icônes de répertoire et un engrenage sur les fichiers de paramètres. Seuls les fichiers pour lesquels l'extension appartient à l'un des fichiers connus sont affichés. Actuellement, il s'agit de fichiers .pws (fichiers préparés par le segment pour l'impression) et de fichiers .acfg (fichiers texte avec les paramètres de l'imprimante).
Étant donné que le micrologiciel fonctionne également avec des répertoires que l'utilisateur peut entrer, j'ai placé une ligne au-dessus de la liste des fichiers dans lesquels le chemin actuel est écrit. Les boutons permettant de quitter le répertoire actuel ou de faire défiler vers le bas ou vers le haut n'apparaissent que lorsqu'ils ont un sens - c'est-à-dire lorsque vous pouvez quitter le répertoire actuel ou faire défiler la liste vers le bas ou vers le haut.

Un de mes amis, à qui j'ai montré tout cela pendant que le firmware était en cours d'écriture, a suggéré une autre option pour la sortie des fichiers - sous la forme d'une liste, d'un tableau. Premièrement, plus de fichiers tiennent sur la page, et deuxièmement, la liste s'affiche beaucoup plus rapidement, car vous n'avez pas besoin de lire les images de prévisualisation des fichiers et de les dessiner avec mise à l'échelle à l'écran, et troisièmement, sous forme de tableau, vous pouvez également afficher en plus du nom et l'heure à laquelle le fichier a été modifié pour la dernière fois, ce qui est parfois très pratique. C'est un péché de rejeter une bonne idée, j'ai donc ajouté une liste de tableaux, et en même temps un bouton pour basculer entre les vues "icône" et "table". Les répertoires sous forme de tableau sont mis en évidence avec un fond jaune et la ligne "DIR" est écrite à la place de l'heure-date:

À propos, il n'y a aucune intrigue sur les images d'aperçu qui sont dessinées pour les fichiers en mode icône. Le micrologiciel n'analyse pas le fichier entier pour créer une image à partir d'un modèle 3D, comme certains le pensent :) Cette image est enregistrée dans le fichier d'impression par le trancheur lui-même, dans un format similaire à BMP - un tableau de valeurs de couleurs de pixels de 16 bits. La taille de l'image d'aperçu est stockée dans des champs spéciaux à l'intérieur du fichier. Donc tout est très simple.
La seule chose que le micrologiciel doit forcer est de redimensionner l'image du fichier à la taille de l'icône sur l'écran. Le firmware effectue la mise à l'échelle de manière très simple: il calcule le facteur de mise à l'échelle k(nombre fractionnaire) - la largeur de l'image d'origine est divisée par la largeur de la zone d'affichage sur l'écran (le coefficient de hauteur est également calculé et la plus grande des deux valeurs est prise en compte), puis des pixels et des lignes sont extraits de l'image d'origine pour s'afficher sur l'écran avec un pas de k .
De cette façon, vous pouvez mettre à l'échelle à la fois en plus et en moins. La qualité du résultat mis à l'échelle, bien sûr, laisse beaucoup à désirer, car aucune interpolation n'est effectuée, mais sur un affichage aussi petit et pas de très haute qualité, il est imperceptible, mais la vitesse d'un tel algorithme est assez élevée.
Lorsque vous cliquez sur l'icône ou la ligne du fichier .pws, un écran de visualisation des informations sur le fichier s'ouvre avec la possibilité de commencer à l'imprimer. Si vous cliquez sur le fichier .acfg, l'utilisateur est invité à charger les paramètres à partir de ce fichier. Eh bien, si un répertoire est pressé, il devient alors courant et la liste des fichiers est mise à jour.
2.2 Affichage des informations sur le fichier avant l'impression
Comme vous l'avez correctement noté dans les commentaires de la partie précédente, Anycubic ne dispose d'aucune information sur le fichier lorsqu'il est sélectionné. Les boutons pour lancer l'impression et la supprimer apparaissent juste. Et c'est très gênant - pour connaître le temps d'impression estimé, le nombre de couches ou d'autres paramètres de ce fichier, vous devez commencer à l'imprimer. J'ai décidé de ne pas répéter ce défaut, et lorsque je clique sur le fichier coupé, un écran s'ouvre avec les informations les plus complètes à ce sujet:

nom du fichier, taille, heure de la dernière modification et presque tous les paramètres d'impression. Ici, cependant, le fait que l'écran MKS DLP ait une résolution de 480x320 a joué entre mes mains, tandis que les Enikubik en ont un plus petit - 320x240, sur celui-ci, vous ne pouvez pas vraiment vous balancer avec un tas de texte.
2.2.1 J'écrirai séparément concernant le calcul du temps d'impression.
Cet indicateur n'est pas stocké dans le fichier, contrairement à tous les autres paramètres. Son imprimeur doit calculer indépendamment, sur la base des informations qu'il connaît. Le même Anycubic Photon S a tendance à dépasser avec ce calcul, et à la baisse - par exemple, il promet 5 heures d'impression, alors qu'en réalité il imprime 6 heures. Et Longer Orange 30 change cette fois d'avant en arrière presque deux fois pendant l'impression. J'ai décidé d'aborder ce point aussi soigneusement que possible. En quoi consiste ce temps?- Le temps nécessaire à la plate-forme pour descendre à une vitesse donnée jusqu'à la hauteur de la couche suivante.
- Le temps de pause avant le début de l'exposition.
- Temps d'exposition de la couche.
- Le temps nécessaire à la plate-forme pour s'élever à une hauteur donnée à une vitesse donnée après que la couche est exposée.
Ces 4 paramètres sont additionnés, multipliés par le nombre de couches et le temps total d'impression est obtenu. Si tout est élémentaire avec les temps de pause et de flare - ils sont maintenus avec une précision à la milliseconde, mais avec le mouvement de la plate-forme, tout est déjà un peu plus compliqué.
La plate-forme ne prend pas instantanément la vitesse définie, elle a une certaine accélération, qui est définie dans les paramètres. De plus, lors de l'impression, il s'agit d'une accélération plutôt faible, car la plate-forme doit commencer à monter très doucement pour que la dernière couche durcie se détache sans douleur du film au fond du bain (oui, le polymère adhère aussi au film, malheureusement).
Il s'avère que le mouvement de la plate-forme se compose de trois éléments: l'accélération jusqu'à ce qu'une vitesse donnée soit atteinte, le mouvement uniforme à une vitesse donnée et la décélération jusqu'à l'arrêt complet. Et c'est là que les options commencent - par exemple, l'accélération et la hauteur de levage spécifiées ne permettent pas à la plate-forme d'atteindre la vitesse spécifiée, elle accélère toujours au moment où elle doit déjà commencer à décélérer pour s'arrêter à la hauteur spécifiée. Ou bien l'accélération et l'altitude sont suffisantes pour que la plate-forme accélère jusqu'à la vitesse définie et parcourt une partie de la trajectoire en mouvement constant avant de commencer à décélérer. Nous devons vérifier tout cela, calculer les temps et les distances pour chaque composant.
Pour être honnête, ma tête tournait quand j'ai écrit la fonction de calcul du temps d'impression :) Et en conséquence j'ai quand même une petite erreur. Par exemple, l'heure d'impression réelle est 07:43:30 au lieu de 07:34:32 estimée.

Ou 05:48:43 au lieu de 05:43:23 calculé.

Mais en principe, cette erreur me convenait. J'ai essayé de trouver une erreur dans les calculs, mais tout semble y être correct. Très probablement, l'accélération réelle ne correspond légèrement pas à celle spécifiée en raison des particularités de la commande du moteur pas à pas. Nous sommes donc arrivés à l'étape suivante en douceur :)
3. Commande de moteur pas à pas pour le mouvement de la plate-forme.
Au début, j'ai eu l'idée d'écrire ma propre commande de moteur pas à pas. Ce n'est pas du tout difficile d'avoir un pilote normal sur la carte - définissez le sens de rotation sur une broche et dirigez les impulsions des étapes vers l'autre broche. Vous devez tourner rapidement - vous augmentez la fréquence d'impulsion, vous devez lentement - vous la diminuez.
Mais quand j'ai commencé à aborder ce problème plus spécifiquement, j'ai réalisé que sa simplicité est trompeuse. Non, vous pouvez écrire le vôtre et cela fonctionnera, mais écrire pour que cela fonctionne bien est une tâche plutôt lourde. Les moteurs pas à pas n'aiment pas beaucoup les irrégularités dans les pas, il est donc nécessaire d'assurer une bonne uniformité des impulsions de pas dans une plage de fréquences assez large - de quelques hertz à des dizaines de kilohertz. Il est nécessaire d'assurer une augmentation et une diminution régulières de la fréquence des impulsions d'accélération et de décélération. Il est nécessaire de compter avec précision les impulsions générées pour être assuré de savoir dans quelle position se trouve la plateforme. Il est nécessaire de calculer le nombre d'impulsions et la période de leur changement de fréquence dans une période de temps strictement définie afin de fournir l'accélération requise.
Bref, la tâche, bien que réalisable, est très, très volumineuse, ce qui me prendrait plus d'une journée. J'ai donc décidé de retirer les fonctions de gestion du moteur de Marlin . J'ai pensé que ce serait facile ...
D'abord, j'ai pris le fichier stepper.cpp des sources de Marlin - contrôlant directement le moteur pas à pas. Cependant, il s'est avéré que son travail dépendait beaucoup du planificateur de mouvement du fichier planner.cpp, donc j'ai dû le prendre aussi. Eh bien, dans le tas, j'ai également pris le fichier endstops.cpp à partir de là - traitant les interrupteurs de fin de course d'axe, car j'avais encore besoin de traiter les événements à partir d'eux, et ici le planificateur et le contrôle du moteur étaient déjà associés à ce fichier pour les interrupteurs de fin de course.
J'ai passé très longtemps à essayer de supprimer tout ce qui était inutile de ces fichiers et de les délier du reste de l'écosystème Marlin. Le fait est que Marlin est affûté sous le contrôle de 6 ou 7 steppers en même temps, alors que leur travail peut dépendre de la température de plusieurs chauffages, des paramètres du plastique, etc. Le système y est vraiment compliqué. J'ai dû faire beaucoup de refaire, principalement en supprimant les axes inutiles et les extrudeurs inutiles et en me débarrassant de tout un tas de macros qui étaient utiles dans la version originale, mais très ennuyeuses dans la mienne. Juste pour comprendre - la taille des sources que j'ai prises de Marlin a été réduite de 346 à 121 Ko. Et chaque ligne devait être supprimée avec prudence.
Naturellement, dans le processus de cette taille difficile, je me suis un peu plus plongé dans le travail de l'ensemble du système, comment il fonctionne. Pour déplacer l'axe, la position cible de l'axe est transférée au planificateur via l'une de ses fonctions (le planificateur enregistre la position actuelle). L'ordonnanceur calcule le nombre de pas et leurs paramètres d'accélération, de déplacement en ligne droite et de décélération et forme à partir de ces données un paquet de données spécial pour la fonction de commande directe du moteur (pas à pas). Il peut y avoir plusieurs de ces packages, le planificateur calcule et crée un nouveau package suivant pour chaque nouvelle tâche.
Stepper, travaillant dans une interruption de minuterie, dans un état libre, demande le prochain paquet de données au planificateur. Si le planificateur a un package préparé, il le donne et le considère comme terminé. Stepper prend le paquet reçu en travail et commence à élaborer les étapes du moteur en fonction des données qu'il contient. Jusqu'à ce qu'il l'achève, le paquet suivant n'est pas demandé.
Ce qui est curieusement implémenté dans le stepper, c'est qu'à basse vitesse, il émet une impulsion de pas dans chaque interruption, ajustant la minuterie de sorte que l'interruption suivante se produise après la période de temps requise. Lorsque le taux de pas requis dépasse une certaine valeur, le stepper commence à émettre plusieurs étapes à chaque interruption. En même temps, tous les timings sont si bien choisis que l'uniformité des pas est très bonne, par curiosité j'ai regardé l'oscilloscope.
L'ordonnanceur sait également comment «rejoindre» les paquets voisins. Ce que cela signifie: si l'ordonnanceur a déjà un paquet préparé pour le stepper et qu'une nouvelle tâche lui vient, alors il forme le paquet suivant et change le précédent de sorte qu'à la suite du traitement séquentiel de ces deux paquets par le stepper, un mouvement fluide soit obtenu.
Laissez-moi vous expliquer avec un exemple. Le planificateur est libre, il reçoit une tâche pour faire avancer l'axe de 20 mm à une vitesse de 30 mm / s. Le planificateur génère le premier paquet dans lequel il décrit une accélération de zéro à 30 mm / s, un mouvement en ligne droite à cette vitesse et une décélération de cette vitesse à zéro. Si, avant que le stepper ne prenne ce paquet du planificateur, le planificateur reçoit une nouvelle tâche pour déplacer cet axe de 50 mm vers l'avant, mais déjà à une vitesse de 40 mm / s, alors le planificateur ne créera pas simplement un nouveau paquet avec une accélération à partir de zéro, mais changera le premier paquet en supprimant la décélération et en étendant le mouvement en ligne droite de sa distance, et dans le deuxième paquet créé, l'accélération ne commencera pas à partir de zéro, mais à partir de la vitesse du paquet précédent.
Le résultat sera un mouvement dans lequel l'axe accélérera à 30 mm / s, parcourra 20 mm, puis accélérera à nouveau à 40 mm / s et parcourra encore 50 mm, ralentissant à zéro à la fin. Mais ce n'est que si le stepper n'a pas encore réussi à récupérer le package précédent, sinon ces deux tâches seront traitées comme deux mouvements séparés avec des vitesses initiale et finale nulles dans chacune d'elles. Par conséquent, en passant, dans les imprimantes avec commande manuelle de la plate-forme, si vous appuyez plusieurs fois de suite sur l'élévateur par incréments de 10 mm, la plate-forme s'arrêtera après le premier levage de 10 mm, puis continuera à se déplacer sans s'arrêter à la hauteur totale cliquée par le bouton.
Dans la nouvelle version de Marlin, un remède est déjà apparu contre un tel mouvement "saccadé" - maintenant l'ordonnanceur ne donne pas de paquet stepper pendant un certain temps après sa formation si ce paquet est le seul prêt. Ce temps est réservé à l'attente - la tâche suivante arrivera-t-elle pour que vous puissiez la connecter à la tâche existante.
3.1 Interface de contrôle de mouvement de la plate-forme

Ici, en général, tout est standard et habituel pour les imprimantes photopolymères. En haut se trouve la sélection du pas du mouvement de l'axe, à droite se trouvent les boutons pour déplacer l'axe vers le haut ou vers le bas avec le pas sélectionné.
Le bouton «Home» permet de mettre à zéro la plate-forme (parking, maison), lorsqu'elle est pressée, la plate-forme commence à se déplacer vers l'interrupteur de fin de course «home». Une fois atteinte, la plate-forme s'arrête, recule un peu et à nouveau lentement (pour plus de précision) se heurte à l'interrupteur de fin de course. Après cela, le firmware connaît définitivement la hauteur de levage actuelle exacte de la plate-forme.
Bouton de réglage Z = 0 ”est utilisé pour calibrer la hauteur de la plate-forme au-dessus de l'écran. Un tel système de calibrage est utilisé par exemple dans les imprimantes Anycubic, lorsque le point zéro de la plate-forme (sa hauteur optimale au-dessus de l'écran) est de 1 à 2 mm en dessous du déclenchement du fin de course "home". Et ce système d'étalonnage me semble plus correct que les systèmes qui sont récemment devenus populaires, lorsque la hauteur de l'actionnement des fins de course est en même temps la hauteur zéro de la plate-forme.
Et le dernier bouton est "Stop!" Est un arrêt inconditionnel et immédiat du mouvement de la plate-forme. Au fait, pendant que la plate-forme est en mouvement, vous ne pouvez pas quitter cet écran, le bouton "Retour" ne fonctionnera pas. Ceci est fait juste pour que pendant que la plate-forme se déplace, le bouton Stop soit immédiatement disponible.
3.2 Autres points sur le mouvement de la plate-forme
Il y a plusieurs choses qui m'ennuient terriblement dans Anycubic Photon.
La première est pourquoi le mouvement manuel de la plate-forme se produit-il avec la même accélération d'escargot qu'en mode impression? Lors de la frappe, une si petite accélération est utile, mais lors du contrôle manuel de l'axe, elle accélère pendant 2 secondes - ce n'est qu'un cauchemar. Et la vitesse du mouvement est moyenne.
Le deuxième point - pourquoi, lorsque l'impression est suspendue, la plate-forme monte à la hauteur de pause à la vitesse spécifiée dans les paramètres d'impression? Bon sang, attendre 15 secondes que la plate-forme monte de deux (seulement) centimètres est au-delà de la bonne. Mais merci de vous être levé. Dans Orange 30, une pause ne signifie pas lever la plate-forme même d'un millimètre, donc on ne sait même pas pourquoi elle est là du tout.
Et le troisième moment, qui exaspère juste - après la fin de l'impression, la plate-forme s'élève tout en haut. À la même vitesse que celle spécifiée dans les paramètres d'impression - 1 mm / s. Il faut 100 secondes pour monter d'une hauteur de 5 cm!
Par conséquent, dans mon firmware, j'ai fait des vitesses et des accélérations réglables séparément pour le mode d'impression et séparément pour le contrôle manuel de la plate-forme. Mais avec deux limitations:
- Jusqu'à ce que l'axe soit réinitialisé par le bouton Home, la vitesse de déplacement sera réduite de trois fois. En effet, bien que l'imprimante ne connaisse pas la hauteur exacte actuelle de la plate-forme, il existe un risque d'écrasement de l'écran sans s'arrêter à grande vitesse (inertie, donc elle) ou d'endommager la butée supérieure de l'essieu. Après la mise à zéro de l'axe, l'imprimante connaît déjà exactement la position de la plate-forme et les limites de hauteur du logiciel entrent en vigueur, qui sont également définies dans les paramètres.
- À une hauteur inférieure à 30 mm, la vitesse est également réduite de trois fois, que l'axe soit remis à zéro ou non. Ceci afin d'éviter les éclaboussures du photopolymère de la cuve lorsque la plate-forme y est abaissée trop rapidement. Ou lorsque vous en sortez trop rapidement.
Bien sûr, il existe d'autres paramètres d'axe standard dans les réglages - le nombre de pas par 1 mm, le sens du mouvement, le travail des fins de course, etc. Si quelqu'un est intéressé, il y a sous le spoiler un fichier de configuration texte avec tous les paramètres pris en charge. Un tel fichier avec l'extension .acfg est mangé par le firmware directement à partir de la liste des fichiers, chargeant les paramètres, les sauvegardant dans l'EPROM et les appliquant immédiatement, sans redémarrer:
Contenu du fichier de configuration
# Stepper motor Z axis settings
[ZMotor]
# .
# : 0 1. : 1.
# .
invert_dir = 1
# .
# : -1 1. : -1.
# -1,
# , . 1
# .
home_direction = -1
# Z . ,
# 0, - .
home_pos = 0.0
# .
# : -32000.0 32000.0.
# : -3.0
# .
# , .
min_pos = -3.0
# .
# : -32000.0 32000.0.
# : 180.0
# .
# , .
max_pos = 180.0
# .
# : 0 1. : 1.
# ,
# 1, - 0.
min_endstop_inverting = 1
# .
# : 0 1. : 1.
# ,
# 1, - 0.
max_endstop_inverting = 1
# 1 .
steps_per_mm = 1600
# ,
# , /. : 6.0.
homing_feedrate_fast = 6.0
# ,
# , /. : 1.0.
homing_feedrate_slow = 1.0
# , /2.
acceleration = 0.7
# , /.
feedrate = 5.0
# ( ,
# ..), /2.
travel_acceleration = 25.0
# ( ,
# ..), /. 30
# ,
# 5 /.
travel_feedrate = 25.0
# , .
current_vref = 800.0
# , .
current_hold_vref = 300.0
# ,
# . . 0
# .
hold_time = 30.0
# ,
# . .
# hold_time. 0 .
# , .
off_time = 10.0
# General settings
[General]
# (0.001 )
# .
# : 0 15000. : 700 (0.7 ).
buzzer_msg_duration = 700
# (0.001 )
# , .
# : 0 15000. : 70 (0.07 ).
buzzer_touch_duration = 70
# 180 .
# .
# : 0 1. : 0.
rotate_display = 0
# , .
# LCD-. -
# .
# : 0 15000. : 10. 0 .
screensaver_time = 10
Et avec cela je vais terminer cette partie, et il y a déjà trop de texte :)
Comme avant, je serai heureux de répondre aux questions et d'accepter les commentaires.
- Partie 1: 1. Interface utilisateur.
- Partie 2: 2. Travailler avec le système de fichiers sur une clé USB. 3. Commande de moteur pas à pas pour le mouvement de la plate-forme.
- Partie 3: 4. Affichage des images des couches sur l'écran rétroéclairé. 5. Chaque petite chose, comme le contrôle de l'éclairage et des ventilateurs, le chargement et l'enregistrement des paramètres, etc. 6. Caractéristiques supplémentaires pour le confort et la commodité.
Liens
Kit MKS DLP sur Aliexpress Codes
sources du firmware d'origine du fabricant sur les
schémas GitHub du fabricant de deux versions de la carte sur GitHub
Mes sources sur GitHub