Hallo alle zusammen !!
Hier ist also mein Projekt, mein Ziel war es das projekt so einfach wie möglich zu verwirklichen (das Suche und das löschen ohne großes umbauen).
Prinzip: Der RP6 fährt in einem 1*1 Meter größen Areal herum, und orientiert sich mit hilfe der Bumper. Die Wände bestehen aus Schweisserdraht der mithilfe von Klebeband am Boden fixiert ist. Kommt ein Teelicht vor den RP6 erkennt er se durch seine Infrarotsensoren, alle LEDs gehen an und das Servo schließt den Stromkreis durch einen Kipp-Schalter und das Teelicht wird durch den Motor ausgeblasen. Leider musste ich eine Externe Stromquelle für den Motor nehmen, da der RP6 (VDD, GND) bei jedem Motorstart Abstürtzte (denselben Fehler hatte ich aber auch schon bei Großen Servos).
Hier das Video: http://www.youtube.com/watch?v=o2okdm7lwEE
Der Code:
Code:
#include "RP6RobotBaseLib.h"
uint8_t c;
void teelicht(void)
{
if (!obstacle_left && !obstacle_right && !bumper_left && !bumper_right) //wenn keine Hindernisse vorliegen
{
changeDirection(FWD);
moveAtSpeed(75,75);
}
if (obstacle_left && obstacle_right) //Haben die Infrarotsensoren ein Teelicht geortet
{
DDRC |= SCL;
PORTC &= ~SCL;
setLEDs(0b111111);
move(90, FWD, DIST_MM(50), BLOCKING);
for(c=0; c<50; c++) //Servoposition 1
{
PORTC |= SCL;
sleep(12);
PORTC &= ~SCL;
sleep(190);
}
setLEDs(0b100100); //LEDs blinken im Sekundentakt bis das Teelicht gelöscht ist
mSleep(1000);
setLEDs(0b010010);
mSleep(1000);
setLEDs(0b001001);
mSleep(1000);
setLEDs(0b000000);
for(c=0; c<50; c++) //Servo zurück
{
PORTC |= SCL;
sleep(9);
PORTC &= ~SCL;
sleep(190);
}
move(80, BWD, DIST_MM(100), BLOCKING);
rotate(80, RIGHT, 30, BLOCKING);
}
if (bumper_left) //ist der Linke Bumper gedrückt
{
move(80, BWD, DIST_MM(100), BLOCKING);
rotate(80, RIGHT, 110, BLOCKING);
}
if (bumper_right) //ist der Rechte Bumper gedrückt
{
move(80, BWD, DIST_MM(100), BLOCKING);
rotate(80, LEFT, 110, BLOCKING);
}
if (bumper_left && bumper_right) //sind beide Bumper gedrückt
{
move(80, BWD, DIST_MM(100), BLOCKING);
rotate(80, LEFT, 110, BLOCKING);
}
}
int main(void)
{
initRobotBase();
powerON();
setACSPwrLow(); // ACS auf geringe entfernung einstellen
while(true)
{
teelicht();
task_RP6System();
}
return 0;
}
So das war's !
Gruß Fabi
Lesezeichen