c konnte ich vorher ganz gut... ;)
macht nix. mal sehn was rauskommt...
Druckbare Version
c konnte ich vorher ganz gut... ;)
macht nix. mal sehn was rauskommt...
Hey damaltor,
Schau dir das doch mal an ob das so ungefähr C entspricht.
Hab das heute nachmittag mal versucht zu schreiben.
Das ist jetzt meiner Meinung nach NUR die Kantenverfolgung, mit 2 Unterscheidungen, je nach dem wo grade schwarz und weiß ist.
Mit den Schleifen bin ich mir nicht ganz sicher...und auch nicht wo ich die while(1) Schleife setzen muss. Wie ist das mit den if-Anweisungen? Die verlangen doch eigentlich eine reine else-Anweisung? Ich hab da jetzt ne if else Anweisung gemacht, da ich das in irgendeinem Programm in der Asuro Lib gesehen habe.
Danke fürs durchschauen!!Code:#include "asuro.h"
#define SPEED 0x9F
int main(void)
{
unsigned int data[2]; //data[0]->rechts, data[1]->links
Init();
FrontLED(On);
MotorDir(FWD,FWD);
MotorSpeed(SPEED,SPEED);
while(1)
{
LineData(data); //Liniensensoren
if ( data[0]>550 && data[1]<450 ) //RECHTS weiß, LINKS schwarz -> gerade weiterfahren
{
MotorDir(FWD,FWD);
MotorSpeed(SPEED,SPEED);
}
else if ( data[0]>600 && data[1]>600) //RECHTS weiß, LINKS weiß -> weiter LINKS fahren
{
MotorDir(FWD,FWD);
SPEED=SPEED+10;
MotorSpeed(150,SPEED);
}
else if ( data[0]<400 && data[1]<400 ) //RECHTS schwarz, LINKS schwarz -> weiter RECHTS fahren
{
MotorDir(FWD,FWD);
SPEED=SPEED-10;
MotorSpeed(150,SPEED);
}
LineData(data);
if ( data[0]<450 && data[1]>550 ) //RECHTS schwarz, LINKS schwarz -> gerade weiterfahren
{
MotorDir(FWD,FWD);
MotorSpeed(Speed,Speed);
}
else if (data[0]>600 && data[1]>600) //RECHTS weiß, LINKS weiß -> weiter RECHTS fahren
{
MotorDir(FWD,FWD);
SPEED=SPEED-10;
MotorSpeed(150,SPEED);
}
else if (data[0]<400 && data[1]<400 ) //RECHTS schwarz, LINKS schwarz -> weiter LINKS fahren
{
MotorDir(FWD,FWD);
SPEED=SPEED+10;
MotorSpeed(150,SPEED);
}
}
while (1);
return 0;
}
Schönen Abend noch :)
Schritt 1: bevor du es dir angewöhnst - schreibe keine hex-zahlen. du sparst keinen deut speicher, du musts umrechnen, und das programm wird unübersichtlicher. ausserdem musst du ein zeichen mehr tippen ;)
data[0] ist links, 1 ist rechts.
ich pass dein progeamm mal etwas an...
also: theoretisch sollte wenigstens eins der beiden ifs erfüllt sein (also linksschwarzrechtsweiss oder linksweissrechtsschwarz). je nachdem wird eine der beiden endlosschleifen gestartet und es wird immer geprüft ob beide fototransistoren die gleiche farbe sehen. dann wird die geschwindigkeit des rechten rades (über speed) angepasst.Code:#include "asuro.h"
int main(void)
{
unsigned int data[2]; //data[0]->rechts, data[1]->links
unsigned char speed=150;
Init();
FrontLED(On);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
if ((data[0]>550)&&(data[1]<450)) { // links weiss rechts schwarz
while(1){
if ((data[0] > 600)&&(data[1] > 600)) { // wenn beide weiss
speed=speed-10
}
if ((data[0] < 400)&&(data[1] < 400)) { //wenn beide schwarz
speed=speed+10
}
MotorSpeed(150,speed);
LineData(data[]);
} //ende schleife
} //ende if
if ((data[1]>550)&&(data[0]<450)) { // links schwarz rechts weiss
while(1){
if ((data[0] > 600)&&(data[1] > 600)) { // wenn beide weiss
speed=speed+10
}
if ((data[0] < 400)&&(data[1] < 400)) { //wenn beide schwarz
speed=speed-10
}
MotorSpeed(150,speed);
LineData(data[]);
} //ende schleife
} //ende if
while(1){ //wenn beide ifs nicht erfüllt wurden und damit beide endlosschleifen nicht gestartet wurden, dann wird das hier gemacht
StatusLED(RED);
}
return 0;
} //ende main()
wenn keines der beiden ifs erfüllt war, also nicht eindeutig gefunden wurde wo weiss und schwarz ist, wird die endlosschleife am ende ausgeführt (wenn erstmal eine der ersten schleifen läuft, kommt das programm hier nie an) und die statusled wird rot.
dieses programm ist sehr einfach gestrickt, und die werte für die fototransistoren sind nicht angepasst, und es kann noch keinen helligkeitsausgleich. aber ein anfang sollte es wohl sein.
ich habs nicht getestet...viel glück... =)
"Leider habe ich keinerlei Zugang zum Roboter, noch habe ich umfangreiche C Kenntnisse."
Dann ist der Asuro der ideale Einstieg für Dich.
C-Schnell-Kurs: http://www2.its.strath.ac.uk/courses/c/
Erst mal danke ehenkes.
Ich werde mir das mal morgen durchlesen!!
Und dann noch ein paar Fragen an dich damaltor.
1) Nach der Init() und der Festlegung von MotorDir usw....warum wird da nicht als erstes LineData gemacht?!? Du machst die while Schleife und am Ende dieser liest du erst die LineData(data[]) ein...soll das quasi heißen: Liese solange die LineData ein, bis eines der beiden ifs erfüllt ist? Das verwirrt mich ein bisschen, da bei Pascal das ja direkt nacheinander geschrieben wird. Habe ich das richtig verstanden?
2)Kannst du mir erklären warum das immer while(1) heißen muss? Für was steht die 1?
Ansonsten ist mir das eigentlich klar wie es funktioniert...nur wie gesagt, C ist komplett neu für mich!!
Danke für die Hilfe!!
das LIneData am Anfang habe ich vergessen. es kann direkt hinter Init() stehen.
ausserdem kann die zeile Motorspeed(speed,speed) am anfang weg, wird ja später eh gestartet.
eine while-schleife läuft solange, wie das was in der klammer ist WAHR ist. WAHR ist alles, was nicht null ist. null ist also FALSCH.
while(3==3) -> WAHR -> 1 -> schleife wird ausgeführt.
while(1+2==3) -> WAHR -> 1 -> wird ausgeführt
while(3-1==4) -> FALSCH -> 0 -> schleife wird nicht ausgeführt
while(3+3) -> WAHR (ist nicht 0) -> 1 -> schleife wird ausgeführt
while(3-3) -> FALSCH (ist gleich 0) -> 0 -> schleife wird nicht ausgeführt
x=3;
while(x==3) -> WAHR
tja... und while(1) wird ausgeführt solange in den klammern nicht 0 steht, also ewig. =) wird also eines der beiden ifs als richtig bewertet, also linksschwarzrechtsweiss oder andersrum, wird die entsprechende endlosschleife ausgeführt. der rest des programms wird dann nie mehr ausgeführt, da die endlosschleofe nie wieder verlassen werden kann!
Ah ok, jetzt habe ich das erst gerafft. Ich dachte while(1) steht immer nur einmal in einem ASURO Programm! Jetz isses klar.
Das soll einfach eine Endlosschleife sein, die nur verlassen wird, wenn keine einzige if Bedingung erfüllt worden ist. Und genauso ist es mit der zweiten while Schleife. Falls auch diese nicht erfüllt wird, wird das Programm beendet und die rote LED geht an!!
Danke für die Hilfe!!
nicht ganz. eine while(1) schleife wird NIEMALS verlassen.
völlig unabhängig von dem was drin ist.
(für die cracks: ja ich weiss, möglich ist es. aber so selten gebraucht...)
es wird am anfang durch die beiden ifs geprüft ob schwarz rechts oder links ist. dann wird die entsprechende endlosschleife gestartet. und nie mehr verlassen!!
nur wenn keines der beiden ifs wahr ist, also nicht erkannt wurde wo schwarz ist, dann wird die letzte schleife gestartet, und die led rot gemacht.
Achso, ok, das iss noch eine kleine Feinheit, aber das ist genauso logisch.
Ich hoffe ich bekomme das am Dienstag gut rum!
Wenn ich dann meinen eigenen ASURO habe, bastel ich da mal weiter dran rum...ich glaube nicht, dass ich den morgen noch bekomme und zusammenbauen kann.
Dann werd ich in meiner freien Zeit mal ein bisschen damit rumspielen!!
Also nochmal dankeschön! Du warst mir eine große Hilfe.
Schau Dir für den ASURO bei C folgende Features an:
- logische Bit-Operatoren (zumindest | und <<)
- if/else
- while, do/while und for
- Funktionen
- Zeiger und Arrays http://www.henkessoft.de/C++/C/arrays_pointer.htm