PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Hilfe beim Verbinden von zwei Teilprogrammen



LikeYou
30.11.2011, 17:44
Hallo Leute,

ich möchte ein Linienverfolgungsprogramm mit einem Kollisionsprogramm verbinden aber leider habe ich noch große Probleme beide mit einander zu verbinen.
Ich hoffe es kann mir jemand weiterhelfen.

Hier die beiden Teilprogramme.

Kollisionsprogramm:

#include "asuro.h"

int main(void){
unsigned int i;
Init();

while(1){


while(PollSwitch()==0)
{StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);} //fahre vorwärts


if(PollSwitch()!=0) // bis Schalter gedrückt wird
{StatusLED(RED); // Rote Lampe an

MotorDir(RWD,RWD); //Rückwärtsgang mit 120
MotorSpeed(120,120);
for (i=0;i<280;i++){Sleep(255);} //für 1 Sek zurückfahren
MotorSpeed(0,0); // Motoren stoppen
MotorDir(FWD,FWD); // Und Drehung einleiten für 1 Sek
MotorSpeed (0,120);
for (i=0;i<280;i++){Sleep(255);}
MotorSpeed(0,0);
}
}
return 0;
}

Linienverfolgung:

#include "asuro.h"

int main(void)
{
Init();

while(1)
{
int line_data[2];
LineData(line_data); // line_date[0]: linker Sensor, [1]: rechter Sensor
// schwarzer Untergrund: kleine Werte; heller Hintergrund: große Werte

FrontLED(ON); // liefert bessere bzw. konstrastreichere Werte
int limit = 45; // Dieser Vergleichswert ist an die Lichtverhältnisse anzupassen
int speed = 120;
int debug_mode = 0; // 0: aus; 1: an, ASURO sendet die Werte der Sensoren zurück

while (line_data[1] > limit)
{
if (debug_mode)
{
SerWrite("rechts\r\n", 8 );
PrintInt(line_data[1]);
SerWrite("\r\n", 2);
}
BackLED(OFF, ON);
MotorSpeed(0, speed);
LineData(line_data);
}

while (line_data[0] > limit)
{
if (debug_mode)
{
SerWrite("links\r\n", 7);
PrintInt(line_data[0]);
SerWrite("\r\n", 2);
}
BackLED(ON, OFF);
MotorSpeed(speed, 0);
LineData(line_data);
}
MotorDir(FWD, FWD);
MotorSpeed(speed, speed);
}

return 0;
}

Kampi
30.11.2011, 17:54
Naja das Kollisionsprogramm kannst du ja so übernehmen wie das da steht. Du musst dann in das Programm nur eine weitere If-Abfrage machen um den Sensor auszulesen. Verstehst du den die beiden Einzelprogramme oder hast du da auch schon schwierigkeiten?
Weil der Sinn ist ja das du es verstehst :) es bringt nichts wenn dir einer ein Programm schreibt was du nicht nachvollziehen kannst oder? ;)

LikeYou
30.11.2011, 19:48
Zugegeben nich zu 100%, aber das wichtigste verstehe ich glaube ich. ^^

"Nur" eine weitere If-Abfrage? Ok, klingt ja im Grunde nicht so schwer, aber ich dachte der Asuro kann nicht zwei Sachen parallel machen. Also muss er die Linienverfolgung quasi aussetzen während er die Kollision hat und sich dreht?
Ähm kann ich es auch anders herum machen, also das Kollisions- in das Linienverfolgungsprogramm einbinden? Würde das dann auch mit einer weiter If-Abfrage möglich sein?

Und danke für deine Antwort ;)

Kampi
30.11.2011, 19:53
Klar ist sogar die bessere Idee das so rum zu machen :)
Du hast auch recht der Asuro kann keine zwei Sachen gleichzeitig machen. Du musst das alles nacheinander machen.
Du nimmst dann einfach das Standart Linienfolgenprogramm und machst da eine If-Abfrage rein. Also falls der Schalter für die Kollisionsabfrage gedrückt wird soll er rückwärts fahren. Wenn nicht soll er weiter der Linie folgen.
Also müsstest du eigentlich nur diese Zeilen:

