PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SRF08 Ultraschallsensoren an CC2



Floyd
06.04.2004, 17:53
Moin!

Ich habe mir nun die neuen Ultraschall-Sensoren SRF08 gekauft,
da ich ja ein paar Problemchen mit dem Messen der Zeit (mit der C-Control) bei den SRF04's hatte.

Daher nun meine Frage, ob jemand schon diese Sensoren zufriedenstellend zum laufen
bekommen hat?!

Bei mir funktioniert die Messung denke ich, aber irgendwie kommen nicht ganz die richtigen werte raus. Ich denke beim Low Byte sind die werte mehr oder weniger sinnvoll, man kann eine änderung feststellen. Nur beim high byte ist das komisch, da ist die Ausgabe immer 0...

Ich verwende folgenden Quellcode:


byte buffer[2];
int range;
string s;

i2c.init();
lcdext.init();

loop
{
i2c.start(0xE0);
i2c.write(0);
i2c.write(0x51);
i2c.stop();

sleep 70;

i2c.start(0xE0);
i2c.write(2);
i2c.start(0xE1);
buffer[0]=i2c.readlast();
i2c.stop();

i2c.start(0xE0);
i2c.write(3);
i2c.start(0xE1);
buffer[1]=i2c.readlast();
i2c.stop();

range = mem.getint(buffer,0);

lcdext.clear();
s="";
str.putint(s,range);

lcdext.print(s);


Kann mir jemand den Fehler sagen, oder mal seinen (funktionierenden) Quellcode schicken,
falls ihr auch schon mit den Sensoren herum experimentiert habt?!

Wäre echt nett!!

Viele Grüße Floyd

Joerg
06.04.2004, 18:59
Hallo Floyd,


Daher nun meine Frage, ob jemand schon diese Sensoren zufriedenstellend zum laufen bekommen hat?!

ja ich ;-)

Das angehängte Programm bedient 3 Module, die anderen lassen sich aber problemlos raustreichen und gibt die Werte auf ein LCD aus.
Mit dabei sind auch Funktionen zum ändern der I2C-Adresse des Moduls.

Allerdings verwende ich die geänderten I2C-Funktionen von cc2net.de.

HTH und Viele Grüße
Jörg


const addrSRFFrontLeft = 0xE0;
const addrSRFFront = 0xE2;
const addrSRFFrontRight = 0xE4;

string s;
int val1, val2, val3;

function ModulWrite (byte addr, byte reg, byte Val)
{
i2c.cstart (addr);
i2c.write (reg);
i2c.write (Val);
i2c.stop ();
}

function ModulRead (byte addr, byte reg) returns byte
{
byte val;
i2c.cstart (addr);
i2c.write (reg);
// i2c.stop ();
i2c.start (addr+1);
val = i2c.readlast();
i2c.stop();
return val;
}

function ModulReadWord (byte addr, byte reg) returns int
{
int val;
i2c.cstart (addr);
i2c.write (reg);
// i2c.stop ();
i2c.start (addr+1);
val = i2c.read();
val = val << 8;
val = val + i2c.readlast();
i2c.stop();
return val;
}

function GetVersion (byte addr) returns byte
{
return ModulRead (addr, 0);
}

function SetAddress (byte addrSrc, byte addrTarg)
{
i2c.cstart (addrSrc);
i2c.write (0); // Register 0 Command Register
i2c.write (0xa0); // 1. Byte Sequ.
i2c.start (addrSrc);
i2c.write (0); // Register 0 Command Register
i2c.write (0xaa); // 2. Byte Sequ.
i2c.start (addrSrc);
i2c.write (0); // Register 0 Command Register
i2c.write (0xa5); // 3. Byte Sequ.
i2c.start (addrSrc);
i2c.write (0); // Register 0 Command Register
i2c.write (addrTarg);
i2c.stop();
}

function Measure ()
{
ModulWrite (0, 0, 0x51); // Messung auslösen (broadcast)
sleep (70);
val1 = ModulReadWord (addrSRFFrontLeft, 2);
val2 = ModulReadWord (addrSRFFront, 2);
val3 = ModulReadWord (addrSRFFrontRight, 2);
}

thread main
{
lcd.clear();
s = "";
str.putint (s, GetVersion (addrSRFFrontLeft));
lcd.print(s, str.length(s));
sleep 1000;
s = s + " ";
lcd.clear();
str.putint (s, GetVersion (addrSRFFront));
lcd.print(s, str.length(s));
sleep 1000;
s = s + " ";
lcd.clear();
str.putint (s, GetVersion (addrSRFFrontRight));
lcd.print(s, str.length(s));
sleep 5000;
loop
{
Measure ();
lcd.clear();
s = "";
str.putint (s, val1);
s = s + " ";
str.putint (s, val2);
s = s + " ";
str.putint (s, val3);
lcd.print(s, str.length(s));
sleep 500;
}
sleep 5000;
lcd.clear();
quit 1;
}

Floyd
06.04.2004, 20:46
Moin Jörg,

danke für das Programm! Werde es gleich mal ausprobieren!

Wo ich dann gleich dabei bin, hast du auch ein Programm zum Auslesen der SRF04-Sensoren mit der CC2 (in cm oder m Ausgabe)?
Das wäre echt super perfekt!

Vielen dank schonmal!

mfg Floyd

P.S.: @Jörg: Haste die jufo-Arbeit schon gelesen?

Floyd
07.04.2004, 06:24
PS: @Jörg: Warum ist beim auslesen 2x das i2c.stop ausdeklariert? Hat das einen besonderen Sinn?

Joerg
07.04.2004, 07:00
Hallo Floyd,


Wo ich dann gleich dabei bin, hast du auch ein Programm zum Auslesen der SRF04-Sensoren mit der CC2 (in cm oder m Ausgabe)?

ne habe ich leider nicht. Allerdings muss man hier wahrscheinlich was tricksen, da die Auflösung der CC2 Timer nicht sonderlich hoch ist.


Warum ist beim auslesen 2x das i2c.stop ausdeklariert? Hat das einen besonderen Sinn?

IIRC (liegt schon eine Weile her das ich das verbrochen habe) hat es auch funktioniert als das i2c.stop noch drin war, laut Beschreibung gehört es aber nicht rein.


P.S.: @Jörg: Haste die jufo-Arbeit schon gelesen?
Ich habe sie mal überflogen, im Moment (Messevorbereitung) aber wirklich keine Zeit mich da richtig reinzudenken. Wird aber nachgeholt.

Viele Grüße
Jörg

07.04.2004, 08:49
Moin Jörg,
lass dir Zeit mit der Arbeit, aber die ist eigentlich ganz gut geworden.

Gruß
Johannes

Johannes
07.04.2004, 08:50
Hm, war nicht eingeloggt...