Modellbauservo-Plotter, mein nächster Schritt

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Modellbauservo-Plotter, mein nächster Schritt

      Es geht weiter. Inzwischen hab' ich doch ganz brauchbare Servos bekommen, und die Mechanik ist im Aufbau. Justament hat Six1 hier den Bresenham reingestellt und den hab' ich gleich mal zum Ansteuern der Servos verwendet.
      Mit einem extra Programm kann ich jetzt die Servos per Poti bewegen und die Daten für den Puls für die angesteuerten Punkten an einem Display ablesen.
      Diese Punktdaten werden in einem weiteren Programm durch den Bresenhamalgorithmus 'verbunden' und an die Servos ausgegeben. Der erste Versuch:


      Die untere Linie ist doppelt, weil ich ja wieder zum Anfang muss :whistling:
      Für interessierte das unspektakuläre Programm (von den Zeilen für das LCD nicht verwirren lassen, dient nur zur Fehlerfindung und paar andere Sachen sind auch noch als Rest verblieben)

      BASCOM-Quellcode

      1. '----------------------------------------------------------------------------
      2. $regfile = "m168pdef.dat"
      3. $crystal = 20000000
      4. $lib "YwRobot_Lcd_i2c.lib" 'YwRobot Treiber für LCD
      5. $hwstack = 64
      6. $swstack = 60
      7. $framesize = 60
      8. '**********************************************************
      9. '******************* Deklarationen ************************
      10. Const Pcf8574_lcd = &B0100_1110 'Adresse des I2C-LCDs
      11. Dim Lcd_backlight As Byte '1 = an; 0 = aus. Wird erst durch einen LCD-Befehl umgesetzt!
      12. Dim Puls_n As Byte 'Servonummer in der isr
      13. Dim Servo_l As Word 'Stellwert0=1msec, 156=2msec
      14. Dim Servo_r As Word 'Stellwert0=1msec, 156=2msec
      15. Dim Servo3 As Word 'Stellwert0=1msec, 156=2msec
      16. Dim Servo4 As Word 'Stellwert0=1msec, 156=2msec
      17. Servoport Alias Portd
      18. Config Servoport = Output
      19. Config Timer1 = Timer , Prescale = 8 , Clear_timer = 1 '2500 Takte für 1 msec
      20. On Compare1a Timer1_isr
      21. Start Timer1
      22. Enable Interrupts
      23. Dim N As Word
      24. Dim Trigger As Byte '10msec Zeit ohne interrupt
      25. Compare1a = 3750 'Startwert
      26. Puls_n = 0 'Startwert
      27. Enable Compare1a
      28. Servo_l = 1875
      29. Servo_r = 1875
      30. Servo3 = 1875
      31. Servo4 = 1875
      32. Config Portc = Input
      33. Dim L_1 As Word , R_1 As Word , L_0 As Word , R_0 As Word
      34. Dim S_l As String * 8 , S_r As String * 8
      35. Declare Sub Gl_line(byval X0 As Word , Byval Y0 As Word , Byval X1 As Word , Byval Y1 As Word )
      36. Dim X As Word , Y As Word , I As Word
      37. Config Scl = Portb.4 'Konfigurieren von I2C
      38. Config Sda = Portb.5
      39. Config Lcd = 16 * 2 'nicht unbedingt nötig
      40. Config I2cdelay = 1
      41. Waitms 300 'warte bis Kondensator bei Ta0 geladen, auch für LCD-Init!
      42. Lcd_backlight = 1
      43. 'Damit Backlight-Zustand an LCD übermittelt wird
      44. '**********************************************************
      45. '******************** Hauptprogramm ***********************
      46. Cls
      47. Locate 1 , 1 : Lcd " Servo"
      48. Locate 2 , 1 : Lcd " Wegsteuerung "
      49. Wait 1
      50. Cls
      51. L_0 = 1875 : R_0 = 1875
      52. Wait 1
      53. Do
      54. L_1 = 1750 : R_1 = 2208
      55. Call Gl_line(l_0 , R_0 , L_1 , R_1)
      56. L_0 = L_1 : R_0 = R_1
      57. Wait 1
      58. L_1 = 2242 : R_1 = 2682
      59. Call Gl_line(l_0 , R_0 , L_1 , R_1)
      60. L_0 = L_1 : R_0 = R_1
      61. Wait 1
      62. L_1 = 2060 : R_1 = 1872
      63. Call Gl_line(l_0 , R_0 , L_1 , R_1)
      64. L_0 = L_1 : R_0 = R_1
      65. Wait 1
      66. L_1 = 2467 : R_1 = 2342
      67. Call Gl_line(l_0 , R_0 , L_1 , R_1)
      68. L_0 = L_1 : R_0 = R_1
      69. Wait 1
      70. L_1 = 2590 : R_1 = 1787
      71. Call Gl_line(l_0 , R_0 , L_1 , R_1)
      72. L_0 = L_1 : R_0 = R_1
      73. Wait 1
      74. L_1 = 2016 : R_1 = 1912
      75. Call Gl_line(l_0 , R_0 , L_1 , R_1)
      76. L_0 = L_1 : R_0 = R_1
      77. Wait 1
      78. L_1 = 1750 : R_1 = 2208
      79. Call Gl_line(l_0 , R_0 , L_1 , R_1)
      80. L_0 = L_1 : R_0 = R_1
      81. Wait 1
      82. L_1 = 2467 : R_1 = 2342
      83. Call Gl_line(l_0 , R_0 , L_1 , R_1)
      84. L_0 = L_1 : R_0 = R_1
      85. Wait 1
      86. L_1 = 2242 : R_1 = 2682
      87. Call Gl_line(l_0 , R_0 , L_1 , R_1)
      88. L_0 = L_1 : R_0 = R_1
      89. Wait 5
      90. Loop
      91. End
      92. '-------------------------------------------------------------------------------
      93. ' Gl_line
      94. ' Bresenham-Algorithm for LINE.
      95. '-------------------------------------------------------------------------------
      96. Sub Gl_line(byval X0 As Word , Byval Y0 As Word , Byval X1 As Word , Byval Y1 As Word )
      97. Local Dx As Integer , Dy As Integer
      98. Local Adx As Integer , Ady As Integer
      99. Local Sdx As Integer , Sdy As Integer
      100. Local Pdx As Integer , Pdy As Integer
      101. Local Ddx As Integer , Ddy As Integer
      102. Local Es As Word , El As Word
      103. Local Error As Integer
      104. Dx = X1 - X0
      105. Dy = Y1 - Y0
      106. Adx = Abs(dx)
      107. Ady = Abs(dy)
      108. ' Sdx = Sgn(dx)
      109. ' Sdy = Sgn(dy)
      110. if dx < 0 then
      111. sdx = -1
      112. else
      113. If Dx = 0 Then
      114. Sdx = 0
      115. else
      116. Sdx = 1
      117. End If
      118. End If
      119. If Dy < 0 Then
      120. Sdy = -1
      121. Else
      122. If Dy = 0 Then
      123. Sdy = 0
      124. else
      125. Sdy = 1
      126. End If
      127. End If
      128. If Adx > Ady Then
      129. ' x is fast direction
      130. Pdx = Sdx
      131. Pdy = 0 ' pd. is move in Parall
      132. Ddx = Sdx
      133. Ddy = Sdy ' dd. is move in Diagonal
      134. Es = Ady
      135. El = Adx ' move in error direction
      136. Else
      137. ' y is fast direction
      138. Pdx = 0
      139. Pdy = Sdy
      140. Ddx = Sdx
      141. Ddy = Sdy
      142. Es = Adx
      143. El = Ady
      144. End If
      145. X = X0
      146. Y = Y0
      147. Servo_l = X
      148. Servo_r = Y
      149. Error = El / 2
      150. For I = 1 To El
      151. Error = Error - Es
      152. If Error < 0 Then
      153. Error = Error + El
      154. X = X + Ddx
      155. Y = Y + Ddy ' move Diagonal
      156. Else
      157. X = X + Pdx
      158. Y = Y + Pdy ' move Parallel
      159. End If
      160. Servo_l = X
      161. Servo_r = Y
      162. Waitus 400
      163. Next
      164. End Sub
      165. Anzeige:
      166. S_l = Str(x) : S_l = Format(s_l , " 0000 ")
      167. S_r = Str(y) : S_r = Format(s_r , " 0000 ")
      168. Locate 2 , 1 : Lcd S_l ; S_r
      169. Return
      170. Timer1_isr:
      171. Select Case Puls_n
      172. Case 0 :
      173. Servoport.0 = 1
      174. Compare1a = 5625 - Servo_l 'Einschaltdauer + 1 msec =max 2 msec
      175. Incr Puls_n 'Servonummer hochzählen
      176. Case 1 :
      177. Servoport.1 = 1
      178. Servoport.0 = 0
      179. Compare1a = 5625 - Servo_r 'Einschaltdauer + 1 msec =max 2 msec
      180. Incr Puls_n 'Servonummer hochzählen
      181. Case 2 :
      182. Servoport.2 = 1
      183. Servoport.1 = 0
      184. Compare1a = 5625 - Servo3 'Einschaltdauer + 1 msec =max 2 msec
      185. Incr Puls_n 'Servonummer hochzählen
      186. Case 3 :
      187. Servoport.3 = 1
      188. Servoport.2 = 0
      189. Compare1a = 5625 - Servo4 'Einschaltdauer + 1 msec =max 2 msec
      190. Incr Puls_n 'Servonummer hochzählen
      191. Case 4 :
      192. Servoport.3 = 0
      193. Compare1a = 2500 * 10 '10msec Pause
      194. Puls_n = 0
      195. Trigger = 5
      196. End Select
      197. Return
      Alles anzeigen
      Der nächste Schritt ist wieder mehr der Mechanik gewidmet. Statt eines E-Magneten (den ich nicht im meinen Fundus finden konnte) kommt ein kleines Servo an die Spitze, das eine Scheibe mit dem Permanentmagnet dreht, damit's malt, Magnet in der Scheibe zur Tafel gedreht, kein Strich erwünscht > Scheibe 90° gedreht.
      Eine Tafellöschmechanik mit einem weiteren Servo hab' ich auch noch nicht.
      Ach ja, als Wandmodell wird das ganze Teil mit Servos nach oben montiert.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Noch ein Schritt weiter und gleich viel lauter. Jetzt kann der Stift ein/ausgeschaltet werden und der Löscher arbeitet hörbar a_15_a5ddcf85


      Zum Glück ist das ja ein Versuchsmodell und ich kann dabei viel lernen :/
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Statt eines E-Magneten (den ich nicht im meinen Fundus finden konnte)
      Hi Tscho,
      einen Eisennagel, Nylon-Unterlegscheiben, dünnen Kupferlackdraht und einen Akkuschrauber gibt Dein Fundus mit Sicherheit her...
      Die sichtbaren Servoarme machen m. E. gerade den Reiz der neuen Uhr aus.
      LG
      Mathias

      P.S. Ich warte schon gespannt darauf, dass Du eine Laser-Uhr baust.
      Heisenberg bei einer Radarkontrolle:
      Polizist: "Wissen Sie, wie schnell Sie waren?"
      Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"

    • Hm, ein Kind, was nur der Vater lieben kann :/
      Mein MBSP hat schreiben gelernt, 1. Klasse


      Naja, mit gutem Willen kann man's lesen. Die Mechanik ist schon sehr schlabbrig. Ich hatte eher gehofft, die senkrechte Aufstellung und der kleine Servo an den Hebeln dran verhindern das Umkehrspiel. Aber es federt doch sehr X/
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Es ist sicherlich so, dass man mit Rechnerei eine theoretisch genauere Linie beschreiben kann, in der Praxis kommt halt noch Spiel in Getriebe, Gelenk, Massenträgheit, Verwindungsunsteifigkeit dazu, was alles wieder relativiert. Dein gezeigter Aufbau hat ja vergleichsweise kurze Ärmchen, und die aus Epoxy. Aus diesen Gründen wage ich zu bezweifeln, dass es mit Rechnerei besser zu lesen wäre. Wenn ich das Haus vom Nikolaus nehme, dann hab' ich da nur die Eckpunkte, die mit Bresenham verbunden werden. Es wird mit diesem Verfahren keine schnurgerade Linie geben, aber Wellen wären rechnerisch auch nicht drin, sind in der Praxis aber.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Aus diesen Gründen wage ich zu bezweifeln, dass es mit Rechnerei besser zu lesen wäre.

      Du hast auch die von mir schon angebrachte Option der höheren Punktdichte.

      tschoeatsch schrieb:

      aber Wellen wären rechnerisch auch nicht drin, sind in der Praxis aber.
      Wie ich schon schrieb, die Wellen kommen durch die polare Mechanik selbst, die musst du eben aus deinen X-Y Koordinaten erst umrechnen.
    • tschoeatsch schrieb:

      Die Mechanik ist schon sehr schlabbrig.
      Hi Tscho,

      wie Dein "Haus vom Nikolaus" gezeigt hat, ist die Wiederholgenauigkeit ausreichend.


      ceperiga schrieb:

      Was wäre denn mit einem breiteren Magneten, der würde die Unregelmäßigkeiten nicht so betonen?
      Ja, versuche es einmal mit einem Eigenbau-Elektromagneten. Den kannst Du dimensionieren, wie Du magst.

      Ansonsten: Auf Michael hören ;)
      Selbst wenn Du perfekte Zahlen auf Position 1 hättest, würden die sich bei einer einfachen Verschiebung nach rechts "verbiegen".

      LG
      Mathias
      Heisenberg bei einer Radarkontrolle:
      Polizist: "Wissen Sie, wie schnell Sie waren?"
      Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"

    • stefanhamburg schrieb:

      Jetzt fehlen eigentlich nur noch die zwei Punkte in der Mitte ...
      und das '°C'

      Michael schrieb:

      Wie ich schon schrieb, die Wellen kommen durch die polare Mechanik selbst
      Haus-vom-Nikolaus.PNG
      Ich meine solche Wellen, wie in der rechten Linie, das hat mit dem Prinzip der Mechanik nix zu tun, links geht's besser. Je nach Haftreibung...

      mac5150 schrieb:

      Ansonsten: Auf Michael hören
      Selbst wenn Du perfekte Zahlen auf Position 1 hättest, würden die sich bei einer einfachen Verschiebung nach rechts "verbiegen".
      Ich verschiebe keine Zeichen, ich hab' für jede Stelle eigene.
      Punkte_auf_zahlen.jpg
      Ich habe mir Schablonen gedruckt, Punkte vergeben und die einzelnen Punkte mit meinem 'Handeingabeprogramm' am Originalplotter angefahren und die zugehörigen 'Drehwinkel' bzw 'Pulslängen' notiert und in einer data-Tabelle für das Malen bereitgestellt. Ok, so erhöht man die Fehler, ist klar.

      Mechanic schrieb:

      Lösche doch nur von hinten her immer die Ziffer(n), die sich geändert haben.
      Das ist auch mein Plan, deswegen auch diese Schiebemechanik, womit das hinreichend gut gehen müsste. Eine andere Variante wäre das Hinklappen einer Magnetfolie an das komplette 'display', da wäre mit einem Klapp ziemlich geräuscharm die Schrift weg gewesen, aber eben alles.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Ich meine solche Wellen, wie in der rechten Linie, das hat mit dem Prinzip der Mechanik nix zu tun, links geht's besser. Je nach Haftreibung...
      nein, links bewegen sich deine Servos zufällig mit gleicher Geschwindigkeit, deswegen ist die gemeinsame Linie gerade.
      Die rechte Dachschräge beschreibt ja auch einen Bogen.
      Die linke Dachschräge und die in der gleichen Richtung verlaufende Diagonale beschreiben auch Bögen, mit gleichem Durchmesser, nur anderem Mittelpunkt.

      Wenn du nicht rechnen willst, wirst du zwangsläufig die Punkte viel enger machen müssen, dann klappt das auch mit der Mechanik.