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