Vorüberlegungen zu einem 'Sisyphus table'

    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!

    • ceperiga schrieb:

      Ja, ich fühl mich auch wie ein halber Mensch :( . Mit ein wenig Glück, kann ich das noch in diesem Jahr ändern :)
      Dann wirst du aufblühen und dich ärgern, weil du die erst jetzt besorgt hast. (Die Fehlschläge und vermurksten Sachen musst du schnell vergessen, das gehört dazu :whistling: )
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Es dreht sich von selber!

      es gibt noch viel zu verbessern!
      Die steps werden jetzt noch nicht berechnet, bin schon mal gespannt, welche Geschwindigkeiten ich bei berechneten steps hin bekomme.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Michael schrieb:

      Ja, super, genauso hab ich das gemeint, das Muster ergibt sich von selbst.
      Wenn du jetzt noch ein paar Künstler-Argumente hinzufügst, dann brauchst du nicht mehr viel programmieren ;)
      Das wäre ein Notausstieg, wenn ich nix besseres hinkriege :D
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Zitronenfalter schrieb:

      six1 schrieb:

      feinerer Quartzsand
      Mit der Zeit kommt der wohl von selbst wenn das lange genug läuft a_38_b45e201d
      du meinst, ich sollte noch ein Fach für Ersatzkugeln vorsehen? Die Kugel wird ja auch immer kleiner werden :D
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Puh, wenn man erstmal alle Fehler macht, die man machen kann und dann ewig braucht, um alle Fehler zu finden und zu beheben, dann braucht man für ein paar Zeilen code 2 Tage. Aber ich hab's vor meinem Lebensende geschafft a_64_3a718cae
      Mein Elektrosandkasten malt, was ich will. Hier das Haus vom Nikolaus. Als Nächstes sind die Bezierkurven dran...
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Michael schrieb:

      nice.
      Wo ist das Programm? ;)
      Na hier:

      BASCOM-Quellcode

      1. 'Elektrosandkasten
      2. $regfile = "m168pdef.dat"
      3. $crystal = 20000000
      4. $hwstack = 234
      5. $swstack = 232
      6. $framesize = 400
      7. 'ports
      8. Config Portd.4 = Output 'step Sonnenrad
      9. Config Portd.5 = Output 'dir Sonnenrad
      10. Config Portd.6 = Output 'step Planetenrad
      11. Config Portd.7 = Output 'dir Planetenrad
      12. 'alias
      13. Step_sonne Alias Portd.4
      14. Step_planet Alias Portd.6
      15. Dir_sonne Alias Portd.5
      16. Dir_planet Alias Portd.7
      17. 'Konstanten
      18. Const Pi = 3.1415927
      19. Const 2pi = Pi * 2
      20. Const Pi_halbe = Pi / 2
      21. Const Microstep = 16 'Einstellung microsteps/fullstep
      22. Const Stepperstep = 200 'Anzahl Vollschritte/U
      23. Const Gear = 190 / 10 'Übersetzung Sonnen/Planetenrad zu Motorritzel
      24. Const Steps_per_u = 60800 'Microstep * Stepperstep * Gear 'steps pro Umdrehung
      25. Const Steps_per_u_minus = -60800 '0 - steps_per_u
      26. Const Steps_per_u_halbe = 30400 'Steps_per_u / 2
      27. Const Steps_per_u_halbe_minus = -30400 '0 - steps_per_u_halbe
      28. Const Steps_per_2pi = 9676.6205 'Steps_per_u /(2 * Pi)
      29. Const Laenge_ausleger = 126.6 'Länge des Auslegers=1/4 des Zeichenflächendurchmessers
      30. Const 2_la_quadrat = 32055.12 '2 *(laenge_ausleger ^ 2)
      31. 'Variablen
      32. Dim Stand_sonne As Long
      33. Dim Step2go_sonne As Long , Step2go_s As Long
      34. Dim Winkel_sonne As Single
      35. Dim Stand_planet As Long
      36. Dim Step2go_planet As Long , Step2go_p As Long
      37. Dim Winkel_planet As Single
      38. Dim Step_s As Long , Step_p As Long
      39. Dim Radius As Single , Winkel As Single
      40. Dim Make_step As Bit
      41. Dim Ready_for_step As Bit
      42. Dim X As Integer , Y As Integer
      43. Dim N As Word
      44. 'timer
      45. Config Timer0 = Timer , Prescale = 256 , Clear_timer = 1
      46. On Compare0a Steppertakt_isr
      47. Enable Compare0a
      48. Start Timer0
      49. Compare0a = 20
      50. Enable Interrupts
      51. 'subs
      52. Declare Sub Fahre_zu_punkt(byval W As Single , Byval R As Single)
      53. Declare Sub Fahre_zu_xy(byval X1 As Single , Byval Y1 As Single)
      54. Declare Sub Linie_zu(byval X1 As Integer , Byval Y1 As Integer )
      55. 'init
      56. Wait 5
      57. X = 0 : Y = 0
      58. Linie_zu -100 , -150
      59. Do
      60. Linie_zu 100 , -150
      61. Linie_zu -100 , 50
      62. Linie_zu 100 , 50
      63. Linie_zu 0 , 150
      64. Linie_zu -100 , 50
      65. Linie_zu -100 , -150
      66. Linie_zu 100 , 50
      67. Linie_zu 100 , -150
      68. Linie_zu -100 , -150
      69. Linie_zu 100 , 50
      70. Linie_zu -100 , 50
      71. Linie_zu 0 , 150
      72. Linie_zu 100 , 50
      73. Linie_zu 100 , -150
      74. Linie_zu -100 , 50
      75. Linie_zu -100 , -150
      76. Loop
      77. 'subs
      78. '-------------------------------------------------------------------------------
      79. ' Bresenham-Algorithm for LINE. nach six1
      80. '-------------------------------------------------------------------------------
      81. Sub Linie_zu(byval X1 As Integer , Byval Y1 As Integer )
      82. Local Dx As Integer , Dy As Integer
      83. Local Adx As Integer , Ady As Integer
      84. Local Sdx As Integer , Sdy As Integer
      85. Local Pdx As Integer , Pdy As Integer
      86. Local Ddx As Integer , Ddy As Integer
      87. Local Es As Integer , El As Integer , I As Integer
      88. Local Error As Integer
      89. Dx = X1 - X
      90. Dy = Y1 - Y
      91. Adx = Abs(dx)
      92. Ady = Abs(dy)
      93. if dx < 0 then
      94. sdx = -1
      95. Else
      96. If Dx = 0 Then
      97. Sdx = 0
      98. else
      99. sdx = 1
      100. End If
      101. End If
      102. If Dy < 0 Then
      103. Sdy = -1
      104. Else
      105. If Dy = 0 Then
      106. Sdy = 0
      107. else
      108. Sdy = 1
      109. End If
      110. End If
      111. If Adx > Ady Then
      112. ' x is fast direction
      113. Pdx = Sdx
      114. Pdy = 0 ' pd. is move in Parall
      115. Ddx = Sdx
      116. Ddy = Sdy ' dd. is move in Diagonal
      117. Es = Ady
      118. El = Adx ' move in error direction
      119. Else
      120. ' y is fast direction
      121. Pdx = 0
      122. Pdy = Sdy
      123. Ddx = Sdx
      124. Ddy = Sdy
      125. Es = Adx
      126. El = Ady
      127. End If
      128. Error = El / 2
      129. For I = 1 To El
      130. Error = Error - Es
      131. If Error < 0 Then
      132. Error = Error + El
      133. X = X + Ddx
      134. Y = Y + Ddy ' move Diagonal
      135. Else
      136. X = X + Pdx
      137. Y = Y + Pdy ' move Parallel
      138. End If
      139. Fahre_zu_xy X , Y
      140. Next
      141. End Sub
      142. Sub Fahre_zu_xy(byval X1 As Single , Byval Y1 As Single)
      143. Local H As Single
      144. Winkel = Atn2(y1 , X1) : If Y1 < 0 Then Winkel = 2pi + Winkel
      145. X1 = X1 * X1 : Y1 = Y1 * Y1 : H = X1 + Y1
      146. Radius = Sqr(h) : If Radius > 250 Then Radius = 250
      147. Fahre_zu_punkt Winkel , Radius
      148. End Sub
      149. Sub Fahre_zu_punkt(byval W As Single , Byval R As Single)
      150. Local W1 As Single 'Winkel in der Spitze gleichschenkligen Dreiecks, Seiten 2x Auslegerlänge, Basis=Radius
      151. '0=max Radius, 180°=Radius=0
      152. Local W2 As Single
      153. Local H As Single , Hh As Single
      154. Local Hs As Long , Hp As Long
      155. 'aktuelle Werte für die aktuelle Stellung
      156. If Stand_planet > Steps_per_u Then Stand_planet = Stand_planet - Steps_per_u
      157. If Stand_planet < 0 Then Stand_planet = Steps_per_u + Stand_planet
      158. H = R / 2_la_quadrat : H = H * R : Hh = 1 -h
      159. W1 = Acos(hh) 'Winkel an der pitze des gleichschenkligen Dreiecks bei Basislänge R
      160. 'Erweiterung des Orbits auf R
      161. Hs = W1 * Steps_per_2pi 'Verdrehung des Auslegers um die Kugel auf Abstand R vom Mittelpunkt zu bekommen
      162. Step_s = Hs - Stand_sonne 'steps, die von der alten Stellung bis zur neuen gebraucht werden
      163. Stand_sonne = Hs 'neuer Stand
      164. 'Verdrehung auf den Winkel W
      165. Hp = W * Steps_per_2pi
      166. Step_p = Hp - Stand_planet
      167. 'Drehrichtung optimieren
      168. If Step_p > Steps_per_u_halbe Then Step_p = Step_p - Steps_per_u
      169. If Step_p < Steps_per_u_halbe_minus Then Step_p = Step_p + Steps_per_u
      170. Stand_planet = Hp 'neuer Stand
      171. Hs = Step_s / 2
      172. Step_p = Step_p - Hs
      173. Step_s = Step_s - step_p
      174. Bitwait Ready_for_step , Set
      175. Step2go_sonne = Step_s
      176. Step2go_planet = Step_p
      177. Ready_for_step = 0
      178. ' Bitwait Ready_for_step , Reset
      179. End Sub
      180. Steppertakt_isr:
      181. If Make_step = 1 Then
      182. 'Sonne
      183. If Step2go_sonne > 0 Then
      184. Dir_sonne = 0
      185. Step_sonne = 1
      186. Decr Step2go_sonne
      187. End If
      188. If Step2go_sonne < 0 Then
      189. Dir_sonne = 1
      190. Step_sonne = 1
      191. Incr Step2go_sonne
      192. End If
      193. 'Planet
      194. If Step2go_planet > 0 Then
      195. Dir_planet = 1
      196. Step_planet = 1
      197. Decr Step2go_planet
      198. End If
      199. If Step2go_planet < 0 Then
      200. Dir_planet = 0
      201. Step_planet = 1
      202. Incr Step2go_planet
      203. End If
      204. Make_step = 0
      205. Else
      206. Step_planet = 0
      207. Step_sonne = 0
      208. Make_step = 1
      209. End If
      210. Compare0a = 20 '__ms Pulslänge
      211. If Step2go_sonne = 0 And Step2go_planet = 0 Then 'alle step sind gemacht
      212. Ready_for_step = 1
      213. Else
      214. Ready_for_step = 0
      215. End If
      216. Return
      Alles anzeigen
      noch schlecht kommentiert :S
      Ich hab' jetzt die Möglichkeit gerade Linien zwischen 2 Punkten(X,Y) zu zeichnen. Unterprogramme positionieren den Magnet auf x,y, bzw auf polare Koordinaten.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Meine Überlegungen sind weiter gekommen.
      Mein bisheriger software-Ansatz ist ungünstig. Es ist nicht gut, ein Raster in ein polares System zu pressen. Ich muss für eine flüssige Bewegung der Kugel (neben feinem Sand) auch die software besser an die hardware anpassen. Das heißt eine Verdrehung um einen Winkelschritt muss einem step oder Vielfachen dessen aus machen. Das geht am besten, wenn man polare Funktionen von Linien hat, die man dann winkelschrittweise (stepweise) durchläuft und den entsprechend zugehörigen Radius zu den Punkten dazu berechnet und mit der Mechanik einstellt. Deswegen meine Suche nach der Funktion, die 2 polare Punkte verbindet. Das ist der Schlüssel zu einer gleichmäßigen Bewegung, so ist meine Vermutung.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hm, ich könnte ja hilfsweise die 2 Punkte so verdrehen, dass einer auf der 0-Winkellinie zu liegen kommt, beide in kartesisch umrechnen, die Gerade der Verbindung in der Form f(x)=mx+b berechnen und diese Formel nach der polaren gemäß r(t)=b/[sin(t)-m*cos(t)] überführen. Jetzt kann ich die Zwischenpunkte berechnen und muss natürlich den zuvor angewanden Verdrehwinkel berücksichtigen.
      Oh, es hat geklingelt...They're coming to take me away ho ho he he ha ha
      to the funny farm where life is beautiful all the time, and I'll be happy to see those nice young men in their clean white coats
      and they're coming to take me away ha ha....
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Es ist schon wie verhext. Es soll die allgemeine Umrechnung gelten

      Hat die Gerade die Normalform y=mx+b, so ist die Polarform r(t)=b/[sin(t)-m*cos(t)].
      Geraden parallel zur y-Achse haben die Darstellung x=a. Das führt zu r(t)=a/cos(t).
      Quelle mathematische-basteleien.de/gerade.htm

      Jetzt hat man 2 Punkte auf der x-Geraden liegen, dann lautet die Funktion im kartesischen y=0*x+0. Kein Problem, auf dieser Geraden hat jeder Punkt als y-Koordinate den Wert 0
      Überträgt man das nach der obigen Formel verpufft diese Gerade plötzlich, r(t)=0/[sin(t)-0*cos(t)] Ich kann noch so am Winkel drehen, als Ergebnis bekomme ich nur den Nullpunkt. Das passiert mit jeder Geraden, die durch den Nullpunkt geht, b=0. Die Punkte wären ja da, ich kann ja die Linie zeichnen, aber ich kann die nicht in einer polaren Geradenformel beschreiben. Versteht das einer, oder zeigt mir meinen Fehler? Oder taugt das polare System nix, weil es so komische Spezielfälle (wenn man das so nennen kann) hat?

      Hat's grad' an der Tür geklingelt?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Wenn keiner eine neue Idee hat, ich bin jetzt auf dem Stand:
      Punkte in kartesische Koordinaten, mit Bresenham Zwischenpunkte ermitteln, diese in polar umrechnen und mit der Mechanik anfahren, aber, das ist jetzt neu, nicht mit dem wahren Massstab arbeiten sondern auf das 20-fache vergrößern. Dadurch sind die Sprünge durch den Bresenham statt 1mm nur noch 1/20mm groß und die Mechanik fährt schon geschmeidiger. Da mit diesem Verfahren alle Punkte, ohne Ausnahmeregeln, angefahren werden können, ist es jetzt meine Wahl. Ich werde mir jetzt mal komplexere Muster ausdenken und dann gibt's wieder einen Film (hoffe ich).
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Genau! Nachdem genau dieses Grün die Lieblingsfarbe meiner Frau ist, potenziert sich der Waf. Er war vorher schon hoch.
      Danke dafür, deine Idee, dieses Zeugs (Hollipulver) zu verwenden und auch noch zu spendieren war sehr gut :thumbsup:
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Dieses verdrehte Dreieck gehört bei mir in die Gruppe 'Kaleidoskop'. So werde ich die Figuren nennen, die aus Kontrollpunkten (hier die Eckpunkte des Dreiecks) bestehen, die mit einer Vorschrift in ihrer Position verändert werden und jeweils von der Mechanik angefahren werden. Hier bei diesen Dreieck wird nach jedem Erreichen des Punktes dieser bisschen um den Nullpunkt verdreht und vom Nullpunkt entfernt. Dieses Verändern nach Vorschrift geht im polaren System sehr einfach. Da ich aber von einem Punkt zum anderen 'krabbeln' will, brauch ich Zwischenpunkte. Die im polaren Systen zu errechnen, ist mir nicht gelungen, sodass ich das im kartesischen System mit den Bresenham mache. Wenn diese Zwischenpunkte entsprechend nah beieinander liegen geht das recht gut. Nicht gut geht es, wenn ich in die Nähe oder durch den Nullpunkt gehe. Da haben benachbarte, aufeinander folgende Punkte sehr unterschiedliche Koordinaten, was den Winkel betrifft. Das ergibt ein schnelles Verstellen des Winkels in der Mechanik in schneller Abfolge, was Unruhe erzeugt. Da habe ich noch keine gescheite Idee. Eventuell statt Bresenham die kartesische Geradengleichung berechnen und mit der die Koordinaten der Zwischenpunkte ermitteln.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Alles ein bisschen weiter entwickelt. Bresenham ist out. 2 Punkte werden mit einer Geradenformel (y=mx+b) verbunden, die Koordinaten der Zwischenpunkte werden mit dieser Formel berechnet. Je nachdem ob delta x oder delta y der beiden Punkte größer ist, wird der größere Wert genommen und milimeterweise von einem Punkt zum anderen durchgerechnet. Die Auflösung wird durch einen Massstab noch erhöht, derzeit Faktor 5. Es wird also gerechnet, wie wild, inzwischen mit einem xmega.
      Was mir jetzt noch Kopfzerbrechen macht, ist die unterschiedliche Kugelgeschwindigkeit. In dem angehängten Filmchen sieht man das deutlich, Eckpunkte werden langsam genommen, gerade Stücke dazwischen teilweise recht flott. Um von einem Punkt zum nächsten zu gelangen, werden die nötigen steps berechnet. Die werden dann alle abgearbeitet. Jeder step braucht zwei interrupts, einschalten/ausschalten, das heißt haben die beiden Punkte den gleichen Abstand zum Nullpunkt, muss nur der Winkel verändert werden, um von Punkt A zu Punkt B zu kommen. Dann geht das schneller, als wenn noch der Radius verändert werden muss. Wie kann ich das gleichmäßiger hin kriegen? Die Berechnungen takten und zwischen den Berechnungen schauen, dass ich die nötigen steps in dieser Zeit unter bringe?



      Elektrosandkasten-xmega-V0.9.bas
      Raum für Notizen

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

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