- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 37

Thema: ASURO Dunkel-Hell-Kantenverfolgung

  1. #11
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    Anzeige

    Powerstation Test
    c konnte ich vorher ganz gut...

    macht nix. mal sehn was rauskommt...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    10.05.2007
    Alter
    40
    Beiträge
    31
    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.

    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;
    }
    Danke fürs durchschauen!!

    Schönen Abend noch

  3. #13
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    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...

    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()
    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.
    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... =)
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  4. #14
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    699
    "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/

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    10.05.2007
    Alter
    40
    Beiträge
    31
    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!!

  6. #16
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    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!
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    10.05.2007
    Alter
    40
    Beiträge
    31
    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!!

  8. #18
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    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.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    10.05.2007
    Alter
    40
    Beiträge
    31
    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.

  10. #20
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    699
    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

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen