PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servos an M128-Erweiterungsplatine (CC-Pro)



BabaLrObOt
11.08.2010, 17:56
Ich hät da mal ne andere frage!

Ich hab ne erweiterungsplatiene und wollte einen servo anschließen (bessergesagt 2) und vl ein quellcode. kann ich mir aber auch selberschreiben wenn ich weiß wo ich anschließen soll!

auf dem zettel bei der rp6 cc-pro mega 128 steht jedenfalls das man drei servos anschließen kann!

thx

Fabian E.
11.08.2010, 18:34
Die M128 hat direkt schon Unterstützung für drei Servos. Die kann man das direkt anklemmen.

Prinzipiell brauchst du für jeden Servo einen Pin zum Steuern, eine Spannungsversorgung, und einmal GND.
Darüber kannst du Programmtechnisch alle Servos ansteuern.
Auch beim RP6 hast du solche PINS die du nehmen kannst (SDA, SCL, INT).

Aber suche doch einfach mal hier im Forum, das Thema gabs schon unzählige Male.

Martinius11
11.08.2010, 18:44
hast du jetzt nur ne Erweiterungsmodul ccp pro 128 oder ne Erweiterungsplatiene ?

aber du musst nen Software-PWM erstellen:

void Servo(uint8_t Winkel)
{
do
{
DRRA |= (1<<4);
PortA |= (1<<4);
Sleep(Winkel);
PortA &= ~(1<<4);
mSleep(127);
}
while(1)
}

und dann nur noch in dr Hauptschleife Servo(15); ist aber blockend andernfalls musst du ne Servostellzeit einstellen

Fabian E.
11.08.2010, 18:54
Wenn du wirklich die M128 hast, dann such halt mal nach "M128 Servo".
Da wird dir etwas sehr nützliches ins Auge springen.

BabaLrObOt
11.08.2010, 19:16
Ja ich hab die ganze platiene!

Ich breucht nur ein foto=wo angeschlossen wird.

Und vl ein quellcode.

BabaLrObOt
11.08.2010, 19:53
OK...Ich weiß wo ansteck (PB5,PB6)!

Kennt noch jemand einen Quellcode?

Thx :cheesy:

Martinius11
11.08.2010, 20:00
also gut ein servo kann man an jede freie Leitung des Controllers anschliesen
Plus(5V) Ground(Minus) und Signal (Leitung des Controlers) nehmen wir mal das Programm von mir das kannst du auch verwenden du musst nur die von dir genutzte Leitung deklarieren.

z. B.

ich habe mit

DRRA das A-Register ausgewählt und dann mit |= die Int_1 (Base) Leitung auf ausgang geschaltet und dann mit |= und &= ~ die Leitung ein und aus
Port ist eigentlich wie DRR wird aber zu ein und ausschalten verwendet.

radbruch
11.08.2010, 20:09
Dieser mangel an eigeninitiative macht mich echt sprachlos! Dieses Zitat stammt von hier:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=506953#506953

Gruß

mic

Martinius11
11.08.2010, 20:47
Dieser mangel an eigeninitiative macht mich echt sprachlos! Dieses Zitat stammt von hier:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=506953#506953

Gruß

mic


Ruhig, ruhig Radbruch aller Anfang war schwer.

Also hier noch ein code der nicht den Programmverlauf ganzunterbricht

int Servostellzeit = 20;
int a;

void Servo(uint8_t Winkel)
{
do
{
a++;
DRRA |= (1<<4);
PortA |= (1<<4);
Sleep(Winkel);
PortA &= ~(1<<4);
mSleep(127);
}
while(Servostellzeit >= a)
}

BabaLrObOt
12.08.2010, 09:42
ok jz funzt alles und das servo geht!

danke für die antworten!

bin hald noch neu in sachen robotik!

BabaLrObOt
12.08.2010, 09:52
Ok das is jz die letzte frage!

Den code soll ich auf die M128 laden und nicht auf den rp6 oder??

Martinius11
12.08.2010, 11:40
Mein code ist für die base wenn du ihn auf der 128 nutzen willst dann musst du nur die Leitung ändern

BabaLrObOt
12.08.2010, 12:25
ok ich probier mal!

ich schreib dann noch mal wenns geht oder wenns nicht geht!

danke für die gedult!

BabaLrObOt
12.08.2010, 19:14
So ich hab jz alles geändert.

Nun sollte vom code eigentlich alles passen.

Ich hab das alles in dem C.Control Pro IDE damit ichs auf die Platiene spielen kann.

Aber wenn ich das ganze komplimieren will steht unten: "Syntax Fehler -erwartete ´EOF´ ,gefunden ´void´.

Was soll ich da machen??

Fabian E.
12.08.2010, 19:46
Ohne Code können wir da überhaupt nicht helfen...

Martinius11
12.08.2010, 19:56
Schreib meine Funktion mal ohne void oder schreib es vor der initialisierung der Base

BabaLrObOt
12.08.2010, 21:01
void Servo(uint8_t 10)
{
do
{
a++;
PB5 |= (1<<4);
PB5 |= (1<<4);
Sleep(90);
PB5 &= ~(1<<4);
mSleep(127);
}
while(Servostellzeit >= 20)
}



Das is der code.

Martinius11
12.08.2010, 21:51
du musst dann in der Hauptschleife Servo(15); aufruffen in Klammern steht
der winkel

BabaLrObOt
13.08.2010, 11:47
Ich habs schon mehrere stunden an dem code gearbeitet aber immer wieder gibt es probleme!

Ich habs auch schon mit dem probiert:


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

' -----------------------------------------------------------------------------

aber auch da gibt es probleme mit kommentaren....

keine ahnung was ich noch machen soll...

ich werd einfach auf jeden fall noch probieren...

Martinius11
13.08.2010, 12:59
Du programmierst ja auch in Bascom ich hab ein c Programm geschrieben!