ich meinte nur weil du geschrieben hast ich soll mehr über den Asuro und den RP6 und soetwas erzählen
Druckbare Version
ich meinte nur weil du geschrieben hast ich soll mehr über den Asuro und den RP6 und soetwas erzählen
Hab jetzt mal ein Programm geschrieben, bei dem er zuerst einfach der Linie folgen soll und nach einem Tastendruck dann den 2ten Teil des Programms ausführen soll, also auf Kollisionsfahrt gehen.
Habe jetzt nur Problem, das ich das mit dem bis zu Tastendruck irgendwie nicht hinbekomme, lest es euch bitte mal durch un schlagt mal vor wie es gehen müsste. Danke.
Code:#include "asuro.h"
int main(void){
unsigned int data[2], i;
unsigned char b1, b2, taste;
Init();
FrontLED(ON);
MotorDir(FWD,FWD);
MotorSpeed(255,255);
taste = PollSwitch();
/*Linienfolger bis Tastendruck*/
while(taste == 0){
LineData(data);
if ((data [0] < 20) && (data [1] > 20 )){
MotorDir(RWD,FWD);
MotorSpeed(0,255);
BackLED(OFF,ON);
StatusLED(RED);
}
if ((data [1] < 20) && (data [0] > 20 )){
MotorDir(FWD,RWD);
MotorSpeed(255,0);
BackLED(ON,OFF);
StatusLED(RED);
}
if ((data [1] < 20) && (data [0] < 20 )){
MotorDir(FWD,FWD);
MotorSpeed(255,255);
BackLED(ON,ON);
StatusLED(GREEN);
}
}
FrontLED(OFF);
MotorSpeed(0,0);
for (i=0;i<1024;i++){Sleep(255);}
/*Kollision bis zum bitteren Ende*/
while (1){
b1 = PollSwitch();
b2 = PollSwitch();
if (b1 == 0 && b2 == 0){
MotorDir(FWD,FWD);
MotorSpeed(255,255);
BackLED(OFF,OFF);
StatusLED(GREEN);
}
else if (b1 && b2 && b1 == b2){
MotorDir(BREAK,BREAK);
if (b1 > 7){
MotorDir(RWD,RWD);
MotorSpeed(100,255);
BackLED(ON,OFF);
StatusLED(RED);
}
if (b1 < 8){
MotorDir(RWD,RWD);
MotorSpeed(255,100);
BackLED(OFF,ON);
StatusLED(RED);
}
for (i=0;i<200;i++){Sleep(255);}
}
}
return 0;
}
Hallo
Wie kann taste hier jemals ungleich 0 werden, wenn die while-Schleife erstmal betreten wurde? Auch in der Liniensuchschleife sollte zur Entstörung der PollSwitch()-Wert überprüft werden.Zitat:
taste = PollSwitch();
/*Linienfolger bis Tastendruck*/
while(taste == 0){
....
Gruß
mic
Jetzt wo du es sagst: Gute Frage :) ](*,)
Also muss ich einfach in die Schleife taste=PollSwitch() integrieren und das ganze geht oder? (Hab grad keine Zeit um es zu probieren)
Mal vielen Dank für diese Denkhilfe ;)
Hab das jetzt mal probiert, aber jetzt wird der Teil noch nicht mal einmal ausgeführt. Außerdem habe ich dann mal taste komplett weg gelassen und dafür "while(PollSwitch() == 0)" probiert, dabei war jedoch auch das Problem, das es dann nicht ausgeführt wurde.
Wo könnte das Problem sein?
Könnte mir vielleicht jemand eine komplett richtige Version nach meiner Vorlage schreiben?
Hallo
Die Linienverfolgung wird übersprungen und sofort der Kollisionsteil abgearbeitet? Macht er das:
if (b1 == 0 && b2 == 0){ ?
Wenn nicht, dann stimmt vielleicht, wenn keine Taste gedrückt ist, der Rückgabewert von PollSwitch() nicht. Stichwort wäre dann: Tasten kallibrieren.
Notlösung wäre vielleicht eine tolerantere Abfrage:
while(PollSwitch() < 3)
Gruß
mic
Das Programm wird ausgeführt, als ob es den Teil mit der Linienverfolgung gar nicht gäbe.
DEr 2te Teil funktioniert Problemlos. Also macht er:
if (b1 == 0 && b2 == 0){
Selbst bei einer sehr toleranten Abfrage, habe mal 17 genommen kommt es nach einer immer unterschiedlichen Zeit dazu das er plötzlich anhält, also das Programm weiter abläuft, als ob der Taster gedrückt worden wäre. Jedoch ist um so höher sie Zahl die Zeit länger. Was könnte da das Problem sein?
Kann man den Wert von PollSwitch() über die IR-Schnittstelle immer an den PC senden? Dann könnte man das mal anschauen.
Hallo
Klar kann man die Daten von PollSwitch() auch an das Terminal senden:
https://www.roboternetz.de/phpBB2/ze...ag.php?t=35598
:)
Gruß
mic
Hab das mal ausprobiert. Es kamen immer die richtigen Werte.
Hab jetzt mal noch weiter mit dem Programm probiert. Dabei ist folgendes Programm rausgekommen und es funktioniert soger :)
Könnte mir vielleicht mal jemand das Blockschaltbild des AVR Prozessors erklären? (Ist das aus der ASURO-Anleitung)Code:#include "asuro.h"
int main (void)
{
unsigned int data[2], i;
unsigned char b1, b2;
int speed;
Init();
speed = 160;
FrontLED(ON);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
while (1){
b1 = PollSwitch();
b2 = PollSwitch();
if (b1 == 0 && b2 == 0){
LineData(data);
if ((data [0] < 20) && (data [1] > 20 )){
MotorDir(RWD,FWD);
MotorSpeed(0,speed);
BackLED(OFF,ON);
StatusLED(RED);
}
if ((data [1] < 20) && (data [0] > 20 )){
MotorDir(FWD,RWD);
MotorSpeed(speed,0);
BackLED(ON,OFF);
StatusLED(RED);
}
if ((data [1] < 20) && (data [0] < 20 )){
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
BackLED(ON,ON);
StatusLED(GREEN);
}
}
else if (b1 && b2 && b1 == b2){
while(1){
b1 = PollSwitch();
b2 = PollSwitch();
if (b1 == 0 && b2 == 0){
MotorDir(FWD,FWD);
MotorSpeed(255,255);
BackLED(OFF,OFF);
StatusLED(GREEN);
}
else if (b1 && b2 && b1 == b2){
MotorDir(BREAK,BREAK);
MotorDir(RWD,RWD);
MotorSpeed(255,100);
BackLED(OFF,ON);
StatusLED(RED);
for (i=0;i<200;i++){Sleep(255);}
}}
}
}
return 0;
}
Danke
Hab jetzt meine Präsentation rum und eine 1 bekommen *freu*
Er hat zum Glüch nicht nach dem Schaltbild gefragt :)