Fake-Elektronik für Reprap 3D-Drucker

Aus Port23Wiki
Version vom 24. November 2014, 08:12 Uhr von Bastard (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Meist braucht man keinen vollständigen 3D-Drucker, um etwas vorzuführen. Aber so ganz Ohne geht es auch nicht, da die im Spiel befindliche Soft- und Hardware kommunizieren möchte. Deshalb habe ich mir Gedanken gemacht, wie man einer Soft- oder Hardware einen 3D-Drucker vorspiegeln könnte. Diese Seite erläutert meine Gedanken.


Inhaltsverzeichnis

Wieviel Fake ist machbar?

Ein echter Reprap 3D-Drucker besteht aus

  • Schrittmotoren (je einer für die X-, Y- und Z-Achse, Extruder)
  • Treiber für die Schrittmotoren
  • Bett- und Hotend-Heizung (Leistungswiderstand)
  • je ein Leistungstransistor für die Bett- und Hotend-Heizung
  • je ein Thermistor für die Temperaturmessung an Bett und Hotend
  • Endstoppschalter für die 3 Achsen
  • (Arduino-Mega) Microcontroller mit (Marlin) 3D-Druckerfirmware
  • 3D-Drucker Shield

Nun geht es darum, die meisten oben aufgelisteten Teile zu ersetzen.

  • Schrittmotoren und Treiber
    • werden durch LEDs ersetzt, je eine für jede Drehrichtung
  • Heizungen und Leistungstransistoren
    • werden durch "rote" LEDs ersetzt.
  • Thermistoren
    • werden durch Potis ersetzt
  • Endstoppschalter
    • werden durch öffnende Drucktaster "ersetzt"
  • Mikrocontroller und Shield
    • Den Arduino Mega zu ersetzen bedeutet einen hohen Aufwand, da man fast alles, was er mitbringt (Stromversorgung, USB-Schnittstelle) gut brauchen kann. Lediglich das Shield wird duch eine vereinfachte Elektronik ersetzt.


Experimente zur vereinfachten Elektronik

  • Schrittmotoren und Treiber
    Die Treiber bekommen an den 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.
  • Firmwareänderung zur Verlängerung des Impulses
    Mein Mendel90 3D-Drucker läuft mit einer vom Entwickler angepassten Version der Marlin Firmware. Hauptgründe für die Änderungen sind der verschobene Ursprung in die Mitte des Druckbetts und der Z-Endstopschalter an Z-Max.
    • Änderungen in "stepper.cpp"
      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
  • Heizungen
    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.
  • Thermistoren
    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


  • Endstoppschalter
    Die Öffner werden mit GND verbunden.

Realisierung auf dem Steckbrett

Bis jetzt eingezeichnet:

  • LEDs X-Motor
  • LEDs Y-Motor
  • Thermistor für das Hotend

Steckplatine-1.png

Und in "echt" sieht das bis jetzt so aus:

https://drive.google.com/file/d/0B6LM7uRPVe-sTHpHd0FxRFhaRU0/view?usp=sharing

https://drive.google.com/file/d/0B6LM7uRPVe-sM1BSZVQySVdMN1E/view?usp=sharing

Realisierung mit einem Mega Protoboard

Protoboard.png

Meine Werkzeuge