Archiv verlassen und diese Seite im Standarddesign anzeigen : ACS Status über I²C mit M32 abfragen
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:
I2CTWI_getReceivedData(messageBuf, 3);
Das ist doch nur zum einlesen der Daten in eine Variable?!
Danke für eure Antworten.
ACU
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):
I2CTWI_setRequestedDataReadyHandler(I2C_requestedD ataReady);
Die Funktion definiert man folgendermaßen:
#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:
#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
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
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
roboterheld
28.12.2007, 09:16
.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.
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
RP6conrad
17.05.2008, 20:23
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 !
Hallo "RP6conrad",
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
RP6conrad
18.05.2008, 21:10
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.
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
... wie ich die Stärke des ACS verändern kann?
setACSPwrLow(); // Low power
setACSPwrMed(); // Set ACS to medium power/range
setACSPwrHigh(); // High Power
Gruß Dirk
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.