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:
CompactC: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 ' -----------------------------------------------------------------------------
Viel Spaß!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); } //------------------------------------------------------------------------------
Gruß Dirk







Zitieren

Lesezeichen