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
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)
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.
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
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
- '----------------------------------------------------------------------------
- $regfile = "m168pdef.dat"
- $crystal = 20000000
- $lib "YwRobot_Lcd_i2c.lib" 'YwRobot Treiber für LCD
- $hwstack = 64
- $swstack = 60
- $framesize = 60
- '**********************************************************
- '******************* Deklarationen ************************
- Const Pcf8574_lcd = &B0100_1110 'Adresse des I2C-LCDs
- Dim Lcd_backlight As Byte '1 = an; 0 = aus. Wird erst durch einen LCD-Befehl umgesetzt!
- Dim Puls_n As Byte 'Servonummer in der isr
- Dim Servo_l As Word 'Stellwert0=1msec, 156=2msec
- Dim Servo_r As Word 'Stellwert0=1msec, 156=2msec
- Dim Servo3 As Word 'Stellwert0=1msec, 156=2msec
- Dim Servo4 As Word 'Stellwert0=1msec, 156=2msec
- Servoport Alias Portd
- Config Servoport = Output
- Config Timer1 = Timer , Prescale = 8 , Clear_timer = 1 '2500 Takte für 1 msec
- On Compare1a Timer1_isr
- Start Timer1
- Enable Interrupts
- Dim N As Word
- Dim Trigger As Byte '10msec Zeit ohne interrupt
- Compare1a = 3750 'Startwert
- Puls_n = 0 'Startwert
- Enable Compare1a
- Servo_l = 1875
- Servo_r = 1875
- Servo3 = 1875
- Servo4 = 1875
- Config Portc = Input
- Dim L_1 As Word , R_1 As Word , L_0 As Word , R_0 As Word
- Dim S_l As String * 8 , S_r As String * 8
- Declare Sub Gl_line(byval X0 As Word , Byval Y0 As Word , Byval X1 As Word , Byval Y1 As Word )
- Dim X As Word , Y As Word , I As Word
- Config Scl = Portb.4 'Konfigurieren von I2C
- Config Sda = Portb.5
- Config Lcd = 16 * 2 'nicht unbedingt nötig
- Config I2cdelay = 1
- Waitms 300 'warte bis Kondensator bei Ta0 geladen, auch für LCD-Init!
- Lcd_backlight = 1
- 'Damit Backlight-Zustand an LCD übermittelt wird
- '**********************************************************
- '******************** Hauptprogramm ***********************
- Cls
- Locate 1 , 1 : Lcd " Servo"
- Locate 2 , 1 : Lcd " Wegsteuerung "
- Wait 1
- Cls
- L_0 = 1875 : R_0 = 1875
- Wait 1
- Do
- L_1 = 1750 : R_1 = 2208
- Call Gl_line(l_0 , R_0 , L_1 , R_1)
- L_0 = L_1 : R_0 = R_1
- Wait 1
- L_1 = 2242 : R_1 = 2682
- Call Gl_line(l_0 , R_0 , L_1 , R_1)
- L_0 = L_1 : R_0 = R_1
- Wait 1
- L_1 = 2060 : R_1 = 1872
- Call Gl_line(l_0 , R_0 , L_1 , R_1)
- L_0 = L_1 : R_0 = R_1
- Wait 1
- L_1 = 2467 : R_1 = 2342
- Call Gl_line(l_0 , R_0 , L_1 , R_1)
- L_0 = L_1 : R_0 = R_1
- Wait 1
- L_1 = 2590 : R_1 = 1787
- Call Gl_line(l_0 , R_0 , L_1 , R_1)
- L_0 = L_1 : R_0 = R_1
- Wait 1
- L_1 = 2016 : R_1 = 1912
- Call Gl_line(l_0 , R_0 , L_1 , R_1)
- L_0 = L_1 : R_0 = R_1
- Wait 1
- L_1 = 1750 : R_1 = 2208
- Call Gl_line(l_0 , R_0 , L_1 , R_1)
- L_0 = L_1 : R_0 = R_1
- Wait 1
- L_1 = 2467 : R_1 = 2342
- Call Gl_line(l_0 , R_0 , L_1 , R_1)
- L_0 = L_1 : R_0 = R_1
- Wait 1
- L_1 = 2242 : R_1 = 2682
- Call Gl_line(l_0 , R_0 , L_1 , R_1)
- L_0 = L_1 : R_0 = R_1
- Wait 5
- Loop
- End
- '-------------------------------------------------------------------------------
- ' Gl_line
- ' Bresenham-Algorithm for LINE.
- '-------------------------------------------------------------------------------
- Sub Gl_line(byval X0 As Word , Byval Y0 As Word , Byval X1 As Word , Byval Y1 As Word )
- Local Dx As Integer , Dy As Integer
- Local Adx As Integer , Ady As Integer
- Local Sdx As Integer , Sdy As Integer
- Local Pdx As Integer , Pdy As Integer
- Local Ddx As Integer , Ddy As Integer
- Local Es As Word , El As Word
- Local Error As Integer
- Dx = X1 - X0
- Dy = Y1 - Y0
- Adx = Abs(dx)
- Ady = Abs(dy)
- ' Sdx = Sgn(dx)
- ' Sdy = Sgn(dy)
- if dx < 0 then
- sdx = -1
- else
- If Dx = 0 Then
- Sdx = 0
- else
- Sdx = 1
- End If
- End If
- If Dy < 0 Then
- Sdy = -1
- Else
- If Dy = 0 Then
- Sdy = 0
- else
- Sdy = 1
- End If
- End If
- If Adx > Ady Then
- ' x is fast direction
- Pdx = Sdx
- Pdy = 0 ' pd. is move in Parall
- Ddx = Sdx
- Ddy = Sdy ' dd. is move in Diagonal
- Es = Ady
- El = Adx ' move in error direction
- Else
- ' y is fast direction
- Pdx = 0
- Pdy = Sdy
- Ddx = Sdx
- Ddy = Sdy
- Es = Adx
- El = Ady
- End If
- X = X0
- Y = Y0
- Servo_l = X
- Servo_r = Y
- Error = El / 2
- For I = 1 To El
- Error = Error - Es
- If Error < 0 Then
- Error = Error + El
- X = X + Ddx
- Y = Y + Ddy ' move Diagonal
- Else
- X = X + Pdx
- Y = Y + Pdy ' move Parallel
- End If
- Servo_l = X
- Servo_r = Y
- Waitus 400
- Next
- End Sub
- Anzeige:
- S_l = Str(x) : S_l = Format(s_l , " 0000 ")
- S_r = Str(y) : S_r = Format(s_r , " 0000 ")
- Locate 2 , 1 : Lcd S_l ; S_r
- Return
- Timer1_isr:
- Select Case Puls_n
- Case 0 :
- Servoport.0 = 1
- Compare1a = 5625 - Servo_l 'Einschaltdauer + 1 msec =max 2 msec
- Incr Puls_n 'Servonummer hochzählen
- Case 1 :
- Servoport.1 = 1
- Servoport.0 = 0
- Compare1a = 5625 - Servo_r 'Einschaltdauer + 1 msec =max 2 msec
- Incr Puls_n 'Servonummer hochzählen
- Case 2 :
- Servoport.2 = 1
- Servoport.1 = 0
- Compare1a = 5625 - Servo3 'Einschaltdauer + 1 msec =max 2 msec
- Incr Puls_n 'Servonummer hochzählen
- Case 3 :
- Servoport.3 = 1
- Servoport.2 = 0
- Compare1a = 5625 - Servo4 'Einschaltdauer + 1 msec =max 2 msec
- Incr Puls_n 'Servonummer hochzählen
- Case 4 :
- Servoport.3 = 0
- Compare1a = 2500 * 10 '10msec Pause
- Puls_n = 0
- Trigger = 5
- End Select
- Return
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
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------