PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CCPRO M128: Demo Servo-Ansteuerung



Dirk
11.06.2009, 15:04
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:

/************************************************** *****************************
* 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:

/************************************************** *****************************
* 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

Fabian E.
17.04.2010, 16:02
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?

klausjuergen
28.12.2010, 19:55
Hallo,

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


Ü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_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\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_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(421 ,18): Syntax Fehler - unerwartetes Symbol: ')'
C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(421 ,19): Syntax Fehler - erwartete ')' , gefunden '
'
C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(422 ,20): Syntax Fehler - unerwartetes Symbol: ')'
C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\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_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\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_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(439 ,18): Syntax Fehler - unerwartetes Symbol: ')'
C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(439 ,19): Syntax Fehler - erwartete ')' , gefunden '
'
C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(440 ,20): Syntax Fehler - unerwartetes Symbol: ')'
C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\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_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(845 ,18): Syntax Fehler - unerwartetes Symbol: ')'
C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(845 ,19): Syntax Fehler - erwartete ')' , gefunden '
'
C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(846 ,21): Syntax Fehler - unerwartetes Symbol: ','
C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\BASIC\Servo\..\..\RP6CCLib\RP6CCLib.cbas(846 ,24): Syntax Fehler - unerwartetes Symbol: ')'
C:\Dokumente und Einstellungen\DC2JR\Eigene Dateien\AVR-Programmierung\Roboter\RP6Examples_20080915\RP6_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\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_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\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_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\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_CC PRO_EXAMPLES_DE_20090131\RP6_CCPRO_EXAMPLES_DE_200 90131\BASIC\Servo\Servo RP6.cbas(123,22): Semantik Fehler - Variable RECHTER_ANSCHLAG nicht definiert
18 Fehler - Kompilation abgebrochen.
Schreibe Symboldaten - 9826 bytes..

Gruß

Klaus

Fabian E.
28.12.2010, 20:07
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.

klausjuergen
28.12.2010, 20:56
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