PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei 1. Programm :(



V!P3R
15.03.2008, 11:04
Ich hab gestern Versucht mein erstes "Richtiges" Programm für mein RP6 zu schreiben aber leider will das Programm nicht so wie ich will. :(

Das Programm sollte wenn es richtig funktioniert einen Gegenstand folgen.
(Der Gegenstand wird über die ACS Sensoren erkannt)

Das Problem ist zur Zeit das er nicht nach Rechts fahren will wenn sich das Hindernis nach Rechts bewegt.

Ich hab hier mal den Code Hochgeladen


#include "RP6RobotBaseLib.h"

void acsStateChanged(void)
{

if(obstacle_right)
//Hinderniss rechts
moveAtSpeed(100, 0);

if(obstacle_left)
//Hinderniss links
moveAtSpeed(0, 100);

if(obstacle_right && obstacle_right )
// Mitte
moveAtSpeed(100, 100);

statusLEDs.LED6 = obstacle_left && obstacle_right; // Mitte ?
statusLEDs.LED3 = statusLEDs.LED6;
statusLEDs.LED5 = obstacle_left; // Hinderniss links
statusLEDs.LED4 = (!obstacle_left); // LED5 invertiert!
statusLEDs.LED2 = obstacle_right; // Hinderniss rechts
statusLEDs.LED1 = (!obstacle_right); // LED2 invertiert !
updateStatusLEDs();
}


void bumpersStateChanged(void)
{
if(bumper_left)
moveAtSpeed(0,0);
setACSPwrOff();

if(bumper_right)
moveAtSpeed(0,0);
setACSPwrOff();

}



int main(void)
{

initRobotBase();

//ACS Event Handler reg.
ACS_setStateChangedHandler(acsStateChanged);

powerON(); // ACS Empfänger einschalten (und Encoder etc.)


//Event Handler registrieren:
BUMPERS_setStateChangedHandler(bumpersStateChanged );


while(true)
{
//Aus der Hauptschleife ständig die motionControl Funktion aufrufen - sie regelt die Motorgeschwindigkeit :
task_motionControl();
task_ADC(); // Wird wegen den Motorstromsensoren aufgerufen!

task_ACS(); // ständig die task_ACS Funktion aufrufen !

task_Bumpers(); // ständig aus der Hauptschleife aufrufen

setACSPwrLow(); // ACS auf mittlere Sendeleistung stellen.
}

return 0;
}


MFG V!P3R

Roboman93
15.03.2008, 15:48
ich habe hier auch mal so ein code, aber ohne die bumper:


#include "RP6RobotBaseLib.h"

void acsStateChanged(void)
{
uint8_t i;

if(obstacle_left && obstacle_right)
i = 1;


else if(obstacle_left)
i = 2;


else if(obstacle_right)
i = 3;




switch(i)
{
case 1:
{
writeString("hindernis mitte\n");

moveAtSpeed(100,100);
}
break;

case 2:
{
writeString("hindernis links\n");

moveAtSpeed(70,150);
}
break;

case 3:
{
writeString("hindernis rechts\n");

moveAtSpeed(150,70);
}
break;

default:
{
stop();
}

}




statusLEDs.LED6 = obstacle_left && obstacle_right;
statusLEDs.LED3 = statusLEDs.LED6;
statusLEDs.LED5 = obstacle_left;
statusLEDs.LED4 = (!obstacle_left);
statusLEDs.LED2 = obstacle_right;
statusLEDs.LED1 = (!obstacle_right);
updateStatusLEDs();
}
int main(void)
{
initRobotBase();
ACS_setStateChangedHandler(acsStateChanged);
powerON();
setACSPwrHigh();
changeDirection(FWD);
while(true)
{
task_RP6System();
}
return 0;
}

und hier die hex-file:

V!P3R
15.03.2008, 17:19
Danke Roboman93,

es funktioniert ohne Probleme O:) O:)

MFG
V!P3R

Roboman93
16.03.2008, 17:59
gut, freut mich

Roboman93
16.03.2008, 18:02
gut, freut mich O:) O:)
das problem bei der verfolgung mit den IR-Dioden ist, dass der bereich, wo nur eine diode das objekt erfasst, sehr klein. leider sind sie schlecht angebracht um sie ein bisschen zu biegen :(

radbruch
16.03.2008, 18:09
Vielleicht hilft ein Strohhalm, Schrupfschlauch oder ein Stück Pappe.