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
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
// "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:
Keine Kommentare:
Kommentar veröffentlichen