PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zwei 550er Motoren mit RP6 ansteuern (Help)



Paolo
23.02.2009, 20:22
Hallo erstmal

Ich bin absolut neu auf diesem sector Robotic, aber ich habe mir den RP6 zugelegt und gleich über das Ziel hinaus geschossen 8-[ und jetzt würde ich mich sehr freun wenn ihr mir helfen könntet.

Ich wollte meinen rp6 auf ein Amphibien Fahrzeug aufbauen, dass von 2 Motoren angetrieben wird, 2 x 550er Motoren EF 76 II S (RS-550 SW) und ich dachte mir dass ich jeden Motor mit einem NiMH Akku betreibe, und das wollte ich dan über zwei Fahrtenregler ansteuern aber irgentwie bekomme ich das nicht wirklich hin.
Habt ihr für mich einen Rat der mir helfen könnte ?.

TobeFFM
26.02.2009, 19:29
einfach mal ins Datenblatt kucken, was deine 550er an Spannung haben wollen, wieviel Strom die max. ziehen, und dann halt mit dem RP6 vergleichen...ohne weitere Infos kann da keiner was zu sagen glaub ich..

Edblum
27.02.2009, 09:00
Moin,

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

Edblum

SlyD
27.02.2009, 15:45
Was sind denn das für "Fahrtregler"?
Lassen die sich über ein normales PWM Signal + Richtungspin steuern?

Falls ja, dann könntest Du die entsprechenden Signale die sonst eigentlich für die Motoren des RP6 verwendet werden auf den Pads in der Mitte des Mainboards abgreifen (ML1,MR1,DL1,DR1)...

MfG,
SlyD

Edblum
28.02.2009, 08:05
äëöüßïó°


Was sind denn das für "Fahrtregler"?
Lassen die sich über ein normales PWM Signal + Richtungspin steuern?

Hallo SlyD,

Ich habe mal den RP6 kurz angeschaut, da gibt es bereits Motorsteuerung. Ich verstehe die Probleme deshalb auch nicht. Ich arbeite selber nicht mit RP6, ich habe eine eigene Platine gebastelt un diese arbeitet mit eine Mega88 Controller und nur zwei PWM ausgänge. Mehr braucht mann nicht. Wird vorwärts gefahren, ist pwm1a aktiv, bei rückwärts pwm1b.

Benütze die Suchfunktion mit Edblum für weitere Info. Und RN-wissen Artikelbereich für RP6.

https://www.roboternetz.de/wissen/index.php/RP6

SlyD
28.02.2009, 10:32
Mir (Entwickler) brauchst Du das nicht zu erzählen ;)

Die Fragen oben waren darauf gerichtet das der Thread Eröffner da etwas zu ungenau war...
Wenn in dem Modell schon (größere) Motortreiber drin sind, kann man natürlich auch die verwenden anstatt der zwei RP6 H-Brücken. Für solche Fälle gibt es auf dem Mainboard des RP6 eben die genannten Anschlusspins. So kann man leicht eine eigene externe Motorsteuerung verwenden.

MfG,
SlyD

Paolo
01.03.2009, 19:24
Hallo
Danke für die Tipps aber leider bin ich noch immer nicht weiter, ich habe natürlich gleich das getestet was Slyd vorgeschlagen hat aber leider kommen bei den Ausgängen ML1,MR1,DL1,DR1 nur bei maxi speed 2,8 v raus. Die zwei Fahrtenregler die ich da habe sind LRP Automatic Digital Fahrtenregler Spannungsbereich 4-7 cells (4,8-8,4 V), Strombelastbarkeit 180 A , Empfängerspannung 5.0 V. Ich habe auch versucht dass ich über den XBUS1 Ansteuer aber leider bin ich was das Programme schreiben angeht die gleiche Lusche was die Elektronik betrifft, ich wäre sehr froh wenn mir da wer helfen könnte wie das geht.

Dirk
02.03.2009, 16:06
LRP Automatic Digital Fahrtenregler Spannungsbereich 4-7 cells (4,8-8,4 V), Strombelastbarkeit 180 A , Empfängerspannung 5.0 V.
Das klingt nach Fahrtreglern, die an einem Fernsteuerungsempfänger betrieben werden.
Die must du dann wie Servos ansprechen. Mit der Motor-PWM des RP6 wird das nicht gehen.

Gruß Dirk

Paolo
02.03.2009, 17:44
Danke für die Antwort Dirk ,ja das sind Fahrtregler für Fernsteuerungsempfänger hat jemand ein Beispielprogramm wie das den geht, ich habe schon versucht, dass ich sie wie Servos anspreche über adc0 und xbus1 aber leider hat das auch nicht funktioniert, das zuckt alles nur :-k bitte bitte hilfe.

SlyD
02.03.2009, 18:29
Hallo Paolo,

gibt es ne Dokumentation / Anleitung zu den Fahrtreglern?
Und wie sah denn Dein bisheriges Programm aus?
(komplett hier in [ code ] tags posten )

Hier gibts ja schon recht viele Beispiele dazu wie man Servos ansteuern kann - also was davon hast Du verwendet?

MfG,
SlyD

Paolo
02.03.2009, 19:55
Hallo
So die Motoren gehn jetzt ,hab die Fahrtenrgler über ADC0-ADC1 angeschlossen.
Aber leider drehn sich die räder gegengesätzt, aber wie schon gesagt ich bin absolut neu was das alles betrieft. Kann mir wehr helfen mit dem Programm

Paolo
05.03.2009, 07:49
]Hallo
So die Motoren gehn jetzt ,hab die Fahrtenrgler über ADC0-ADC1 angeschlossen.
Aber leider drehn sich die räder gegengesätzt, aber wie schon gesagt ich bin absolut neu was das alles betrieft. Kann mir wehr helfen mit dem Programm.


}

#include "RP6RobotBaseLib.h"

uint8_t i;

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

while(true)
{
for(i=1;i<100; i++)

{
PORTA |= 1;
sleep(20);
PORTA &= ~1;
sleep(10-1);
PORTA |= 2;
sleep(20);
PORTA &= ~2;
sleep(10-2);

}
}
return(0);
}

Dirk
05.03.2009, 16:56
Aber leider drehn sich die räder gegengesätzt,...
Vorschlag: Einen Motor umpolen?

Gruß Dirk

Paolo
07.03.2009, 16:33
Hallo
Ich habe jetzt mal den Motor umgepolt, aber damit ist das Problem leider nur halb behoben, weil der Roboter ja auch mal rückwärts fahren soll.
Ich hab schon viele Sachen an dem Programm Code geändert. Gibts da nicht eine andere Möglichkeit (Programm Code) um vorwärts, rückwärts links und rechts zu Fahren, hab echt schon viele Sachen versucht aber leider ist der Erfolg ausgeblieben, leider. Als kompletter Anfänger ist das nicht ganz so einfach und die Programme für den RP6 sind halte auch alle so geschrieben das der Antrieb über den normalen Ausgang geht ,und die was im Roboternetz Forum zu finden sind, sind so geschrieben, dass sie Servos Ansteuern und den Programm Code den ich da habe von mic geht echt super aber nur in eine Richtung.

