-
        

Ergebnis 1 bis 3 von 3

Thema: Asuro Ir sensor

  1. #1

    Asuro Ir sensor

    Anzeige

    hallo
    ich weis das dieses thema schon sehr oft hier besprochen wurde aber leider finde ich nicht die richtige antwort .

    Ich habe folgendes Problem ich hab den Ir sensor / empfänger des Asuro wie bei vielen schon beschreiben noch vorne gerichtet und umgebaut .

    Nur mit dem Programm hab ich ein Problem und zwar hab ich den test Code aus dem Forum aufgespielt und sie klappt auch auf dem Asuro nur möchte ich das er bei erkennung eines hindernis nicht die Farbe der Satus LED ändert sondern stoppt und nach rechts solange dreht bis kein Hinderniss mehr da ist und dann wieder geradeaus weiter fährt !! Leider weis ich nicht wie ich dies in den Code einfügen kann


    Hier der Code :

    #include "asuro.h"
    #include <stdlib.h>

    int main(void)
    {

    unsigned char sw;

    Init();
    DDRD |= (1 << DDD1); // Port D1 als Ausgang
    PORTD &= ~(1 << PD1); // PD1 auf LOW

    while(1)
    {
    if (PIND & (1 << PD0))
    StatusLED(GREEN);
    else
    StatusLED(RED);

    sw = PollSwitch();
    if (sw & 0x01)
    OCR2 = 0xFE; //Pulsbreite 1
    if (sw & 0x02)
    OCR2 = 0xFD; //Pulsbreite 2
    if (sw & 0x04)
    OCR2 = 0xFB; //Pulsbreite 4
    if (sw & 0x0
    OCR2 = 0xF7; //Pulsbreite 8
    if (sw & 0x10)
    OCR2 = 0xEF; //Pulsbreite 16
    if (sw & 0x20)
    OCR2 = 0x90; //Pulsbreite 110
    }
    return 0;
    }

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Hallo

    Vielleicht funktioniert es so:
    Code:
       if (PIND & (1 << PD0))
    	{
    		StatusLED(GREEN); // freie Fahrt vorwärts
    		MotorDir(FWD, FWD);
    		MotorSpeed(150,150);
    	}
    	else
    	{
    		StatusLED(RED); // Hindernis erkannt
    		MotorDir(BREAK, RWD);
    		MotorSpeed(0,150);
    		while(!(PIND & (1 << PD0))); // warten bis kein Hindernis voraus
    		Sleep(255); // noch etwas weiterschwenken
    	}
    Habe ich aber nicht selbst getestet.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    danke schon mal für die schnelle antwort leider hab ich jetzt noch ein problem :

    ich hab den code mit dem besipiel code für geradeaus fahren kombiniert leider klappt das nicht ganz !!

    Asuro soll solange gerade aus fahren mit der Odometrie auswertung und bei hinderniss rechts schwenken

    so sieht der code derzeit aus : Leider taucht dabei immer folgender fehler auf :

    test.c:68: error: parse error before "else"

    was is falsch ??


    #include "asuro.h"
    #include <stdlib.h>

    // Schwellwert fr die Hell/Dunkel-Unterscheidung
    // Eventuell muss damit etwas variiert werden
    #define TRIGGERLEVEL 800
    #define HYSTERESIS 10
    #define LOW 0
    #define HIGH 1

    int main(void)
    {

    Init();
    DDRD |= (1 << DDD1); // Port D1 als Ausgang
    PORTD &= ~(1 << PD1); // PD1 auf LOW



    if (PIND & (1 << PD0))
    {
    StatusLED(GREEN); // freie Fahrt vorwärts
    unsigned int data[2];
    signed int status[2]={0,0};
    signed int difference=0;
    Init();
    MotorDir(FWD, FWD);
    while(1)

    {
    // Helligkeitswerte der Lichtschranken auslesen
    OdometrieData(data);
    // Wechsel linker Sensor von niedrig auf hoch?
    if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
    status[0]=HIGH;
    difference++;
    }
    // Wechsel linker Sensor von hoch auf niedrig?
    if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
    status[0]=LOW;
    difference++;
    }
    // Wechsel rechter Sensor von niedrig auf hoch?
    if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
    status[1]=HIGH;
    difference--;
    }
    // Wechsel rechter Sensor von hoch auf niedrig?
    if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
    status[1]=LOW;
    difference--;
    }
    // zur Sicherheit: verhindern, dass der Differenzz?ler
    // den erlaubten Wertebereich verl?st
    if (difference<-255) difference=-255;
    if (difference>255) difference=255;

    // Status-LED noch entsprechend der erkannten Segmente
    // aufleuchten lassen, grn fr links, rot fr rechts
    StatusLED(status[0]+status[1]*2);

    // Z?ldifferenz passend auf die Motoren verteilen
    if (difference>0) MotorSpeed(255-difference,255);
    else MotorSpeed(255,255+difference);
    }

    else
    {
    StatusLED(RED); // Hindernis erkannt
    MotorDir(BREAK, RWD);
    MotorSpeed(0,200);
    while(!(PIND & (1 << PD0))); // warten bis kein Hindernis voraus
    Sleep(255); // noch etwas weiterschwenken
    }
    return 0;
    }

Berechtigungen

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