Ein HPGL-Selbstbauplotter


Hier eine kleine Sammlung an Fotos und Quelltexten etc. über ein altes Projekt aus dem Jahr 1994:
Features:

  • DIN A4 Papiergröße
  • Eigene Intelligenz mit 8051-Prozessor und 32k RAM
  • 2x16 Zeichen LCD-Display und 6-Tasten Bedienfeld, 3 Status-LEDs
  • HPGL-Interpreter für Linienbefehle: PU, PD, PA (Pen up, Pen down, Pen absolute)
  • Endschalter für alle Achsen
  • serielle RS232-Schnittstelle
  • Antrieb über 2 Unipolar-Stepper mit 200steps/U, Betrieb im Halfstep-Mode
  • Fischertechnik-Ketten zur Kraftübertragung
  • Ein Stifthalter mit Hubmagnet
  • Kugelgelagerte Brücke für x-Achse
  • Rahmenkonstruktion aus Plexiglas und Alu-L-Profilen

Hier ein paar Fotos:

Gesamtansicht
Gesamtansicht

 

Detail Bedienfeld, Bruecke
Controller, Bedienfeld, Y-Achse und Stifthalter (Klicken für Großbild)

 

Detail
... (Klicken für Großbild)

 

Detail: Controller
Contoller im Detail (Klicken für Großbild)

 

Platinenlayout Controller
Das Controller-Board-Layout (Klicken für Großbild)

 

Platinenlayout Bedienfeld
Das Bedienfeld-Layout (Klicken für Großbild)



Dazu gibt es die ASSEMBLER-Quelltexte (ich glaube ich habe damals den TASM/Table Driven Assembler von Speech Technology Inc. benutzt...) als ZIP
Die Board-Dateien des Controllers und des Bedienfeldes (konvertiert von EAGLE 2.05 nach 4.15) als ZIP. Die doppelseitig durchkontaktierte Controller-Leiterplatte habe ich damals beim PCB-Pool herstellen lassen: Super Sache!

Die Schrittmotoren würde ich jetzt mit nem ULN2803 ansteuern, damals habe ich eine Endstufe mit Transistoren aufgebaut. Die Adressdecodierung bzw. Cipselect-Erzeugung kann man statt mit einem GAL auch mit wired-or etc. erzeugen.

Der Kern des ganzen, der Bresenham-Linienalgorithmus als Pseudocode/Pascal-Quelltext:

Procedure PlotLine(x1,y1,x2,y2 :  Integer);
    Var
       px, py, dx, dy, ax, sy, rest, j :  Integer;
    Begin
 	ax := 1; sy := 1;
    	dx := (x2-x1);
 	dy := (x2-yl);
 	px := 0;
 	py := 0;
    	If dx=dx Then
           Begin
 	   py := py+sy;
           rest := rest-dx;
           move_x_Y; (*SCHRITT IN X- UND Y-RICHTUNG*)
           End
       	  Else
           move x;(*SCHRITT IN X-RICHTUNG*)
 	Until px-~dx
 	Else If (dx=0) And (dy != 0) Then
   	RepeaT
 	py : = py+ sy;
 	move_y; (*SCHRITT IN Y-RICHTUNG*)
  	 Until py=dy
	Else If (dx!= 0) And (dy=0) Then
  	Repeat
   	  px := px+ax;
  	  move_x;
 	 UnTil px=dx;
	End;


Der Programmfluss der Assembler-SW in plotter1.zip als unvollständiges Pseudocode-Bruchstück:

10  Schalte LEDs aus
20  Springe zu LCD_Init
30  Fahre nach 0,0
35  Initialisiere Variablen, Clear RAM, Init RS232
40  Warte auf serielles Zeichen oder Taste
50  Wenn Taste, dann Menü behandeln ->goto MENU
60  Wenn Zeichen, dann PA, PD, PU auswerten -> goto COMMAND
70  Wenn Zeichen Dateiende -> goto WORKFIRST
80  gehe zu 40

100 COMMAND:
110 Ist es PU? Pen-Bit setzen
120 Ist es PD? Pen-Bit löschen
130 Ist es PA? Koordinaten von ASCII zu Binaer wandeln, ins RAM schreiben -> goto KOORDINATEN
140 goto 40

200 WORKFIRST:
210 Koordinaten aus RAM abarbeiten, Plotten
220 ...

300 MENU:
310 Tasten auswerten
320 ...

Hier gibt es noch eine ganz interessante Seite mit Selbstbau-Plottern und Algorithmen.