PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6 mit Greifer



carlitoco
18.10.2008, 16:15
ich habe mir nun einen 5-achs greifer gebastelt.

Aber große frage: wie steuere ich ihn an?

Eine Überlegung war ihn vom pc aus zu steuern, erstmal über das kabel um es einfach zu halten. da stellt sich schon die frage könnte ich ihn mit der maus steuern ?
Das geht doch bestimmt ...

ok aber mann soll ein Dach nicht vor dem Funderment bauen!
also erstmal möchte ich die fünf servos über ein Programm steuern.
Hierbei hatte mir radbruch auch schon einmal geholfen, jedoch nur für einen Servo

um ein bischen Butter bei die Fische zu geben ein Foto
& Danke für Hilfe, Tipps oder ratschläge.

P.S.
Es gibt doch auch sicher verschiedene Lösungsansätze: Gehen wir mal davon aus das der Servoarm an dem M32 hängt, welches auf der "Base" sitzt. Das ganze soll dann noch fahren, jedes "bumper-Hinderniss" soll der RP6 "aus dem Weg räumen". :D

nachtrag:
--der greifer ist von radbruch abgeguckt - klappt gut !

RP6conrad
18.10.2008, 19:40
Sieht mal meine Lösung an :https://www.roboternetz.de/phpBB2/viewtopic.php?t=43476
Du brauchts da nur den freie Timer 1 von M32.

radbruch
18.10.2008, 20:15
Hallo carlitoco

Ein sehr hübscher und kreativer Nachbau meines (nie wirklich gelaufenen) Greifarms. Gratulation. Da ich kein M32 besitze kann ich dich im Moment auch nicht wirklich unterstützen. Ohne M32 würde ich den Arm natürlich an den LEDs anschließen, allerdings über einen USRBUS-Sockel und nicht wie bei mir direkt an den IO-Pins angeschlossen.

Wenn du alle 5 Servos über den internen Spannungsregler versorgen möchtest solltest du allerdings ein kleines Kühlblech für den Spannungsregler vorsehen. Alternativ könnte man die Servoversorgung auch direkt an die Akus klemmen.

Mit dem von RP6conrad gezeigten Verfahren kann man sehr effektiv (weil rechenzeitschonend) mehrere Servos ansteuern. Ein wesentlicher Vorteil gegenüber der weitverbreiteten Lösung aus dem RN-Wissen ist das zeitversetzte Ansteuern der einzelnen Servos. Dadurch werden die recht hohen Anlaufströme besser verteilt.

Viel Spaß mit deinem schicken Greifarm.

mic

Pr0gm4n
18.10.2008, 20:43
Hi carlitoco,

wie du weisst, hab ich auch an meinem Greifarm-Projekt gebastelt und ich glaube ich hätte dir geschrieben, dass meine Mechanik bis auf den Greifer an sich (halt ganz vorne) fertig ist...

ist sie auch, bloß dass ich nicht nur 5 sondern 9 Achsen habe (oder warens mit greifer vorne dann doch 10?!?, muss mal gucken)

ich bin im moment nur etwas behindert, denn meine eltern waren im urlaub und vergessen seit 4 tagen mir die kamera zu geben, aber bald wirds von mir dann viele bilder geben^^

ich habe den greifarm aus gelaserten Aluminiumblechen zusammengeklebt und geschraubt (m3 gewindeschrauben)