radbruch
07.03.2009, 16:44
...den Programm Code den ich da habe von mic geht echt super ...
Ähm, Einspruch, SO geht das eher gar nicht. Mein Code ist hier mehr schlecht als recht kopiert. Damit erzeugst du nur irgendwelchen Impulsmüll den der Regler nicht interpretieren kann. Auch mit der einfachen Sleep()-Ansteuerung muss man sich an das Timeing der Servos halten:


PORTA |= 1;
sleep(5);
PORTA &= ~1;
PORTA |= 2;
sleep(15);
PORTA &= ~2;
sleep(180);

Pr0gm4n
07.03.2009, 17:16
Hey,

also wie du sicher schon irgendwo gelesen hast (falls nicht dann geh hier hin: Servo) wird der servo über die länge des impulses an seine position dirigiert

bei motoren wird es normal über die spannung gemacht, der fahrtenregler übernimmt das aber für dich...

beim servo sind 1ms länge = linker anschlag (oder rechts kA) und 2 ms der andere

bei 1,5 ms steht er in der mitte

bei motoren ist es so, dass der motor bei 1,5 ms stillsteht, alles was drüber (bis maximal 2ms) ist ist vorwärts (oder rückwärts kA; je näher an 2 desto schneller) und alles was drunter ist bis minimal 1 ms ist rückwärts (vgl. drüber)

versuchs also mal so:



#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
DDRA |= 1;
DDRA |= 2;
int x = 12; // 10<=x<=20; wenn x >15 in die eine richtung, x<15 in die andre, x=15 stillstand

while(true)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
return(0);
}


ach ja, ich hab mal die for-schleife raus, die war ja unnötig xD

LG Pr0gm4n

Dirk
08.03.2009, 13:25
Hi Paolo,

da hast du ja jetzt ne Menge Möglichkeiten, die Fahrtregler anzusteuern.
Hier kommt noch eine:

Wenn du meine RP6BaseServoLib für 8 Servos aus diesem Beitrag:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=45180
... nehmen willst, dann hier eine Demo dafür zur Ansteuerung eines Fahrtreglers an der Status LED 1:

/*
* ************************************************** **************************
* RP6 ROBOT SYSTEM - ROBOT BASE TESTS
* ************************************************** **************************
* Test: Servo Test 2
* Author(s): Dirk
* ************************************************** **************************
* Description:
* This is a small test for the RP6 Base Servo Library for the RP6 ROBOT BASE.
*
* COMMENT: It is a good idea to use a separate power supply for the servos!
*
* Servo connections:
* SERVO1 -> Status LED 1 (SL1) SERVO5 -> Status LED 5 (SL5)
* SERVO2 -> Status LED 2 (SL2) SERVO6 -> Status LED 6 (SL6)
* SERVO3 -> Status LED 3 (SL3) SERVO7 -> PC0 (I2C bus: SCL)
* SERVO4 -> Status LED 4 (SL4) SERVO8 -> PC1 (I2C bus: SDA)
* If you want to use the RP6 bumpers in your program, you should not
* connect servos to SL3 and SL6.
* It is not possible to use the I2C bus, if servos are connected to SCL
* and/or SDA. Instead of SCL/SDA you could use ADC0/ADC1 for servo 7/8,
* if you want to use the I2C bus.
*
* ################################################## ##########################
* The Robot does NOT move in this example! You can simply put it on a table
* next to your PC and you should connect it to the PC via the USB Interface!
* ################################################## ##########################
* ************************************************** **************************
*/

/************************************************** ***************************/
// Includes:

#include "RP6BaseServoLib.h" // The RP6 Base Servo Library.

/************************************************** ***************************/
// Defines:

#define MOTOR_FORWARD_FULL RIGHT_TOUCH
#define MOTOR_FORWARD_HALF (MIDDLE_POSITION / 2 + MIDDLE_POSITION)
#define MOTOR_STOP MIDDLE_POSITION
#define MOTOR_BACK_HALF (MIDDLE_POSITION / 2)
#define MOTOR_BACK_FULL 0

/************************************************** ***************************/
// Variables:

uint16_t pos = 0;

/************************************************** ***************************/
// Functions:

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

int main(void)
{
initRobotBase(); // Always call this first! The Processor will not work
// correctly otherwise.

// ---------------------------------------
// Write messages to the Serial Interface:
writeString_P("\n\n _______________________\n");
writeString_P(" \\| RP6 ROBOT SYSTEM |/\n");
writeString_P(" \\_-_-_-_-_-_-_-_-_-_/\n\n");

writeString_P("################\n");
writeString_P("<<RP6 Base>>\n");
writeString_P(" Servo - Test 2 \n");
writeString_P(" Version 1.00 \n");
writeString_P("################\n\n");
mSleep(2500);

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

// Initialize the servo lib for use of only servo 1:
initSERVO(SERVO1);

startStopwatch2(); // Used for the demo

pos = 2; // Start with motor stopped
servo1_position = MOTOR_STOP;

while(true)
{
// ---------------------------------------------------------------------
// The demo code for positioning a drive controller (servo 1):
if (getStopwatch2() > 5000) { // Change position every ~5s
if (pos == 0) {
servo1_position = MOTOR_BACK_FULL;}
if (pos == 1) {
servo1_position = MOTOR_BACK_HALF;}
if (pos == 2) {
servo1_position = MOTOR_STOP;}
if (pos == 3) {
servo1_position = MOTOR_FORWARD_HALF;}
if (pos == 4) {
servo1_position = MOTOR_FORWARD_FULL;}
if (pos == 5) {
servo1_position = MOTOR_FORWARD_HALF;}
if (pos == 6) {
servo1_position = MOTOR_STOP;}
if (pos == 7) {
servo1_position = MOTOR_BACK_HALF;}

pos++;
if (pos > 7) {pos = 0;}
setStopwatch2(0);
}
// ---------------------------------------------------------------------

task_SERVO(); // The main servo task
task_RP6System();
}
return 0;
}

/************************************************** ****************************
* Additional info
* ************************************************** **************************
* Changelog:
* - v. 1.0 (initial release) 08.03.2009 by Dirk
*
* ************************************************** **************************
*/

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

Die Änderungen für 2 Fahrtregler an ADC0/1 im Programm und in der Lib sind einfach und werden in der Lib beschrieben.

Die Demo steuert den Motor von Stop auf halbe Kraft vorwärts, volle Kraft vorwärts, wieder halbe Kraft, Stop, halbe Kraft rückwärts, volle Kraft rückwärts, usw. Jede Stellung wird 5 Sekunden gehalten.

Gruß Dirk

Pr0gm4n
08.03.2009, 13:57
Hi,

also Dirk, ich erkenn da nen kleinen fehler:


#define MOTOR_FORWARD_HALF (MIDDLE_POSITION / 2 + MIDDLE_POSITION)

ich nehm mal an die defines stehen für zeiten...