if(PollSwitch()!=0)
{StatusLED(RED);

MotorDir(RWD,RWD);
MotorSpeed(120,120);
for (i=0;i<280;i++){Sleep(255);}
MotorSpeed(0,0);
MotorDir(FWD,FWD);
MotorSpeed (0,120);
for (i=0;i<280;i++){Sleep(255);}
MotorSpeed(0,0);
}

in das Linienfolgenprogramm reinschreiben. Das müsste eigentlich funktionieren.....

LikeYou
30.11.2011, 20:11
Ah oke, alles klar. Ich habe es jetzt folgendermaßen versucht. Leider kann ich es nicht compelieren, da ich auf dem PC an dem ich im moment bin nicht ProgrammersNotepad2 drauf ist.
Noch eine zwischen Frage die Klammer nach else { ist schon nötig oder?

#include "asuro.h"

int main(void)
{
Init();

while(1)
{

if(PollSwitch()!=0)
{StatusLED(RED);

MotorDir(RWD,RWD);
MotorSpeed(120,120);
for (i=0;i<280;i++){Sleep(255);}
MotorSpeed(0,0);
MotorDir(FWD,FWD);
MotorSpeed (0,120);
for (i=0;i<280;i++){Sleep(255);}
MotorSpeed(0,0);
}

else{
int line_data[2];
LineData(line_data); // line_date[0]: linker Sensor, [1]: rechter Sensor
// schwarzer Untergrund: kleine Werte; heller Hintergrund: große Werte

FrontLED(ON); // liefert bessere bzw. konstrastreichere Werte
int limit = 45; // Dieser Vergleichswert ist an die Lichtverhältnisse anzupassen
int speed = 120;
int debug_mode = 0; // 0: aus; 1: an, ASURO sendet die Werte der Sensoren zurück

while (line_data[1] > limit)
{
if (debug_mode)
{
SerWrite("rechts\r\n", 8 );
PrintInt(line_data[1]);
SerWrite("\r\n", 2);
}
BackLED(OFF, ON);
MotorSpeed(0, speed);
LineData(line_data);
}

while (line_data[0] > limit)
{
if (debug_mode)
{
SerWrite("links\r\n", 7);
PrintInt(line_data[0]);
SerWrite("\r\n", 2);
}
BackLED(ON, OFF);
MotorSpeed(speed, 0);
LineData(line_data);
}
MotorDir(FWD, FWD);
MotorSpeed(speed, speed);
}
}
return 0;
}

Kampi
30.11.2011, 20:13
Ja nach jedem if oder else muss der Teil der ausgeführt werden soll zwischen {} stehen

LikeYou
30.11.2011, 20:27
Ist es so richtig eingefügt?

Jetzt hätt ich noch eine Frage und zwar wie kann ich die Zeit verkürzen die der Asuro rückwärts fähr, jetzt ist es ja 1 Sec.
Ich kann das über Sleep einstellen oder?
Im moment ist es ja auf Sleep(255) eingestellt, aber was entspricht dem Wert 255? ^^

radbruch
30.11.2011, 20:38
Hallo

Sleep(1) dauert je nach Version der Library 1/72000 oder 1/36000 Sekunde. Normalerweise ist PrintInt() nur in 36kHz-Libraries zu finden, aber dann passt die genannte Sekunde nicht zum errechneten Wert:

for (i=0;i<280;i++){Sleep(255);

280 * 255 * 1/36000sek = 1,98sek

Möglicherweise erkennt der Kompiler int debug_mode = 0; und optimiert den Debugteil raus. Dann wäre das mit der CD-Lib und 72kHz übersetzbar.

Gruß

mic

P.S.: Eine Sekunde:

for(i=0; i<1000; i++) Sleep(36); // Sleep(36) dauert 1/1000Sek, bei CD-Library Sleep(72)

LikeYou
30.11.2011, 20:55
Also ich hab mir alle neuesten Versionen aus dem internet runtergeladen welche Version habe ich dann ?

for(i=0, i<1000; i++) für was steht die 1000 in diesem fall?
bei meinem programm ist das ja auf 280

Kampi
30.11.2011, 21:03
for(i=0, i<1000; i++)
ist eine Zählschleife. Der startet mit i = 0 und führt den Befehl der danach kommt solange aus bis i größer als 1000 ist. Das i++ heißt das er in einser Schritten zählt.
Eine komplette Zählschleife würde so aussehen:
for(i=0, i<1000; i++)
{
}
Radbruch hat ja eben gesagt das Sleep(1) = 1/36000 Sekunden ist. Dementsprechend ist Sleep(36)= 36/36000 und das ergibt 1/1000. Das heißt Sleep(36) dauert 36/36000 Sekunden oder gut 1ms. Und deswegen machst du die Zählschleife von 0 bis 1000. Weil er dann 1000x Sleep(36) ausführt. Und das sind 1000x 1ms also 1 Sekunde. Wenn du jetzt 2 Sekunden haben willst schreibste statt 1000 2000. Für 3 Sekunden 3000 usw.
Hoffe das hilft dir weiter :)

LikeYou
30.11.2011, 21:12
Ja sehr! Vielen dank x) .. ich werd das morgen alles mal testen und dann mal sehen. Hoff ihr helft mir dann ein weiteres mal falls Schwierigkeiten auftreten sollten.

