Browsing posts in: Imprimante 3d

Utilisation de la carte Melzi en impression 3D

Nécessite l’utilisation de l’IDE Arduino 1.0.5 ainsi que la libraire u8glib

L’installation manuelle ou via le gestionnaire de carte ne fonctionne pas avec la carte Sanguino sur les versions ultérieures de l’IDE Arduino.
L’écran LCD en mode SPI ne fonctionne pas directement sur le port SPI de la carte Melzi qui est aussi partagé par le lecteur de carte SD.

Carte Melzi

Important : La numérotation des pins 24 à 31 du port analogique est inversée. L’entrée analogique A7 devrait normalement correspondre à l’E/S digital 31 mais sur la carte Melzi elle correspond au numéro 24.
Dans Marlin le support de la carte SD est déclaré en pin 24, hors si on active cette dernière on surcharge A7 normalement réservée à la thermistance hotend. Il faut donc redéfinir dans le fichier pins.h l’assignation des signaux SD-SS, Z-ENABLE et LED.
Les signaux A1,A2,A3 et A4 disponibles au connecteur JP16 sont seront eux aussi inversées si la numérotation digitale est utilisée. Le problème vient de Sanguino sur laquelle la carte Melzi est basée, il est donc nécessaire de se référer à leurs documentations.
La meilleure solution consiste à utiliser uniquement la numérotation analogique.

Caractéristiques :

  • Processeur: ATMEGA1284P (basé sur Sanguino V1.2)
  • Tension de travail : 5V
  • 4 x A4982 drivers moteur pas à pas
  • Marlin ID board : Motherboard 63
  • Dimensions: 210mm x 50mm x 17mm
  • Poids: 70g
  • Broches disponibles : 27(A4),28(A3),29(A2),30(A1) / 16(scl),17(sda) / 10(RX1),11(TX1)
  • AOFI et AIFO (RX0 et TX0) pointe vers le C.I FTDI

Liens utiles :

Eclairage (en cours de rédaction)

Sketch Marlin_main.cpp. Sortie led déjà réservée en Marlin pin 28 pour Melzi. Problème de numérotation redéfinir 28 en A3. Utilisation des pins 26 et 27 en sus pour gérer le ledstrip RGB en analogique.
Le ledstrip 5050 smd consomme 60mA (3 canaux de 3 leds de 20mA), soit une consommation de 0.24W par canal. Pour habiller l’arceau de la foldarap, il faut 3 bande de 20cm monté en série soit une puissance de 3W min par canal.
Une résistance limite déjà le courant dans chaque canal, elle est de 330 ohm pour le canal rouge, la led fonctionnant sous une tension plus faible.
Possibilité de diminuer la consommation en utilisant une tension inférieure à 12V, en utilisant les couleurs primaires (à l’exception du blanc) ou en utilisant le signal PWM.

Malheureusement les pins disponibles sur la Melzi ne permettent pas de gérer le PWM et de simples transistors bipolaires ne suffiront pas. Achat de transistor MOSFET STP16NF06.

Création d’un Gcode m43 afin de conserver m42 qui offre plus de souplesse sur le controle des pins A1-A4 du port JP16. Il est possible de personnaliser la fonction code_seen() avec la lettre de son choix et de récupérer son paramètre numérique via code_value(). N’ayant pas accès aux signaux PWM, aucune nuance étant possible, le codage des couleurs se fera par codage bianaire sur 3 bit. Par exemple 010 pour le vert.

Reste à lancer la couleur blanche à l’alimentation / repos, le rouge pour indiquer que les températures sont atteintes et le bleu pour indiquer le travail.
Il n’y a pas de fonction in_array() en langage C, ni de variable typé TEXT. Va falloir potasser

Brancher les ventilateurs hotend et extrudeur sur la pin RX1 pour un controle via gcode

Le code binaire sur 3 bits a posé des problèmes pour une raison inconnue, le code 010 n’était pas vu par l’instruction switch. La méthode code_value() retourne un float , c’est donc très certainement un problème de zéros de remplissage. Le problème a été contourné en codant sur 2 bits de la manière suivante :

00 => sleep / pink
01 => done / red
10 => hot / pink
11 => working /blue

Ventilateur Akasa AK 160 BL-S Cool Blue Fan :

  • Dimension : 40x40x10mm
  • Niveau bruit : 24 dB
  • Vitesse : 5000 R.P.M
  • Tension : 12V
  • Courant : 0.07A
  • Connecteur : 3 broches – 1/led, 2/Vcc, 3/led+fan
  • Documentation

