Hallo Bammel,
1. freut mich und ich werd dann noch ein Bier auf das Wohl deines Roboters trinken.
2. versteh ich nicht, könntest du das vielleich aufmalen?
grüsse,
Hannes
Druckbare Version
Hallo Bammel,
1. freut mich und ich werd dann noch ein Bier auf das Wohl deines Roboters trinken.
2. versteh ich nicht, könntest du das vielleich aufmalen?
grüsse,
Hannes
bild...
könnte mir nur vorstellen das das ganze mit den katheten und hyputinosen zusammen hängt das sich das vllt verschiebt.
was ich nochmal testen wollte ein poti zum einstellen der abstände einzubinden. so kann ich sehen wann sich welcher winkel wie verhält.
edit: hab mal ein poti eingebaut. um den abstand verändern zu können und dann live zu beobachten was passiert. für die höhe soll auchnoch eins eingebaut werden. aber das kommt morgen. erstmal ist es schon sehr geil zu sehen das die idee hinter dem ganzen so funktioniert wie ich es mir erhofft habe.
zu dem problem: erste erkenntnis: bei einer höhe von 50 geht der knie-winkel nie kleiner als 90°. kann es daran liegen das dann die seitenbezeichnungen nicht mehr passen. den c ist ja immer die hypotinuse und die ist ja iemmr die längste seite im dreieck. oder irre ich mich? wenn das so ist wie kann ich das umsetzten das es mir keine probleme bereitet? erste idee von mir wäre ne abfrage zu machen wenn der winkel kleiner als 90° ist, die größenverhältnisse zu tauschen und neu zu berechnen so das es wieder hinkommt.
gute nacht
Ah,
das ist kein Problem, das macht der Hund vom Nachbarn auch immer. Das ist ein natürliches Bedürfnis.
Nein im Ernst: Dis wird dann 114 und der Kniewinkel 95°.
Welcher Code produziert denn diesen Fehler. Ich will nicht im alten Code von früher herumsuchen, du hast den ja inzwischen geändert.
Die veränderte Höhe ändert nichts daran, dass DIS die Hypothenuse im blauen Dreieck ist , und dass das Beindreieck ein allgemeines Dreieck ist. Es brauchen keine Bezeichnungen verändert werden.
grüsse,
Hannes
habs nochmal genau durchgeschaut bei folgenden daten geht das bein hoch:
Hoehe = 50
Abstand = 97
bei abstand = 98 bleibt es noch unten und verhält sich so wie es soll
code ist folgender:
EDIT: hab gerade noch ein poti für die höhe eingebaut. und ich muss feststellen sobald der kniewinkel kleiner als 90° werden würde geht das bein in fehlstellung. aber ich glauber nur der unterschenkel. dieser stellt sich dann immer in den 180° winkelCode:$regfile = "m8def.dat"
$crystal = 3686400
$baud = 19200
$framesize = 64
$swstack = 64
$hwstack = 64
Config Timer1 = Timer , Prescale = 1 'timer für servos
Enable Timer1
Timer1 = 56320
Config Portc = Output
Portc.2 = 0 'hier hängt servo1
Portc.3 = 0 'hier hängt servo2
Portc.4 = 0 'hier hängt servo3
Portc.5 = 0 'hier hängt servo4
Config Pinc.0 = Input ' Port C.0 Ausgang
Config Pinc.1 = Input
On Timer1 Servoirq 'servo
Config Adc = Single , Prescaler = 64 , Reference = Avcc
Start Adc
Enable Interrupts
Declare Sub Berechnung
Dim Kanal As Byte
Dim Servo(4) As Word 'links: 63200, mitte 60000, rechts 56800
Dim Hoehe As Byte
Dim Abstand As Byte
Dim Wert1_a As Single
Dim Wert1_b As Word
Dim Hoehe_q As Word
Dim Abstand_q As Word
Dim Dis_q As Word
Dim Dis As Byte
Dim Knie_wi As Byte
Dim Kniea As Word
Dim Knieb As Word
Dim Knie_zw_a As Word
Dim Knie_zw_b As Word
Dim Knie_zw_c As Word
Dim Knie_zw_d As Integer
Dim Knie_zw_e As Single
Dim Knie_zw_wi As Single
Dim Hufta_zw_a As Single
Dim Hufta_zw_b As Single
Dim Hufta_wi As Byte
Dim Huftb_zw_a As Word
Dim Huftb_zw_b As Word
Dim Huftb_zw_c As Word
Dim Huftb_zw_d As Integer
Dim Huftb_zw_e As Single
Dim Huftb_zw_wi As Single
Dim Huftb_wi As Byte
Dim Huft_wi As Byte
Dim Hufta As Word
Dim Huftb As Word
Const Oberschenkel = 67
Const Unterschenkel = 87
Const Oberschenkel_q = 4489
Const Unterschenkel_q = 7569
Hoehe = 50
Abstand = 100
Call Berechnung
Servo(3) = 60000
Servo(4) = 60000
Wait 3
Do
Wert1_b = Getadc(0)
Waitus 50
Wert1_a = 150 / 1024
Abstand = Wert1_a * Wert1_b
Call Berechnung
Loop
Servoirq:
If Kanal = 0 Then
If Portc.2 = 0 Then 'wenn port low
Timer1 = Servo(1) 'dann timer auf entsprechende verzögerung
Portc.2 = 1 'und port anschalten
Else 'das hier passiert erst bei dem darauf folgenden interrupt
Portc.2 = 0 'dann port wieder ausschalten
Incr Kanal 'und den nächsten kanal bearbeiten
End If
End If
If Kanal = 1 Then
If Portc.3 = 0 Then
Timer1 = Servo(2)
Portc.3 = 1
Else
Portc.3 = 0
Incr Kanal
End If
End If
If Kanal = 2 Then
If Portc.4 = 0 Then
Timer1 = Servo(3)
Portc.4 = 1
Else
Portc.4 = 0
Incr Kanal
End If
End If
If Kanal = 3 Then
If Portc.5 = 0 Then
Timer1 = Servo(4)
Portc.5 = 1
Else
Portc.5 = 0
Incr Kanal
End If
End If
If Kanal = 4 Then
Timer1 = 21300 '54016 eine pause von ca. 12ms bis zum nächsten interrupt. Bei guten Servos oder Brushlessreglern kann man hier bis auf 65530 gehen ==> ansteuerfrequenz von ~ 200Hz
Kanal = 0
End If
Return
'------------------------------------------
Sub Berechnung
If Hoehe > 110 Then Hoehe = 110
If Abstand < 37 Then Abstand = 37
Hoehe_q = Hoehe * Hoehe
Abstand_q = Abstand * Abstand
Dis_q = Hoehe_q + Abstand_q
Dis = Sqr(dis_q)
'-------------- Knie ----------------------
Knie_zw_a = Dis_q - Unterschenkel_q
Knie_zw_b = Knie_zw_a - Oberschenkel_q
Knie_zw_c = Unterschenkel * Oberschenkel
Knie_zw_d = -2 * Knie_zw_c
Knie_zw_e = Knie_zw_b / Knie_zw_d
Knie_zw_wi = Acos(knie_zw_e)
Knie_wi = Rad2deg(knie_zw_wi)
If Knie_wi < 45 Then Knie_wi = 45
If Knie_wi > 180 Then Knie_wi = 180
Kniea = 6400 / 180
Knieb = Kniea * Knie_wi
Servo(2) = 63200 - Knieb
'-------------- Hüfte a ---------------------
Hufta_zw_a = Hoehe / Dis
Hufta_zw_b = Acos(hufta_zw_a)
Hufta_wi = Rad2deg(hufta_zw_b)
'-------------- Hüfte b --------------------- alpha = acos((ober² + dis² - unter²)/(2·ober·dis))
'alpha = acos((ober² - unter² - dis²) / (-2 * ober * dis))
Huftb_zw_a = Oberschenkel_q + Dis_q
Huftb_zw_b = Huftb_zw_a - Unterschenkel_q
Huftb_zw_c = Oberschenkel * Dis
Huftb_zw_d = 2 * Huftb_zw_c
Huftb_zw_e = Huftb_zw_b / Huftb_zw_d
Huftb_zw_wi = Acos(huftb_zw_e)
Huftb_wi = Rad2deg(huftb_zw_wi)
Huft_wi = Hufta_wi + Huftb_wi
If Huft_wi < 55 Then Huft_wi = 55
If Huft_wi > 180 Then Huft_wi = 180
Hufta = 6400 / 180
Huftb = Hufta * Huft_wi
Servo(1) = 56800 + Huftb
Print "----------------------------------"
Print "Knie_wi " ; Knie_wi
Print "Abstand " ; Abstand
Print "adc " ; Wert1_b
Print "huft_wi " ; Huft_wi
End Sub
End
mfg bammel
Hallo,
der Code, den du gepostet hast, hat der den Fehler produziert? Da ist ja hoehe 50, Abstand 100. Wenn das nicht exakt der Code ist, der den Fehler produziert hat, dann tu ich mit kein Kreuzkompilieren an.
Aber andere Frage: Was ist denn der Argumentbereich und der Wertebereich der Ergebnisse von Bascom acos?
Wenn ich mit hoehe 80 Abstand 97 rechne, dann ist das Ergebnis acos(+.015) = 89°. Teste doch in Bascom acos(+.015), ob das dort auch so ist.
grüsse,
Hannes
ja der code ist der!!! ja die hoehe und abstand sind erstaml an anfang gegeben dann wird nurnoch der abstand durch das poti (AD-Wandler) verändert!
EDIT:
änderunegn in der knieberechnung:
das ergebnis ist dann wie es sein sollte 89°Code:'-------------- Knie ----------------------
Knie_zw_e = 0.015
Knie_zw_wi = Acos(knie_zw_e)
Knie_wi = Rad2deg(knie_zw_wi)
If Knie_wi < 45 Then Knie_wi = 45
If Knie_wi > 180 Then Knie_wi = 180
Kniea = 6400 / 180
Knieb = Kniea * Knie_wi
Servo(2) = 63200 - Knieb
OK, das kann ich ohne Hardware nicht nachvollziehen. Macht nix.
Was ergibt in Bascom acos(+.015) ? Und was ergibt die Umrechnung genau davon in Grad?
Hannes
siehe edit im vorherigen post ;)
edit: was mir grade einfällt gibt es nicht ein programm (simulation??) in der ich das ganze auch virtuel machen könnte um es mal bildlich zu haben. sowas könnte ich mir dann leichter vorstellen. udn evtl so auch schneller fehler finden.
Aha,
da steht ja inzwischen was: und es liegt also nicht am Bascom.
Inzwischen hab ich deinen Code durchgesehen, und ich finde keinen Fehler. Da kann ich nur empfehlen, nach jeder Zeile einen Test - Print befehl zu schreiben, und mit dem Taschenrechner mitrechnen, bis es abweicht. Wahrscheinlich steht irgendwo etwas anderes als beabsichtigt und beim Lesen sehen wir immer das was beabsichtigt war.
wünsche viel Erfolg und
grüsse,
Hannes
okay werde also alles aml gründlich durchforsten.. nun geh ich aber erstmal ins kino. star trek schaun ;)
werde mich dann morgen mal dran machen.
mfg Bammel