da MIDDLE_POSITION ja 1,5 ms sind gäbe MOTOR_FORWARD_HALF ja dann 1,5/2 + 1,5 = 2,25

der impuls darf aber bloß 2 ms lang sein, also warum machst du's so und nicht über (MIDDLE_POSITION - 1)/2 + (MIDDLE_POSITION - 1) ?

(oder hab ich mich getäuscht und middle_position ist bei dir nur 0,5 ms und du addest jedes mal unabhänig vom wert eine ms? ich hab die lib leider ned vorliegen, ich hol se mir gleich und guck nochmal nach :-D)

LG Pr0gm4n

Dirk
08.03.2009, 14:34
Hi Pr0gm4n,

Danke für den Hinweis!
Bei meinen Libs nehme ich immer Werte für die Servoposition von 0 (linker Anschlag) bis Maximum, z.B. 254 (rechter Anschlag).
MIDDLE_POSITION (= MOTOR_STOP) ist dann 127 und RIGHT_TOUCH (= MOTOR_FORWARD_FULL) ist 254.

Dann ist MOTOR_FORWARD_HALF = 127 / 2 + 127 = 191 (3/4 Servoweg).
MOTOR_BACK_HALF = 127 / 2 = 64 (1/4 Servoweg).

Aber du hast Recht: Wahrscheinlich wird der Fahrtregler keine lineare Abhängigkeit der Motorgeschwindigkeit von der Impulslänge haben, so dass man die halben Geschwindigkeiten noch "eichen" müßte.

Gruß Dirk

Pr0gm4n
08.03.2009, 14:45
Hi,

doch, der fahrtenregler hat da eine lineare abhängigkeit, zwar nicht von motorgeschwindigkeit und impulslänge sondern von stromfluss ~ (impulslänge - 1ms)

LG Pr0gm4n

Paolo
08.03.2009, 20:02
Hallo
Danke für eure Hilfe ,ich werde mich gleich mal an die Sache ran schmeissen ,meine vorherigen versuche waren ja nicht so gut von mir :shock: ,mein Robi ist mir mit quietschenden Reifen davon ich dachte echt er haut mit der Terassentür ab, aber sie hat ihn doch noch gebremst :oops: ,und ab jetzt muss ich wohl ein klein wenig aufpassen.

Pr0gm4n
08.03.2009, 20:16
Hi,

solltest den robby vlt. nächstes mal so hinstellen dass seine reifen den boden ned berühren xD

LG Pr0gm4n

Paolo
09.03.2009, 20:15
Hallo
Danke für die ganzen Tipps ,Dirk mit deinem Demo Programm komme ich leider noch nicht ganz klar. Ich habe da immer wieder Fehler Meldungen wenn ich da die ADC1 u. ADC2 einfüge, irgentwas mach ich da falsch, bin ja der volle Anfänger.
Ich hab da noch eine Frage, bei dem Programm mit dem ich gerade experimentiere ist zwar ganz gut zum testen aber leider ist es sehr schwer die Räder untereinander einzustellen, ADC1 u. ADC0 sind doch zwei seperate Ein und Eusgänge? Warum ändert es z.b die Geschwindigkeit an ADC1 wenn ich an ADC0 was ändere? oder anderst herum.

8-[
Ich hab auch bei dem code schon alles geändert, aber ich komm da nicht wirklich weiter ,ich habe auch die Werte wo das x steht geändert aber sobald ich bei irgent einen was ändere dreht sich das eine schneller und das andere langsamer was ja ok wäre wens nicht zu schnell wäre dann hab ich es geschafft dass ich es langsamer kriege aber dafür geht das andere garnicht mehr oder zu schnell oder wieder anderst rum das ist der jammer echt, ich dachte immer wenn ich eine Seite eingestellt habe dann bleibt das so und sobald ich mich dann an das andere Rad mache verändere ich automatisch das andere wieder mit ](*,) was habe ich den falsch verstanden?.



#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
DDRA |= 1;
DDRA |= 2;
int x = 15; // 10<=x<=20; wenn x >15 in die eine richtung, x<15 in die andre, x=15 stillstand

while(true)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
return(0);
}

Pr0gm4n
09.03.2009, 21:26
Hi,

das iss doch der code den ich geschrieben hab oder?

im prinzip solltest du verstehen, der code macht im moment folgendes:

-init
-dann DDRA-bits 0 und 1 auf ausgang setzen

dann macht er nen 1,5 ms impuls an Pin PA0, dann nen 1,5ms impuls an PA1 und dann wartet er 17ms, dann fängt er wieder mit 1,5ms impuls an PA0 an...

sollte schon klappen denk ich ;D

wenn nich, dann beschreib doch mal was er macht xD

also der code hier iss natürlich nur zum geradeausfahren gedacht, er sollte, so meine hoffnung das eigentlich auch tun...

hast du die pins auch ja richtig angeschlossen?

hast du zufällig nen servo da damit dus damit schnell überprüfen könntest?

wenns mit dem servo geht, dann wird dein fahrtenregler entweder anders angesteuert oder er ist kaputt xD

LG Pr0gm4n

radbruch
09.03.2009, 21:45
Hallo

Wenn ich mit deinem Programm ein normales Servo ansteuere stellt es sich brav auf eine Position, allerdings nicht auf die Mitte. Möglicherweise ist die Auflösung mit der sleep()-Funktion einfach nicht fein genug um den Nullpunkt der Regler zu treffen.


Warum ändert es z.b die Geschwindigkeit an ADC1 wenn ich an ADC0 was ändere?Das geht vielleicht in die selbe Richtung. Ein Impulszyklus dauert die Summe der einzelnen Sleep()s und ist vielleicht nicht genau genug 20 ms lang. Möglicherweise reagiert der Regler darauf unerwartet.

Ich würde zu einer etwas kompfortableren Impulserzeugung via ISR raten, allerdings ist das zusammen mit der RP6-Library nicht ganz einfach.

Gruß

mic

Pr0gm4n
09.03.2009, 23:06
Hi,

danke dass dus getestet hast ;D

also bei mir sind grad die akkus leer, sonst hätt ich grade auch nochmal schnell was getestet, ich glaub ich bastel morgen mal mein netzteil an den robby ran, hab selber keine fahrtests z.z. xD

naja, mal schaun was meine servos bei x= 10 x= 15 und x=20 so zusammenfahren xD

LG Pr0gm4n

radbruch
10.03.2009, 00:15
#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
DDRA |= 1;
DDRA |= 2;
int x; // 10<=x<=20; wenn x >15 in die eine richtung, x<15 in die andre, x=15 stillstand
char i;

