@Bauteiltöter: ich implementiere noch die Power-off Sequenz (hört sich cool an), teste sie, und dann kann ich sie von mir aus reinstellen.
lg
Hi,
Ok, die Servoroutine ist schlecht... schade auch
@bluesmash: Kanst du die Routien mal hier posten, als kleiner Denkanstoß?
@ikarus_177: Ja, das war ja auch nur TheoretischAuch an deiner Routine bin ich interressiert...
Ich möchte sie nicht einfach Abkupfern, sonder als Denkanstoß benutzen... schließlich will ich ja auchnoch was Lernen
MfG Bauteiltöter
@Bauteiltöter: ich implementiere noch die Power-off Sequenz (hört sich cool an), teste sie, und dann kann ich sie von mir aus reinstellen.
lg
Ok, vielen Dank!
Ich werde mich jetzt mal nach einem Kostenlosen CAD-Programm umschauen, und post dann mal Zeichnungen vom Geplanten Bot... oder sollte ich da lieber einen neuen Thread in geplante Projeckte eröffnen?
Oder kann ein Mod den Thread verschieben?
Hi,
sodana, meine Routine:
Code:$regfile = "m32def.dat" 'verwendeter Chip $crystal = 16000000 'Taktfrequenz $hwstack = 32 'HardwareStack $swstack = 32 'SoftwareStack $framesize = 64 Config Timer1 = Timer , Prescale = 1 On Timer1 Servo Enable Timer1 Start Timer1 '-----------------------------------------------------------------------' 'Verwendete Ports: ' '-----------------------------------------------------------------------' Config Porta.0 = Output Config Porta.1 = Output Config Porta.2 = Output Servo1 Alias Porta.0 Servo2 Alias Porta.1 Servo3 Alias Porta.2 '-----------------------------------------------------------------------' 'Variablendefinition: ' '-----------------------------------------------------------------------' Dim Servo(6) As Word 'Array der Pulsweiten für Servos Dim Servo_ein(6) As Byte '1 - Servo eingeschaltet; 0 - Servo ausgeschaltet Dim I As Byte : I = 0 'Zählvariable Dim J As Word : J = 1 'Zählvariable Dim Verzoegerung As Word 'zum Einstellen der Refresh - Rate Dim Verzoegerungsservo As Byte '-----------------------------------------------------------------------' 'Hauptprogramm: ' '-----------------------------------------------------------------------' For J = 1 To 6 'alle Servos inkl. Verzögerunsservos einschalten Servo_ein(j) = 1 Next Verzoegerung = 60000 Servo(4) = Verzoegerung 'Verzögerungsservos einstellen Servo(5) = Verzoegerung Servo(6) = Verzoegerung Enable Interrupts 'Servointerrupt aktivieren Do For J = 15000 To 35000 Step 10 Servo(1) = J Servo(2) = J Servo(3) = J Waitus 1000 Next For J = 35000 To 15000 Step -10 Servo(1) = J Servo(2) = J Servo(3) = J Waitus 1000 Next Loop '-----------------------------------------------------------------------' 'Funktionen: ' '-----------------------------------------------------------------------' Servo: Select Case I Case 1 : Servo1 = 0 Case 2 : Servo2 = 0 Case 3 : Servo3 = 0 Case 4 : Verzoegerungsservo = 0 Case 5 : Verzoegerungsservo = 0 Case 6 : Verzoegerungsservo = 0 End Select Incr I If I = 7 Then I = 0 End If If Servo_ein(i) = 1 Then Select Case I Case 1 : Servo1 = 1 Case 2 : Servo2 = 1 Case 3 : Servo3 = 1 Case 4 : Verzoegerungsservo = 1 Case 5 : Verzoegerungsservo = 1 Case 6 : Verzoegerungsservo = 1 End Select End If Timer1 = 65535 - Servo(i) Return
ich hab auch ein kurzes Video gemacht:
http://de.youtube.com/watch?v=diCrlAC4-3w
die Routine ist noch nicht das gelbe vom Ei, da es eine maximale Anzahl der Servos gibt, die angesteuert werden können. Wird diese Zahl überschritten, werden die (analogen) Servos kraftlos, da der Impuls nicht mehr alle 20 ms wiederholt werden kann. Da ich aber pro ATMega eh nur 3 Servos ansteuere, reichts für mich.
Viele Grüße
ikarus_177
Hallo ikarus_177,
danke, ich habe die Routine zwar noch nicht ganz verstanden, aber ich habe noch einen Tipp: Du kannst ein wenig Speicher sparen, wenn dudurchCode:Dim Servo_ein(6) As Byteersetzt.Code:Dim Servo_ein(6) As bit
Udn warum schreibst du das in einen ATmega32? Der ist da doch unterfordert... oder scheibst du noch anderen Code dazu, z.B. die Algorhythmen (schreibt man das so?) für die vorwertsbewegung? Der Code passt nämlich auch locker in einen ATmega8!
Du kanst mit der Routine maximal 3 Servos ansteuern, oder?
MfG Bauteiltöter
Hi,
danke für den Tipp! Werde ich gleich mal umsetzen.
Ich verwende deswegen einen Mega32, weil da später noch die ganzen Berechnungen für IK und so dazukommen sollen.
Man kann mehrere Servos auch ansteuern, du musst nur unten die Interruptroutine folgendermaßen umändern:
Du musst halt dann oben im Deklarationsteil die Ports noch hinzufügen:Code:Servo: Select Case I Case 1 : Servo1 = 0 Case 2 : Servo2 = 0 Case 3 : Servo3 = 0 Case 4 : Servo4 = 0 Case 5 : Servo5 = 0 Case 6 : Servo6 = 0 End Select Incr I If I = 7 Then I = 0 End If If Servo_ein(i) = 1 Then Select Case I Case 1 : Servo1 = 1 Case 2 : Servo2 = 1 Case 3 : Servo3 = 1 Case 4 : Servo4 = 1 Case 5 : Servo5 = 1 Case 6 : Servo6 = 1 End Select End If Timer1 = 65535 - Servo(i) Return
Man könnte wahrscheinlich auch noch mehr als die 6 Servos ansteuern, ab einer bestimmten Grenze wird halt dann der Impuls nicht mehr alle 20 ms wiederholt und die Servos werden kraftlos.Code:config PortX.X = output Servo4 alias PortX.X Servo5 alias PortX.X Servo6 alias PortX.X
Gibt sicher noch eine elegantere Lösung.
Viele Grüße
ikarus_177
Hallo,
ok, dann werde ich das so machen, dass ich 1xAtmega8 für 3 Beine und einmal ATmega 16 für die restlichen 3 Beine und die Berechnung der Schritte nehme.
Die ganzen µCs weden hinterher über I2C verbunden.
Über Atmega16 kann ich eh nicht gehen, da ich den Flash eh nich vollbekomme... ich hab nur die Demo-version... dann muss ich das ganze halt auf mehrere µCs splitten....
Ich habe vor, die Elektonik Steckbar zu machen, d.h. eine Hauptplatine, die die Stromversorgung enthält und dann 10 Steckerleisten drauf, sodass Platinen einfach Senkrecht aufgesteckt werden...
MfG
so und hier meine routine:
Code:'--------Definitionen für Servo------------ Config Timer1 = Timer , Prescale = 8 On Timer1 Timer1_irq nosave Enable Timer1 Config Portc.3 = Output Servo4 Alias Portc.3 Config Portc.1 = Output Servo5 Alias Portc.1 Config Portc.0 = Output Servo6 Alias Portc.0 Config Portb.0 = Output Servo1 Alias Portb.0 Config Portb.1 = Output Servo2 Alias Portb.1 Config Portb.2 = Output Servo3 Alias Portb.2 Dim Servo_incr As Byte Dim Servo_incr2 As Byte Dim Servo(6) As Word '0-3900 Dim Servo_aus As Bit Dim Servo_ber As Bit Timer1_irq: $asm push r10 push r11 push r16 push r17 push r20 push r21 push r24 push r25 push r26 push r27 in r24,SREg push r24 $end Asm Select Case Servo_incr Case 0 : Servo1 = 1 Int_daten = 0 Case 1 : Servo1 = 0 Case 2 : Servo2 = 1 Case 3 : Servo2 = 0 Case 4 : Servo3 = 1 Case 5 : Servo3 = 0 Case 6 : Servo4 = 1 Case 7 : Servo4 = 0 Case 8 : Servo5 = 1 Case 9 : Servo5 = 0 Case 10 : Servo6 = 1 Case 11 : Servo6 = 0 End Select Incr Servo_incr If Servo_aus = 0 Then Incr Servo_incr2 Temp_word2 = 1000 + Servo(servo_incr2) Timer1 = 65535 - Temp_word2 Else Temp_word2 = 3900 - Servo(servo_incr2) Timer1 = 65535 - Temp_word2 End If Toggle Servo_aus If Servo_incr = 12 Then Servo_incr = 0 Servo_incr2 = 0 Servo_aus = 0 Timer1 = 65535 - 12000 Int_daten = 1 Servo_ber = 1 End If $asm pop r24 Out Sreg , R24 pop r27 pop r26 pop r25 pop r24 pop r21 pop r20 pop r17 pop r16 pop r11 pop r10 $end Asm Return
dies ist für 6 servos... es würde bis ca. 8 gehen....
gruss bluesmash
Meine Homepage:
www.bluesmash.roboterbastler.de
Hi,
auch dir vielen dank, ich habe diese Routine auch noch nicht ganz verstanden, werde mir beide aber nochmal genau anschauen.
MfG Bauteiltöter
PS: Ich werde jetzt wahrscheinlich Alu nehmen
gute sache =D>Zitat von Bauteiltöter
Lesezeichen