PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo 180 Grad drehen



twebworld
22.10.2007, 17:28
Hallo :-)

Ich möchte einen Servo um 180 Grad drehen.
Dann soll er so verweilen bis er einen Befehl bekommt sich wieder um 180 GRad zurückzudrehen.

Könnt ihr mir da weiterhelfen wie ich das mit einem RP6 am unkompliziertesten löse.

MFG

Twebworld

radbruch
22.10.2007, 18:48
Hallo

Viel schlanker gehts wohl nicht mehr:


unsigned char servo_stellzeit;

void servo(unsigned char winkel){
unsigned int count=0;
do{
count++;
extIntON();
sleep(winkel);
extIntOFF();
sleep(255);
}while (count<servo_stellzeit);
}
winkel bei meinem Testservo zwischen 15-90 für 180° , stellzeit je nach Schrittweite zwischen 5 und 50. Steueranschluß des Servos am E-INT-Pin(8) am XBUS-Stecker des RP6.

Gruß

mic

twebworld
22.10.2007, 19:19
Vielen DAnk :-)

radbruch
22.10.2007, 20:36
Immer gerne.

mic

btw:
Mein 3-Servo-Adapter:
http://radbruch.roboterbastler.de/rp6/pics/servo-adapter-oben_klein.jpg (http://radbruch.roboterbastler.de/rp6/pics/servo-adapter-oben.jpg) http://radbruch.roboterbastler.de/rp6/pics/servo-adapter-unten_klein.jpg (http://radbruch.roboterbastler.de/rp6/pics/servo-adapter-unten.jpg)
Anschlüsse:
E_INT1 (Pin8)
SCL (Pin10)
SDA (Pin12)

