PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Projekt "Malender RP6" Programierhilfe gesucht !!!



fabi202cool
09.01.2010, 14:03
Hallo alle zusammen,
ich verfolgen nun schon seit einigen Tagen mit viel Interesse die threats zu Servos, bis ich mir schließlich gestern auch so ein Teil gekauft habe. Inzwischen habe ich schon einige Programme auf den RP6 geladen, und verändert. Während des Programmierens bin ich auf die Idee gekommen, einen „Malenden RP6“ zu bauen. Habe zwar schon an einigen Programmen gebastelt, aber das Servo tat nicht das was es sollte.

Vielleicht kann ja einer von euch ein beispielprog posten?

Meine ersten Ideen währen. Der RP6 soll sich um 90 Grad drehen, dann das Servo um ca. 40 Grad nach links drehen (Stift herablassen), dann 20cm nach vorne fahren und dann das Servo wieder um 40 Grad nach rechts drehen um den Stift wieder vom Papier heben.

Wer hat eine Idee?

Gruß Fabi

KingTobi
09.01.2010, 14:16
Vielleicht postest du mal dein Beispielprogramm!
Dann wird dir sicher jemand helfen/Tipps geben.

Schwierig ist das ja nun wirklich nicht.

fabi202cool
09.01.2010, 17:09
Hier ist mein Programm:


#include "RP6RobotBaseLib.h" // The RP6 Robot Base Library.
// Defines:
#define SERVO_OUT SDA // PINC1 XBUS Pin 12

// Servo movement limits (depending on servo type):
#define LEFT_TOUCH 1//550 // Left servo touch
#define RIGHT_TOUCH 254 // Right servo touch [max. 255]
#define PULSE_ADJUST 4
#define PULSE_REPETITION 19 // Pulse repetition frequency
//Variablen
int richtung=0; //0=rechts; 1=links
int speed=5;
/************************************************** ***************************/
// Functions:

/**
* INIT SERVO
*
* Call this once before using the servo task.
*
*/
void initSERVO(void)
{
DDRC |= SERVO_OUT; // SERVO_OUT -> OUTPUT
PORTC &= ~SERVO_OUT; // SERVO_OUT -> LO
startStopwatch1(); // Needed for 20ms pulse repetition
}
void pulseSERVO(uint8_t position)
{
cli();
PORTC |= SERVO_OUT; // SERVO_OUT -> HI (pulse start)
delayCycles(LEFT_TOUCH);
while (position--) {
delayCycles(PULSE_ADJUST);
}
PORTC &= ~SERVO_OUT; // SERVO_OUT -> LO (pulse end)
sei();
}
void task_SERVO(void)
{static uint8_t pos;
if (getStopwatch1() > PULSE_REPETITION) { // Pulse every ~20ms
if(richtung==0) pos=pos+speed;
else pos=pos-speed;
if (pos > RIGHT_TOUCH) {richtung = 1;} //nach links drechen
if (pos < LEFT_TOUCH) {richtung = 0;} //nach rechts drehen

pulseSERVO(pos);
setStopwatch1(0);
}
}

/************************************************** ***************************/
// Main function - The program starts here:

int main(void)
{
initRobotBase();
powerON();//anschalten
startStopwatch1();

setLEDs(0b111111); // Turn all LEDs on
mSleep(500); // delay 500ms
setLEDs(0b000000); // All LEDs off

initSERVO();

while(true)
{
task_SERVO();
rotate(60, RIGHT, 90, true);
task_SERVO();
move(70, FWD, DIST_MM(300), true);
task_SERVO();
task_RP6System();
}
return 0;
}
[/code]

suicide
11.01.2010, 07:01
Hi,
was hälst du davon, deiner task_SERVO(void) Methode die Position des Servos als Parameter zu übergeben? Dadurch siehst du im Programm schneller, an welcher Stelle der Stift angehoben, bzw. abgesenkt wird und musst nicht die Aufrufe von task_SERVO() zählen.

Grüße,
Jan

fabi202cool
11.01.2010, 17:36
Naja, ich habe den RP6 nun erst seit 3 Wochen und kann noch nicht wirklich programmieren !!
Wäre nett, wenn du mir ein beispielprogramm posten könntest !!

Xandi11
11.01.2010, 19:05
versuchs mal mit diesem code hier.



#include "RP6ControlLib.h"


void servo_io5 (uint8_t imp)
{
DDRC |= IO_PC5;
PORTC |= IO_PC5;
sleep(imp);
PORTC &= ~IO_PC5;
sleep(200-imp);
}




