PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC0 am RP6



.:Robin:.
09.01.2009, 23:19
Hi hab an Weihnachten einen RP6 bekommen und jetzt wollt ich mal en Servo am ADC0 beim RP6 anschließen, aber was muss ich programmieren dass sich der Servo dann auch bewegt.

radbruch
09.01.2009, 23:48
Hallo

Es gibt unzählige Möglichkeiten ein Servo anzusteuern. Eine kleine Auswahl:

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

Glückwunsch zum RP6 und willkommen im RN-Forum (das auch eine Suchfunktion hat).

Gruß

mic

.:Robin:.
10.01.2009, 00:13
ja schon aber gib mir mal en beispiel code den ich benutzen kann wenn den servo am ADC0 angeschlossen hab.
Bei dem link den du gepostet hast kam nur was wo ma des am XBUS anschließt.
und ich glaub da gibts dann auch en quellcode unterschied

Gruß Robin

radbruch
10.01.2009, 00:33
Das hier kannst du auch für adc0 verwenden:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=45180

Ein besseres Konzept als meine verwirrenden Versuche ;)

.:Robin:.
10.01.2009, 01:11
Also ganz ehrlich...
ich bekomm des nich hin

radbruch
10.01.2009, 01:53
Mein RP6 ist grad eingemottet, ich kann's deshalb nicht testen:

// Servoansteuerung mit sleep(), Servoimpuls an ADC0 10.1.09 mic

#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase(); // initialisieren
DDRA |= 1; // Datenrichtung Port A Bit 0 (das ist ADC0) auf Ausgang

while(true) // endlos Impulse für Servomitte senden
{
PORTA |= 1; // Ausgang auf high setzen (Impulsstart für Servo)
sleep(15); // sleep(1) verzögert ca. 100µsec, sleep(15) dann ca. 1,5ms=Servomitte
PORTA &= ~1; // Ausgang auf low setzen (Impulsende für Servo)
sleep(200-15); // 20ms-Impulslänge warten vor nächstem Impuls
}
return(0);
}

Die Beschreibung von sleep() in der Library:


/**
* Delay with the help of the 10kHz timer.
* sleep(10) delays for *about* 1ms! Not exaclty, as we do not use assembly routines
* anywhere in this library!
*
* This is a blocking routine, which means that the processor
* will loop in this routine and (except for interrupts) the
* normal program flow is stopped!
* Thus you should use the Stopwatch functions wherever you can!
*
* Example:
* sleep(1); // delay 1 * 100us = 100us = 0.1ms
* sleep(10); // delay 10 * 100us = 1000us = 1ms
* sleep(100); // delay 100 * 100us = 10000us = 10ms
* // The maximum delay is:
* sleep(255); // delay 255 * 100us = 25500us = 25.5ms
*/
void sleep(uint8_t time)
{
for (delay_timer = 0; delay_timer < time;);
}

Infos zum Impulstimeing der Servos gibt's im RN-Wissen.

Gruß

mic

.:Robin:.
10.01.2009, 12:03
tut nich kann aber auch sein dass der Servo falsch eingesteckt ist ?
bei mir is des
Schwarze Kabel an 3
Rote Kabel an 2
und weiß an 1

radbruch
10.01.2009, 14:33
Hallo

Das Programm habe ich nun getestet und wie erwartet funktioniert es auch leidlich. Deine Pinbelegung scheint nicht zu passen:

