Montag, 22. Dezember 2014

Fake Drucker-Elektronik

Zugegeben, die Überschrift soll absichtlich verwirren. ;-)) Was ist eine "Fake Drucker-Elektronik"? Gleich mehr dazu ... 

Vor ein paar Wochen hatte ich das Bedürfnis, ein paar Experimente mit der Firmware meines 3D Druckers durchzuführen. Allerdings wollte ich weder auf das Drucken verzichten, noch am gut eingestellten Gerät Veränderungen vornehmen. Zum Drucken verwende ich eine von nophead angepasste Version von Marlin. Die ist inzwischen ziemlich veraltet, was ich während der Experimente mit dem Grafik-LCD spüren musste. Aber auch die im Reprap-Forum gepflegte aktuellere Version hat so ihre Tücken. 

Ein weiterer Bestandteil meines 3D-Drucker-Setups, der immer wieder aktualisiert werden sollte, ist OctoPi (ein für Raspberry Pi angepasstes Image von Octoprint). In letzter Zeit gab es auch beim Raspberry ein paar Ergänzungen, die ich gerne ausprobieren will, wie z.B. ein 7" HD-Display von Pollin, eine Bluetooth Tastatur, ein 4" Touch-Display und eine Verlängerung für das 4" Touch-Display.

Einen zweiten Drucker anzuschaffen wäre eine Lösung gewesen, aber ziemlich teuer. Weitere Überlegungen brachten mich zum Schluss, dass man auf Einiges an der Druckerhardware verzichten kann, wenn man nur ein paar Experimente macht. Die Elemente, die weggelassen werden, können durch viel einfachere Komponenten ersetzt werden:

  • Die 4 Schrittmotoren an den Achsen werden durch 6 grüne LEDs ersetzt. Je eine pro Drehrichtung. Für den Extruder verwende ich blaue LEDs.
  • Die beiden Heizungen (Hotend / Heizbett) werden durch rote LEDs symbolisiert.
  • Die beiden Thermistoren (Hotend / Heizbett) werden durch Potis ersetzt.
  • Die drei Endstopschalter werden durch öffnende Drucktaster ersetzt.
  • Anstelle des RAMPS' kommt eine selbst gelötete Protoshield-Platine zum Einsatz
Letztlich bleibt als Original-Elektronik nur der Arduiuno-Mega übrig.

Die Schrittmotortreiber bekommen an ihren Anschlüssen STEP und DIR die nötigen Signale vom µC; über Logikgatter werden 2 LEDs die jeweilige Richtung anzeigen. Wenn DIR auf HIGH gesetzt ist läuft der Motor in die eine, bei LOW in die andere Richtung: 
  • DIR ∧ STEP = Richtung_1 
  • DIR ∧ STEP = Richtung_2
Je nachdem wie weit ein Motor laufen soll, werden entsprechend viele Impulse an STEP gegeben. Leider sind die Impulse zu kurz, als dass man die LED leuchten sieht. Ein sehr schwaches glimmen ist sichtbar. Es gibt zwar auch einen elektronischen Weg (monostabile Kippstufe, Monoflop, mglw. auch mit einem RC-Glied), diese Impulse so zu verlängern, damit man sie sehen kann - ich habe mich wegen dem geringerem Aufwand entschieden, die Firmware des µC entsprechend zu ändern. Bei der Marlin-Firmware muss man in der Datei stepper.cpp die nötigen Änderungen vornehmen. Innerhalb der ISR() wird jeweils das Löschen des Bits verhindert (//WRITE(X_STEP_PIN, LOW);) und am Ende der Funktion nach einem delayMicroseconds(100); nachgeholt:

 // "The Stepper Driver Interrupt" - This timer 
 // interrupt is the workhorse.
 // It pops blocks from the block_buffer and executes

 // them by pulsing the stepper pins appropriately.
ISR(TIMER1_COMPA_vect)
...
     counter_x += current_block->steps_x;
     if (counter_x > 0) {
       WRITE(X_STEP_PIN, HIGH);
       counter_x -= current_block->step_event_count;
       //WRITE(X_STEP_PIN, LOW);
       count_position[X_AXIS]+=count_direction[X_AXIS]; 
     }

     counter_y += current_block->steps_y;
     if (counter_y > 0) {
       WRITE(Y_STEP_PIN, HIGH);
       counter_y -= current_block->step_event_count;
       //WRITE(Y_STEP_PIN, LOW);
       count_position[Y_AXIS]+=count_direction[Y_AXIS];
     }

     counter_z += current_block->steps_z;
     if (counter_z > 0) {
       WRITE(Z_STEP_PIN, HIGH);
       counter_z -= current_block->step_event_count;
       //WRITE(Z_STEP_PIN, LOW);
       count_position[Z_AXIS]+=count_direction[Z_AXIS];
     }

     #ifndef ADVANCE
       counter_e += current_block->steps_e;
       if (counter_e > 0) {
         WRITE_E_STEP(HIGH);
         counter_e -= current_block->step_event_count;
         //WRITE_E_STEP(LOW);
         count_position[E_AXIS]+=count_direction[E_AXIS];
       }
     #endif //!ADVANCE
     step_events_completed += 1;
     if(step_events_completed >= current_block->step_event_count) break;
   }

   delayMicroseconds(100);
   WRITE(X_STEP_PIN, LOW);
   WRITE(Y_STEP_PIN, LOW);
   WRITE(Z_STEP_PIN, LOW);
   WRITE_E_STEP(LOW);

   // Calculare new timer value


Jeweils eine rote LED mit passendem Vorwiderstand simulieren die Heizungen. Man sieht sehr schön am blinken der LEDs, wenn die Regelung einsetzt. Am Oszilloskop ist die Veränderung des Puls- / Pausenverhältnisses noch besser zu sehen. Hier wird keine weitere Elektronik benötigt.

Jeweils ein 10kΩ Poti sorgt für die Rückmeldung einer "Temperatur". Dabei ist das Poti mit VCC und GND verbunden, der Schleifkontakt geht zurück zum µC. Damit man einen Temperaturbereich von 0°C bis 300°C simulieren kann, ist es nötig, die verwendete Thermistorentabelle in thermistortables.h zu verändern. Ich habe mit diesen Werten gute Ergebnisse erzielt:

 #if (THERMISTORHEATER_0 == 4) || (THERMISTORHEATER_1 == 4) || (THERMISTORHEATER_2 == 4) || (THERMISTORBED == 4) //10k thermistor
const short temptable_4[][2] PROGMEM = {
  {1*OVERSAMPLENR, 300},
  {100*OVERSAMPLENR, 270},
  {200*OVERSAMPLENR, 240},
  {300*OVERSAMPLENR, 210},
  {400*OVERSAMPLENR, 180},
  {500*OVERSAMPLENR, 150},
  {600*OVERSAMPLENR, 120},
  {700*OVERSAMPLENR, 90},
  {800*OVERSAMPLENR, 60},
  {900*OVERSAMPLENR, 30},
  {1000*OVERSAMPLENR, 0}
};
#endif


Am Ende sieht das dann so aus:

Was jetzt noch fehlt, ist ein Gehäuse:

 Und so sieht es aus, wenn man etwas auf dem Fake-Drucker ausdruckt:








Keine Kommentare:

Kommentar veröffentlichen