- LiFePO4 Speicher Test         
Ergebnis 1 bis 5 von 5

Thema: ACS mit Lichtsensoren

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.04.2009
    Ort
    Wörgl
    Alter
    28
    Beiträge
    175

    ACS mit Lichtsensoren

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Leute,

    ich hab ein Programm für den RP6 geschrieben, so ähnlich wie das Beispielprogramm Example_05_Move_05, nur weniger kompliziert:



    Code:
      #include "RP6RobotBaseLib.h"
      
      void Lichtsensoren(void)
       {
        int x,y;
    	  x=adcLSL;
    	  y=adcLSR;
    	  
    	if(x+100 > y && x-100 < y)
    	 {
    	  setLEDs(0b100100);
    	  changeDirection(FWD);
    	  moveAtSpeed(120,120);
    	 }
    	  
          else
      
          { 
    	   if(x > y)
    	    {
    	     setLEDs(0b100000);
    	     changeDirection(LEFT);
    	     moveAtSpeed(100,100);
    	    }
    	 
    	   if(y > x)
    	    {
    	     setLEDs(0b000100);
    	     changeDirection(RIGHT);
    	     moveAtSpeed(120,120);
    	    }
    	  }
       }
       
    // -------------- Antikollision --------------------
       
      void Antikollision(void)
       {
        if(obstacle_right && obstacle_left)
         {
          setLEDs(0b110110);
    	  changeDirection(RIGHT);
    	  moveAtSpeed(120,120);
         }
      
        if(obstacle_right)
         {
          setLEDs(0b000110);
    	  changeDirection(LEFT);
    	  moveAtSpeed(120,120);
         }
      
        if(obstacle_left)
         {
          setLEDs(0b110000);
    	  changeDirection(RIGHT);
    	  moveAtSpeed(120,120);
    	 }
    	 
    	if(!obstacle_right && !obstacle_right)
         {
          setLEDs(0b001001);
    	  changeDirection(FWD);
    	  moveAtSpeed(120,120);
    	 }
       }
     
    // -------------- Main ---------------
    
      int main(void)
       {
        initRobotBase();
    	powerON();
    	setACSPwrMed();
    	
    	ACS_setStateChangedHandler(Antikollision);
    	changeDirection(FWD);
    	moveAtSpeed(120,120);
    	
    	while(1)
    	 {
    	  task_RP6System();
    	  Lichtsensoren();
    	 }
    	 
    	return 0;
       }
    doch der RP6 nimmt keinerlei Rücksicht auf Hindernisse, das mit dem Licht funktioniert super. das mit dem kleiner und größer 100 hab ich gemacht, damit der Roboter nicht wegen jedem kleinen Unterschied hin und her fährt.

    wenn ich den aufruf für die Funktion "Lichtsensoren" auskommentiere, funktioniert das ACS. Weiß jemand, woran das liegt?

    MfG
    Michi

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    hallo, meine vermutung ist, dass du die antikollission auch in der while schleife aufrufen musst. ich würde das ACS_setStateChangedHandler(Antikollision); auch in die while schleife verschieben.

    gruß

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.04.2009
    Ort
    Wörgl
    Alter
    28
    Beiträge
    175
    hallo,

    es passiert immer noch das gleiche: die Lichtsensoren funktioneren, das ACS nicht.

    lg
    Michi

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    die Lichtsensoren funktioneren, das ACS nicht.
    Die Abfrage des ACS und der Lichtsensoren erfolgt ja immer direkt nacheinander. Auch die Fahrbefehle erfolgen in rascher Folge durch die ACS- und die Lichtsensortests und löschen sich gegenseitig aus.
    Im Grunde brauchst du eine Priorität, d.h. einen Vorrang des einen gegenüber dem anderen Sensor.
    Da wäre es ja so, dass das ACS Vorrang vor der Lichtsuche haben müßte.
    Also: Wenn kein Hindernis (rechts UND links), dann Suche Licht.

    Du könntest z.B. die Helligkeitsabfragen in diesem Teil ...

    if(!obstacle_right && !obstacle_right)
    {
    ...
    }

    ... der ACS-Tests unterbringen.
    Damit würde nur dann nach Licht gesucht, wenn überhaupt kein Hindernis in Sicht ist.

    Gruß Dirk

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.04.2009
    Ort
    Wörgl
    Alter
    28
    Beiträge
    175
    Hi,

    das ist eine einleuchtende Erklärung. Allerdings wenn ich es so mache

    Code:
    if(!obstacle_right && !obstacle_right)
         {
          setLEDs(0b001001);
    	  changeDirection(FWD);
    	  moveAtSpeed(120,120);
    	 
          Lichtsensoren();
    	 }
    erkennt er immer noch kein Licht, auch wenn kein Hindernis da ist. Ich glaube aber, dass er die Lichtsensorenwerte nur 1 mal kontrolliert, und es dann dabei belässt, die Bewegungen deuten darauf hin. wenn ich es aber in einer while-schleife aufrufe, passiert genau das gleiche.

Berechtigungen

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

12V Akku bauen