while(true)
{
x = 15;
for(i=0; i<50; i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
x = 10;
for(i=0; i<50; i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
x = 20;
for(i=0; i<75; i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}
return(0);
}
Der RP6 macht dann aber nichts mehr außer Servos ansteuern...

Paolo
10.03.2009, 09:05
Hallo u. danke für eure Mühe. Also wenn ich es so lasse x=10, x=15, x=20 dann fährt er vor stoppt dann und dann zurück. Das ist schon echt super nur leider viel zu schnell - also Vollgas. Ich habe unten noch eine Zeile hinzugefügt, weil beim Ende der Schleife ist er ohne Stop gleich wieder in die andere Richtung und das ist nicht gut für die Motoren bei Vollgas.
Ich weiss nicht ob ich es richtig gemacht habe, aber so stoppt er kurz und fährt dann weiter. Sowie ich es jetzt habe ist es echt super für eine Richtung, aber wie schaffe ich es jetzt, dass er es so macht wie oben beschrieben - vor Stop und dann zurück, weil wenn ich es jetzt so lasse und nur den letzten Wert ändere also x=20, dann fängt er wieder an zu spinnen, d.h. vor geht er super
auch mit der Geschwindigkeit passt es zusammen sowie ich es bräuchte, aber zurück nur zu schnell, ruckartig, garnicht oder nur eine Seite.

#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
DDRA |= 1;
DDRA |= 2;
int x; // 10<=x<=20; wenn x >15 in die eine richtung, x<15 in die andre, x=15 stillstand
char i;

while(true)
{
x =13;
for(i=0; i<50; i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
x = 15;
for(i=0; i<50; i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
x = 13;
for(i=0; i<50; i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
x = 15;
for(i=0; i<50; i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}
return(0);
}

Paolo
10.03.2009, 09:34
Hab es jetzt doch noch geschafft und es geht super, aber ich könnt Hilfe bei der Feineinstellung gebrauchen. Wie kann ich mir jetzt ausrechnen, dass ich auch links u. rechts fahren kann. Welche Werte muss ich wo verändern. Leider bin ich echt der volle Anfänger und bin euch für eure Hilfe SEHR dankbar, denn ohne euch wär ich aufgeschmissen.
Hab zuerst wieder viel zu viel verändert und deshalb hat es nicht gleich geklappt. Vielleicht wäre ja auch einer so nett von euch mir mit dem Einfügen der Programierung für die Pumpers zu helfen.
Damit er wenn er wo anstösst die Richtung wechselt. Das wäre super Nett - Danke euch schon mal im Voraus für eure Hilfe!.

#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
DDRA |= 1;
DDRA |= 2;
int x; // 10<=x<=20; wenn x >15 in die eine richtung, x<15 in die andre, x=15 stillstand
char i;

while(true)
{
x =13;
for(i=0; i<50; i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
x = 15;
for(i=0; i<50; i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
x = 20;
for(i=0; i<50; i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
x = 15;
for(i=0; i<50; i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}
return(0);
}

Pr0gm4n
10.03.2009, 12:36
Hi,

zu deim problem kann ich dir heut nachmittag nochmal helfen, muss jetz weg, nacher guck ichs mir nochmal an *sry 4 now*

aber meine kurze frage:



#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
DDRA |= 1;
DDRA |= 2;
int x = 15; // 10<=x<=20; wenn x >15 in die eine richtung, x<15 in die andre, x=15 stillstand
int i = 0;

while(true)
{
if(i<100)
{
x=15;
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
if((i>100)&&(i<200))
{
x=20;
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
if(i>200)
{
x=10;
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
i++;
}
return(0);
}


das hab ich compiliert und reingeladen, die servos haben keinen muks gemacht...

radbruch könntest du mein hexfile vlt. schnell testen?

LG Pr0gm4n

Dirk
10.03.2009, 14:02
Hallo Paolo,

... ,Dirk mit deinem Demo Programm komme ich leider noch nicht ganz klar. Ich habe da immer wieder Fehler Meldungen wenn ich da die ADC1 u. ADC2 einfüge, irgentwas mach ich da falsch, ...

Die Änderungen für Fahrtregler an ADC0/1 sind echt nicht so schlimm:

In der RP6BaseServoLib.h änderst du die 4 Zeilen:


#define SERVO7_PULSE_ON (PORTC |= SCL) // PC0
#define SERVO7_PULSE_OFF (PORTC &= ~SCL)
#define SERVO8_PULSE_ON (PORTC |= SDA) // PC1
#define SERVO8_PULSE_OFF (PORTC &= ~SDA)

... in:


#define SERVO7_PULSE_ON (PORTA |= ADC0) // PA0
#define SERVO7_PULSE_OFF (PORTA &= ~ADC0)
#define SERVO8_PULSE_ON (PORTA |= ADC1) // PA1
#define SERVO8_PULSE_OFF (PORTA &= ~ADC1)


Und in der RP6BaseServoLib.c änderst du die 2 Zeilen:


if (servos & SERVO7) {DDRC |= SCL; PORTC &= ~SCL;}
if (servos & SERVO8) {DDRC |= SDA; PORTC &= ~SDA;}

... in:


if (servos & SERVO7) {DDRA |= ADC0; PORTA &= ~ADC0;}
if (servos & SERVO8) {DDRA |= ADC1; PORTA &= ~ADC1;}


Meine Demo vom 8.3. in diesem Thread schreibst du so um (der Rest der Demo bleibt gleich!):


// Initialize the servo lib for use of servos 7, 8:
initSERVO(SERVO7 | SERVO8);

startStopwatch2(); // Used for the demo

pos = 2; // Start with motor

stopped
servo7_position = MOTOR_STOP;
servo8_position = MOTOR_STOP;

while(true)
{
// ---------------------------------------------------------------------
// The demo code for positioning a drive controller (servo 1):
if (getStopwatch2() > 5000) { // Change position every ~5s
if (pos == 0) {
servo7_position = MOTOR_BACK_FULL;
servo8_position = MOTOR_BACK_FULL;}
if (pos == 1) {
servo7_position = MOTOR_BACK_HALF;
servo8_position = MOTOR_BACK_HALF;}
if (pos == 2) {
servo7_position = MOTOR_STOP;
servo8_position = MOTOR_STOP;}
if (pos == 3) {
servo7_position = MOTOR_FORWARD_HALF;
servo8_position = MOTOR_FORWARD_HALF;}
if (pos == 4) {
servo7_position = MOTOR_FORWARD_FULL;
servo8_position = MOTOR_FORWARD_FULL;}
if (pos == 5) {
servo7_position = MOTOR_FORWARD_HALF;
servo8_position = MOTOR_FORWARD_HALF;}
if (pos == 6) {
servo7_position = MOTOR_STOP;
servo8_position = MOTOR_STOP;}
if (pos == 7) {
servo7_position = MOTOR_BACK_HALF;
servo8_position = MOTOR_BACK_HALF;}

pos++;
if (pos > 7) {pos = 0;}
setStopwatch2(0);
}
// ---------------------------------------------------------------------


Viel Erfolg!

Gruß Dirk

Pr0gm4n
10.03.2009, 14:04
So, ich hab mal n paar mins hier dran rumgebastelt:



#include "RP6RobotBaseLib.h" //Code by Pr0gm4n© v1.0 Fahrtenregler/Servos an ADC0 und ADC1

void vorwaerts(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 0 und 5, bei 0 = stillstand; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 0)geschwindigkeit = 0;
int x = 15+geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}

void rueckwaerts(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 1 und 5; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 1)geschwindigkeit = 1;
int x = 15-geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}

void initMotoren()
{
DDRA |=3;
}


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

while(true)
{
vorwaerts(2, 1000);
vorwaerts(0, 100);
rueckwaerts(2, 1000);
vorwaerts(0, 100);
}
return(0);
}


alles was in der while-schleife ist darfst du verändern, da kannst du auch einstellen dass er andre sachen machen soll...

für links- / rechtskurven solltest du lieber erstmal versuchen den code wirklich zu verstehen, erst dann kannst du dich an sowas wagen....

es wird dir dann zwar recht leicht fallen aber dennoch solltest du das hier erstmal verstehen...

man könnte auch eine funktion schreiben die nur den einen motor vor-/rückwärts fahren lässt, damit kann man auch direkt drehen...

LG Pr0gm4n

EDIT: ÄÄh dirk, warum hast du 2x gepostet?

EDIT2: https://www.roboternetz.de/phpBB2/viewtopic.php?p=430502#430502 bitte nich vergessen xD (den beitrag von mir, v.a. radbruch)

Dirk
10.03.2009, 14:10
ÄÄh dirk, warum hast du 2x gepostet?

Nach dem 1. Posten kam bei mir: "Seite kann nicht angezeigt werden".
Da dachte ich, es hat nicht geklappt und habe nochmal gesendet.

Den 2. Beitrag konnte ich dann nicht mehr löschen: Du warst schneller!

Gruß Dirk

Pr0gm4n
10.03.2009, 14:12
Hehe, naja nich so schlimm, radbruch kann das ja erledigen sofern er lust hat xD

ich würd sagen [/offtopic]

hat schon jemand getestet?

mein robby frisst grade iwie nix mit servos....


LG Pr0gm4n

Paolo
13.03.2009, 14:08
Hallo
Danke für eure Hilfe ,leider stehe ich vor einem neuen Problem.
Die Fahrtenregler reagieren nach dem abstecken der seperaten Akkus für die Fahrtenregler anderst als da wo ich das Programm draufgespielt habe.
Wenn ich nur die Akkus vom RP6 heraus nehme und dann wieder einlege geht alles normal nur sobald ich die Akkus von den Fahrtenregler nehme beginnt die einstellerei von neuem denn er fährt nur noch mit Vollgas, ruckeln und stops.
Kann das sein dass das mit dem internen Speicher der Fahrtenregler zusammen hängt?.
Ich denke dass die nicht für das geeignet sind.

Pr0gm4n
13.03.2009, 14:34
Hi,

also ich weiss zwar nicht was die für nen internen speicher haben sollen xD, aber steckst du die akkus um während der rp6 an iss oder wenn er aus iss?

LG Pr0gm4n

ps: wenn bei an, versuchs mal bei aus xD

Paolo
13.03.2009, 17:21
Die RC-Fahrtregler haben einen internen Speicher damit sie die Einstellungen der Lenkung im Fahrzeug behalten damit man an der Fernsteuerung nicht ständig nachstellen muss usw.
Und wenn ich jetzt an dem Programm das du mir gegeben hast probiere bis die Geschwindigkeit passt so wie ich es bräuchte speichert das Ding irgendwie die vorherigen Versuche so das wenn ich ihm dann den Strom nehme nix mehr stimmt.
Keine Ahnung wie das geht ich weiss nur dass er speichert ,ich habe mir jetzt schnell einen besorgt der das nochnicht macht und versuche es noch mal.
Ich habe es so und so versucht mit dem Strom
](*,)

radbruch
13.03.2009, 18:18
Möglicherweise wird die Impulsdauer beim Einschalten der Fahrtenregler als Mitteimpuls gespeichert. Zuerst Fernbedienung einschalten (=Programm im RP6 starten und Impulse für Mitte/Drehzahl 0 senden), dann das Modell einschalten (=die Fahrtenregler).

Pr0gm4n
14.03.2009, 09:01
Hi,

das könnte schon eher sein @ radbruch.

ich hab schon einiges gemacht im rc-bereich und von wegen speichern des vorherigen impulses, das stimmt nich.

bei der rc funke isses so dass die alle 20ms ja wieder den impuls schickt egal ob verändert oder nicht

der empfänger schickt dann auch den impuls genau so raus und wieder egal ob verändert oder nicht

der fahrtenregler bekommt normal alle 20ms den impuls und muss so NICHTS speichern. die fahrtenregler sind eig bloß ne schaltung, die aus dem eingehenden impuls ne analoge spannung machen, mehr ned

die haben dabei auch keinen internen speicher xD

LG Pr0gm4n

ps: der fahrtenregler hängt schon mit an dem akku der motoren oder?

mach das mal so dann rp6 ein, programm starten, akkus an motoren und fahrtenregler anschließen

dann sollte es gehen
bzw. die motoren kriegen ja über den fahrtenregler strom xD

EDIT: radbruch kannst du das hier plz mal testen? https://www.roboternetz.de/phpBB2/viewtopic.php?p=430502#430502

ich such grad den fehler und bin ned sicher ob mein programmer noch ordentlich eingerichtet iss --> das hexfile wär fürn arsch, ob ich doch iwo nen fehler gemacht hab beim code oder ob er bei übertragung mist gebaut hat... DANKE!

radbruch
14.03.2009, 14:12
Hallo

der fahrtenregler bekommt normal alle 20ms den impuls und muss so NICHTS speichern. die fahrtenregler sind eig bloß ne schaltung, die aus dem eingehenden impuls ne analoge spannung machen, mehr nedDas stimmt ja wohl offensichtlich nicht wie man aus dem oben beschriebenen schliesen kann. Wenn es so einfach wäre, würde es ja nach dem Akkuwechsel funktionieren.

Ich kenne das eigentlich von Spielekonsolen. Wenn man hier beim Einschalten den Joystick nicht in Nullstellung hat stimmt die Steuerung im Spiel nicht weil die Joysticks beim Start kalibriert werden. Servos und Fahrtenregler haben wohl eine ähnliche Funktion um sich den verschiedenen (Mitte-)Impulslängen der Fernbedienungen anzupassen.


radbruch kannst du das hier plz mal testen?Ich besitze genau einen RP6 der in mein aktuelles Projekt integriert ist. Jedesmal wenn ich "mal kurz was testen soll" muss ich alles abbauen und die Testbedingungen nachstellen, dein Programm laden und eben testen. Das mache ich gerne wenn ich das Gefühl habe, es hilft entscheidend weiter. Im konkreten Fall ist es aber "nur" eine kleine Variation eines weiter oben geposteten Codes, ohne große und grundlegende Änderung. Das solltest du selbst auch ohne Hilfe zum Laufen bringen können.


Gruß

mic

Pr0gm4n
14.03.2009, 14:59
Hi,

sry radbruch aber ich muss dir widersprechen.

ich hab jahrelang rc-modellbau betrieben und es ist 100%ig noch kein fahrtenregler hergestellt worden (den ich kenne und das sind schon ganz schön viele) der sich erst kalibrieren muss.

normalerweise ist es so wie beim servo, der kriegt nen impuls, misst die länge und regelt dann proportional durch. 1,5ms sind IMMER mittelstellung



Servos und Fahrtenregler haben wohl eine ähnliche Funktion ...


also servos ja schon gleich garnicht...
bei fahrtenreglern würde es ja zumindest noch etwas sinn machen aber geben tuts das bei keinem



ach und @ offtopic:

sry, tut mir leid. aber ich krieg es eben nicht allein hin xD

und da ich auch nicht weiss ob das hex-file das ich generiert hab auch WIRKLICH das abbild meines codes ist bräuchte ich jemand anderen bei dem es funktioniert um das zu testen. da du den anderen code ja auch getestet hast dachte ich du müsstest ja zumindest nichts umbauen und habe gehofft du könntest das schnell machen

LG Pr0gm4n

radbruch
14.03.2009, 15:35
Ich bin RC-Laie, habe aber nach kurzer Suche ein passendes Beispiel gefunden:

http://www.sgs-electronic.de/Anleitung_Regler_TVC-B-10_deutsch.pdf

Auf Seite 3 unter "Inbetriebnahme: Einschalten" steht da folgendes:

...Diese automatische Kalibrierung erfolgt in dieser Weise bei jeder
Einschaltung. D.h. die beim Einschalten erkannte Position wird als
Neutralposition gespeichert. Das gilt sowohl für die Lenkung, als auch
für die Geschwindigkeit....

Pr0gm4n
15.03.2009, 07:15
LOL!

sry, dann muss ich alles zurücknehmen, aber meine etwa 7 fahrtenregler die ich bisher hatte und verwendet hab, sowie alle die ich je gesehn hab funzten anders...

es iss ja auch so, dass du wenn man das auto zuerst einschaltet und dann erst die funke, trotzdem sobald die funke an iss volle kontrolle hast und das auto steht --> am anfang hat er dann keinen kalibrierungsimpuls

sehr merkwürdig, ich geh gleich am freitag mal wieder zu unserem rc-shop in der stadt, da treffen die sich bei uns immer, da kann ich dann mal fragen ob die das auch gehört haben, ich kann mir aber beim besten willen nich vorstellen warum die das gemacht hätten...

wenn man beim einschalten schon nach vorne drückt dann würde er ja in nullstellung rückwärtsfahren... *grübel*

LG Pr0gm4n

EDIT: also der den du gefunden hast, der ist ja für kettenfahrzeuge xD

ich weiss nicht, inwiefern du die unterscheidung kennst, aber für kettenfahrzeuge nimmt man normal eine 2-knüppel-funke

da iss das anders, dem regler gibt man einen geschwindigkeits- und einen lenkimpuls vom empfänger, sowie die akkus halt noch

das sind sowieso sondermodelle von fahrtenreglern, ich guck auch gleich mal bei graupner und futaba was die dann so gemacht haben

EDIT2: http://www.graupner.de/fileadmin/downloadcenter/anleitungen/7195.pdf seite 5 /einstellen auf den sender

Paolo
17.03.2009, 09:51
Hallo
Also mal ganz kurz, Laut Conrad Elektronic gibts kaum noch Fahrtenregler ohne Speicher. Ich habe durch Zufall einen RC Handel gefunden, der mir noch einen geben konnte ohne Speicher und mit dem geht es super. Am Donnerstag bekomme ich den zweiten dazu und kann dann testen ob es auch so bleibt.
Inzwischen hab ich mir Gedanken gemacht über den Code den mir Pr0gm4n gemacht hat. Ich wollte die Bumper hinzufügen, leider ohne Erfolg, was hab ich bloss schon wieder falsch gemacht. Ich habe den Code so umgeschrieben wie ich es mir erhofft habe, dass es gehen könnte rechts u. links, hab ich nur daweil dazu geschrieben aber bringt auch nicht wirklich was ohne die richtigen Fahrtenregler.
#include "RP6RobotBaseLib.h" //Code by Pr0gm4n© v1.0 Fahrtenregler/Servos an ADC0 und ADC1

void vorwaerts(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 0 und 5, bei 0 = stillstand; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 0)geschwindigkeit = 0;
int x = 15+geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}

void rueckwaerts(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 1 und 5; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 1)geschwindigkeit = 1;
int x = 15-geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}
void rechts(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 1 und 5; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 1)geschwindigkeit = 1;
int x = 15-geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}
void links(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 1 und 5; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 1)geschwindigkeit = 1;
int x = 15-geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}
void initMotoren()



int main(void)
{
initRobotBase();
initMotoren();
pwerON();
while(true)

{
rueckwaerts,rechts,links,vorwaerts,(int geschwindigkeit, int zeit,true);
if (getBumperLeft)
{ rueckwaerts(1, 100);
rechts(2, 100);
}
if (getBumperRight)
{ rueckwaerts(1, 100);
links(1, 100);
}
vorwaerts(2, 1000);
vorwaerts(0, 100);
rueckwaerts(2, 1000);
vorwaerts(0, 100);
}

return (0);
}

Pr0gm4n
17.03.2009, 12:33
Hi,

also

rueckwaerts,rechts,links,vorwaerts,(int geschwindigkeit, int zeit,true);


das kann schonmal garnicht funktionieren... ich hab keine ahnung was du damit bezwecken willst xD

ach ja und



void links(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 1 und 5; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 1)geschwindigkeit = 1;
int x = 15-geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}


dashier ist ja der gleiche code wie bei mir bei vorwärts

du musst das nicht nur umnennen xD

naja ich hab grad keine zeit...

aber die bei uns im modellbauladen haben alle gesagt dass sie noch nie was von fahrtenreglern mit speicher gehört haben...


LG Pr0gm4n

Paolo
17.03.2009, 12:54
Hallo dass, das mit links u. rechts nicht geht ist mir klar, weil ich es einfach nur mal zum Programm dazu habe und dass ich die Werte ändern muss ist mir auch klar. Ich wollte es einfach mal dazu tun damit es mal im Programm drinnen ist und dass ich sobald ich die Fahrtenregler habe (beide) versuchen kann ob es auch geht.
Zu den Fahrtenreglern kann ich nur sagen, dass ich mir das mit dem Speicher nicht aus der Nase ziehe, das wurde mir so erklärt von Mitarbeitern bei Conrad Elektronics und von einem RC-Modellbaushop so erklärt nur dass die Conrad die ohne Speicher nicht mehr verkauft. Meine Frage war diesmal eher auf die Bumper bezogen, wie ich die hinbekommen kann. Sorry wenn ich mich falsch ausgedrückt habe.

Pr0gm4n
18.03.2009, 07:25
Hi,

das meinte ich ja...

also wenn deine funktion rechts(); nichts anderes macht als geradeaus weiterfahren, dann kannst du ja garnicht erkennen ob du das mit den bumpern richtig gemacht hast...
ich seh grad du würdest wenn bumper gedrückt wurde halt gerade hinterfahren.. naja, bleibt sich gleich

ich selber bin nichmehr allzu sehr in den rp6 eingearbeitet, ich mach z.z. andere projekte, aber wenn ich mich nicht allzu irre dann ging das über nen eventhandler oder interrupt, dem du direkt sagen kannst was er dann machen soll...

so wie dus jetz machst iss zum einen die zeile hier falsch:


rueckwaerts,rechts,links,vorwaerts,(int geschwindigkeit, int zeit,true);


und wenn man die weglässt dann sieht das programm so aus:

-überprüfung des linken Bumpers
-überprüfung des rechten Bumpers
-2,2s irgendwas was du fährst

und dann von vorne

das heißt wenn dein robby auf ein hindernis stößt kann er im extremfall noch 2,1s weiter dagegenfahren weil du ja erst dann überprüfst...

bin mir sogar ziemlich sicher dass es da was gab, son eventhandler mein ich war das...

@
erklärt von Mitarbeitern bei Conrad Elektronics und von einem RC-Modellbaushop

also wenn du das RC-Modellbaushop nicht hinigeschrieben hättest wär ich immernoch überzeugt vom gegenteil

weil die mitarbeiter beim großen c einfach keine ahnung haben...

aber in nem modellbaushop... komisch

also speicher haben sie schon alle, ich weiss ja nich was du erklärt bzw. gefragt hast... das iss normal, du kannst deine eigenen einstellungen machen aber hier gehts ja eig. nur darum ob der fahrtenregler sich anhand des ersten fernsteuerimpulses kalibriert... und das glaub ich immernoch nich xD

sonst könnte man die mittelstellung nicht einprogrammiern sondern müsste ja bloß den hebel n bissl anders halten...

und es gibt genug leute, die den akku anstecken und dabei die fernsteuerung nur rumhängen haben, mich eingeschlossen, da iss der knüppel öfters mal nich in mittelposition...

das kann also ned sein eigentlich

wie gesagt machts ja eig. auch kein sinn und graupner verbaut auch nur fahrtenregler mit speicher aber ohne kalibrierung wie gesagt

LG Pr0gm4n

Paolo
22.03.2009, 08:05
Hallo
So leider bin ich kein Stückchen weiter. Die Fahrtenregler machen noch immer was sie wollen (Leider). Ich ändere das Programm so das es mit vorwärts beginnt u. dann rückwärts mit der gewünschten Geschwindigkeit.
1 Test. Ich schalte nun den RP6 aus ohne die Akkus ab zu stecken und wieder ein, keine Veränderung am Ablauf des Programms. 2. Test. Ich schalte den RP6 aus stecke die Akkus ab ,schalte den RP6 wieder ein spiele das Programm wieder drauf schalte den RP6 wieder aus stecke ,die Akkus wieder an und schalte den Rp6 wieder an. Die Fahrtenregler machen wieder alles nur nicht das was vorher eingestellt wurde, ich habe natürlich auch andere Abläufe versucht wie Akkus abstecken während der RP6 angeschalten ist (aber das Programm nicht läuft nur Power on) wieder das gleiche.
Es ist auch so dass wenn ich das Programm dann wieder auf die gewünschte Funktion einstelle, dass ich dann immer andere Werte habe wie vor dem ab stecken der Akkus. Wenn ich das Programm so lasse wie du es mir gegeben hast Pr0gm4n dann Ffährt der Robi nur vorwärts mit Vollgas u. mit kurzen Stops ich habe es dann verändert so das er vor u. zurück fährt , so wie ich den code jetzt zeige ist es super gelaufen ich weiss nicht ob das korrekt ist wie ich es eingestellt habe aber leider ist es so am Besten gegangen, kann es sein dass ich da was falsch eingestellt habe, dass es nach dem ab und an stecken der Akkus nicht mehr Funktioniert. BITTE BITTE Hilfe ich bin echt schon am verzweifeln. PS Das mit den Speicher ist natürlich Schwachsinn gewesen war noch bei einem Modelbaushop und der hat das auch zum ersten mal gehört mit Speicher, jetzt weiss ich wo ich nicht mehr nachfragen gehe.


#include "RP6RobotBaseLib.h" //Code by Pr0gm4n© v1.0 Fahrtenregler/Servos an ADC0 und ADC1

void vorwaerts(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 0 und 5, bei 0 = stillstand; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 0)geschwindigkeit = 0;
int x = 13+geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}

void rueckwaerts(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 1 und 5; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 1)geschwindigkeit = 1;
int x = 23-geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}