bald werde ich mich ans überarbeiten der dxf-dateien machen, sodass man alles besser stabilisieren kann (das was ich jetzt erstmal provisorisch gemacht habe halt

möchte versuchen morgen meinen Greifer fertigzubauen, doch leider ist meine am computer gezeichnete und ausgedachte lösung meiner meinung nach nicht gerade ideal und zu allem überfluss konnte ich mir ab einem gewissen zeitpunkt die dimensionen nicht mehr vorstellen(im nachhinein sogar eigentlich glück gehabt) und meinte, ich baue eine stabile servohalterung mit löchern exakt bei der servoachse/symmetrisch daneben

mal schauen, ich hoffe ich kann das so hinbasteln, dass es funktioniert...

nebenbei bin ich z.Z. am konstruieren der platine für die ansteuerung, denn ich habe einfach keine lust mehr die lochrasterplatinen zu löten (zumindest nicht in dem maße), und für den rp6 wird das dann alles doch noch zuviel denke ich...

bei dem gewicht werd ich jetz auch erstmal nen fixierten Boden-Sockel bauen (iss auch fast fertig), dann hab ich auch strommässig für die servos keine probleme weil ich einfach ein netzteil nehmen kann...

wie ich auch carlitoco schon erzählt habe, will ich das ganze direkt über funk mit 2 Joysticks steuern, die Joystickelektronik habe ich dazu herausgenommen und eine eigene auf lochraster entworfen (auch bis auf den funkmodulen fertig)

zu deiner frage wegen dem PC: also theoretisch wäre dein vorhaben kein problem, schon relativ geringe Java/C++ oder was auch immer-Kenntnisse reichen aus, um die maus, tastatur und ähnliches (joystick z.B.) einzulesen und über einen comport auszugeben. wenn du dir ein rn-funk besorgst kannst du so über zig varianten und über pc deinen arm steuern.

naja, ich schätze morgen abend wirds dann den vorstellungen projekte+ideen thread für mein projektlein mit zig fotos geben...


LG Pr0gm4n

Pr0gm4n
19.10.2008, 09:29
So, hab jetz mal schön fotografiert und biete jetz ein paar Bilder an, aber im Laufe des Tages gibts dann den Vorstellungen+Bilder+Ideen-Thread wie gesagt...

ich hoffe ich erlege euch dadurch keine zu hohen ladezeiten auf, bei mir gehts nämlich ganz gut im moment...


LG Pr0gm4n

http://i72.servimg.com/u/f72/12/52/00/91/img_3510.jpg (http://www.servimg.com/image_preview.php?i=6&u=12520091)

http://i72.servimg.com/u/f72/12/52/00/91/img_3511.jpg (http://www.servimg.com/image_preview.php?i=7&u=12520091)

http://i72.servimg.com/u/f72/12/52/00/91/img_3512.jpg (http://www.servimg.com/image_preview.php?i=8&u=12520091)

http://i72.servimg.com/u/f72/12/52/00/91/img_3513.jpg (http://www.servimg.com/image_preview.php?i=9&u=12520091)

http://i72.servimg.com/u/f72/12/52/00/91/img_3514.jpg (http://www.servimg.com/image_preview.php?i=10&u=12520091)

http://i72.servimg.com/u/f72/12/52/00/91/img_3515.jpg (http://www.servimg.com/image_preview.php?i=11&u=12520091)

http://i72.servimg.com/u/f72/12/52/00/91/img_3516.jpg (http://www.servimg.com/image_preview.php?i=12&u=12520091)

http://i72.servimg.com/u/f72/12/52/00/91/img_3517.jpg (http://www.servimg.com/image_preview.php?i=13&u=12520091)

http://i72.servimg.com/u/f72/12/52/00/91/img_3518.jpg (http://www.servimg.com/image_preview.php?i=14&u=12520091)

http://i72.servimg.com/u/f72/12/52/00/91/img_3519.jpg (http://www.servimg.com/image_preview.php?i=15&u=12520091)

http://i72.servimg.com/u/f72/12/52/00/91/img_3520.jpg (http://www.servimg.com/image_preview.php?i=16&u=12520091)

http://i72.servimg.com/u/f72/12/52/00/91/img_3521.jpg (http://www.servimg.com/image_preview.php?i=17&u=12520091)

http://i72.servimg.com/u/f72/12/52/00/91/img_3522.jpg (http://www.servimg.com/image_preview.php?i=18&u=12520091)

RP6conrad
19.10.2008, 10:58
In Prinzip machen mehr wie 5 Achsen wenig Sinn : alle Positionen in Bereich konnen auch mit 5 Achsen angefahren werden. Es scheint mir auch das bei diese Laenge (70 cm) die Servo's an der Basis ueberfoerdert sind. Auch das ansteuern mit 10 Achsen ist gar nicht einfach : mit 2 Joysticks kann man gerade 4 Servo's steuern. Bei die Industrieroboter gebt der Joystick den Input für X,Y,Z cOördinaten. Die wirkliche bewegung von jeden motor wird dan erst umgerechnet und simultan gesteuert. Aber lass dass alles den Spass nicht bederfen : mach weiter und halt uns auf die hohe !!!

Pr0gm4n
19.10.2008, 13:11
hi,

also 1.:

2 joysticks haben je:
- X-Achse
- Y-Achse
- Z-Achse
- 3 Knöpfe oben
- einen Feuerknopf
- den Coolie Hat (8 Schaltpositionen)
- eine zusätzliche Achse des Schubreglers

macht zusammen:
-4 Achsen (potis)
-12 Schalter

und das mal 2

8 Achsen und 24 Schalter, zusätzlich wären noch weitere, aber die liegen ungünstig

also ich denke mit den ganzen schaltern werde ich das doch wohl hinkriegen, oder?!?

naja, ich habe ja auch 2 Servos gehackt, den ganz unten und den am Greifer selbst, das heisst, da macht es keinen sinn eine poti-steuerung zu verwenden, bei den anderen wird sich das ergeben...

LG Pr0gm4n

ps: das mit den 5 achsen ist mir auch klar gewesen, doch ich habe den greifarm nicht als hauptprojektteil, sonder eigentlich nur zur veranschaulichung meiner dazugehörigen funksteuerung...

carlitoco
20.10.2008, 17:00
Hi!

erstmal danke für das Lob von radbruch.
So richtig schwer wird es für mich wohl mit der Programmierung, da ich mich damit noch recht schwer tue.

Zur Stormversorgung war die Überlegung, das ich rechs und links in die Schlaufen von den XBUS kabeln jeweils ein 3-er Akkupack, also die hälfte dessen, was sich im rumpf vom RP6 befindet einzulegen und zu fixieren. Dadurch erhalte ich den nötigen Strom für die Servos.

Des weiteren hatte ich gelesen, das es sich für das M32 lohnt ein PWM-Modul zu benutzen, in wie weit ich das aber direkt drauflöten kann oder einbinden, weiss ich noch nicht.

Erstmal aber möchte ich das "Greiferlein" über das M32 steuern, um damit umgehen zu lernen. Und das motto "so einfach wie möglich..." welches sich Radbruch zu eigen gemacht hat ist erstmal nicht schlecht. Die Hardware des RP6 ersteinmal ausreitzen zu können -
bis dahin ists für meine Programmierfähigkeiten noch ein kleiner Weg.

Die Idee mit den Joysticks finde ich dennoch ziemlich gut.
Dabei fällt mir ein es gibt da so ein altes Spiel, ähnlich wie mechWarrior, dafür gab es für schlappe 250$ :D eine Bedienkonsole mit 2 Joysticks und allen möglichen Knöpfen - nur leider zu teuer !

Hier das bild davon.
http://spjall.vaktin.is/files/23214-steel_battalion_controller.jpg

Pr0gm4n
20.10.2008, 17:27
Hi,

das Teil kostet wirklich 250$?!?

das ist ja voll überteuert!

ich habe für knapp 10 euro incl jeweils 3,90€ versand 2 alte saitek joysticks gekauft (ebay) und dann die dumme elektronik raus und meine rein...

LG Pr0gm4n

carlitoco
20.10.2008, 17:31
Das war dahmals so ... - heute keine Ahnung

grüsse
carlitoco

Pr0gm4n
20.10.2008, 17:41
Hi,

ich hab meine Joysticks auch noch nich so lange...

du musst ja nicht unbedingt usb-joysticks kaufen, die alten mit gameportanschluss taugen genauso...


hier mal ein link zu ebay (http://shop.ebay.de/?_from=R40&_trksid=m38&_nkw=saitek+cyborg+3d)

der eignet sich hervorragend...


LG Pr0gm4n

carlitoco
22.10.2008, 11:22
zu deiner frage wegen dem PC: also theoretisch wäre dein vorhaben kein problem, schon relativ geringe Java/C++ oder was auch immer-Kenntnisse reichen aus, um die maus, tastatur und ähnliches (joystick z.B.) einzulesen und über einen comport auszugeben.

Also ich habe am RP6 schon ein bischen rum programmiert aber deshalb habe ich noch keinen blassen schimmer wie ich mit C/C++ meine maus auslesen soll und das an mein usb oder serial Port weitergeben kann.
Meiner meinung ist das kein Anfänger kurs. Es sei denn einer von euch bastelt ein Tutorial.

Also mal hand aufs Herz ich muss mir das aus aus den Fingern saugen und schaffe die Programmierung trotzdem noch nicht. Aufgeben möchte ich aber auch nicht.

Ich brauche Infos, Quellen, Bücher, Tutorials und Beispiele...
ich mache das bisher autodidaktisch !

gruss Carlito

robocat
22.10.2008, 15:47
hallo carlitoco, nicht aufgeben!
wenn du windows verwendest (nehme ich an) und einen c compiler hast (wie bcc32, gibt aber viele andere), bringt dir folgendes proggi schonmal die mauskoordinaten auf den schirm (so einfach wie möglich gehalten):

// einfaches konsolenprogramm um mauskoordinaten anzuzeigen

#include <windows.h> // for API functions
#include <stdio.h> // for printf

int main()
{
CURSORINFO cursorinfo;
POINT p;

for(;;)
{
// structure wants to know its size
cursorinfo.cbSize=sizeof(CURSORINFO);

// fill the cursorinfo structure
GetCursorInfo(&cursorinfo);

// copy mouse coordinates to p
// not necessary; cursorinfo.ptScreenPos.x could be used directly
p=cursorinfo.ptScreenPos;

// output coordinates
printf("x:%d,y:%d\n",p.x,p.y);

// sleep for 100ms to keep cpu load low
Sleep(100);
}
return 0;
}

die ausgabe auf den seriellen port ist auch keine grosse sache, aber versuch erstmal, diesen code zu kompilieren.

wahrscheinlich willst du kein konsolenprogramm, sondern ein fenster mit buttons etc (GUI), da wird das ganze dann schon etwas komplizierter. wenn ich kann, werde ich dir aber helfen.

gruesse von der katz

Pr0gm4n
22.10.2008, 21:00
Hi,

also erstmal carlitoco: das was du beim rp6 verwendest würde ich nicht gerade als C bezeichnen...

es ist im programmierstil von C gehalten und grundlegende strukturen sind klar auch in C vorhanden, aber alle Befehle die du verwendest wurden ja von den AREXX-Entwicklern definiert...

du musst dir für soetwas natürlich schon eher das C/C++ für den PC angucken, z.B. hier (http://www.galileocomputing.de/openbook/c_von_a_bis_z/index.htm), das ist ein recht gutes C-Tutorial...

wenn du deinen Greifarm nur mit der maus steuern willst aber dafür nichts auf dem Bildschirm angezeigt haben musst, dann dürfte das relativ simpel sein, was ich auch erwähnt habe...

naja, ich hab mich schon länger nichmehr mit GUI beschäftigt, werde das so frühsommer nächsten jahres wieder intensivieren, also lass dir lieber von robocat helfen...


LG Pr0gm4n

carlitoco
23.10.2008, 12:05
Hi !

Also danke erstmal für den code ich arbeite mit Linux Slackware... nicht mit Windoof :D

Also GUI erstmal nicht nötig, die Konsole ist mein hauptwekzeug. und das schon ne weile.

Ich werd mir jetzt erstmal den code von Robocat reinziehen übersetzen geht ja leider nicht da windows.h bestimmt nicht vorhanden sein wird.

grüsse

robocat
23.10.2008, 12:42
sorry, ich fürchte dann wird dir mein code nicht helfen. das sind alles win32 api befehle, im linux sieht das sicher ganz anders aus. :(

Pr0gm4n
23.10.2008, 16:54
Hi,

tjo, da muss er dann selber proggen, aber ich glaub es gab doch so ein paar libs, die auf linux und windows laufen und in denen man befehle zum senden via com-port hat, dann noch das jeweilige einlesesystem (winapi oder halt linuxzeug) und fertig


LG Pr0gm4n

merlin63
29.10.2008, 00:24
hi robert

na das sieht ja schon nach was aus, obwohl ich jetzt auf die schnelle erstmal probs hatte die einzelnen achwsen zu erkennnen.
wie auch schon oben gesagt, hätte ich jetzt auch bedenken, was der untere servo zu dieser ausladung sagt.
aber du wirst dir schon was bei gedacht haben.
also viel spass noch
und wenn de was brauchst.....weste ja ;-)
gruß thomas

carlitoco
29.10.2008, 13:42
Hier der Open Source code zur mausauslese


#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

#include <linux/input.h>

#define MOUSEFILE "/dev/input/event7"

/* oder wenn nicht usb mouse sondern trackpoint:
#define MOUSEFILE "/dev/input/event5" oder
#define MOUSEFILE "/dev/input/event8"
*/

int main()
{
int fd;
struct input_event ie;

if((fd = open(MOUSEFILE, O_RDONLY)) == -1) {
perror("opening device");
exit(EXIT_FAILURE);
}

while(read(fd, &ie, sizeof(struct input_event))) {
printf("time %ld.%06ld\ttype %d\tcode %d\tvalue %d\n",
ie.time.tv_sec, ie.time.tv_usec, ie.type,
ie.code, ie.value); }

return 0;
}

Pr0gm4n
29.10.2008, 14:11
Hey thomas, ich heisse immernoch roland....

jo, was dabei gedacht hab ich mir, aber jetz mach ich erstmal die elektronik fertig und dann fang ich schon mit der konstruktion der 2. version...


dann solls mit schrittmotoren gehen und auch nichtmehr so viele achsen haben...

mal schauen, so 5-6 achsen sollens dann vielleicht noch sein...

carlitoco
29.10.2008, 15:25
Um schnell mal in der Ansteuerung Fortschritte zu machen habe ich mir gedacht den Servoarm über IR zu bedienen.

Das ist mein Code:

/*

* ************************************************** **************************

* RP6 ROBOT SYSTEM - Base

* ************************************************** **************************

Dieses Prorgamm wird gebaut um mienen Servoarm mit Hilfe einer IR-vernbedienung zu bedienen.
*************************************************

*/




#include "RP6RobotBaseLib.h"


uint8_t i, pause, servo_stellzeit, servo_delay;


//#define RC_EURO_SKY

#define RC_PROMO8




#ifdef RC_PROMO8 // RC Type: Conrad - Promo8

#define RC5_KEY_LEFT 21

#define RC5_KEY_RIGHT 22

#endif





void receiveRC5Data(RC5data_t rc5data)

{



writeString_P("Toggle Bit:");

writeChar(rc5data.toggle_bit + '0');

writeString_P(" | Device Address:");

writeInteger(rc5data.device, DEC);

writeString_P(" | Key Code:");

writeInteger(rc5data.key_code, DEC);

writeChar('\n');



switch(rc5data.key_code)

{

case RC5_KEY_LEFT: // Turn left:

writeString_P("LEFT\n");

int arm
{
i=0;
servo_stellzeit=16;
DDRA |= E_INT1; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
// 5 - 15 - 25 // Min - Mitte - Max
servo(15); // Grundstellung
while (1)
{
servo(17);
servo(18);
servo(19);
servo(20);
servo(21);
servo(22);
servo(23);
servo(24);
}

setLEDs(0b100000);
}

break;
case RC5_KEY_RIGHT: // Turn right:

writeString_P("RIGHT\n");
int arm
{
i=0;
servo_stellzeit=16;
DDRA |= E_INT1; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
// 5 - 15 - 25 // Min - Mitte - Max

servo(15); // Grundstellung
while (1)
{
servo(14);
servo(13);
servo(12);
servo(11);
servo(10);
servo(9);
servo(8);
servo(7);
servo(6);
}

setLEDs(0b000100);
}

break;

}


}


/************************************************** ***************************/


int main(void)

{

initRobotBase();



setLEDs(0b111111);

writeChar('\n');

writeString_P("RP6 controlled by RC5 TV Remote\n");

writeString_P("___________________________\n");

mSleep(500);

setLEDs(0b000000);

powerON();



// Set the RC5 Receive Handler:

IRCOMM_setRC5DataReadyHandler(receiveRC5Data);



return 0;

}



Aber er scheint Fehler zu haben ,da ich ine Aussage wie diese erhalte.

Compiling: RP6Base_tvarm.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=RP6Base_tvarm.lst -I../../../RP6Lib/ -I../../../RP6Lib//RP6base -I../../../RP6Lib//RP6common -std=gnu99 -MD -MP -MF .dep/RP6Base_tvarm.o.d RP6Base_tvarm.c -o RP6Base_tvarm.o
RP6Base_tvarm.c: In function 'receiveRC5Data':
RP6Base_tvarm.c:40: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
RP6Base_tvarm.c:46: warning: implicit declaration of function 'servo'
RP6Base_tvarm.c:65: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'i'
RP6Base_tvarm.c:85: error: break statement not within loop or switch
RP6Base_tvarm.c: At top level:
RP6Base_tvarm.c:88: error: expected identifier or '(' before '}' token
make: *** [RP6Base_tvarm.o] Fehler 1

Dirk
29.10.2008, 20:22
Hallo carlitoco,

ein Teil der Fehlermeldungen verschwindet, wenn du die Definition "int arm" wegläßt (wird ja gar nicht gebraucht) oder zumindest ein Semikolon anhängst: "int arm;"

Ganz fehlerfrei wird das erst kompiliert, wenn du noch die Funktion "servo" irgendwo definierst.
Was das Programm aber eigentlich so machen soll, kann ich auch dann nicht erkennen. :-k

Gruß Dirk

carlitoco
29.10.2008, 23:26
Ziel soll es sein die Servos über die IR Fernbedienung zu steuern.

Es würde erstmal reichen wenn ich 2 servos ansteuern könnte, das wäre eine gute Grundlage. Doch scheint das so noch nicht richtig zu sein.
hier nochmal der
neue code:

/*

* ************************************************** **************************

* RP6 ROBOT SYSTEM - Base

* ************************************************** **************************

Dieses Prorgamm wird gebaut um mienen Servoarm mit Hilfe einer IR-vernbedienung zu bedienen.
*************************************************

*/
#include "RP6RobotBaseLib.h"
uint8_t i, pause, servo_stellzeit, servo_delay;

//#define RC_EURO_SKY

#define RC_PROMO8
#ifdef RC_PROMO8 // RC Type: Conrad - Promo8

#define RC5_KEY_LEFT 21

#define RC5_KEY_RIGHT 22

#endif

void servo(uint8_t w0)

{}

void receiveRC5Data(RC5data_t rc5data)

{
writeString_P("Toggle Bit:");

writeChar(rc5data.toggle_bit + '0');

writeString_P(" | Device Address:");

writeInteger(rc5data.device, DEC);

writeString_P(" | Key Code:");

writeInteger(rc5data.key_code, DEC);

writeChar('\n');

switch(rc5data.key_code)

{

case RC5_KEY_LEFT: // Turn left:

writeString_P("LEFT\n");

{
i=0;
servo_stellzeit=16;
DDRA |= E_INT1; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
// 5 - 15 - 25 // Min - Mitte - Max
servo(15); // Grundstellung
while (1)
{
servo(17);
servo(18);
servo(19);
servo(20);
servo(21);
servo(22);
servo(23);
servo(24);
}

setLEDs(0b100000);
}

break;
case RC5_KEY_RIGHT: // Turn right:

writeString_P("RIGHT\n");

{
i=0;
servo_stellzeit=16;
DDRA |= E_INT1; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
// 5 - 15 - 25 // Min - Mitte - Max

servo(15); // Grundstellung
while (1)
{
servo(14);
servo(13);
servo(12);
servo(11);
servo(10);
servo(9);
servo(8);
servo(7);
servo(6);
}

setLEDs(0b000100);
}

break;

}


}


/************************************************** ***************************/


int main(void)

{

initRobotBase();



setLEDs(0b111111);

writeChar('\n');

writeString_P("RP6 controlled by RC5 TV Remote\n");

writeString_P("___________________________\n");

mSleep(500);

setLEDs(0b000000);

powerON();



// Set the RC5 Receive Handler:

IRCOMM_setRC5DataReadyHandler(receiveRC5Data);



return 0;

}


Gruss und danke für die Hilfe carlitoco

carlitoco
30.10.2008, 14:02
Hier eine kliene Bewegung des Servoarms als Video:
noisia.sytes.net/text/SV_A0074.mp4

carlitoco
30.10.2008, 19:58
Würfel sammler
noisia.sytes.net/text/Cube-collector.avi


#include "RP6RobotBaseLib.h"

uint8_t i, pause, servo_stellzeit, servo_delay;

void servo(uint8_t w0, uint8_t w1, uint8_t w2, uint8_t w3, uint8_t w4)
{
unsigned int count=0;
do{
PORTA |= E_INT1; // E_INT1 (Pin8)
sleep(w0);
PORTA &= ~E_INT1;
PORTC |= 1; // SCL (Pin10)
sleep(w1);
PORTC &= ~1;
PORTC |= 2; // SDA (Pin12)
sleep(w2);
PORTC &= ~2;
PORTB |= 1;
sleep(w3);
PORTB &= ~1;
PORTB |=2;
sleep(w4);
PORTB &=~2;
sleep(servo_delay-(w0+w1+w2+w3+w4));
//sleep(127);
} while (count++ < servo_stellzeit);
mSleep(20*pause);
}

int main(void) {

initRobotBase();
i=0;
servo_stellzeit=20;
DDRA |= E_INT1; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
// 5 - 15 - 25 // Min - Mitte - Max
servo(25,15,20,10,10);
servo(15,5,20,10,10); // Grundstellung
servo(10,5,15,10,10);
while (1)
{
servo(25,24,20,10,10);
servo(25,24,10,10,10);
servo(25,24,5,10,10);
servo(20,24,5,10,10);
servo(10,24,5,10,10);
servo(10,24,7,10,10);
servo(10,24,9,10,10);
servo(10,24,10,10,10);
servo(10,24,12,10,10);
servo(10,24,13,10,10);
servo(10,24,15,10,10);
servo(10,24,18,10,10);
servo(10,24,21,10,10);
servo(10,24,23,10,10);
servo(10,24,25,10,10);
servo(10,8,25,10,10);
servo(10,7,22,10,10);
servo(10,8,18,10,10);
servo(20,8,18,10,10);
servo(25,8,16,10,10);

/*
servo(15,8,20,10,10); //runter&greifer auf
servo(16,8,19,10,10);
servo(17,8,17,10,10);
servo(18,8,15,10,10);
servo(17,8,14,10,10);
servo(16,8,14,10,10);
servo(15,8,14,10,10);//greifer zu
servo(14,8,14,10,10);
servo(13,8,14,10,10);
servo(12,8,14,10,10);
//=(greifer,baseturn,beuger1
servo(12,8,14,10,10);//hoch
servo(12,8,14,10,10);
servo(12,8,16,10,10); //links drehung beginn
servo(12,10,19,10,10);
servo(12,13,21,10,10);
servo(12,15,23,10,10);
servo(12,18,21,10,10);
servo(12,21,19,10,10);
servo(12,22,17,10,10);
servo(12,23,16,10,10);
servo(12,24,13,10,10); //links drehung ende
servo(12,24,12,10,10);//runter greifer auf
servo(13,24,10,10,10);
servo(19,24,10,10,10);
servo(19,24,15,10,10); */
}

return 0;
}


gruss

radbruch
30.10.2008, 23:01
Hallo

Sehr hübsch. Um die Abläufe etwas flüssiger zu gestalten habe ich bei meinen Greifern solche Konstruktionen verwendet:


// Als Ersatz für z.B.:
servo(25,24,20,10,10);
servo(25,24,10,10,10);
servo(25,24,5,10,10);
servo(20,24,5,10,10);

// Startposition
servo(25,24,20,10,10);
// das Servo sollte noch genug Zeit haben um die neue Position zu erreichen
servo_stellzeit=5;
for(i=20;i>5; i--) servo(25,24,i,10,10);
// oder mit variablen Schrittweiten:
for(i=20;i>5; i--)
{
servo(25,24,i,10,10);
if(i>10) i--;
}
// oder eine zweite Achse gleichzeitig
for(i=20;i>5; i--) if(i>10) servo(25,24,i,10,10); else servo(20,24,i,10,10);


Weiterhin viel Spaß mit deinem Greifarm

mic

carlitoco
03.11.2008, 15:07
So sind die Bewegungen auch etwas schöner:
computerkalle.de/rp6.php RP6 Servoarm Video


#include "RP6RobotBaseLib.h"

uint8_t i, pause, servo_stellzeit, servo_delay;

void servo(uint8_t w0, uint8_t w1, uint8_t w2, uint8_t w3, uint8_t w4)
{
unsigned int count=0;
do{
PORTA |= E_INT1; // E_INT1 (Pin8)
sleep(w0);
PORTA &= ~E_INT1;
PORTC |= 1; // SCL (Pin10)
sleep(w1);
PORTC &= ~1;
PORTC |= 2; // SDA (Pin12)
sleep(w2);
PORTC &= ~2;
PORTB |= 1;
sleep(w3);
PORTB &= ~1;
PORTB |=2;
sleep(w4);
PORTB &=~2;
sleep(servo_delay-(w0+w1+w2+w3+w4));
//sleep(127);
} while (count++ < servo_stellzeit);
mSleep(2000*pause);
}

int main(void) {

initRobotBase();
i=0;
servo_stellzeit=2;
DDRA |= E_INT1; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
// 5 - 15 - 24 // Min - Mitte - Max
//servo(24,15,20,10,10);
//servo(15,5,20,10,10); // Grundstellung
servo(24,24,20,10,10);
servo(24,24,20,10,10);
servo(24,24,20,10,10);
while (1)
{//servo(greifer auf/zu,links/rechts,up/down,10,10);
servo(24,24,20,10,10); //runter
servo(24,24,19,10,10);
servo(24,24,18,10,10);
servo(24,24,17,10,10);
servo(24,24,16,10,10);
servo(24,24,15,10,10);
servo(24,24,14,10,10);
servo(24,24,13,10,10);
servo(24,24,12,10,10);
servo(24,24,11,10,10);
servo(24,24,10,10,10);
servo(24,24,9,10,10);
servo(24,24,8,10,10);
servo(24,24,7,10,10);
servo(24,24,6,10,10);
servo(24,24,5,10,10);//greifen
servo(23,24,5,10,10);
servo(22,24,5,10,10);
servo(21,24,5,10,10);
servo(20,24,5,10,10);
servo(19,24,5,10,10);
servo(18,24,5,10,10);
servo(17,24,5,10,10);
servo(16,24,5,10,10);
servo(15,24,5,10,10);
servo(14,24,5,10,10);
servo(13,24,5,10,10);
servo(12,24,5,10,10);
servo(11,24,5,10,10);
servo(10,24,5,10,10); //hoch
servo(10,24,6,10,10);
servo(10,24,7,10,10);
servo(10,24,8,10,10);
servo(10,24,9,10,10);
servo(10,24,10,10,10);
servo(10,24,11,10,10);
servo(10,24,12,10,10);
servo(10,24,13,10,10);
servo(10,24,14,10,10);
servo(10,24,15,10,10);
servo(10,24,16,10,10);
servo(10,24,17,10,10);
servo(10,24,18,10,10);
servo(10,24,19,10,10);
servo(10,24,20,10,10);
servo(10,24,21,10,10);
servo(10,24,22,10,10);
servo(10,24,23,10,10); //Drehung, von recht nach links
servo(10,23,24,10,10);
servo(10,22,24,10,10);
servo(10,21,24,10,10);
servo(10,20,24,10,10);
servo(10,19,24,10,10);
servo(10,18,24,10,10);
servo(10,17,24,10,10);
servo(10,16,24,10,10);
servo(10,15,24,10,10);
servo(10,14,24,10,10);
servo(10,13,24,10,10);
servo(10,12,24,10,10);
servo(10,11,24,10,10);
servo(10,10,24,10,10);
servo(10,9,24,10,10);
servo(10,8,23,10,10); //runter
servo(10,8,22,10,10);
servo(10,8,21,10,10);
servo(10,8,20,10,10);
servo(10,8,19,10,10);
servo(10,8,18,10,10);
servo(10,8,17,10,10);
servo(10,8,16,10,10);
servo(11,8,15,10,10);//greifer auf
servo(12,8,15,10,10);
servo(13,8,15,10,10);
servo(14,8,15,10,10);
servo(15,8,15,10,10);
servo(16,8,15,10,10);
servo(17,8,15,10,10);
servo(18,8,15,10,10);
//servo(19,8,14,10,10); //hoch
servo(18,8,16,10,10);
servo(18,8,17,10,10);
servo(18,8,18,10,10);
servo(19,8,19,10,10);
servo(20,8,20,10,10);
servo(20,8,21,10,10);
servo(20,8,22,10,10);
servo(20,8,23,10,10);
servo(20,8,24,10,10);
servo(20,9,24,10,10); //Drehung, von links nach rechts
servo(20,10,24,10,10);
servo(20,11,24,10,10);
servo(20,12,24,10,10);
servo(20,13,24,10,10);
servo(20,14,24,10,10);
servo(20,15,24,10,10);
servo(20,16,24,10,10);
servo(20,17,24,10,10);
servo(20,18,24,10,10);
servo(20,19,24,10,10);
servo(20,20,24,10,10);
servo(20,21,24,10,10);
servo(21,22,24,10,10);
servo(22,23,24,10,10);
servo(23,24,24,10,10);
}

return 0;
}