- LiFePO4 Speicher Test         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 33

Thema: Kraft von Servos im Hexabot

  1. #21
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2008
    Beiträge
    113
    Anzeige

    LiFePo4 Akku selber bauen - Video
    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 Theoretisch Auch 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

  2. #22
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    31
    Beiträge
    601
    @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

  3. #23
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2008
    Beiträge
    113
    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?

  4. #24
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    31
    Beiträge
    601
    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

  5. #25
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2008
    Beiträge
    113
    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 du
    Code:
    Dim Servo_ein(6) As Byte
    durch
    Code:
    Dim Servo_ein(6) As bit
    ersetzt.

    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

  6. #26
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    31
    Beiträge
    601
    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:

    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
    Du musst halt dann oben im Deklarationsteil die Ports noch hinzufügen:

    Code:
    config PortX.X = output
    Servo4 alias PortX.X
    Servo5 alias PortX.X
    Servo6 alias PortX.X
    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.

    Gibt sicher noch eine elegantere Lösung.


    Viele Grüße
    ikarus_177

  7. #27
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2008
    Beiträge
    113
    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

  8. #28
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    41
    Beiträge
    982
    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

  9. #29
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2008
    Beiträge
    113
    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

  10. #30
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    38
    Beiträge
    388
    Zitat Zitat von Bauteiltöter
    PS: Ich werde jetzt wahrscheinlich Alu nehmen
    gute sache =D>

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests