- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 10

Thema: Dynamixel Servo RX-10 ansteuern

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    14.02.2004
    Ort
    Kaiserslautern
    Beiträge
    78

    Dynamixel Servo RX-10 ansteuern

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Zusammen,

    ich bin gerade dabei einen RX-10 Servo mit Bascom anzusteuern, leider
    habe ich da so meine Probleme. Hier im Forum war das ja schon mal ein Thema und ich habe auch ein paar Sachen versucht. Am Anfang ist es halt schwer Fehler einzugrenzen, könnte ja Hard.- oder Software sein. Ich poste einfach mal den Code den ich versucht habe, vielleicht sieht ja einer einen Fehler. Danke schon mal im voraus!!
    Ich hoffe das es mit der 485 Schnittstelle so geht, habe da die ganze Zeit
    einen anderen Motor dran gehabt, dort hat es geklappt, Senden und Empfangen.

    Hier mal das Datenblatt des Servo´s

    http://www.nodna.com/download/ROBOTIS/Dynamixel/RX-10(english).pdf

    und hier der Code


    Code:
    $regfile = "m16def.dat"                                     'ATMEGA16
    $crystal = 16000000                                         'Quarz: 16MHz
    
    $baud = 1000000
    
    Dim S As Byte
    
    Wait 2
    
    Ddrd = &B11100000                                           'Pin PD7,6,5 als Ausgang konfigurieren
    
    Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    
    
    
    Enable Interrupts                                           'Interrupts global
    
    
    'FF FF 01 04 03 19 01 DD ' LED ein bei Adresse 1
    
    'FF FF 01 04 03 19 00 DE ' LED aus bei Adresse 1
    
    Do
    
    Wait 1
    
    Ucsra.txc = 1
    
    Portd.7 = 0                                                 ' 485 Modul auf schreiben setzen
    
    Waitms 1
    S = &HFF
    Print Chr(s);
    S = &HFF
    Print Chr(s);
    S = &H01
    Print Chr(s);
    S = &H04
    Print Chr(s);
    S = &H03
    Print Chr(s);
    S = &H19
    Print Chr(s);
    S = &H01
    Print Chr(s);
    S = &HDD
    Print Chr(s);
    
    Portd.6 = 0                                                 ' Test-Led einschalten
    
    Sprung:
    If Ucsra.txc = 0 Then Goto Sprung                           ' warten bis Serieller Puffer leer ist
    Portd.7 = 1                                                 ' 485 Modul auf lesen setzen
    
    Wait 1
    
    Ucsra.txc = 1
    
    Portd.7 = 0                                                 ' 485 Modul auf schreiben setzen
    
    Waitms 1
    S = &HFF
    Print Chr(s);
    S = &HFF
    Print Chr(s);
    S = &H01
    Print Chr(s);
    S = &H04
    Print Chr(s);
    S = &H03
    Print Chr(s);
    S = &H19
    Print Chr(s);
    S = &H00
    Print Chr(s);
    S = &HDE
    Print Chr(s);
    
    Portd.6 = 1                                                 ' Test-Led ausschalten
    
    Sprung1:
    If Ucsra.txc = 0 Then Goto Sprung1                          ' warten bis Serieller Puffer leer ist
    Portd.7 = 1                                                 ' 485 Modul auf lesen setzen
    
    
    Loop
    
    End
    Danke Gruß Frank

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    14.02.2004
    Ort
    Kaiserslautern
    Beiträge
    78
    Hallo Leute,

    sieht ja schlecht aus mit dem Servo. Ich bin da noch nicht weiter gekommen, wenn euch nix einfällt werde ich das Projekt wieder einstellen.

    Gruß Frank

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Wenn man in Bascom auch auf Groß/Kleinschreibung achten muss, dann würde ich mal auf die Variable S achten.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    14.02.2004
    Ort
    Kaiserslautern
    Beiträge
    78
    Hallo Hubert,

    das wäre mir neu, aber wäre doch auch alles groß, oder was meinst du?

    Gruß Frank

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Du hast geschrieben. Dim S As Byte => großes S
    Weiter unten hast du Print Chr (s) => kleines S geschrieben.

    Das dürfte aber nicht der Fehler sein, da es in Basic egal ist, ob es groß oder klein geschrieben ist. Bei C wird zwischen Groß- und Kleinschreibung unterschieden.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.08.2004
    Ort
    Graz
    Beiträge
    342
    Upper/Lower-Case macht Bascom automatisch.
    Im Code kann ich keine Fehler entdecken, aber Printbin wäre schon schöner.
    Mit dem anderen Motor hat das funktioniert? Dann wirds doch wohl am Motor/der Stromversorgung liegen?

    mfg

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    14.02.2004
    Ort
    Kaiserslautern
    Beiträge
    78
    Hi,

    so ich habe meine Möglichkeiten ausgereizt, ich bekomme das Ding nicht zum laufen. Habe jetzt auch mal versucht das mit den Datenpaketen zu verstehen, bin mir nicht ganz sicher aber ich komme nie auf die selbe Checksumme wie die. Wenn ich das Beispiel 16 auf Seite 41
    der Anleitung versuche nachzurechnen komme ich immer auf eine Differenz von eins. Also die haben &DD und ich komme immer auf DC, auch bei anderen Beispielen, immer eins unterschied. Na ja, ich versuche mal weiter, aber mir gehen echt die Ideen aus!

    Gruß Frank

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    55
    Beiträge
    1.258
    Hallo emulein,

    das LSB Byte der Summe zur Checksum Addiert ergibt Null.
    Du summierst einfach alle Bytes in eine Bytevariable und rechnest zum Schluß 256-Bytevariable( NOT + 1) und hast deine Checksum.

    Gruß, Michael

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    14.02.2004
    Ort
    Kaiserslautern
    Beiträge
    78
    Hallo Michael,

    das sehe ich so in der Anleitung nicht wie du das
    geschrieben hast. Muss aber auch gestehen das ich
    nicht der beste Programmierer bin, eher unter schnitt.
    Werde mir das mal versuchen zu verdeutlichen.
    Danke für deine Hilfe!!

    Gruß Frank

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    14.02.2004
    Ort
    Kaiserslautern
    Beiträge
    78
    Hallo Zusammen,

    so der Servo läuft jetzt, hier der Code.
    Bestimmt nicht der stein der weisen, aber der Servo dreht damit,
    für den Anfang geht´s aber. Die Baudrate sollte auch noch mit 57600
    laufen.

    Code:
    $regfile = "m644pdef.dat"                                   'ATMEGA16
    $crystal = 16000000                                         'Quarz: 16MHz
    
    $baud = 57142
    
    $baud1 = 9600
    
    
    Dim S As Byte
    Dim I As Long
    Dim Zeichen_com1 As Byte
    Dim Empf_com1 As Byte
    Dim Empf_com2 As Byte
    Dim Empf_string As String * 10
    Dim Ausgabe_com1 As String * 10
    Dim Ausgabe_com2 As String * 10
    
    Dim Zeichen As Byte
    
    Dim Durchlauf As Byte
    
    Dim Status As Byte
    
    Ddrd = &B11110000                                           'Pin PD7,6,5,4 als Ausgang konfigurieren
    
    
    
    
    
    Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    
    Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    
    
    
    Open "COM2:" For Binary As #1
    
    
    
    Enable Interrupts                                           'Interrupts global
    
    Enable Urxc
    Enable Urxc1
    
    
    On Urxc Empfangen_com1                                      ' isr rxd ( com0 )
    On Urxc1 Empfangen_com2                                     ' isr rxd ( com1 )
    
    
    Ausgabe_com1 = ""
    
    
    
    Do
    
    Incr I
    
    If I = 250000 Then
    
    Ucsr0a.txc0 = 1
    
    Portd.7 = 1                                                 ' 485 Modul auf schreiben setzen
    Wait 2
    
    
    If Durchlauf = 1 Then
       S = &HFF
       Print Chr(s);
       S = &HFF
       Print Chr(s);
       S = &H01
       Print Chr(s);
       S = &H07
       Print Chr(s);
       S = &H03
       Print Chr(s);
       S = &H1E
       Print Chr(s);
       S = &H00
       Print Chr(s);
       S = &H02
       Print Chr(s);
       S = &H00
       Print Chr(s);
       S = &H01
       Print Chr(s);
       S = &HD3
       Print Chr(s);
       Durchlauf = 0
       Else
       S = &HFF
       Print Chr(s);
       S = &HFF
       Print Chr(s);
       S = &H01
       Print Chr(s);
       S = &H07
       Print Chr(s);
       S = &H03
       Print Chr(s);
       S = &H1E
       Print Chr(s);
       S = &H00
       Print Chr(s);
       S = &H00
       Print Chr(s);
       S = &H00
       Print Chr(s);
       S = &H01
       Print Chr(s);
       S = &HD5
       Print Chr(s);
       Durchlauf = 1
    End If
    
    
    
       Sendbuffer:
       If Ucsr0a.txc0 = 0 Then Goto Sendbuffer                  ' warten bis Ausgabepuffer leer ist
    
       Portd.7 = 0
    
       Waitms 1
       Empf_com1 = 1
    
       I = 0
    
    
    
    
    
    
    If Empf_com1 = 1 Then
        Toggle Portd.5                                          'Kontroll LED
        Print #1 , Ausgabe_com1;
        Ausgabe_com1 = ""
        Empf_com1 = 0
    End If
    
    
    If Empf_com2 = 1 Then
       Print #1 , Ausgabe_com2;
       Ausgabe_com2 = ""
       Empf_com2 = 0
    End If
    
    End If
    
    
    Loop
    
    End
    
    Close #1
    
    
    
    Empfangen_com1:
    
    Toggle Portd.4                                              ' Kontroll LED
    Ausgabe_com1 = Ausgabe_com1 + Chr(udr)
    Empf_com1 = 1
    
    Return
    
    
    Empfangen_com2:
    
    Ausgabe_com2 = Ausgabe_com2 + Chr(udr1)
    Empf_com2 = 1
    
    Return
    Gruß Frank

Berechtigungen

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

12V Akku bauen