void initMotoren()
{
DDRA |=3;
}


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

while(true)
{

vorwaerts(0, 100);
vorwaerts(2, 1000);
vorwaerts(0, 100);
rueckwaerts(3, 1000);

}
return(0);
}

Pr0gm4n
22.03.2009, 09:22
Hi,

freut mich, recht gehabt zu haben xD

das mit dem speicher ist einfach so, dass der modellbautyp nicht erwartet hat, dass du das damit meinst xD

ich würde dir vorschlagen in die initMotoren ein vorwaerts(0, 10000); einzubauen, dann hast du 10 sekunden zeit um die akkus anzustecken, falls du tatsächlich so ein sondermodell hast wie radbruch ja gepostet hat, dass es es gibt.

also ich bin noch etwas müde, mach mich aber gleich dran den code für dich nochmal n bissl auszubauen wenn du das wünschst, also ich könnte dir vlt. ne musterlösung machen für vor- zurück- und linksfahren oder so

rechts iss ja dann trivial wie der mathematiker sagt xD
also analog, sehr einfach etc... so in der art bedeutet das...

also allein der beschreibung deiner tests von oben nach würde ich wirklich davon ausgehen, dass der so einen wirklich SEHR komischen speicher hat...

naja werden wir sehen, dann wird die initMotoren(); das bald beheben xD

