V-Plotter: Unterschied zwischen den Versionen

Aus C3D2
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(13 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
= V-Plotter / Hanging Wall Plotter "Plotbert"=
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).


Zur Codeweek 2015, wurde in einem Workshop für Kinder und Jugendliche begonnen ein [https://www.raspberrypi.org/blog/hanging-wall-plotter/ V-Plotter, auch hanging wall plotter] zu bauen.
== roadmap ==


Dieser steht dem HQ für allerei Spielereien zur Verfügung.
* 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)
* 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 [https://www.raspberrypi.org/blog/hanging-wall-plotter/ entsprechenden] [[Raspberry Pi]] zu bauen.
 
[[#plotbeere]] steht dem [[HQ]] für allerlei Spielereien zur Verfügung.


[[Bild:V-Plotter1_2.jpg|100px]]
[[Bild:V-Plotter1_2.jpg|100px]]
Zeile 9: Zeile 28:
[[Bild:V-Plotter3.JPG|100px]]
[[Bild:V-Plotter3.JPG|100px]]


= Aufbau =
Grundsätzlich ist [[#plotbeere]] als [[wikipedia:de:Stiftplotter|Stiftplotter]] angedacht.


Ein Raspberry2 steuert über 8 Pins 2 StepperMotoren 28BYJ-48 (5V DC) via 2 passender H-Brücken. Und ein
=== Aufbau ===
Die Pinbelgung auf dem Raspberry:


MOTOR_LEFT:
Ein [[Raspberry Pi 2]] steuert über 8 Pins 2 [[wikipedia:de:Schrittmotor|Steppermotor]]en 28BYJ-48 (5V DC) via 2 passender [[wikipedia:de:Vierquadrantensteller|H-Brücken]]. Und ein
*          _pins[0] = 11
*          _pins[1] = 10
*          _pins[2] = 13
*          _pins[3] = 12


MOTOR_RIGHT:
; Pinbelegung:
*          _pins[0] = 5
:; MOTOR_LEFT:
*          _pins[1] = 4
:*          _pins[0] = 11
*          _pins[2] = 9
:*          _pins[1] = 10
*          _pins[3] = 8
:*          _pins[2] = 13
:*          _pins[3] = 12
:; MOTOR_RIGHT:
:*          _pins[0] = 5
:*          _pins[1] = 4
:*          _pins[2] = 9
:*          _pins[3] = 8


=== Verwendung ===


= Verwendung =
Verbinden mit [[plotbeere]]
: <source lang="bash">ssh pi@172.22.99.103</source>
<tt>raspberry</tt>


$ ssh pi@172.22.99.103  (pw: raspberry)
Starten des [[C++]] Kommandointerpreters
: <source lang="bash">vplotter</source>


starten des c++ Kommandointerpreters
* l <length>  // direct control, left motor
  $ vplotter
* 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 <time>    // wait for a given time (in ms)
* 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


  * l <length> // direct control, left motor
; Quellen sind unter
  * r <length> // direct control, right motor
* <code>/home/pi/V-Plotter</code>
  * m <dx> <dy> // move relative to current position
 
  * g <x>  <y>  // move to absolute coordinate
; Oder bei Github:
  * c          // calibrate printer position
* [https://github.com/schwarzchristian/v-plotter V-Plotter C++ Repo]
  * u          // move pen up
 
  * d          // move pin down
=== script interface: Klassen Definition (Ruby) ===
  * w <time>    // wait for a given time (in ms)
 
  * s <level>   // set servo to this pwm level
Um besser damit spielen zu können, haben wir eine Ruby-Schnittstelle gebaut ([http://schwarz-chr.de/doc/V-Plotter-Ruby/ RDoc]):
  * h          // move to calibration point
 
== Beispiel für die Verwendung ==
   Parameter der Zeichenfläche und des Plotters
 
   sind in der main.cpp hard gecodet:
<source lang="ruby">
   (Koordinatenursprung ist 0:0)
# config laden
   * Position des Kalibrierungspunkt
plotter = VPlotter.new :plotbeere
   * Entfernung der Motoren vom CalibrierungsPunkt aus
 
  * Größe der Zeichenfläche
# 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
</source>


; Laden der richtigen Konfiguration (config) für unseren Plotter
entweder im Konstruktor:
: <source lang="ruby">plotter = VPlotter.new :plotbeere</source>
oder auch nachher:
: <source lang="ruby">plotter.use_config :plotbeere</source>


Quellen sind unter:
; Aufsetzen vom Stift
/home/pi/V-Plotter
: <source lang="ruby">plotter.penDown</source>
; Absetzen vom Stift
: <source lang="ruby">plotter.penUp</source>


Oder bei Github:
; Rotieren lassen vom (linken oder rechten) Motor:
  [https://github.com/schwarzchristian/v-plotter V-Plotter C++ Repo]
Warnung: Die Benutzung dieser Funktionen kann im Moment dazu führen, dass der Plotter seine Kalibrierungsdaten verliert!
:: Wert>0 = abrollen
;: Wert<0 = aufrollen
: <source lang="ruby">plotter.rotateLeftMotor(int Entfernung in mm)</source>
: <source lang="ruby">plotter.rotateRightMotor(int Entfernung in mm)</source>


== script interface: Klassen Definition (Ruby) ==
; absolute Bewegung vom Koordinatenursprung aus
: <source lang="ruby">plotter.goto x, y</source>


Um bessere damit spielen zu können, haben wir eine Ruby Schnittstelle gebaut:
; relative Bewegung von aktueller Position
: <source lang="ruby">plotter.move x, y</source>


'''class VPlotter'''
; Fahren zum Kalibrierungspunkt
: <source lang="ruby">plotter.home</source>
   
; Schreiben des Wortes ''Test'' an der aktuellen Position (noch nicht implementiert)
: <source lang="ruby">plotter.test</source>
   
   
'''VPlotter.selectPlotter("plotbert")'''
servo motor position für definierte Stiftposition
    lädt die richtig config für unseren Plotter
: <source lang="ruby">plotter.setPen(int 0-100)</source>
     
'''VPlotter.penUp()
'''VPlotter.penDown()
    Stift auf und absetzen
   
   
  '''VPlotter.rotateLeftMotor( int Entfernung in 1/10 mm)
; Neues Kalibieren der Stiftspitze:
'''VPlotter.rotateRightMotor( int Entfernung in 1/10 mm)
:: Fahren zum Kalibrierungspunkt und Ausführen von <code>calibrate</code>
     Wert<0 = aufrollen, Wert>0 = abrollen
: <source lang="ruby">plotter.calibrate</source>
   
 
'''VPlotter.goto(x,y)  
; unter Angabe der Rahmenparameter ist es auch möglich andere Plotter damit zu steuern
    absolute Bewegung vom Koordinaten Ursprung aus
<source lang="ruby">
'''VPlotter.move(x,y)
plotter.use_config(
    relative Bewegung von aktueller Position
  pos_left: [x, y],
   
  pos_right: [x, y],
'''VPlotter.home()
  pos_cali:  [x, y],
    zum Kalibrierungspunkt fahren
  height:    height,
  width:    width
)
</source>
 
; Ä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
: <source lang="ruby">VPlotter.printSpeed(int [1-10-∞])</source>
 
 
== Zwischenformat ==
<source lang="javascript">
{
    "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'
        },
        // ...
    ]
}
</source>
 
=== 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 ====
<source lang="text">
pattern => [10 mm linie]
". "    => [. . . . . . . . . . ]
"- "    => [- - - - - -]
". - " => [. - . - . - . ]
". .. " => [. - . - . - . ]
</source>


'''VPlotter.test()
    schreibt das Wort Test an die aktuelle Position
  '''VPlotter.setPen(int 0-100)
    servo motor position für definierte Stiftposition
'''VPlotter.calibrate()'''
    zum neu kalibieren des V-Plotters die Stiftspitze
    zum Kalibrierungspunkt bringen und calibrate() ausführen


'''VPlotter.customConfig(posMotorRight(x,y), posMotorLeft(x,y), calibrationPoint(x,y), height, width)'''
[[Kategorie:HQ]]
    es ist unter Angabe der Rahmenparameter auch möglich andere Plotter damit zu steuern
[[Kategorie:Infrastruktur]]
[[Kategorie:Inventar]]
[[Kategorie:C++]]
'''VPlotter.printSpeed(int [1-10-∞])'''
[[Kategorie:Ruby]]
    ändert die Zeichengeschwindigkeit, default=10, langsam=1,
[[Kategorie:Raspberry Pi]]
    Werte über 10 sind möglich aber können zu übersprungenen
[[Kategorie:Projekt]]
    Steps führen die die Zeichnung zerstören

Aktuelle Version vom 2. Dezember 2015, 17:21 Uhr

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)
  • 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
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]
". "    => [. . . . . . . . . . ]
"- "    => [- - - - - -]
". - "  => [. - . - . - . ]
". .. " => [. - . - . - . ]