V-Plotter
Ein V-Plotter, auch hanging wall plotter genannt, ist
- eine Wand zum Befestigen von Papier,
- zwei Rollen mit ansteuerbaren Motor,
- eine Halterung für ein Zeichengerät, die an den Fäden der Rollen hängt und
- eine Steuerung von den Motoren (mit Stromversorgung).
roadmap
- SVG support
- internes Zwischenformat für Puntwolke (json)
- Skalierungsfaktor (Bild zu Zeichenfläche), Linienart/Pfad, Linienbreite, defaults, Liste von Punkten (ein Pfad = 1 Objekt)(Absolute Werte)
- internes Zwischenformat für Puntwolke (json)
- Parser für Zwischenformat in libvplotter einbauen
- Servosteuerung (Stifthebeautomatik) (muss noch getestet werden)
- TCP Interface
- GUI-Interface
- Autokalibrierung
- 2 Taster, beide Schnüre einzelen aufwickeln, Anschlagspunkt = Schnurlänge
- OSM-Karten parser :D
plotbeere
Zur Codeweek EU#2015, wurde in einem Workshop für Kinder und Jugendliche begonnen ein V-Plotter, gesteuert von einem entsprechenden Raspberry Pi zu bauen.
#plotbeere steht dem HQ für allerlei Spielereien zur Verfügung.
Grundsätzlich ist #plotbeere als Stiftplotter angedacht.
Aufbau
Ein Raspberry Pi 2 steuert über 8 Pins 2 Steppermotoren 28BYJ-48 (5V DC) via 2 passender H-Brücken. Und ein
- Pinbelegung
-
- MOTOR_LEFT
- _pins[0] = 11
- _pins[1] = 10
- _pins[2] = 13
- _pins[3] = 12
- MOTOR_RIGHT
- _pins[0] = 5
- _pins[1] = 4
- _pins[2] = 9
- _pins[3] = 8
Verwendung
Verbinden mit plotbeere
ssh pi@172.22.99.103
raspberry
Starten des C++ Kommandointerpreters
vplotter
- l <length> // direct control, left motor
- r <length> // direct control, right motor
- m <dx> <dy> // move relative to current position
- g <x> <y> // move to absolute coordinate
- c // calibrate printer position
- u // move pen up
- d // move pin down
- w
- s <level> // set servo to this pwm level
- h // move to calibration point
Parameter der Zeichenfläche und des Plotters sind in der main.cpp hard gecodet: (Koordinatenursprung ist 0:0)
- Position des Kalibrierungspunktes
- Entfernung der Motoren vom Kalibrierungspunkt aus
- Größe der Zeichenfläche
- Quellen sind unter
/home/pi/V-Plotter
- Oder bei Github
script interface: Klassen Definition (Ruby)
Um besser damit spielen zu können, haben wir eine Ruby-Schnittstelle gebaut (RDoc):
Beispiel für die Verwendung
# config laden
plotter = VPlotter.new :plotbeere
# in den Zeichenmodus wechseln
plotter.draw do |d|
d.goto 50, 50 # Punkt anfahren
d.penDown # Stift aufsetzen
d.move 100, 0 # Relativbewegung
d.penUp # Stift absetzen
d.home # zurück zum Startpunkt
end
- Laden der richtigen Konfiguration (config) für unseren Plotter
entweder im Konstruktor:
plotter = VPlotter.new :plotbeere
oder auch nachher:
plotter.use_config :plotbeere
- Aufsetzen vom Stift
plotter.penDown
- Absetzen vom Stift
plotter.penUp
- Rotieren lassen vom (linken oder rechten) Motor
Warnung: Die Benutzung dieser Funktionen kann im Moment dazu führen, dass der Plotter seine Kalibrierungsdaten verliert!
- Wert>0 = abrollen
- Wert<0 = aufrollen
plotter.rotateLeftMotor(int Entfernung in mm)
plotter.rotateRightMotor(int Entfernung in mm)
- absolute Bewegung vom Koordinatenursprung aus
plotter.goto x, y
- relative Bewegung von aktueller Position
plotter.move x, y
- Fahren zum Kalibrierungspunkt
plotter.home
- Schreiben des Wortes Test an der aktuellen Position (noch nicht implementiert)
plotter.test
servo motor position für definierte Stiftposition
plotter.setPen(int 0-100)
- Neues Kalibieren der Stiftspitze
-
- Fahren zum Kalibrierungspunkt und Ausführen von
calibrate
- Fahren zum Kalibrierungspunkt und Ausführen von
plotter.calibrate
- unter Angabe der Rahmenparameter ist es auch möglich andere Plotter damit zu steuern
plotter.use_config(
pos_left: [x, y],
pos_right: [x, y],
pos_cali: [x, y],
height: height,
width: width
)
- Ändern der Geschwindigkeit vom Zeichen
- (noch nicht implementiert)
- default=10
- langsam=1
- Werte über 10 sind möglich aber können zu übersprungenen Steps führen, die die Zeichnung zerstören
VPlotter.printSpeed(int [1-10-∞])
Zwischenformat
{
"scale": [xscale, yscale], // float, Skalierungsfaktor (default: auto)
"offset": [x, y], // int, Verschiebung in mm (default: auto)
"line_width": 1, // int, Linienbreite
"line_pattern": "-" // string, Linienmuster (siehe unten) (default: durchgezogen)
"paths": [
{
"line_width": null, // siehe oben (default: globale Einstellung)
"line_pattern": null, // siehe oben (default: globale Einstellung)
"points": [[0, 0], [10, 0], [5, 5]], // Punkte in absoluten Koordinaten
"closed": false, // Pfad wird geschlossen, wenn 'true'
},
// ...
]
}
Linienmuster
Der Linientyp wird als String dargestellt, wobei folgende Zeichen verwendet werden können:
- ' ' (Leerzeichen)
- es wird 1mm ausgelassen (es wird kein strich gezeichnet)
- '.' (Punkt)
- es wird ein Punkt gesetzt, ohne die Position zu ändern; stehen mehrere dieser Zeichen hintereinander, wird beim das ersten Zeichen der Stift abgesenkt und für jeden weiteren Punkt 1mm weiter bewegt.
- '-' (Minus)
- es wird eine Linie von 1mm gezeichnet
Beispiele
pattern => [10 mm linie]
". " => [. . . . . . . . . . ]
"- " => [- - - - - -]
". - " => [. - . - . - . ]
". .. " => [. - . - . - . ]