also dann hättest du von 1.x Startknopf an 10 sec zeit um den akku anzuschließen, bei bedarf auch mehr xD

LG Pr0gm4n

Pr0gm4n
22.03.2009, 09:32
Hi,

so hab mal den Code bearbeitet:



#include "RP6RobotBaseLib.h" //Code by Pr0gm4n© v1.1 Fahrtenregler/Servos an ADC0 und ADC1 die entgegengesetzt drehen

void vorwaerts(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 0 und 5, bei 0 = stillstand; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 0)geschwindigkeit = 0;
int x = 15+geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}

void rueckwaerts(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 1 und 5; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 1)geschwindigkeit = 1;
int x = 15-geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}

void links() // oder rechts, das musst du testen, hängt davon ab, was an adc0 oder adc1 hängt
{
int x= 17; // hier kannst du an der geschwindigkeit in der kurve rumprobieren (15 < x <= 20)
int y= 20; // hier kannst du am Winkel der Drehung rumprobieren, das hängt von den Motoren ab, einfach ausprobieren dann siehst du was gut iss xD
int i;
for(i=0; i<y ;i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
sleep(200-x);
}
}

void rechts() // oder links, das musst du testen, hängt davon ab, was an adc0 oder adc1 hängt
{
int x= 17; // hier kannst du an der geschwindigkeit in der kurve rumprobieren (15 < x <= 20)
int y= 20; // hier kannst du am Winkel der Drehung rumprobieren, das hängt von den Motoren ab, einfach ausprobieren dann siehst du was gut iss xD
int i;
for(i=0; i<y ;i++)
{
PORTA |= 2;
sleep(x);
PORTA &= ~2;
sleep(200-x);
}
}