La connectique du venitlateur Akasa 3 broches correspond au 12V pour la broche centrale, soit masse 1 pour alimenter le ventilateur, soit masse 2 pour alimenter le ventilateur et l’éclairage. La masse 2 est indiquée par une encoche sur la prise.

Graphic LCD

1- Présentation

Afin de diminuer les coûts de revient de l’imprimante, on privilégiera un GLCD nu comme le LCD 12864. En effet, là où un LCD Shield pour RAMPS coûte aux alentours de 50$ (Gadgets3D), le LCD 12864 se trouve à 6$ sur ebay.

Caractéristiques :

  • Écran lcd graphique 3.2″
  • Résolution : 128 x 64 pixels
  • Couleur blanc sur fond bleu
  • Alimentation : 4.5 à 5.5V
  • Consommation : IC 3mA / BLK 55mA
  • Câblage en parallèle (4 bit et 8 bits) ou en SPI
  • Horloge : 2MHz
  • Contrôleur ST7920 compatible 1/32DUTY, 1/5BIAS
  • Dimensions: 3.66 in x 2.76 in x 0.39 in (9.3 cm x 7.0 cm x 1.0 cm)
  • Poids: 2.82 oz (80 g)
  • Datasheet

2- Câblage

  • VSS -> GND
  • VCC -> 5V
  • VO -> contraste (0-5V)
  • RST -> reset (actif à LOW)
  • PSB -> mode (LOW = SPI, HIGH = parallèle)
  • BLK -> cathode
  • BLA -> anode (avec résistance de limitation)
  • Mode parallèle
  • RS -> Register Select
  • R/W -> « Read/Write control »
  • E -> Enable »
  • Do ~ D7 -> bus de données
  • Mode SPI
  • RS -> Chip Select (CS)
  • R/W -> Serial input (MOSI)
  • E -> Serial clock (SCLK)

3- Librairie

Utilisation de la librairie U8glib. Supportée dans Marlin V1, elle nécessite cependant une installation dans l’IDE Arduino.

4- Marlin

Dans le fichier Pins.h ajouter la condition de préprocesseur suivante :

#ifdef U8GLIB_ST7920 // SPI GLCD 12864 ST7920 
        #define LCD_PINS_RS 4 // CS
        #define LCD_PINS_ENABLE 5 // MOSI
        #define LCD_PINS_D4 7 // SCLK
        #define BEEPER -1
        // Pins for DOGM SPI LCD Support
       #else
        #define DOGLCD_A0 30
        #define DOGLCD_CS 29
        #define LCD_CONTRAST 1
       #endif

Dans Configuration.h décommenter la ligne :

#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER

Les pins disponibles sous Melzi ne gèrent pas le PWM, le réglage du contraste par Vo a aussi échoué. Le contraste étant inactif, on désactive son réglage dans le fichier ultralcd.cpp en ajoutant la condition suivante :

#ifdef DOGLCD
#ifdef LCD_CONTRAST > 0
// MENU_ITEM_EDIT(int3, MSG_CONTRAST, &lcd_contrast, 0, 63);
MENU_ITEM(submenu, MSG_CONTRAST, lcd_set_contrast);
#endif
#endif

5- Libérer le port SPI

L’activation du REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER entraîne la surcharge de la constante SDSUPPORT dans le fichier Configuration.h.
Cette constante active la gestion de la carte SD et le port SPI par la même occasion.
L’imprimante est gérée par un Raspberry, la carte SD est donc inutile. Il est possible de condamner son accès pour récupérer les broches SCK, MISO et MOSI afin d’y câbler un encodeur rotatif par exemple.

Dans le fichier Configuration.h, au niveau de la condition #ifdef ULTIPANEL supprimer la surcharge SDSUPPORT en commentant la ligne.

Le reste du travail s’effectue dans le fichier ultralcd.cpp. L’afficheur LCD permet de lancer des impressions depuis la carte SD, le fichier intègre donc la librairie cardreader.h afin de créer un menu de navigation. Il va donc falloir également supprimer les objets de cette classe sans dénaturer la mise en page.

Voici le code résultant du fichier ultralcd.cpp : Fichier ultralcd.cpp

Fin de course optique

