an sich ganz fein, aber damit misst du nicht das umgebungslicht, sondern nur den unterschied zwischen frontled on und off. wozu?
teste erstmal das programm ob das überhaupt funktioniert, bevor du es verfeinerst...
Hallo,
jetzt möchte ich meinem alten Programm gerne zur Umgebungslichtkompensation was hinzufügen.
Da ich ja auf einer Schwarz-Weiß-Kante fahre, ist meine Idee folgende:
Ich stehe auf der Kante, links schwarz rechts weiß.
Ich messe nun also auf beiden Transistoren jeweils mit LED on und off.
Dann bilde ich die Differenz aus den Messwerten des linken bzw. rechten Transistors. Da links auf schwarz steht, müsste sich ja hierfür eine andere Differenz ergeben als für den rechten Transistor.
Das habe ich also soweit.Code:Init(); FrontLED(Off); LineData(data); //links->schwarz, rechts->weiß a=data[0]; b=data[1]; FrontLED(On); c=data[0]; d=data[1]; schwarz=c-a; weiß=d-b;
Das würde ich gerne in eine Funktion umgeblicht packen, damit ich im mainprogram nur noch umgeblicht aufrufen muss.
Jetzt ist aber mein Problem, dass ich an die Differenzwerte für Weiß und Schwarz nicht rankomme. Wie bekomme ich denn den Digitalwert?
Desweiteren hab ich mit der funktion so meine Probleme.
so würde ich meine Funktion basteln und dann im main einbauen.int umgeblicht (LineData(Data));
{
int a,b,c,d,schwarz,weiß;
FrontLED(Off);
LineData(data); //links->schwarz, rechts->weiß
a=data[0];
b=data[1];
FrontLED(On);
c=data[0];
d=data[1];
schwarz=c-a;
weiß=d-b;
}
Ist das so in etwa richtig? Bin ich auf dem richtigen Kurs?
Ich weiß, das sieht alles ziemlich unkoordiniert aus
Wenn ich dann mal den Differenzwert habe, dann kann ich das in dem obigen(von damaltor) verbesserten Programm als Bedingung in den if Anweisungen einbauen.
Andererseits habe ich mir auch überlegt, dass ich die Differenz zwischen Links und Rechts bilde, das müsste ja, wenn man auf Kurs ist, immer einen festen Wert ergeben.
Beides hört sich für mich plausibel an...aber am Programmieren haperts halt wieder.
Ich hoffe ihr könnt mir mal wieder helfen!!
Liebe Grüße
an sich ganz fein, aber damit misst du nicht das umgebungslicht, sondern nur den unterschied zwischen frontled on und off. wozu?
teste erstmal das programm ob das überhaupt funktioniert, bevor du es verfeinerst...
Morgen!
Also mein Gedanke war, wenn ich zB mit dem linken Sensor auf einer schwarzen Fläche stehe, dann müsste die Differenz der beiden linken Sensorwerte(LED ON OFF) einen ~gleichbleibenden Wert ergeben. Völlig aus dem Hut gezogen sage ich jetzt einfach für eine schwarze Fläche ergibt sich eine Differenz von 100, und für eine weiße etwa 200. Somit hätte ich ja eine Bedingung dafür, ob sich ASURO auf Kurs befindet, oder ob er neben der Spur liegt.
Was ich mir aber da eingehandelt hab, kam mir erst später in den Sinn: Ich muss immer erst 2mal messen, einmal mit einmal ohne LED, muss die Werte zwischenspeichern, und die müsste ich dann mit Referenzwerten vergleichen, also mit diesen 100 und 200 (welche ich natürlich nicht habe).
Ist es möglich, dass mir ASURO diese Werte schickt (per IR nach dem Programmablauf)? Und dann müsste ich vor jeder while Schleife, von denen ich momentan ja Stück habe, diese Messung machen, und das wird dann ja relativ lange für eine so kleine Funktion!
Ich hoffe, meine Idee mit dem Differenzwert einer LED ist klar, ob die so funktioniert weiß ich nicht.
Leider kann ich das auch noch nicht testen, da mein ASURO noch nicht da ist. Und selbst dann muss ich den erst mal zum laufen bringen
die idee sollte gehen. die werte kannst du bei jedem mal wo das programm gestertet wird, neu einlesen und in einer variable speichern. wenn sie sich dauerhaft sehr ähneln, dann könnte man sie auch im eeprom des prozessors speichern. eine kurzzeitige messung mit quasiblinkender led ist kein problem. nur den sinn des ganzen verstehe ich nicht. wozu wissen wo der unterschied ist?
Na ich möchte gerne den Unterschied zwischen schwarzer und weißer Fläche wissen, unabhängig davon, wie die Lichtverhältnisse sind. Wenn ich von den Schwellenwerten 450 und 550 ausgehe, dann sind die ja immer noch vom Umgebungslicht abhängig. Mit dieser Differenzbildung möchte ich gerne einen zu einer best. Farbfläche korrespondierenden Wert erhalten.
Wenn der ASURO dann über das Feld fährt, und stets diese Messung macht und mit dem Differenzwert vergleicht, weiß er, ob am linken Sensor was anderes anliegt als am rechten. Und das halt auch, wenn unterschiedliche Lichtverhältnisse vorliegen. (Ich denke das mit 450 und 550 sollte hier OHNE Probleme auch funktionieren, nur ist das mit dem Umgebungslicht halt Teil der Aufgabe!!!).
Ich würde das ja mal gern versuchen, aber ich kann ja nicht.
Wie würdest du das, was ich da vorhabe denn in eine Funktion packen?
Ich habs ja oben schon mal versucht...ich will die definieren und dann nur im Programm aufrufen müssen.
Oder eben so: Wie könnte man denn die Umgebungslichtkompensation noch/sonst machen?
Also so hab ich mir das vorgestellt. Bitte nicht auf die Feinheiten achen
Bitte kommentieren was ihr dazu sagt, wäre das so in der Art möglich?Code:#include "asuro.h" int RefLinks(LineData); //Funktion für Differenzwert Links FrontLED(ON); LineData(Data); a=data[0]; FrontLED(OFF); LineData(Data); c=data[0]; LRef=a-c; return LREF; int RefRechts(LineData); //Funktion für Differenzwert Rechts FrontLED(ON); LineData(Data); b=data[1]; FrontLED(OFF); LineData(Data); d=data[1]; RRef=b-d; return RRef; int main(void) { unsigned int data[2]; //data[0]->links, data[1]->rechts unsigned char speed=150; unsigned char taste; Init(); FrontLED(ON); LineData(Data); a=data[0]; b=data[1]; FrontLED(OFF); LineData(Data); c=data[0]; d=data[1]; LRef=a-c; //Aktueller Referenzwert Links RRef=b-d; //Aktueller Referenzwert Rechts if ((data[0]<450)&&(data[1]>550)) { // links schwarz rechts weiß while (1){ LREF = RefLinks(LineData); //Aufrufen der Funktion RRef = RefRechts(LineData); //Aufrufen der Funktion if (LRefakt > LRef );{ //zu weit rechts->links weniger speed speed=speed-10; } if (RRefakt < RRef );{ //zu weit links->links mehr speed speed=speed+10; } MotorSpeed(speed,150); taste=PollSwitch(); if (taste>0){ MotorSpeed(0,0); StatusLED(RED); } .... für linksweissrechtsschwarz genauso
Könnt ihr mir eine andere Möglichkeit nennen? Oder mir etwas zeigen?
EDIT: Wie ich meine "Umgebungslichtkompensation" in die erste Abfrage, also bei der Entscheidung wo nun schwarz und weiß sind, einbaue, habe ich noch keinen Schimmer. Eigentlich ist das ja sinnlos, weil ich nicht zuordnen kann, was für ein Wert für schwarz und was für ein wert für weiß steht!
Ich dreh mich im Kreis
Jetzt habe ich nochmal was....
Im Prinzip nichts anderes als vorhin!!Code:#include "asuro.h" int main(void){ unsigned int data[2]; unsigned char speed=150; unsigned char taste; unsigned char A=0,B=0; Init(); LineData(data); A=data[0]; B=data[1]; FrontLED(ON); MotorDir(FWD,FWD); while ((data[0]>550) && (data[1]<450)){ //LwRs BackLED(OFF,OFF); MotorSpeed(150,150); LineData(data); taste=PollSwitch(); if (taste>0){ MotorSpeed(0,0); StatusLED(RED); } } while ((data[0]<550) && (data[1]>550)){ //LsRw BackLED(ON,ON); MotorSpeed(150,150); LineData(data); taste=PollSwitch(); if (taste>0){ MotorSpeed(0,0); StatusLED(RED); } } while ((data[0]>600) && (data[1]>600) && (A>B)){ //weiter rechts BackLED(ON,OFF); speed=speed-10; MotorSpeed(150,speed); LineData(data); taste=PollSwitch(); if (taste>0){ MotorSpeed(0,0); StatusLED(RED); } } while ((data[0]<400) && (data[1]<400) && (A>B)){ //weiter links BackLED(OFF,ON); speed=speed+10; MotorSpeed(150,speed); LineData(data); taste=PollSwitch(); if (taste>0){ MotorSpeed(0,0); StatusLED(RED); } } while ((data[0]>600) && (data[1]>600) && (A<B)){ //weiter links BackLED(OFF,ON); speed=speed+10; MotorSpeed(150,speed); LineData(data); taste=PollSwitch(); if (taste>0){ MotorSpeed(0,0); StatusLED(RED); } } while ((data[0]<400) && (data[1]<400) && (A<B)){ //weiter rechts BackLED(ON,OFF); speed=speed-10; MotorSpeed(150,speed); LineData(data); taste=PollSwitch(); if (taste>0){ MotorSpeed(0,0); StatusLED(RED); } } while(1){ StatusLED(RED); } return 0; }
Nur jetzt soll der ASURO auch mit dem Wechsel der Farben der Kanten zurechtkommen, also nicht in einer Endlosschleife while(1) stecken bleiben.
Deswegen lese ich am Anfang mit A und B die Werte für links und rechts ein, egal welche Farbe die haben. Dann gehe ich in die einzelnen Schleifen und vergleiche die Bed. mit A und B. Das Problem ist nur, dass nach einem Programmdurchlauf A und B erneut eingelesen werden (oder?)...und falls ASURO grade 2mal auf weiß steht, dann stimmt gar nichts mehr. Kann man die zuerst gemessenen Werte irgendwo-/wie unveränderbar speichern ???
Habt Geduld mit mir
oben rechts über deinem post ist ein button, da steht edit drauf. bitte editiere deine beiträge, und hänge das neue dran, sofern noch kein anderer nach dir gepostet hat.
deinen code muss ich mir mal morgen zu gemüte führen, für heute bin ich zu müde... =)
Erst mal Entschuldigung, für mein Gespamme...ich hab den EDIT Button aber schon mal benutzt
Und jetzt zu meiner neuesten Kreation.
Erst mal kurz der Ablauf, was ich mir dabei gedacht habe.
1. Einlesen ob rechtsschwarzlinksweiß oder andersrum
2. Abspeichern in A und B
while(1){
3. Falls A>B (linksweißrechtsschwarz) -> 2 versch. while schleifen
4. Falls A<B (linksschwarzrechtsweiß) -> 2 versch. while schleifen
}
Einfach mal anschauen!!
Ich würde das ja mal gerne versuchen, aber so rein beim durchschauen denk ich mir, das müsste doch funktionieren
EDIT: Ich hab keine Ahnung warum jetzt alles bold ist, ich habe keinen Knopf gedrückt!!Code:#include "asuro.h" int main(void){ unsigned int data[2]; unsigned char speed=150; unsigned char taste; unsigned char A=0,B=0; Init(); LineData(data); A=data[0]; B=data[1]; FrontLED(ON); MotorDir(FWD,FWD); if ( ((data[0]>550) && (data[1]<450)) || ((data[0]<450) && (data[1]>550)){ while(1){ do { BackLED(OFF,OFF); MotorSpeed(150,150); LineData(data); taste=PollSwitch(); if (taste>0){ MotorSpeed(0,0); StatusLED(RED); } }//ende do while (((data[0]>550) && (data[1]<450)) || ((data[0]<450) && (data[1]>550))) while ((data[0]>600) && (data[1]>600) && (A>B)){ //weiter rechts BackLED(ON,OFF); speed=speed-10; MotorSpeed(150,speed); LineData(data); taste=PollSwitch(); if (taste>0){ MotorSpeed(0,0); StatusLED(RED); } } while ((data[0]<400) && (data[1]<400) && (A>B)){ //weiter links BackLED(OFF,ON); speed=speed+10; MotorSpeed(150,speed); LineData(data); taste=PollSwitch(); if (taste>0){ MotorSpeed(0,0); StatusLED(RED); } } while ((data[0]>600) && (data[1]>600) && (A<B)){ //weiter links BackLED(OFF,ON); speed=speed+10; MotorSpeed(150,speed); LineData(data); taste=PollSwitch(); if (taste>0){ MotorSpeed(0,0); StatusLED(RED); } } while ((data[0]<400) && (data[1]<400) && (A<B)){ //weiter rechts BackLED(ON,OFF); speed=speed-10; MotorSpeed(150,speed); LineData(data); taste=PollSwitch(); if (taste>0){ MotorSpeed(0,0); StatusLED(RED); } } }//ende while }//ende if while(1){ StatusLED(RED); } return 0; }//ende main
sieht auf den ersten blick gar nicht schlecht aus. wird zeit dass du deinen asuro bekommst zum testen... =)
edit: habe das bold weggemacht. das lag an der schlechten html-interpretation des phbb2-systems: du hast a<b geschreiben, und [b] bedeutet "BOLD" in html. wenn du sowas nochmal hast, musst du unten drunter die checkbox "HTML DEAKTIVIEREN" anklicken.
Lesezeichen