-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: ACS Status über I²C mit M32 abfragen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.11.2003
    Ort
    Leipzig
    Alter
    31
    Beiträge
    578

    ACS Status über I²C mit M32 abfragen

    Anzeige

    Hallo,
    Ich versuche jetzt schon seit einem Tag zu verstehen, wie ich die Kollisionssensoren vom RP6 abfragen kann.
    Dazu habe ich die manuals mir angeschaut und auch die Beispielprogramme.
    Im Beispiel 7 (I²C Master) ist ja etwas ähnliches realisiert.
    Ich habe verstanden, dass ich mir von meinem Base Controller die Register auslesen und dann entsprechend auswerten muß.
    Mit Interrupt basierend brauche ich es eigentlich erstmal nicht.
    Was ich nicht finde, ist die Stelle im Code, an der der Basecontroller gesagt bekommt, welche Daten er auf dem Bus senden soll.
    Ich sehe nur:
    Code:
    I2CTWI_getReceivedData(messageBuf, 3);
    Das ist doch nur zum einlesen der Daten in eine Variable?!


    Danke für eure Antworten.


    ACU
    http://www.roboterbastler.de
    endlich wieder online

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    32
    Beiträge
    1.514
    Hi ACU,

    gehen wir mal Schritt für Schritt die betreffenden Teile des Beispielprogramms durch - ich denke so sollte es etwas klarer werden.
    Das ist wieder deshalb etwas komplexer, weil man so eben noch andere Sachen machen kann während die Daten vom Bus abgerufen werden.
    Es geht auch einfacher indem man einfach readRegister verwendet und nicht requestRegister (also register *auslesen* (read) oder register *anfordern* (request))

    Als erstes registriert man in der Main Funktion eine passende Funktion als Event Handler für den Fall, dass vom I2C Bus angeforderte Daten angekommen sind (wie die Event Handler für Bumper und ACS auf
    dem Mainboard):

    Code:
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
    Die Funktion definiert man folgendermaßen:

    Code:
    #define TOLLE_REQUEST_ID 1  // Das brauchen wir später noch - siehe weiter unten
    
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
    
    	if(dataRequestID == TOLLE_REQUEST_ID) // siehe unten
    	{
    	       uint8_t messageBuf[3];  // die "3" verändern je nachdem wieviele Bytes man auslesen möchte...
    	       I2CTWI_getReceivedData(messageBuf, 3);
    		// ... irgendwas damit machen.
    	}
    	// else if ...
    }

    Jetzt kann man irgendwo anders im Program Daten anfordern ("request") und zwar so:

    Code:
    	#define I2C_RP6_BASE_ADR 10   // Die I2C Bus Adresse vom RP6 Mainboard
    	I2CTWI_requestRegisterFromDevice(I2C_RP6_BASE_ADR, TOLLE_REQUEST_ID, 0, 3); 
    	// Hier die "3" wieder ändern je nachdem wieviele Daten man braucht.

    Jetzt werden die Daten angefordert und sobald alles empfangen wurde die Funktion I2C_requestedDataReady
    von oben aufgerufen und man kann die Daten weiterverarbeiten. Anhand der requestID kann man erkennen welche art von Daten angefragt wurden - also z.B. für die Bumper, das ACS o.ä. und anhand dessen passend verarbeiten.

    MfG,
    SlyD

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.11.2003
    Ort
    Leipzig
    Alter
    31
    Beiträge
    578
    Vielen Dank für deine schnelle Antwort, ich werde mir alles mal genau durchlesen. Die Angelegenheit ist jedenfalls komplizierter, als ich am Anfang erwartet hätte. Ich dachte, da gibt es auch sone tolle fertige Funktion für.


    MfG ACU
    http://www.roboterbastler.de
    endlich wieder online

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    32
    Beiträge
    1.514
    Du kannst das auch genauso wie bei anderen I2C Geräten machen wie z.B. beim SRF08 also in der art von
    I2CTWI_readRegisters(I2C_RP6_BASE_ADR, 0, results, 3);

    Das macht dasselbe wie oben - nur das oben ist eleganter wenn man noch andere Dinge nebenbei machen muss

    MfG,
    SlyD

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    .ich dachte, da gibt es auch sone tolle fertige Funktion für. ....


    kann man in winavr-c alle schön selber schreiben. winavr-c ist offen nach allen seiten. kannst dich beim baugruppenproggen frei austoben. man muss nur kreativ sein. mit copy/paste ist da nichts zu machen.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.11.2003
    Ort
    Leipzig
    Alter
    31
    Beiträge
    578
    Nach nach einer Weile Zeit habe ich mal wieder an meinem RP6 gearbeitet.
    Leider habe ich es noch nicht hinbekommen (trotz der Mühe von slyD) die Kollisionssensoren mithilfe von Handlern abzufragen.
    In der Master Lib habe ich die Variablen bumper_left und bumper_right gefunden. Die funktionieren auch super und melden eine 1, wenn der jeweilige Bumper gedrückt wird.
    Die Variablen obstacle_left und right enthalten eine 1, wenn sich vor dem Roboter ein Gegenstand befindet. Leider gibt es keine Abstufungen.
    Es wird auch in beide Variablen eine 1 geschrieben, wenn sich auf einer der beiden Seiten etwas befindet. Kann mir jemand eventuell weiterhelfen?

    Gruß

    ACU
    http://www.roboterbastler.de
    endlich wieder online

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    375
    Das ist doch gerade die ACS function von RP6base ! Diese ACS gibt nur an oder da ein Obstacle left oder/und right sich befindet. Da wirde keine Abstufung ausgegeben ! Einigermasse kannst du das ueber die starke von ACS hinbekommen. Dazu die functione ACS low, middel or high. So wid die Staerke von IRleds reguliert. Das ACS functioniert relatif gut, nur bei Schwarze gegenstanden wirden nicht detectiert. Das Beispiel program Move10 functioniert doch mit die ACS function ueber I2C !

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.11.2003
    Ort
    Leipzig
    Alter
    31
    Beiträge
    578
    Hallo "RP6conrad",
    Code:
    	 if (obstacle_right==0 && obstacle_left==0) writeStringLCD("freie Fahrt");
    	 if (obstacle_right==1 && obstacle_left==0) writeStringLCD("nur rechts");
    	 if (obstacle_right==0 && obstacle_left==1) writeStringLCD("nur links");
    	 if (obstacle_right==1 && obstacle_left==1) writeStringLCD("beide");
    gibt jetzt die richtigen Ergebnisse aus.

    Das keine Abstufung stattfindet, war mir noch nicht bekannt.
    Wie funktioniert das bei Programm Move_2 ?
    Dort erkennt der Roboter, ob das Hindernis sich weit weg (die Geschwindigkeit einer Kette wird verringert) oder nah (Rotation auf der Stelle) befindet. Ich habe leider noch nicht die Zeit gehabt das Programm voll zu durchdringen.
    Was meinst du mit Move 10?
    Ein solches Programm existiert nicht. Ich denke mal du meinst das von mir angesprochene Programm 10, Move 2.


    Gruß

    ACU
    http://www.roboterbastler.de
    endlich wieder online

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    375
    Gans einfach : Wen nur links oder rechts eine Hindernis erkannt wird, dreht der Robby weg von diese hindernis = eine Kette niedrige Geschwindigkeit(siehst du auch an die LEDS vorne). Wen an beide seiten eine Hindernis erkannt wird, dreht Robby erst an der Stelle, bis keine Hindernis mehr erkannt wird, und fahrt dan weiter.

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.11.2003
    Ort
    Leipzig
    Alter
    31
    Beiträge
    578
    Ok vielen Dank.
    Kannst du mir bitte noch sagen, wie ich die Stärke des ACS verändern kann?
    Muß ich da das Master oder das Slave Programm anpassen?
    Ich habe leider keine Variable dafür gefunden.


    Gruß

    ACU
    http://www.roboterbastler.de
    endlich wieder online

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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