Le fin de course mécanique en Z est vissé dans le plastique posant le soucis de déformer légèrement le taraud à chaque homing. Il en résulte une perte de précision, là où il est nécessaire d’avoir entre un ou deux dixièmes suivant la hauteur de couche. Une solution rapide à mettre en oeuvre et peu coûteuse consiste à remplacer le capteur mécanique par un autre capteur de type optique TCST2103.

Il est basé sur ce projet. On le trouve facilement sur ebay pour 2 dollars frais de port compris mais avant de le brancher il est nécessaire de faire quelques vérifications.

Schéma du capteur : Consulter le schéma

Important : Alimenter le capteur avec la même tension de fonctionnement du microcontrôleur.
Ne pas le brancher en 5V si la carte traite du 3V3 !

Le fin de course optique possède 3 slots de configuration situés à côté du connecteur. La présence d’une résistance de limitation de courant sur U$7 et d’une led en U$5 va poser problème. En effet ce setting ramène 3.7V en niveau bas ce qui risque de ne pas l’être au niveau du microcontrôleur. Il est donc nécessaire de dessouder ces 2 composants permettant d’économiser 20mA et surtout de récupérer un niveau bas digne de ce nom, moins de 0.5V.
Le capteur a un fonctionnement inversé par rapport à un fin de course classique. Au repos il conduit d’où l’éclairage de la led, au travail (faisceau coupé) il bloque.

Il va donc falloir modifier le fichier configuration.h du Marlin en inversant le fonctionnement du fin de course Z_min en le passant à false.

const bool Z_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.

Note : Il n’est pas nécessaire d’activer les pullups pour ce capteur une résistance de 2.2Ko est déjà fixée. De la même façon une résistance de tirage est déjà présent sur l’ensemble des broches fin de course de la carte Melzi.
Cependant pour éviter toute erreur, en téléversant Marlin sur une autre carte par exemple, il est plus prudent de définir les pullups avec #define ENDSTOPPULLUPS.

Connectique Melzi

  • RS => 30 (blanc) Chip Select
  • R/W => 28 (rouge) MOSI
  • E => 29 (noir) SCLOCK
  • Servo => 27
  • BTN Droite => 16 (rouge)
  • BTN Gauche => 17 (noir)
  • BTN Click => 11 (blanc)

Marlin

Code M42 gère la pin libre de la carte melzi. (à traiter)

Code M44 gère le cooling fan. (à traiter)

Code M43 permet d’attribuer un éclairage au statut de l’imprimante. Les couleurs ne sont pas bonnes…à finir !

  • C00 =>sleep (pink)
  • C01 =>done (red)
  • C10 =>hot (purple)
  • C11 =>working (blue)
switch( pin_status )
        {
          case 00 : // sleep
            digitalWrite(LED_R, HIGH);
            digitalWrite(LED_G, HIGH);
            digitalWrite(LED_G, HIGH);
          break;
          
          case 01 : // done
            digitalWrite(LED_R, HIGH);
            digitalWrite(LED_G, HIGH);
            digitalWrite(LED_B, LOW);
          break;
          
          case 10 : // hot
            digitalWrite(LED_R, HIGH);
            digitalWrite(LED_G, LOW);
            digitalWrite(LED_B, HIGH);
          break;
          
          case 11 : // working
            digitalWrite(LED_R, LOW);
            digitalWrite(LED_G, HIGH);
            digitalWrite(LED_B, HIGH);
          break;   
         } 

Il existe maintenant un sketch blinkM sous marlin pour gérer l’éclairage par led. Le code est M150 et prend R,U et B comme paramètre. La fonction SendColors est ensuite appelée, elle utilise la librairie Wire.

Troubleshoot

/PROGRA~1/Printrbot/Pronterface/Slic3r0.9.10/lib/std/Slic3r/Layer/Region.pm line 542

Erreur Slicer – Si qu’un seul STL est concerné par ce problème, il s’agit d’un problème de dimension non résolu par Slicer. Cette erreur est apparue en passant une dimension de 0.5mm à 0.25mm.

La carte Melzi ne doit pas se trouver sous tension lors de sa programmation. Choisir la board Sanguino W/ ATmega1284 16Mhz.

Fin de course optique

On peut controler jusqu’à 3 servos via la commande M280 qui prend comme paramètre P pour l’index et S pour l’angle ou le nombre de microseconde.