Globi
28.03.2011, 20:45
Hallo erst mal...
ich habe seit einigen Tagen einen RP6 und lese viel und gerne hier im Forum,
nun hab ich mir auch den Billigservo von Conrad beschafft, nur fuzt bei mir kein einziges Programm bzw. Ausschnitte davon egal ob ich den servo bei den I/O - Ports oder bei den ADC0/ADC1 anschliesse....:(

kann mir villeicht einer helfen?
vielen dank im voraus

Dirk
28.03.2011, 20:59
Warum geht ds net???
Möglichkeiten, warum es nicht klappt:
1. Eines der Programme oder Ausschnitte davon
2. Die Art des Servo-Anschlusses an I/O-Ports oder ADC0/ADC1

Im Ernst: Wer soll dir bei so wenig Angaben helfen?

Globi
28.03.2011, 21:11
entschuldigung für die ungenauheiten...
das problem ist, wenn ich die *.hex dateien kompilieren will, kommen immer wieder fehler meldungen, dass gewisse konstante nicht definiert seien.
muss man da etwas in der lib ändern?

RolfD
28.03.2011, 21:13
Welches Programm?
Welche Fehlermeldungen?
Welche Konstanten?
Welche Lib?

Die Glaskugel ist leider grade in der Spülmaschine...

Globi
28.03.2011, 21:17
programmers notepad 2
Fehlermeldung: bei obigem programm: 1. error: expected ';', ',' or ')' before numeric constant
2. error: expected ';', ',' or ')' before numeric constant
die RP6lib

RolfD
28.03.2011, 21:21
Sie.. die Kugel ... is zwar noch nass aber ich denke, da fehlt irgendwo ne Klammer oder ein ;
Da Du den PN benutzt - ich meinte zwar welchen Source aber egal... - kannst du es recht einfach finden wenn du mal auf die Fehler bzw. deren Zeilennummern achtest und klammern zählst! Fehlermeldungen sind keine Verziehrungen, weisst du....

radbruch
28.03.2011, 21:25
Hallo Globi,

erstmal willkommen im RN-Forum und Glückwunsch zum RP6.

Wenn du schreibst "nun hab ich mir auch den Billigservo von Conrad beschafft.." bedeutet das dann, dass du dir wirklich nur ein Servo beschafft hast?

Ist das Servo richtig angeschlossen? Plus auf Plus, Minus auf Minus und Signal auf den Ausgangspin des RP6? Blinken die LEDs beim Anschluss an die I/O-Ports IO1-IO4? ADC0/1 sind nicht servokompatibel, Plus und Minus am Servostecker muss getauscht werden.

Funktionieren andere selbstgeschriebene Programme? Programm im Notepad gespeichert vor dem Kompilieren? Fehlermeldungen beim Kompilieren? initRobotBase(); aufgerufen? Wird das Programm unerlaubterweise beendet (keine endlose while(1)-Schleife)?

Zeig doch mal eines der von dir getesteten Programme...

Gruß

mic

Globi
28.03.2011, 21:26
ich würde sie abtrocknen, mitnem handtuch oder soo....
aber 1. funzt ja bei denen da oben auch, und 2. wenn ich die klammern setze kommen noch 50 neue fehlermeldungen hinzu:
RP6Servo_Move_02.c:6: error: expected identifier or '(' before numeric constant
RP6Servo_Move_02.c:8: warning: implicit declaration of function 'servo'
RP6Servo_Move_02.c:8: error: expected expression before 'unsigned'
RP6Servo_Move_02.c:8: error: expected ';' before '{' token

RolfD
28.03.2011, 21:31
RP6Servo_Move_02.c:6Sehe ich richtig, das Du einfach nur Radbruchs Schnipsel in ein nacktes File kopiert hast um es dann zu kompilieren?

Das kann nicht gut gehen... ich würd Dir vielleicht erst mal empfehlen, etwas Grundwissen über C anzueignen.

http://www.rn-wissen.de/index.php/C-Tutorial

Globi
29.03.2011, 17:17
natürlich nicht.... ich habe natürlich
int main(void)
{
initRobotBase();
...
eingefügt.

Globi
29.03.2011, 17:18
hi
vielen dank für die Antwort, aber meine Frage ist eher, wie ich den Servo überhaupt ansteuern kann (z.B. mit welcher adresse) oder sind in der Library irgendwelche Befehle vorhande, die eingesetzt werden müssen?

Dirk
29.03.2011, 17:34
@Globi:

... meine Frage ist eher, wie ich den Servo überhaupt ansteuern kann ...
Zum Beispiel mit dieser Lib:
https://www.roboternetz.de/community/showthread.php?40052-RP6Base-Library-für-8-Servos&highlight=servo

Globi
29.03.2011, 20:42
Hi Dirk
danke für den Link, aber ich weiss nicht. bin ich eifach zu doof dafür?
Ich habe (wie von dir vorgeschlagen) das gesamte C-Tut. durchgelesen, die Begriffe kenn ich definitiv. Ich habe eine neue Base "...\RP6Lib\RP6baseservo\ mit RP6BaseServoLib.h & *.c, makefile verändert -> Target geändert, SRC geändert. Ich weiss nich was ich sonst noch machen soll.
Ich habe auch deinen "UR"-Code abgeändert, so dass keine zusätzliche Lib vorhanden sein muss und sie so verändert, dass nur 2 Servos angesteuert werden. bis zum Punkt, an dem "servo2_position" definiert werden muss gehts gut.
könnte mir jemand mal ein komplettes file ohne zusätzl. Libs schicken? Bei mir funzt Learning-by-doing am besten.

RolfD
29.03.2011, 23:34
Hallo Globi,
es tut mir ja leid, das ich dich mehr oder weniger offen kritisiere aber ich sehe von Dir in erster Linie Aktionismus aber wenig Fakten. Und das Problem haben wohl alle, die Dir helfen wollen. Zum anderen hat sich dein "Problem" scheinbar von einer fehlenden Klammer o.ä. hin zu einem komplexen Thema verschoben - und alles ohne das DU auch nur eine Zeile Code postest. Ich hab versucht Dir zu erklären, das es für eine Diagnose wichtig ist, genaue Angaben zu haben und man muss Dir immer noch alles an Infos einzeln aus der Nase ziehen... das ist weder angemessen noch hilfreich. Für uns nicht.. und damit für dich nicht. Das ist schlicht und einfach ignorant von Dir.

Du kannst davon ausgehen, das weder die Libs noch der Compiler irgendwelche Dich tangierenden Probleme haben - versuch also nicht an Baustellen zu stricken die keine sind. Poste den Code so wie du denkst das er laufen sollte - z.B. ggf. mit Dirks Servocode - dann die genauen Fehlermeldungen incl. Zeilennr. oder ggf. das ganze Projekt als zip und dann kann man weiter schauen. Alles andere ist Kaffesatzleserei.. und das seid dem ersten Post zum Thema. Und erwarte bitte nicht, das hier einer deine Programme schreibt, wir können Dir aufs Pferd helfen was wir auch gerne tuen, aber reiten musst du schon selbst. Dazu gehört auch, das man sich informiert, wie ein Servo angesteuert wird, was PWM ist, wie man PWM Impulse generieren kann und letztlich ausgibt. Erst dann bist du selbst nämlich in der Lage, solche Probleme auch zu beheben und sinnvolle Änderungen vor zu nehmen. Das Forum wie auch das Wiki hält reichlich Wissen dazu vor, das Dir fehlt. Ändere das. Das ist learning by doing... nicht andere Programme abschreiben!
Schau Dir nur einfach mal deinen letzten Post an - da steht absolut nichts, was aktuell an welcher Stelle wie schief läuft. Wie soll man da bitte helfen? Du bist sicher nicht zu doof dafür, aber zu oberflächlich, zu ungenau, zu hektisch, kommunikativ eine Katastrophe und zu wenig am Weg zum Ziel als am Ziel selbst interssiert. Dirks Servolib (und viele andere Ansätze) funktionieren. Das ist ein Fakt, den Du nicht mit "geht nicht" mal so eben aus der hohlen Hand negieren kannst nur weil dein Servo sich nicht rührt oder dein Compiler sich wegen Trennzeichen beschwert. Radbruch hat oben auch schon Fehlerquellen aufgezeigt, auf die Du noch nicht eingegangen bist.
Sorry ... aber wenn Du Erfolg suchst, dann geh bitte den Weg mit dem andere auch Erfolg haben. Schritt für Schritt. Das fängt bei deiner eigenen Information zum Thema an und geht bis hin zu eindeutig kommunizierten Problemstellungen hier.. und nicht allein mit einer Stichwortliste was Du alles geändert hast! Denn darunter können wir uns genau 0 vorstellen.
Hier sitzen min. 3 erfahrene Leute im Thread, die Dir helfen möchten aber Dank deiner magelhaften Angaben nicht können. Und dies ist nicht der erste Post, der dich explizit und deutlich darauf hinweist. Bedenke dies bei deinem nächsten Post bitte.

Manchmal hat man eben so Fälle, wo Leute Supportresistent sind. Vielleicht überlegst du mal, welche Infos DU bräuchtest, um so ein Problem bei jemand anderem zu lösen - mal abgesehen von einer "Fixundfertig"-Lösung die du schon aus Prinzip hier nach der Vorgeschichte hoffentlich nicht bekommst.
LG Rolf

Dirk
30.03.2011, 15:45
@Globi:

Ich habe eine neue Base "...\RP6Lib\RP6baseservo\ mit RP6BaseServoLib.h & *.c
Wenn du die Servos mit meiner Lib (Link in 29.3., 18:34 siehe oben!) ansteuern willst, geht das nur mit den Original-Libs des RP6, denn dafür sind sie geschrieben.

Wie gesagt: Poste mal dein Programm und die veränderten Libs.

Grundsätzlich ist es nicht gut, viele Dinge gleichzeitig zu verändern (andere Libs, neues Programm, unbekannte Programmteile von anderen Leuten ...). Bleib am besten erst bei den Original-Libs, bis du das alles besser verstehst.

Globi
01.04.2011, 16:53
Hallo alle miteinander,
nun habe ich es endlich geschaft (nach eingehender Literatur) und fachkundiger anleitung in etwa 13 Forumsbeiträge ;-)
Die Ansteuerung von Port ADC0 läuft ja über DDRA |= 1; und in der Positionsbestimmung PORTA |= 1; .
Mein Programm:

#include "RP6RobotBaseLib.h"

uint8_t i;
int main(void)
{
initRobotBase();
DDRA |= 1;

while(true)
{
for(i=0;i<100; i++)
{
PORTA |= 1;
sleep(5);
PORTA &= ~1;
sleep(200-5);
}
for(i=0;i<100; i++)
{
PORTA |= 1;
sleep(15);
PORTA &= ~1;
sleep(200-15);
}
for(i=0;i<100; i++)
{
PORTA |= 1;
sleep(25);
PORTA &= ~1;
sleep(200-25);
}
for(i=0;i<100; i++)
{
PORTA |= 1;
sleep(15);
PORTA &= ~1;
sleep(200-15);
}
}
return(0);
}


Nun meine Frage: wie kann ich den ADC1 Port ansteuern?
Ich habe keine brauchbaren Infos gefunden wie ich den Port 1 ansteuern kann.
könnte mir vieleicht jemand helfen?
danke

RolfD
01.04.2011, 17:06
ADC1 ist ein normaler Port pin und definiert in RP6RobotBase.h

#define ADC1 (1 << PINA1) // ADC1 (Input)

Folglich kannst Du den als Port steuern wie auch deine anderen Portleitungen.

Details zum ADC findest Du im Datenblatt des Prozessors, welche auf der RP6 CD zu finden ist.

Und da ich nicht nur meckere, lobe ich nun doch mal das du am Thema dran bleibst.
LG Rolf

radbruch
01.04.2011, 17:14
Sensationell, Glückwunsch zum Erfolg :)

ADC1 ist der zweite Portpin und wird mit

DDRA |= 2; // Datenrichtung Ausgang
PORTA |= 2; // high
PORTA &= ~2; // low

angesprochen. Beispiel:

int main(void)
{
initRobotBase();
DDRA |= 1+2;

while(true)
{
for(i=0;i<100; i++)
{
PORTA |= 1;
sleep(5);
PORTA &= ~1;
PORTA |= 2;
sleep(15);
PORTA &= ~2;
sleep(200-5-15);
}
...