radbruch
30.11.2011, 21:14
Also ich hab mir alle neuesten Versionen aus dem internet runtergeladen welche Version habe ich dann?
Aktuell ist V2.8:
https://www.roboternetz.de/community/threads/26974-Die-wichtigsten-Dateien-Quellcodes-Downloads?p=252982&viewfull=1#post252982

In der Datei CHANGELOG steht der Hinweis auf die Version. Ab v2.3 sind es 36kHz.

LikeYou
01.12.2011, 14:13
Ich meine mich zu erinnern, dass ich mal irgendwo gelesen hab das diese formulierung hier problematisch werden kann:
(PollSwitch()!=0) <-- das soll die bedingung sein das er für kurze zeit rückwärs fährt
falls diese schreibweise tatsächlich problematisch ist, was wäre besser?

denn bei meinem aktuellen programm folgt er erst der linie und dann fängt er plötzlich an sich zu dreht? kann das daran liegen? oder sind noch andere fehler in dem programm?

Denn eigendlich soll er ja einer linie folgen und wenn er wo dagegen stößt kurz rückwärtsfahren und dann eine links/rechts kurve machen und dann wieder einer linie folgen.
Kann mir bitte jemand helfen?

#include "asuro.h"

int main(void)
{
Init();
int i;

while(1)
{

if(PollSwitch()!=0)
{StatusLED(RED);

MotorDir(RWD,RWD);
MotorSpeed(120,120);
for (i=0;i<280;i++){Sleep(255);}
MotorSpeed(0,0);
MotorDir(FWD,FWD);
MotorSpeed (0,120);
for (i=0;i<280;i++){Sleep(255);}
MotorSpeed(0,0);
}

else{
int line_data[2];
LineData(line_data); // line_date[0]: linker Sensor, [1]: rechter Sensor
// schwarzer Untergrund: kleine Werte; heller Hintergrund: große Werte

FrontLED(ON); // liefert bessere bzw. konstrastreichere Werte
int limit = 45; // Dieser Vergleichswert ist an die Lichtverhältnisse anzupassen
int speed = 120;
int debug_mode = 0; // 0: aus; 1: an, ASURO sendet die Werte der Sensoren zurück

while (line_data[1] > limit)
{
if (debug_mode)
{
SerWrite("rechts\r\n", 8 );
PrintInt(line_data[1]);
SerWrite("\r\n", 2);
}
BackLED(OFF, ON);
MotorSpeed(0, speed);
LineData(line_data);
}

while (line_data[0] > limit)
{
if (debug_mode)
{
SerWrite("links\r\n", 7);
PrintInt(line_data[0]);
SerWrite("\r\n", 2);
}
BackLED(ON, OFF);
MotorSpeed(speed, 0);
LineData(line_data);
}
MotorDir(FWD, FWD);
MotorSpeed(speed, speed);
}
}
return 0;
}