void initMotoren()
{
DDRA |=3;
vorwaerts(0, 10000);
}


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

while(true)
{
vorwaerts(2, 1000);
vorwaerts(0, 100);
rueckwaerts(2, 1000);
vorwaerts(0, 100);
}
return(0);
}


musst in links(); und rechts(); noch rumprobieren was bei deinen Motoren eine schöne Kurve verursacht xD

LG Pr0gm4n

Paolo
22.03.2009, 11:00
Danke Danke Danke !!!!
Das Programm läeuft echt Super, hab echt einiges versucht und es hat ohne Probleme funktioniert nach dem abstecken der Akkus, super nun kann ich die Einstellungen so vornehmen wie ich sie brauche, und auch endlich damit anfangen die Bumper zu verwenden.
Nurnoch eine kleine frage ich hab den Ultraschall ULT-10 von asuro kann man das auch für den RP6 verwenden über XBUS?.
Muss wohl echt daran gelegen haben das die Fahrtenregler zeit brauchen.
Nochmals vielen Dank für deine Hilfe!!

Pr0gm4n
22.03.2009, 18:01
Hi,

also kein problem xD

ähm mit asuro kenn ich mich nich aus, ich würd sagen das kann dir am besten der radbruch erklären (--> youtube = asurofilmchen --> radbruch = asuroprofi?)

