
Zitat von
Bajuvar

Zitat von
Bensch
So ein Mist.
Meinem Programmierwahn wurde ein jäher Einhalt geboten:
DEMO/BETA only supports 4096 bytes of code
Wo bekomm ich günstig eine BASCOM-Vollversion her? Möglichst natürlich mit Studenten-Rabatt....
Grüße,
Benjamin
Elektor hätte momentan das Angebot noch: 69 statt 89 €uro
http://www.elektor.de/products/offer...r.759187.lynkx
Gruß Bajuvar
Ist bestellt, vielen Dank für den Tipp!
Auch wenn ich mit der Demo noch nicht kompilieren kann, mach ich trotzdem am Code weiter. Ich bin jetzt soweit, dass die Endpunkte der Arme im Raum zu einer beliebigen Tool-Position T berechnet werden und anschließend geprüft wird, ob der Bot die Position erreichen kann. Wenn ja, wird ein Bit "Erreichbar" gesetzt.
Code:
'(
################################################################################
Name : Delta-Ansteuerung.bas
Zweck : Stellt Eine Rückwärtskinematik Für Einen 3 -armigen
"Delta" -roboter Zur Verfügung.
Mikroprozessor : : Atmega32 Auf Rn -control V1.4
Alle Berechnungen Gehen Von Folgendem Aus:
Der Bot Ist An Einer Ebene Befestigt , Die Parallel Zur Xy -ebene Liegt
Der Arm 1 Liegt In Y -richtung.
Der Arm 2 Liegt , Von Oben Gesehen , 120° Links Gedreht(negative Y - Und X -richtung).
Der Arm 3 Liegt , Von Oben Gesehen , 120° Rechts Gedreht(negative Y - , Positive X -richtung).
Alle Werte Für Längen , Abstände Und Positionen Werden In Nanometern(nm) Angegeben!
################################################################################
')
Declare Function Tastenabfrage() As Byte
Declare Sub Update_ae()
Declare Sub Change_t()
Declare Sub Nix()
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000 'Quarzfrequenz
$baud = 9600
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1 'Pullup Widerstand ein
Dim Taste As Byte
' Deklaration der Variablen, die die Proportionen des Roboters beschreiben
' Alle Angaben in nm und als "Long" (32bit genauigkeit)
' Zulässig sind Werte zwischen -2147483648 und +2147483647
Print
Print "= = = = Delta-Steuerung = = = ="
' Fixer Befestigungspunkt B im Raum
Dim B_x As Long
Dim B_y As Long
Dim B_z As Long
B_x = 0
B_y = 0
B_z = 0
' Länge des Servoseitigen Armteils ("Oberer Armteil" -> Oa)
Dim Oa As Long
Oa = 100000000 '=10cm
' Länge des Servofernen Armteils ("Unterer Armteil" -> Ua)
Dim Ua As Long
Ua = 200000000 '=20cm
' Abstand des Armanfangs (aa) vom Befestigungspunkt B auf der Befestigungsebene (parallel zur xy-Ebene)
Dim Abst_b_aa_xy As Long
Abst_b_aa_xy = 70000000 '=7cm
' Abstand des Armanfangs (aa) von der Befestigungsebene
Dim Abst_b_aa_z As Long
Abst_b_aa_z = 30000000 '=3cm
' Abstand des Armendes (ae) vom Tool auf der xy-Parallel-Ebene
Dim Abst_t_ae_xy As Long
Abst_t_ae_xy = 40000000 '=4cm
' Abstand des Armendes (ae) von der xy-Parallel-Ebene
Dim Abst_t_ae_z As Long
Abst_t_ae_z = 20000000 '=2cm
'##### Berechne nun Konstruktionsabhängige Fixwerte #####
' Arm-Anfangspunkte:
' Arm1: (Der von oben gesehen hintere Arm, genau in y-Richtung)
Dim A1a_x As Long
Dim A1a_y As Long
Dim A1a_z As Long
A1a_x = B_x
A1a_y = B_y + Abst_b_aa_xy
A1a_z = B_z - Abst_b_aa_z
'Arm2: (Der von oben gesehen linke Arm)
Dim A2a_x As Long
Dim A2a_y As Long
Dim A2a_z As Long
Dim Hilf1 As Single 'Hilfsvariable für Zwischenergebnisse
Dim Hilf2 As Long
Dim Hilf3 As Long
Hilf1 = 0.866025403784435 '=Cos(30°)
Hilf2 = Hilf1 * Abst_b_aa_xy
A2a_x = B_x - Hilf2
Hilf3 = Abst_b_aa_xy / 2 '=Sin(30°)*Abst_b_aa_xy = Abst_b_aa_xy / 2
A2a_y = B_y - Hilf3
A2a_z = B_z - Abst_b_aa_z
'Arm3: (Der von oben gesehen rechte Arm)
Dim A3a_x As Long
Dim A3a_y As Long
Dim A3a_z As Long
A3a_x = B_x + Hilf2
A3a_y = B_y - Hilf3
A3a_z = B_z - Abst_b_aa_z
'Maximale und minimale "Länge" des Arms (Abstand von Armanfang zu Armende)
'jeweils mit sicherheitsabsatnd von 10% bzw 30%, um instabile Positionen zu vermeiden.
Dim Abst_min As Long
Dim Abst_max As Long
Hilf2 = Oa - Ua
Hilf2 = Abs(hilf2)
Abst_min = Hilf2 * 1.3
Hilf2 = Oa + Ua
Abst_max = Hilf2 * 0.9
Print "Montagepunkt = (" ; B_x ; "," ; B_y ; "," ; B_z ; ")"
Print "Armanfangs-Versatz:"
Print Abst_b_aa_xy ; "nm vom Montagepunkt in xy-Ebene"
Print "und " ; Abst_b_aa_z ; "nm in z-Richtung."
Print "Armende-Versatz:"
Print Abst_t_ae_xy ; "nm vom Toolpunkt in xy-Ebene"
Print "und " ; Abst_t_ae_z ; "nm in z-Richtung."
Print "Arm1-Anfang = ( " ; A1a_x ; " , " ; A1a_y ; " , " ; A1a_z ; " )"
Print "Arm2-Anfang = ( " ; A2a_x ; " , " ; A2a_y ; " , " ; A2a_z ; " )"
Print "Arm3-Anfang = ( " ; A3a_x ; " , " ; A3a_y ; " , " ; A3a_z ; " )"
'Deklariere restliche Variablen:
'Tool-Punkt T (Dieser Punkt soll angefahren werden)
Dim T_x As Long
Dim T_y As Long
Dim T_z As Long
'Kontroll-Bits:
Dim Erreichbar As Bit 'Ist 1, wenn der derzeitig geladene Toolpunkt erreichbar ist.
Erreichbar = 0
'Arm-Endpunkte
'Arm1
Dim A1e_x As Long
Dim A1e_y As Long
Dim A1e_z As Long
'Arm2
Dim A2e_x As Long
Dim A2e_y As Long
Dim A2e_z As Long
'Arm3
Dim A3e_x As Long
Dim A3e_y As Long
Dim A3e_z As Long
'Abstände der Armenden:
Dim Abst(3) As Long
'Hilfsvariablen für Zwischenergebnisse
Dim Hilf4 As Single
Dim Hilf5 As Long
Dim Hilf6 As Long
Dim Hilf7 As Single
Dim I As Integer
Print "Tastenbelegung:"
Print "1 = Armendpunkte berechnen + Pruefen, ob Punkt ereichbar"
Print "2 = Tool-z-Koordinate testweise aendern"
'
'## ## ## ## ## ## ## ## ## Hauptprogramm-Schleife ## ## ## ## ## ## ## ## ##
'
Do
Taste = Tastenabfrage()
If Taste <> 0 Then
Select Case Taste
Case 1
Call Update_ae
Case 2
Call Change_t
Case 3
Call Nix
Case 4
Call Nix
Case 5
Call Nix
End Select
End If
Waitms 20
Loop
End
Sub Update_ae()
' Berechnen der Arm-Endpunkte bei gegebenem Werkzeugpunkt W = ( W_x , W_y , W_z )
' und die Abstände der Arm-Enden "Abst1" bis "Abst3"
' Muss für jede Position natürlich neu vorgenommen werden!
' Arm1: (Der von oben gesehen hintere Arm, genau in y-Richtung)
A1e_x = T_x
A1e_y = T_y + Abst_t_ae_xy
A1e_z = T_z + Abst_t_ae_z
' Arm2: (Der von oben gesehen linke Arm)
Hilf4 = 0.866025403784435 '=Cos(30°)
Hilf5 = Hilf4 * Abst_t_ae_xy
A2e_x = T_x - Hilf5
Hilf6 = Abst_t_ae_xy / 2
A2e_y = T_y - Hilf6
A2e_z = T_z + Abst_t_ae_z
' Arm3: (Der von oben gesehen rechte Arm)
A3e_x = T_x + Hilf5
A3e_y = T_y - Hilf6
A3e_z = T_z + Abst_t_ae_z
' Debug-Ausgabe
Print "Arm-Endpunkte:"
Print "A1e = ( " ; A1e_x ; " , " ; A1e_y ; " , " ; A1e_z ; " )"
Print "A2e = ( " ; A2e_x ; " , " ; A2e_y ; " , " ; A2e_z ; " )"
Print "A3e = ( " ; A2e_x ; " , " ; A2e_y ; " , " ; A2e_z ; " )"
' Prüfen, ob der Punkt erreicht werden kann.
Erreichbar = 0
' Arm1:
Hilf2 = A1a_x - A1e_x
Hilf1 = Hilf2 * Hilf2
Hilf2 = A1a_y - A1e_y
Hilf4 = Hilf2 * Hilf2
Hilf2 = A1a_z - A1e_z
Hilf7 = Hilf2 * Hilf2
Hilf7 = Hilf7 + Hilf4
Hilf7 = Hilf7 + Hilf1
Abst(1) = Sqr(hilf7)
' Arm2:
Hilf2 = A2a_x - A2e_x
Hilf1 = Hilf2 * Hilf2
Hilf2 = A2a_y - A2e_y
Hilf4 = Hilf2 * Hilf2
Hilf2 = A2a_z - A2e_z
Hilf7 = Hilf2 * Hilf2
Hilf7 = Hilf7 + Hilf4
Hilf7 = Hilf7 + Hilf1
Abst(2) = Sqr(hilf7)
' Arm3:
Hilf2 = A3a_x - A3e_x
Hilf1 = Hilf2 * Hilf2
Hilf2 = A3a_y - A3e_y
Hilf4 = Hilf2 * Hilf2
Hilf2 = A3a_z - A3e_z
Hilf7 = Hilf2 * Hilf2
Hilf7 = Hilf7 + Hilf4
Hilf7 = Hilf7 + Hilf1
Abst(3) = Sqr(hilf7)
Print "Abstaende der Armenden: Arm1: " ; Abst(1) ; " Arm2: " ; Abst(2) ; " Arm3: " ; Abst(3)
Erreichbar = 0
For I = 1 To 3 ' Teste Arme 1-3
If Abst(i) < Abst_max And Abst(i) > Abst_min Then ' Wenn der Abstand ok ist...
Erreichbar = 1 ' Dann setze das erreichbar-bit
Else ' Sonst
Erreichbar = 0 ' Clear das Erreichbar-bit
Exit For ' Und verlasse sofort die Schleife
End If
Next I
If Erreichbar = 1 Then
Print "Punkt ist erreichbar!"
Else
Print "Punkt ist NICHT erreichbar! Fehler!"
End If
Waitms 500
End Sub
' Ändert den Punkt T (zu Testzwecken) in z-Richtung, also nach oben/unten
Sub Change_t()
Select Case T_z
Case 0
T_z = -50000000
Case -50000000
T_z = -100000000
Case -100000000
T_z = -150000000
Case -150000000
T_z = -300000000
Case -300000000
T_z = 0
End Select
Print "T_z geändert auf " ; T_z
Waitms 500
End Sub
Function Tastenabfrage() As Byte
Local Ws As Word
Tastenabfrage = 0
Start Adc
Ws = Getadc(7)
If Ws < 500 Then
Select Case Ws
Case 400 To 450
Tastenabfrage = 1
Case 330 To 380
Tastenabfrage = 2
Case 260 To 305
Tastenabfrage = 3
Case 180 To 220
Tastenabfrage = 4
Case 90 To 130
Tastenabfrage = 5
End Select
End If
End Function
Sub Nix()
End Sub
Edit:
Ich habe jetzt viele Deklarationen in Arrays gepackt, wodurch sich auch der rest des Codes deutlich verkürzt, weil ich vieles in "For I = 1 To 3" verpacken kann, wenn identische Berechnungen für alle 3 Arme gemacht werden.
Morgen stell ich den neuen Code ein, is zur Zeit nicht sehr ansehlich
Lesezeichen