Kampi
01.12.2011, 14:38
Ist der Pin wo der Schalter dran angeschlossen ist vielleicht nicht vernünftig auf Masse gezogen, sodass die Pegel dort mal schwanken können?
Wäre eine erste Idee, weil auf dem ersten Blick sieht das Programm richtig aus.
Setz mal bitte deine Programme zwischen [ code] und [/ code] ins Forum (ohne das Leerzeichen).
Das sieht dann so aus


Test


Bzw. ist es nur die Schreibweise des Befehls die Probleme macht oder der ganze Befehl?
Weil sonst frag doch einfach den Pin wo der Taster dran angeschlossen ist direkt mit einer If-Abfrage ab.

radbruch
01.12.2011, 14:46
Beispielhaft für die unzähligen Threads:

https://www.roboternetz.de/community/threads/55517-Probleme-mit-meinen-Programmen?p=530311&viewfull=1#post530311
https://www.roboternetz.de/community/threads/55453-Zeitliche-begrenzung-beim-fahren-Hilfe-ben%C3%B6tigt?p=529782&viewfull=1#post529782

LikeYou
01.12.2011, 15:02
hm ich glaube ein weiteres problem ist das er doch die kurve nur dann fährt wenn ein taster gedrück ist . Oder verstehe ich da das programm falsch?
tut mir wirklich leid aber ich habe kaum programmierfähigkeit ... ich wüsste auch nicht wie ich den programmteil einbinden könnte der jeden taster mehrmals abfrägt

hier nochmal der programm code:



#include "asuro.h"

int main(void)
{
Init();
int i;

while(1)
{

if(PollSwitch()!=0)
{StatusLED(RED);

MotorDir(RWD,RWD);
MotorSpeed(120,120);
for (i=0;i<280;i++){Sleep(255);}
MotorSpeed(0,0);
MotorDir(FWD,FWD);
MotorSpeed (0,120);
for (i=0;i<280;i++){Sleep(255);}
MotorSpeed(0,0);
}

else{
int line_data[2];
LineData(line_data); // line_date[0]: linker Sensor, [1]: rechter Sensor
// schwarzer Untergrund: kleine Werte; heller Hintergrund: große Werte

FrontLED(ON); // liefert bessere bzw. konstrastreichere Werte
int limit = 45; // Dieser Vergleichswert ist an die Lichtverhältnisse anzupassen
int speed = 120;
int debug_mode = 0; // 0: aus; 1: an, ASURO sendet die Werte der Sensoren zurück

while (line_data[1] > limit)
{
if (debug_mode)
{
SerWrite("rechts\r\n", 8 );
PrintInt(line_data[1]);
SerWrite("\r\n", 2);
}
BackLED(OFF, ON);
MotorSpeed(0, speed);
LineData(line_data);
}

while (line_data[0] > limit)
{
if (debug_mode)
{
SerWrite("links\r\n", 7);
PrintInt(line_data[0]);
SerWrite("\r\n", 2);
}
BackLED(ON, OFF);
MotorSpeed(speed, 0);
LineData(line_data);
}
MotorDir(FWD, FWD);
MotorSpeed(speed, speed);
}
}
return 0;
}

Kampi
01.12.2011, 17:12
Wenn du so Probleme hast das fertige Programm zu verstehen, fang doch erstmal mit kleinen Schritten an. :)
Lass den Asuro erstmal nur gerade aus fahren und dann eine Kurve usw.
Gib ihm erstmal nur feste Sachen vor die er tun soll ohne auf seine Umwelt zu reagieren so das du die Befehle und deren Funktion kennen lernst. Und dann taste dich immer weiter ran. Also wenn du die Befehle drauf hast sag dem Asuro das er nach Links fahren soll wenn der linke Taster gedrückt wird. So tastest du dich Schritt für Schritt an dein eigentliches Ziel heran und lernst auch die Befehle. Es bringt ja nichts wenn du ein langes Programm hast wo du kaum was von verstehst oder :)?