LG Pr0gm4n

Paolo
27.03.2009, 18:03
Hallo Pr0gm4n!
Danke nochmal für dein Programm, leider ist es soo, dass die Einstellungen anscheinend zu grob sind und ich keine langsame Geschwindigkeit schaffe, da es 2 sehr starke Motoren sind. Ich habe alle Einstellungen von oben bis unten durch probiert, aber ich bin leider zu keinem Ergebnis gekommen, dass für meinen Roboter geeignet wäre, da er entweder nur Vollgas oder stockend fährt.
Hast du vielleicht eine Idee was ich falsch machen könnte, an was das sonst noch liegen könnte oder noch irgendwelche Ideen die ich ausprobieren könnte?

Ich habe auch bei nachfolgenden Absatz auch versucht von 1-20 vor u. rückwärts alle Möglichkeiten versucht, aber leider hatte ich auch hier keinen Erfolg.

if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 0)geschwindigkeit = 0;
int x = 15+geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)

Ich wäre dir unendlich dankbar für Lösungsvorschläge. Seit 2 Monaten arbeite ich nur daran die Fahrtenregler einzustellen um eine vernünftige Geschwindigkeit programmieren zu können und bin mittlerweile schon verzweifelt und glaube sogar schon, dass daran mein Projekt scheitern muss.



#include "RP6RobotBaseLib.h" //Code by Pr0gm4n© v1.1 Fahrtenregler/Servos an ADC0 und ADC1 die entgegengesetzt drehen

void vorwaerts(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 0 und 5, bei 0 = stillstand; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 0)geschwindigkeit = 0;
int x = 15+geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}

void rueckwaerts(int geschwindigkeit, int zeit)//geschwindigkeit zwischen 1 und 5; zeit in ms
{
if(geschwindigkeit > 5)geschwindigkeit = 5;
if(geschwindigkeit < 0)geschwindigkeit = 0;
int x = 15-geschwindigkeit;
int i;
for(i=0;i<(zeit/20);i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
}

void links() // oder rechts, das musst du testen, hängt davon ab, was an adc0 oder adc1 hängt
{
int x= 17; // hier kannst du an der geschwindigkeit in der kurve rumprobieren (15 < x <= 20)
int y= 20; // hier kannst du am Winkel der Drehung rumprobieren, das hängt von den Motoren ab, einfach ausprobieren dann siehst du was gut iss xD
int i;
for(i=0; i<y ;i++)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
sleep(200-x);
}
}

void rechts() // oder links, das musst du testen, hängt davon ab, was an adc0 oder adc1 hängt
{
int x= 17; // hier kannst du an der geschwindigkeit in der kurve rumprobieren (15 < x <= 20)
int y= 20; // hier kannst du am Winkel der Drehung rumprobieren, das hängt von den Motoren ab, einfach ausprobieren dann siehst du was gut iss xD
int i;
for(i=0; i<y ;i++)
{
PORTA |= 2;
sleep(x);
PORTA &= ~2;
sleep(200-x);
}
}


void initMotoren()
{
DDRA |=3;
vorwaerts(0, 10000);
}


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

while(true)
{
vorwaerts(0, 2500);
vorwaerts(0, 100);
rueckwaerts(0, 2500);
vorwaerts(0, 100);
}
return(0);
}

radbruch
27.03.2009, 19:41
Hallo

Kleines Offtopic zum US-Sensor des asuro am RP6: Hier gibt's einen ausführlichen Thread über den Umbau am asuro selbst:

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

Ich bin zwar noch nicht durch, aber auf Seite 2 findet sich schon mal einen Bibliothek. Anscheinend muss der asuro die 40kHz-Trägerfrequenz selbst erzeugen, das sollte der RP6 auch können. Möglicherweise stimmen die Timersetups nicht völlig überein, aber die Werte sollten passen weil beide mit 8MHz takten. Angriffspunkt ist wohl Timer2 der normalerweise die 36kHz für die IR-Kommunikation erzeugt. btw. fehlt mir noch der Schaltplan für die US-Erweiterung...

Gruß

mic

Pr0gm4n
27.03.2009, 21:27
soooooooo...

also, bei dem code kann man im prinzip die genauigkeit der geschwindigkeit beliebig machen...

wenn ich mich recht erinnere nimmt die sleep-funktion auch floats?

naja ich wollte es halt so einfach wie möglich für dich machen xD

naja, kannst du nicht mit geschwindigkeit 1 probieren und jo...

ich hab grad ned viel zeit und ehrlich gesagt kann ich die werte auch nur wirklich einstellen wenn ich das modell vor mir hab und rumprobieren kann...

sowas mach ich aber wegen zeitintensivität eig. nur bei eigenen projekten xD

du musst halt einfach rumprobieren...

das was du bisher so von dir gibst lässt für mich nurnoch den schluss zu, dass du eig. keine ahnung hast was ich da wirklich zusammengecoded hab und du gern nen kompletten code hättest mit dem das dann läuft...

tja, so läuft das halt nicht, normal kriegst du noch nichtmal soviel..
wenn du das bisherige nicht ganz verstehst dann schau lieber erstmal dass du das hinkriegst bevor du weiter gehst....

LG Pr0gm4n