http://radbruch.roboterbastler.de/rp6/ports/adc_klein.jpg (http://radbruch.roboterbastler.de/rp6/ports/adc.jpg)
(Anklicken! (http://radbruch.roboterbastler.de/rp6/ports/adc.jpg))

Die Anschlüsse ADC0 und 1 passen leider nicht zu den Standartservosteckern, +(VDD,1) und -(GND,2) sind vertaucht. Allerdings kann man recht einfach die Servostecker umbelegen:

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

Viel Erfolg

mic

.:Robin:.
10.01.2009, 16:34
hey danke jetzt funktioniert alles :)

.:Robin:.
10.01.2009, 19:36
ich hab dein code kopiert und jetzt bewegt sich der Sensor nach rechts, da ich mich beim prorammieren nich no auskenn ne neue frage:
wie beweg ich den sensor jetzt nach links

Gruß Robin

radbruch
10.01.2009, 20:00
Hallo

Ich vermute, mit "Sensor" meinst du das Servo.

Das einfach Programm oben sollte das Servo immer in die Mittelstellung bewegen. Hier eine kleine Erweiterung für zwei Positionen:

// Servoansteuerung mit sleep(), Servoimpuls an ADC0, 2 Positionen 10.1.09 mic

#include "RP6RobotBaseLib.h"

uint8_t i;

int main(void)
{
initRobotBase(); // initialisieren
DDRA |= 1; // Datenrichtung Port A Bit 0 (das ist ADC0) auf Ausgang

while(true)
{
for(i=0;i<100; i++) // 100 mal Impuls für Position 1 senden
{
PORTA |= 1;
sleep(10);
PORTA &= ~1;
sleep(200-10);
}
for(i=0;i<100; i++) // 100 mal Impuls für Position 2 senden
{
PORTA |= 1;
sleep(20);
PORTA &= ~1;
sleep(200-20);
}
}
return(0);
}
Die For-Schleifen senden den jeweiligen Impuls mehrmals um dem Servo Zeit zu geben die neue Position anzufahren.

Gruß

mic

.:Robin:.
10.01.2009, 20:19
hmm ich glaub mein servo is kaputt die enzige bewegung die er macht ist nach rechts.
Gruß Robin

radbruch
10.01.2009, 20:35
Hallo

Vielleicht stimmen auch die Anschlüsse noch nicht und Impuls ist mit VDD vertauscht. Deine Aderfarben würde ich so zuordnen:

weis = Signal
rot = Spannungsversorgung +
schwarz = Spannungsversorgung -

Das würde als Steckerbelegung am ADC0 dann so aussehen:

1 - rot
2 - schwarz
3 - weis

Hast du Infos zu dem Servo? Typ, Hersteller, Bezugsquelle und Artikelnummer...

Gruß

mic

.:Robin:.
22.01.2009, 18:26
Hey danke jetzt tut alles

Gruß Robin

.:Robin:.
18.03.2009, 21:39
so hab mal wieder ne frage

hat Impuls eigendlich eine Bezeichnung ?

... weiß am XBus1 nich wo der impuls is

Gruß Robin

Dirk
18.03.2009, 21:48
... weiß am XBus1 nich wo der impuls is
Impuls? Wenn du fragen willst, wo ADC0 zu finden ist (darum gings hier ja mal!), dann gibts den nicht am XBUS.
Schau mal auf die Hauptplatine des RP6. Da gibt es zwei weiße Rahmen mit "1 2 3" drin, da steht an einem auch ADC0 dran.

Gruß Dirk

.:Robin:.
18.03.2009, 22:28
nein... mein adc 0 und adc 1 sind belegt und jetzt wollt ich noch en servo anschließen
... und dachte des geht am XBUS
... am XBUS find ich VDD und GND aber ich weiß net wo ich das kabel für impuls hineinstecken soll

Dirk
19.03.2009, 17:28
am XBUS find ich VDD und GND aber ich weiß net wo ich das kabel für impuls hineinstecken soll
Es gibt am XBUS noch drei Portpins (SCL, SDA und E_INT1). Wenn du VDD und GND im Anhang der M32-Anleitung am Stecker gefunden hast, wirst du auch diese 3 Pins finden.

Gruß Dirk

.:Robin:.
19.03.2009, 21:02
ok thx

Gruß Robin

.:Robin:.
21.03.2009, 20:47
ok weiß jetzt wo

SLK,SDA,E_INT

ist, aber dort gibt es 2x VDD und 3x GND und ich dachte des wär irgendwie unlogisch sowas herzustellen und dachte vielleicht gibt es noch sowas wie VDD nur mit anderer bezeichnung.
So und meine Frage gibt es einen Pol der auch VDD ist aber nicht VDD heißt ?

SKIZZE:

http://twsp.de/downloads/RP6_MANUAL_DE_20071219.pdf%20-%20Adobe%20Reader.bmp

Dirk
21.03.2009, 23:31
So und meine Frage gibt es einen Pol der auch VDD ist aber nicht VDD heißt ?
Nein.

Gruß Dirk

.:Robin:.
22.03.2009, 09:08
des heißt man kann an einem XBUS höchstens 2 Servos anschließen ?

(ich wollte nämlich 17 Servos anschließen)

Gruß Robin

Dirk
22.03.2009, 12:15
Nein: 3

Gruß Dirk