Archiv verlassen und diese Seite im Standarddesign anzeigen : ACS Programm - was ist hier falsch?
LucaSilva301
03.01.2009, 19:41
Hey!
Habe ein Programm geschrieben:
#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
powerON();
uint16_t Licht_L = obstacle_left;
uint16_t Licht_R = obstacle_right;
void setACSPwrMed(void);
void task_ACS();
void task_ADC();
while (true);
{
void setACSPwrMed(void);
while (Licht_L < 1 && Licht_R < 1 && bumper_left == 0 && bumper_right == 0)
{
moveAtSpeed(50,50);
}
while (Licht_L > 0 && Licht_R == 0)
{
moveAtSpeed(75,10);
}
while (Licht_R > 0 && Licht_L == 0)
{
moveAtSpeed(10,75);
}
while (Licht_L > 0 && Licht_R > 0)
{
moveAtSpeed(-70,-70);
}
}
}
leider tut sich GARNICHTS.
Selbst wenn ich einfach ein programm mit
moveAtSpeed(50,50);
schreibe (ohne bedingungen), dann bleibt er einfach stehen.
Woran liegt das?
Was ist Falsch?
Danke für die Hilfe...
beste Grüße
Luca
Hi,
bin noch nicht lange dabei... aber kann es sein das es an der fehlenden return 0; Anweisung in deiner main-Methode liegt?
mfg
ben
LucaSilva301
03.01.2009, 20:03
Hey!
Hat leider nicht geholfen...
trotzdem danke!
LUca
LucaSilva301
03.01.2009, 20:25
Kommt schon!!! =)
RP6conrad
03.01.2009, 21:29
Da fehlt in die Hauptschleife der "task_Motioncontrol()" !! Das muss cyclisch aufgerufen werden um die Motoren an zu steuern !! Diese Task regelt die Geschwindigkeit nach die Vorgabe von move(...) und andere Bewegungsauftrage.
Da fehlt in die Hauptschleife der "task_Motioncontrol()" !!
... und die anderen Tasks müssen auch in die Hauptschleife.
Gruß Dirk
the_Ghost666
03.01.2009, 21:59
VOID TASK_ADC(); ist kein Funktionsaufruf, sondern hat den look einer Definition.
Im Code lässt man den Rückgabetyp weg, oder schreibt stattdessen eine Variablenzuweisung, also
TASK_ADC();
oder (falls es INT, nicht void wäre)
Var= TASK_ADC();
Lass einfach die Voids weg und probiers nochmal. Void bedeutet etwa Leere, also einfach frei lassen, nichts hinschreiben.
P.S: Oder hat sich Conrad wieder einen eigenen C dialekt für die RPX Roboterreihe überlegt, wie auch bei der CControl2? Ich habe das Ding gehasst.
Hi,
also erstmal, ghost hat vollkommen recht...
ach ja ghost, nur um das klarzustellen, der rp6 ist von AREXX und nicht von conrad, er wird nur von conrad verkauft
ach ja, soweit ich weiss ist das ganz normales C, du kannst natürlich so proggen wie jeden normalen µC auch, allerdings haben sie einige libs mitgeliefert die einiges erleichtern, ansonsten aber wie gesagt normales C
LG Pr0gm4n
LucaSilva301
03.01.2009, 23:15
Super!
Vielen Dank für die Hilfe - er fährt jetzt. Zwar geht er nicht auf Bumper oder IC ein, dass liegt jedoch an etwas anderem...
Liebe Grüße
Luca
LucaSilva301
03.01.2009, 23:25
Ok mein code sieht nun so aus:
#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
powerON();
setACSPwrMed();
task_ACS();
task_ADC();
while ((obstacle_left) < 1 && (obstacle_right) < 1 && (bumper_left) == 0 && (bumper_right) == 0)
{
task_motionControl();
moveAtSpeed(50,50);
}
while ((obstacle_left) > (obstacle_right))
{
task_motionControl();
moveAtSpeed(75,10);
}
while ((obstacle_right) > (obstacle_left))
{
task_motionControl();
moveAtSpeed(10,75);
}
while ((obstacle_left)>0 && (obstacle_right)>0)
{
task_motionControl();
moveAtSpeed(-70,-70);
}
}
leider wie gesagt keine reaktion auf veränderte argumente der while-schleifen.
scheint mit 50,50 zu fahren und frage mich wie das sein kann, wenn ich einen bumper drücke und meine hand vor die sensoren halte.
Bg
Luca
Hi, ich würde etwas an den klammern in den bedingungen verändern:
#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
powerON();
setACSPwrMed();
task_ACS();
task_ADC();
while ((obstacle_left < 1) && (obstacle_right < 1) && (bumper_left == 0) && (bumper_right == 0))
{
task_motionControl();
moveAtSpeed(50,50);
}
while ((obstacle_left) > (obstacle_right))
{
task_motionControl();
moveAtSpeed(75,10);
}
while ((obstacle_right) > (obstacle_left))
{
task_motionControl();
moveAtSpeed(10,75);
}
while ((obstacle_left>0) && (obstacle_right>0))
{
task_motionControl();
moveAtSpeed(-70,-70);
}
}
LG Pr0gm4n
Nochmal:
Auch die task_ACS() muss mit in die While-Schleifen, sonst funktioniert das ACS nicht.
Das gleiche gilt für task_ADC(), wenn man die ADCs verwendet.
Gruß Dirk
RP6conrad
04.01.2009, 11:31
Aufgepasst mit "While" Schleifen. Die haben das Nachteil das wahrend der Bedingung IO ist, nichts anderes mehr bearbeitet wird. Da lauft dan immer nur diese "While" schleife.
Was auch immer hilfreich ist zum debuggen, sind die Text/ Var Ausgabe ueber der UART. In die Schleifen programmiert du dan eine (Beispiel )
writeString_P("mspeed= ");
writeInteger(mleft_des_speed,DEC);
writeString_P(" ");
Dan mall sehen in welche Schleife er hangen bleibt/ was die Wert on Varibalen ist.
Hi,
ach ja, danke dirk, das hab ich ja ganz übersehen!
Ich kanns grade nicht testen, aber wenn man das alles beachtet sollte es doch eigentlich jetz gehen oder?
LG Pr0gm4n
Mal unabhängig davon das die Struktur des Programms nicht sooo gut funktionieren wird, kannst Du auch anstelle von
task_motionControl, task_ACS und task_ADC auch einfach
task_RP6System();
aufrufen - ist wohl einfacher und man kann nichts wichtiges mehr vergessen ;)
MfG,
SlyD
Panzerfan
08.01.2009, 17:22
Hi LucaSilva301,
ich glaube ich hab das Problem gelöst, auf jeden Fall läuft das Programm so bei mir:
#include "RP6RobotBaseLib.h"
void ausweichen(void)
{
if (!obstacle_left && !obstacle_right && !bumper_left && !bumper_right)
{
changeDirection(FWD);
moveAtSpeed(50,50);
}
if (obstacle_left)
{
changeDirection(FWD);
moveAtSpeed(75,10);
}
if (obstacle_right)
{
changeDirection(FWD);
moveAtSpeed(10,75);
}
if (obstacle_left && obstacle_right)
{
changeDirection(BWD);
moveAtSpeed(70,70);
}
}
int main(void)
{
initRobotBase();
powerON();
setACSPwrMed();
while(true)
{
ausweichen();
task_RP6System();
}
return 0;
}
P.S.:
So kann man beim RP6 die Geschwindigkeit nicht angeben:
moveAtSpeed(-50,-50);
Wenn man das macht beschleunigt der RP6 auf ungefähr 150 und prallt voll gegen die Wand. Also immer *changeDirection(dir);* verwenden, sonst überleben die Bumper und die InfrarotLEDs nicht lange. :-b
LucaSilva301
12.01.2009, 19:23
Alles klar!
Danke für die vielen Tipps und Antworten.
Eine schöne Woche noch...
Lg
Luca
> So kann man beim RP6 die Geschwindigkeit nicht angeben:
Das ist auch klar - schau Dir mal die definition der Funktion an.
Die Parameter sind VorzeichenLOS... das muss dann natürlich schief gehen wenn Du da negative Werte übergibst.
Du kannst natürlich auch die Lib umschreiben damit das doch geht ;)
MfG,
SlyD
LucaSilva301
12.01.2009, 21:53
ja stimmt...gute idee!
Denke das werde ich mal tun, da ich es sehr viel bequemer finde nicht erst die richtung zu ändern.
Die bumper haben nicht funktioniert, da übersehen wurde, dass ihr status nie abgerufen wird und daher die variablen getBumperLeft() und ""Right() immer 0 sein werden.
Habt ihr evtl. kreative vorschläge was man mit dem teil noch so anstellen könnte ;P ?
Was habt ihr so gemacht?
Ich finde, dass die Geschwindigkeit recht gering ist und vor allem die beschleunigung wirkt sehr träge :(
Danke nochmal für eure Zeit!
Liebe Grüße
Luca
Panzerfan
14.01.2009, 15:40
Hi LucaSilva301
Das die Geschwindigkeit so gering ist hat einen guten Grund: Stell dir mal vor du machst einen Fehler bei deiner Programmierung(s. Oben) und der RP6 fährt mit 20Km/h gegen die Wand! Da wären dann wahrscheinlich die Bumper und noch anderes kaputt und das wollen wir ja nich. Mit der Geschwindigkeit kann nich viel kaputtgehen und der Besitzer könnte noch hinterherspringen wenn der RP6 mal auf einen Abgrund zufährt. Also: Wenn du was schnelleres willst kauf dir doch lieber ein ferngesteuertes Auto oder was auch immer.
mfg Panzerfan
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.