-         

Ergebnis 1 bis 5 von 5

Thema: CCPRO M128: Demo Servo-Ansteuerung

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791

    CCPRO M128: Demo Servo-Ansteuerung

    Anzeige

    Hallo Leute,

    die RP6 CCPRO M128 Karte hat ja schon 3 Servostecker an der Platinenecke, wo auch der Sockel fürs EEPROM sitzt. Da kann man 3 Servos direkt anstecken, sie sind dann mit PB5, PB6 und PB7 verbunden.

    Mit der neuen CCPRO-IDE Version 2.0 ist das Ansteuern von Servos ganz einfach. Hier die Demos:

    CCPRO BASIC:
    Code:
    /*******************************************************************************
     * RP6 C-Control PRO M128 Erweiterungsmodul
     * ----------------------------------------------------------------------------
     * RP6_Servo Demoprogramm 1 - CCPRO BASIC
     * ----------------------------------------------------------------------------
     * RP6_Servo: Ansteuerung von 3 Servos
     * 3 Standard-Servos erforderlich
     * Mega128: Servo-Ausgänge PB5, PB6, PB7 (PortB.5, .6, .7)
     * Erforderliche Library: IntFunc_Lib.cc.
     *
     * Drei zusätzlich erforderliche Standard-Servos (z.B. CONRAD ES-030)
     * werden in dieser Demo gleichzeitig angesteuert. Die Demo ist ausgelegt
     * für die CCPRO-IDE ab Version 2.0.
     * Auf dem LCD-Display wird in der 1. Zeile die Servo-Position und in der
     * 2. Zeile die zugehörige Impulsdauer in Mikrosekunden (us) angezeigt.
     *
     * Hinweis:
     * Für allgemeine Programmierhinweise zur CCPRO schauen Sie sich bitte die
     * CCPRO Dokumentation und die zugehörigen Beispielprogramme an!
     * Es sei auch nochmals darauf hingewiesen, dass die normalen Beispielprogramme
     * für die CCPRO nur zum Teil direkt auf dem RP6-CCPRO Modul laufen.
     * Die Anschlussbelegung ist natürlich komplett anders als auf dem
     * C-Control Application Board. Auch die LCD Ansteuerung ist leicht anders,
     * da hier noch zusätzliche LEDs mit an dem Schieberegister angeschlossen sind.
     * --> Die C-Control Beispielprogramme müssen ein klein wenig angepasst
     * werden bevor sie auf diesem Modul laufen können!
     *
     * *****************************************************************************
     * Der Roboter bewegt sich in diesem Beispielprogramm NICHT und kann
     * am Rechner angeschlossen bleiben!
     ******************************************************************************/
    
    ' WICHTIG: Immer die RP6CCLib mit einbinden:
    #include "../../RP6CCLib/RP6CCLib.cbas"
    
    ' -----------------------------------------------------------------------------
    ' Defines:
    
    ' Servo Konstanten:
    #define SERVO1 13       ' Servo an PB5
    #define SERVO2 14       ' Servo an PB6
    #define SERVO3 15       ' Servo an PB7
    
    ' Servo Bewegungsgrenzen 0,7..2,3ms (abhängig vom Servotyp):
    #define LINKER_ANSCHLAG		700			             ' Linker Anschlag  (0,7ms)
    #define RECHTER_ANSCHLAG	(2300 - LINKER_ANSCHLAG) ' Rechter Anschlag (2,3ms)
    #define MITTE_POSITION		(RECHTER_ANSCHLAG / 2)   ' Mitte-Position   (1,5ms)
    ' Wenn man die Bewegungsgrenzen für ein bestimmtes Servo einstellen will,
    ' muss erst der linke Anschlag so eingestellt werden, dass das Servo bei
    ' servo_pos = 0 am linken Anschlag steht und nicht "brummt", d.h. gegen
    ' den Anschlag arbeitet. Die Werte für LINKER_ANSCHLAG werden zwischen
    ' 700 und 1000 (us) liegen.
    ' Danach muss mit servo_pos = RECHTER_ANSCHLAG die Stellung am rechten
    ' Anschlag gesucht werden, bei der das Servo ebenfalls nicht "brummt",
    ' indem der Wert "2300" in der Definition von RECHTER_ANSCHLAG geändert
    ' wird. Die Werte werden zwischen 2000 und 2300 (us) liegen.
    ' Nach dieser Einstellung kann man das Servo mit Werten (servo_pos) von
    ' 0 (= linker Anschlag) bis RECHTER_ANSCHLAG bewegen. Natürlich könnte
    ' man auch direkt die Werte für die Impulsdauer (us) benutzen. Der Vor-
    ' teil dieser Umrechnung auf Positionswerte besteht darin, dass man die
    ' Servogrenzen vorab gut einstellen kann.
    
    ' -----------------------------------------------------------------------------
    ' Variablen:
    
    Dim servo_var(9) As Byte                    ' globale Variablendeklaration
    Dim servo_pos, impulsdauer As Integer
    
    Sub main()
        ' WICHTIG! Immer als erstes aufrufen:
    	RP6_CCPRO_Init() ' Auf Startsignal warten, LCD und andere Dinge initialisieren !
    
        ' ------------------------------------------------------
    
        ' Zwei Zeilen Text mit dem LCD anzeigen:
        showScreenLCD("RP6 CCPRO M128", "RP6 Servo Demo 1")
    
        ' Zweimal piepsen:
        beep(200, 300, 100)   ' Format: beep (<tonhöhe>, <dauer>, <pause>)
        beep(100, 100, 100)
    
        ' Text über serielle Schnittstelle ausgeben:
        newline() ' Neue Zeile
        println("   ________________________")
        println("   \\| RP6  ROBOT SYSTEM |/")
        println("    \\_-_-_-_-_-_-_-_-_-_/ ")
        newline()
        println("    Let's go!  ")
        newline()
    
        ' 2 Sekunden Pause:
        AbsDelay(2000)
    
        ' ------------------------------------------------------
        ' Servo-Hauptprogramm:
    
        clearLCD()                              ' Display löschen
    
        ' Initialisierung für 3 Servos, Periodendauer 20ms, Timer 3:
        Servo_Init(3, 1, servo_var, 1)
    
        servo_pos = 0
    
        Do While True                           ' Endlosschleife
        	setCursorPosLCD(0, 0)   	' Zeile 1
            printLCD("Servo Pos.: ")
           	printIntegerLCD(servo_pos)
            printLCD("   ")
            impulsdauer = LINKER_ANSCHLAG + servo_pos
        	setCursorPosLCD(1, 0)		' Zeile 2
            printLCD("Impuls[us]: ")
           	printIntegerLCD(impulsdauer)
            printLCD(" ")
            Servo_Set(SERVO1, impulsdauer)
            Servo_Set(SERVO2, impulsdauer)
            Servo_Set(SERVO3, impulsdauer)
            If servo_pos = 0 Then
                AbsDelay(1000)
                Servo_Off()
                AbsDelay(5000)
            End If
    		servo_pos = servo_pos + 10      ' Nächste Position nach rechts
    		If servo_pos > RECHTER_ANSCHLAG Then
                Servo_Off()
                AbsDelay(6000)
    			servo_pos = 0		        ' Servo Position: 0..RECHTER_ANSCHLAG
            End If
            AbsDelay(25)
        End While
    End Sub
    
    ' -----------------------------------------------------------------------------
    ' Alle drei Servos ausschalten:
    Sub Servo_Off()
            Servo_Set(SERVO1, 0)
            Servo_Set(SERVO2, 0)
            Servo_Set(SERVO3, 0)
    End Sub
    
    ' -----------------------------------------------------------------------------
    CompactC:
    Code:
    /*******************************************************************************
     * RP6 C-Control PRO M128 Erweiterungsmodul
     * ----------------------------------------------------------------------------
     * RP6_Servo Demoprogramm 1 - CompactC
     * ----------------------------------------------------------------------------
     * RP6_Servo: Ansteuerung von 3 Servos
     * 3 Standard-Servos erforderlich
     * Mega128: Servo-Ausgänge PB5, PB6, PB7 (PortB.5, .6, .7)
     * Erforderliche Library: IntFunc_Lib.cc.
     *
     * Drei zusätzlich erforderliche Standard-Servos (z.B. CONRAD ES-030)
     * werden in dieser Demo gleichzeitig angesteuert. Die Demo ist ausgelegt
     * für die CCPRO-IDE ab Version 2.0.
     * Auf dem LCD-Display wird in der 1. Zeile die Servo-Position und in der
     * 2. Zeile die zugehörige Impulsdauer in Mikrosekunden (us) angezeigt.
     *
     * Hinweis:
     * Für allgemeine Programmierhinweise zur CCPRO schauen Sie sich bitte die
     * CCPRO Dokumentation und die zugehörigen Beispielprogramme an!
     * Es sei auch nochmals darauf hingewiesen, dass die normalen Beispielprogramme
     * für die CCPRO nur zum Teil direkt auf dem RP6-CCPRO Modul laufen.
     * Die Anschlussbelegung ist natürlich komplett anders als auf dem
     * C-Control Application Board. Auch die LCD Ansteuerung ist leicht anders,
     * da hier noch zusätzliche LEDs mit an dem Schieberegister angeschlossen sind.
     * --> Die C-Control Beispielprogramme müssen ein klein wenig angepasst
     * werden bevor sie auf diesem Modul laufen können!
     *
     * *****************************************************************************
     * Der Roboter bewegt sich in diesem Beispielprogramm NICHT und kann
     * am Rechner angeschlossen bleiben!
     ******************************************************************************/
    
    // WICHTIG: Immer die RP6CCLib mit einbinden:
    #include "../../RP6CCLib/RP6CCLib.cc"
    
    //------------------------------------------------------------------------------
    // Defines:
    
    // Servo Konstanten:
    #define SERVO1 13       // Servo an PB5
    #define SERVO2 14       // Servo an PB6
    #define SERVO3 15       // Servo an PB7
    
    // Servo Bewegungsgrenzen 0,7..2,3ms (abhängig vom Servotyp):
    #define LINKER_ANSCHLAG		700			             // Linker Anschlag  (0,7ms)
    #define RECHTER_ANSCHLAG	(2300 - LINKER_ANSCHLAG) // Rechter Anschlag (2,3ms)
    #define MITTE_POSITION		(RECHTER_ANSCHLAG / 2)   // Mitte-Position   (1,5ms)
    // Wenn man die Bewegungsgrenzen für ein bestimmtes Servo einstellen will,
    // muss erst der linke Anschlag so eingestellt werden, dass das Servo bei
    // servo_pos = 0 am linken Anschlag steht und nicht "brummt", d.h. gegen
    // den Anschlag arbeitet. Die Werte für LINKER_ANSCHLAG werden zwischen
    // 700 und 1000 (us) liegen.
    // Danach muss mit servo_pos = RECHTER_ANSCHLAG die Stellung am rechten
    // Anschlag gesucht werden, bei der das Servo ebenfalls nicht "brummt",
    // indem der Wert "2300" in der Definition von RECHTER_ANSCHLAG geändert
    // wird. Die Werte werden zwischen 2000 und 2300 (us) liegen.
    // Nach dieser Einstellung kann man das Servo mit Werten (servo_pos) von
    // 0 (= linker Anschlag) bis RECHTER_ANSCHLAG bewegen. Natürlich könnte
    // man auch direkt die Werte für die Impulsdauer (us) benutzen. Der Vor-
    // teil dieser Umrechnung auf Positionswerte besteht darin, dass man die
    // Servogrenzen vorab gut einstellen kann.
    
    //------------------------------------------------------------------------------
    // Variablen:
    
    byte servo_var[9];                          // globale Variablendeklaration
    unsigned int servo_pos, impulsdauer;
    
    void main(void)
    {
        // WICHTIG! Immer als erstes aufrufen:
    	RP6_CCPRO_Init(); // Auf Startsignal warten, LCD und andere Dinge initialisieren !
    
        // ------------------------------------------------------
    
        // Zwei Zeilen Text mit dem LCD anzeigen:
        showScreenLCD("RP6 CCPRO M128", "RP6 Servo Demo 1");
    
        // Zweimal piepsen:
        beep(200, 300, 100);   // Format: beep (<tonhöhe>, <dauer>, <pause>)
        beep(100, 100, 100);
    
        // Text über serielle Schnittstelle ausgeben:
        newline(); // Neue Zeile
        println("   ________________________");
        println("   \\| RP6  ROBOT SYSTEM |/");
        println("    \\_-_-_-_-_-_-_-_-_-_/ ");
        newline();
        println("    Let's go!  ");
        newline();
    
        // 2 Sekunden Pause:
        AbsDelay(2000);
    
        // ------------------------------------------------------
        // Servo-Hauptprogramm:
    
        clearLCD();                             // Display löschen
    
        // Initialisierung für 3 Servos, Periodendauer 20ms, Timer 3:
        Servo_Init(3, 1, servo_var, 1);
    
        servo_pos = 0;
    
        while (1)                               // Endlosschleife
        {
        	setCursorPosLCD(0, 0);		// Zeile 1
            printLCD("Servo Pos.: ");
           	printIntegerLCD(servo_pos);
            printLCD("   ");
            impulsdauer = LINKER_ANSCHLAG + servo_pos;
        	setCursorPosLCD(1, 0);		// Zeile 2
            printLCD("Impuls[us]: ");
           	printIntegerLCD(impulsdauer);
            printLCD(" ");
            Servo_Set(SERVO1, impulsdauer);
            Servo_Set(SERVO2, impulsdauer);
            Servo_Set(SERVO3, impulsdauer);
            if (servo_pos == 0) {
                AbsDelay(1000);
                Servo_Off();
                AbsDelay(5000);
            }
    		servo_pos = servo_pos + 10;     // Nächste Position nach rechts
    		if (servo_pos > RECHTER_ANSCHLAG) {
                Servo_Off();
                AbsDelay(6000);
    			servo_pos = 0;		        // Servo Position: 0..RECHTER_ANSCHLAG
            }
            AbsDelay(25);
        }
    }
    
    //------------------------------------------------------------------------------
    // Alle drei Servos ausschalten:
    void Servo_Off(void)
    {
            Servo_Set(SERVO1, 0);
            Servo_Set(SERVO2, 0);
            Servo_Set(SERVO3, 0);
    }
    
    //------------------------------------------------------------------------------
    Viel Spaß!

    Gruß Dirk

  2. #2
    RN-Premium User Roboter-Spezialist
    Registriert seit
    21.04.2009
    Beiträge
    522
    Hey, das sieht ja super aus, aber ich habe ein Problem damit. Sobald der Servos sich bewegen soll, bewegt er sich nur komplett bis zu einem Anschlag und arbeitet auch gegen ihn.
    Soweit kein Problem, ich probierte neue Werte für den Anschlag aus, aber das brachte keine Besserung. Egal welche Werte ich nehmen, er fährt entweder bis an den Anschlag oder er tut einfach nichts...
    Womit kann das zusammenhängen?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    28.10.2009
    Ort
    Ratingen
    Alter
    60
    Beiträge
    60
    Hallo,

    habe die Basicvariante versucht , bekomme aber beim Compilieren mit der IDE 2.1 immer folgende Fehlermeldungen aus derRP6CCLib :

    Code:
    Übersetze Projekt Servo RP6
    C-Control Pro Compiler (C) 2009  Conrad Electronic
    Durchlaufe Pass 1
    Durchlaufe Pass 2
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(421,5): Semantik Fehler - Variable Timer_T3Stop nicht definiert
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(421,18): Syntax Fehler - unerwartetes Symbol: ')'
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(421,19): Syntax Fehler - erwartete ')'  , gefunden '
    '
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(422,20): Syntax Fehler - unerwartetes Symbol: ')'
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(437,5): Semantik Fehler - Variable Timer_T3FRQ nicht definiert
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(439,5): Semantik Fehler - Variable Timer_T3Stop nicht definiert
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(439,18): Syntax Fehler - unerwartetes Symbol: ')'
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(439,19): Syntax Fehler - erwartete ')'  , gefunden '
    '
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(440,20): Syntax Fehler - unerwartetes Symbol: ')'
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(845,5): Semantik Fehler - Variable Timer_T3Stop nicht definiert
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(845,18): Syntax Fehler - unerwartetes Symbol: ')'
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(845,19): Syntax Fehler - erwartete ')'  , gefunden '
    '
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(846,21): Syntax Fehler - unerwartetes Symbol: ','
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(846,24): Syntax Fehler - unerwartetes Symbol: ')'
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\Servo RP6.cbas(107,11): Semantik Fehler - Variable printIntegerLCD nicht definiert
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\Servo RP6.cbas(109,23): Semantik Fehler - Variable LINKER_ANSCHLAG nicht definiert
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\Servo RP6.cbas(112,11): Semantik Fehler - Variable printIntegerLCD nicht definiert
    C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CCPRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_20090131\BASIC\Servo\Servo RP6.cbas(123,22): Semantik Fehler - Variable RECHTER_ANSCHLAG nicht definiert
    18 Fehler - Kompilation abgebrochen.
    Schreibe Symboldaten - 9826 bytes..
    Gruß

    Klaus

  4. #4
    RN-Premium User Roboter-Spezialist
    Registriert seit
    21.04.2009
    Beiträge
    522
    Schau mal bitte nach, ob bei deinem Projekt in den Einstellungen das Projekt für die M128 erstellt wird. Der kleinere Bruder der M128 hat diese Funktionen nämlich nicht.
    Eventuell auch mal das Projekt neu anlegen und die alten Source-Dateien neu hinzufügen.
    War bei mir bis jetzt immer ein Problem der IDE, bzw. des Projektfiles.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    28.10.2009
    Ort
    Ratingen
    Alter
    60
    Beiträge
    60
    Zitat Zitat von Fabian E.
    Schau mal bitte nach, ob bei deinem Projekt in den Einstellungen das Projekt für die M128 erstellt wird. Der kleinere Bruder der M128 hat diese Funktionen nämlich nicht.
    Eventuell auch mal das Projekt neu anlegen und die alten Source-Dateien neu hinzufügen.
    War bei mir bis jetzt immer ein Problem der IDE, bzw. des Projektfiles.
    Bingo, damit ist der Fehler beseitigt. Nun habe ich weitere Fehler: printIntegerLCD nicht definiert

    Hier muß ich dann nocjh einmal prüfen

    Gruß

    Klaus

Berechtigungen

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