int main(void)
{
initRP6Control();
initLCD();


uint8_t i=0, x;

i=0;
x=10;

while(true)
{
while(i<10) //200ms
{
servo_io5(x);
i=i+1;
}
x=x+1;
if (x>=20)
{
x=10;
}
i=0;
}





while(true)
{
showScreenLCD("Endlosschleife", "");
}
return 0;
}

Ist die Grundkonstruktion (funktioniert auch) für die Steuerung eines Servos.

Versuch einfach das ein Wenig umzuschreiben.

PS:
Schau in den Thread (https://www.roboternetz.de/phpBB2/viewtopic.php?t=34407).

fabi202cool
12.01.2010, 17:10
Mit dem Programm kann ich leider nichts anfangen, da ich (noch) keine erweiterung gekauft habe. Werde mir aber wahrscheinlich in den nächsten tagen ein m32 bestellen.
hast du vieleicht noch ein prog für die base ?

Xandi11
12.01.2010, 17:35
nein ... aber ich kann das auf die Base umschreiben

ich poste es dann wenn es für die Base passt

Xandi11
12.01.2010, 18:05
Das wäre nun das selbe Programm allerdings für die Base.
Das Servo hängt am SCL Pin (XBUS).





#include"RP6RobotBaseLib.h"


void servo_scl (uint8_t imp)
{
DDRC |= SCL;
PORTC |= SCL;
sleep(imp);
PORTC &= ~SCL;
sleep(200-imp);
}



int main(void)
{
initRobotBase();

uint8_t i=0, x;

i=0;
x=10;

while(true)
{
while(i<10) //200ms
{
servo_scl(x);
i=i+1;
}
x=x+1;
if (x>=20)
{
x=10;
}
i=0;
}


while(true)
{
writeString_P("\n Endlosschleife");
}

return 0;
}

radbruch
12.01.2010, 18:08
Servo mit zwei Positionen für RP6-Base:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=479916#479916


nein ... aber ich kann das auf die Base umschreiben

ich poste es dann wenn es für die Base passt

Lass es. Du hast es doch kaum geschafft, das Progamm aufs M32 zu Übertragen. Wenn du es jetzt wieder fürs Base umändern willst, kann es nur schlimmer werden.

gruß

mic

[Edit]Zu spät, Glückwunsch

Xandi11
12.01.2010, 18:30
Ich habe ja auch nix für die M32 umgeändert ...

ich hab noch gar kein Programm gehabt wenn man es genau nimmt ...

außerdem gehts da nur ums verstehen ...

hat man es einmal verstanden ist es kein Problem mehr :mrgreen:


Lass es. ... kann es nur schlimmer werden.
... danke für den Zuspruch :cheesy: :cheesy: :cheesy:

fabi202cool
13.01.2010, 17:36
@Xandi11

Danke erst mal !!! Das Programm geht ziemlich gut.
Aber wie kann ich den Servoausschlag verändern ?

Xandi11
13.01.2010, 18:20
indem du die variable imp änderst

15 entspricht ca. der Mittelstellung
<15 geht das Servo nach links
>15 geht das Servo nach rechts

fabi202cool
14.01.2010, 16:44
Habe jetzt ein kleines Programm geschrieben.
habe nur das problem, dassder servo nach dem stellen auf den mittelpunkt nur noch "herumzuckt" !!
Was mache ich falsch ??

#include"RP6RobotBaseLib.h"


void servo_scl (uint8_t imp)
{
DDRC |= SCL;
PORTC |= SCL;
sleep(imp);
PORTC &= ~SCL;
sleep(200-imp);
}


void servo(void)
{
uint8_t i=0, x;

i=0;
x=10;

while(i<10) //200ms
{
servo_scl(x);
i=i+1;
}

x=x+1;
if (x>=20)
{
x=10;
}
i=0;
}
void servol(void)
{
uint8_t i=0, x;

i=10;
x=0;

while(i>15) //200ms
{
servo_scl(x);
i=i+1;
}

x=x+1;
if (x<=20)
{
x=10;
}
i=0;
}
int main(void)
{
initRobotBase();

uint8_t i=0, x;

i=0;
x=10;

powerON();

while(true)
{
servo();
move(70, BWD, DIST_MM(150), BLOCKING);
servol();
servo();
move(70, FWD, DIST_MM(150), BLOCKING);
servol();
}



while(true)
{
writeString_P("\n Endlosschleife");
}

return 0;
}

Xandi11
22.01.2010, 07:29
Sorry, dass ich solange nicht zurückgeschrieben habe ...

Auf die Schnelle ist mir nur aufgefallen, dass du im servo1 vermutlich x und i vertauscht hat.
Denn du gibtst dem Servoprogramm die Position 0 über.

Falls das nicht der Fall ist, schreib nochmal ...


Edit:

Außerdem solltest du zwischen servo1() und servo() eine Pause einbauen.
Damit kannst du sichergehen, dass das Servo den Bewegungen folgen kann und vorallem du auch etwas siehst.

fabi202cool
22.01.2010, 13:21
hi, schön das du wieder schreibst.
Bin aber nicht wewiter gekommen habe den code zwar etwas abgeändert aber immer noch der gleiche effekt.

Könntest du ihn vielleicht mal auf deinem RP6 ausprobieren ?


#include"RP6RobotBaseLib.h"


void servo_scl (uint8_t imp)
{
DDRC |= SCL;
PORTC |= SCL;
sleep(imp);
PORTC &= ~SCL;
sleep(200-imp);
}

void servo1(void)
{
uint8_t i=0, x;

i=0;
x=10;

while(i<10) //200ms
{
servo_scl(x);
i=i+1;
}
x=x+1;

move(70, BWD, DIST_MM(150), BLOCKING);

if (x<=15)
{
x=15;
}
i=0;
}

void servo2(void)
{
uint8_t i=0, x;

i=0;
x=10;

while(i<10) //200ms
{
servo_scl(x);
i=i+1;
}
x=x+1;

move(70, FWD, DIST_MM(150), BLOCKING);

if (x<=15)
{
x=15;
}
i=0;
}

int main(void)
{
initRobotBase();

powerON();

while(true)
{
servo1();
servo2();
}


while(true)
{
writeString_P("\n Endlosschleife");
}

return 0;
}

radbruch
22.01.2010, 13:37
So vielleicht?

// Servoansteuerung2: Wir erzeugen zwei Impulse im Wechsel mit Fahren 22.1.2010 mic
// sleep(1) verzögert ca. 0,1ms, 50 Impulse dauern ca. 1 Sekunde
// Servo an SCL (PC0) (XBUS Pin 10)

#include "RP6RobotBaseLib.h"

uint8_t c; // allgemeine 8-Bit-Variable (ein Char)

int main(void)
{
initRobotBase();
powerON();

DDRC |= SCL;
PORTC &= ~SCL;

while(1)
{
for(c=0; c<50; c++) // 50 Impulse senden, das dauert ca. 1 Sekunde
{
PORTC |= SCL; // Impulsstart
sleep(12); // 1,2ms warten = Servoposition 1
PORTC &= ~SCL; // Impulsende
sleep(190); // 19ms warten
}

move(70, BWD, DIST_MM(150), BLOCKING);

for(c=0; c<50; c++)
{
PORTC |= SCL;
sleep(18); // 1,8ms warten = Servoposition 2
PORTC &= ~SCL;
sleep(190);
}

move(70, FWD, DIST_MM(150), BLOCKING);

}
return(0); // wird nie erreicht
}

fabi202cool
22.01.2010, 16:36
Ich habe den Fehler jetzt gefunden !!! \:D/
Der Servo war schuld, habe meinen großen jetzt durch einen miniservo ersetzt und läuft perfekt. Hatte den Modelcraft RS-2 von Conrad, wahrscheinlich nahm er einfach zu viel Strom auf.

Gruß fabi

Xandi11
22.01.2010, 17:05
Dann bräuchtest du ne externe Stromversorgung ...

an +5V (rot) kommt der Plus des Akkus
an GND (schwarz) kommt der Minus des Akkus und des RP6s
und der Gelbe/Orange kommt auf den Pin am Roboter

Virus
22.01.2010, 17:16
entweder mit Spannungsregler IC 7805 oder mit ein paar dioden in reihe

da die betriebspannung mit 4-6volt angegeben ist, ist es nich das wahre ihn an die akkus mit 6-8volt zu klemmen

Xandi11
22.01.2010, 17:33
Die Empfängerakkus (für solche Aufgaben ideal) sind Akkupacks, welche aus 4 Zellen bestehen.

Sie habe somit eine Spannung zwischen 4,8 und 6V.

Die werden ja auch im Modellbau verwendet ... wenn das nicht funktionieren würde, wäre es sehr schlecht ...


Edit:

Ein Spannungsregler ist dann zu empfehlen, wenn Aufbauten die viel Strom verbrauchen oft und vorallem nicht nur zum Probieren am RP6 sind.

Für die ersten Versuche ist ein externer Akku die bessere Variante.

radbruch
22.01.2010, 17:40
Hallo

Ich verwende auch die RS-2-Servos und hatte bisher keine Probleme mit der Spannungsversorgung. Vielleicht streut die Fertigungsqualität der Servos etwas?

https://www.roboternetz.de/phpBB2/viewtopic.php?p=462535#462535

Gruß

mic