Forum: Mikrocontroller und Digitale Elektronik Entfernung zwischen 2 sensoren von Art SRF02


von yassine98 (Gast)


Lesenswert?

Hallo zusammen,
bis jetzt konnte ich die entfernung ganz genau zwischen meinem sensor 
und jedem objekt messen und die messwerte in einer LCD darstellen.
schaltung:
my Avr board(atmega8) +2 SRF02 sensoren

meine frage jetzt:
ich will nur die enfernung zwischen den sensoren messen?

 ich habe so eine idee und zwar eine srf02 als sender und ein zweite als 
empfänger.
srf02-1 sendet ein thon(signal) mit dem befehl 0x5C
und der srf02-2 empfängt es aber in microsekunde( befehl 0x58)
und dann habe ich die zeit und dei shall-geschwindigkeit, daraus kann 
man die entfernung berechnen. x=v.t

ich habe es so programmiert aber leider ich mache irgendwas falsch ich 
bekomme nur waiting....wartend auf den wert..

ich habe die slaveId der sensoren geändert:sender 0xE2/ empfänger 0xF2
mein code ich benutze lib von fleury)
………
#define USaddrS 0xE2 //Sender-adresse
#define USaddrR 0xF2 //Empfänger-adresse
//sender
i2cStart(USaddrS);
i2cWrite(USaddrS);
i2cWrite(0);
i2cWrite(0x5C);//ein thon senden nch datenblatt
i2cStop();

//empfänger
i2cStart(USaddrR);
i2cWrite(USaddrR);
i2cWrite(0);
i2cWrite(0x58);//zeit in mics
i2cStop();

i2cStart(USaddrR);
i2cWrite(USaddrR);
distance2=i2cReadNak();
warten bis die messung fertig ist
while( i2cReadNak()==255)
{
lcdClear();
lcdGoto(1,1);
lcdWriteText("waiting...");
}
i2cStop();

//empfänger
i2cStart(USaddrR);
i2cWrite(USaddrR);
distance1=i2cReadAck();
distance2=i2cReadNak();

lcdClear();
lcdGoto(1,1);
lcdWriteText(toString(distance1));
lcdGoto(2,0);
lcdWriteText(toString(distance2));
……….
vielen dank im voraus.
sorry für doppel..

von yassine98 (Gast)


Lesenswert?

hallo
ich bin es wieder
ich habe hier ein paar fehler beseitigt:
jetzt blinken die 2 sensoren aber ich bekomme nur 0.

#define USaddrS 0xE2 //Sender-adresse
#define USaddrRR 0xF2+1 // Empfänger-adresse(nur lesemodus ist aktiv)
#define USaddrRW 0xF2 // schreib-modus
.......
........
while(1){

//sender
i2cStart(USaddrS);
i2cWrite(0);
i2cWrite(0x5C);//ein thon senden
i2cStop();
//emfänger
i2cStart(USaddrRW);
i2cWrite(0);
i2cWrite(0x58);
i2cStop();

wait(65);
i2cStart(USaddrRW);
i2cWrite(2);
i2cStop();

i2cStart(USaddrRR);
distance1=i2cReadAck();
distance2=i2cReadNak();
i2cStop();


lcdClear();
lcdGoto(1,1);
lcdWriteText(toString(distance1));
lcdGoto(2,0);
lcdWriteText(toString(distance2));
wait(1000);

}
return 0;
}
ich hoffe dass jemand mir helfen kann..
danke im voraus

von spess53 (Gast)


Lesenswert?

Hi

Ich hoffe, das ich das richtige Teil im Kopf habe. Aber wie soll dein 
Empfänger wissen, wann der Sender das Signal losgeschickt hat?

MfG Spess

von yassine98 (Gast)


Lesenswert?

spess53 schrieb:

spess53 schrieb:
> Ich hoffe, das ich das richtige Teil im Kopf habe. Aber wie soll dein
> Empfänger wissen, wann der Sender das Signal losgeschickt hat?

hallo spess53,
danke dir erstmal füe deine antwort.
ja nach der erzeugung des signals
teile ich dem empfänger mit:
//emfänger
i2cStart(USaddrRW);
i2cWrite(0);
i2cWrite(0x58);
i2cStop();

sovoiel ich weiss der befehl 0x58 dient zur: timer-start des sensors und 
mesunngen in microsec.
jetzt eigentlich bekomme ich werten aber nur in bestimmten positionen 
von den sensoren.
mfg.

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Beide Sensoren sind an den gleichen uC angeschlossen ?
Es gibt also nur 1 Zeitbasis ?
Dann kann man sowas lösen.

Ich habe hier eine Lösung fertig, die einen "Fuchs" ortet, der ein 
Funksignal absetzt und ein 3ms-Ultraschallsignal, daß der Empfänger dann 
ortet (inkl. Richtung).

von yassine98 (Gast)


Lesenswert?

hallo
ja die beiden sensoren sind an den gleichen uC angeschlossen mit 
verschieden slaveid E2 und F2.
ja die zeit wird nur von dem emfänger gezählt(timer) bis er das echo 
bekommt.

ist deine lösung hier zu finden wäre ich dir sehr dankbar.
bei mir die werte sind ganz komisch.
 ist mein programmteil gesund?:)

noch eine kleine frage bei der entfernung man liest die highbyte und die 
lowbyte und durch die entfernung=H*256+L rechnet man den abstand, wie 
ist es mit der zeit? man liest aus register 2 und 3 und dann?

mfg.

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Nenene...
so einfach kannst Du meine Lösung nicht nutzen.

Ich arbeite auch nicht mit den Modulen, da sie mir nicht helfen.

Wenn Du erst den Sender startest und dann den Empfänger - kann das 
US-Signal ja schon durch sein, bevor der Empfänger startet.
Starte doch erst den Empfänger, sende dann ein Signal und sieh nach, 
wann das Signal ankommt. Von der Zeit mußt Du dann eine Konstante 
abziehen, die sich aus der Verarbeitungszeit der Sensoren ergibt.

Du schreibst aber wieder von dem Empfang eines Echos. Das verstehe ich 
nicht ganz, weil Du die Entfernung der 2 Sensoren messen willst.

von yassine98 (Gast)


Lesenswert?

hallo Bernd
danke dir für die antwort,
ahso ok.
ja obwohl die befehl-ausführung vlt. nicht mal eine ms. kostet, scheint 
es besser zu funktionieren.wenigstens bekomme ich mehr messwerten(bei 
mehr positionen meinte ich).
ich habe den befehl 0x57 für "cm" anstatt 0x58, die werten, die ich 
bekomme stimmen leider nicht(die abweichung ist zu gross).
zb wenn die sensoren einandergegenüber(20cm) sind, bekome ich 141cm

>Du schreibst aber wieder von dem Empfang eines Echos. Das verstehe ich
> nicht ganz, weil Du die Entfernung der 2 Sensoren messen willst.
sorry mit Echo meinte ich wenn das vom sender gesendete signal  an einem 
objekt reflektiert und vom emfänger angefangen ist.
os sieht der code aus jetzt:

 while(1){
    //empfänger
    i2cStart(USaddrRW);
      i2cWrite(0);
      i2cWrite(0x57); // Empfangen in Cm
      i2cStop();

      //sender
      i2cStart(USaddrS);
      i2cWrite(0);
        i2cWrite(0x5C);//ein ton senden
        i2cStop();

      wait(100);

      i2cStart(USaddrRW);
      i2cWrite(2);
      i2cStop();

      i2cStart(USaddrRR);
            distance1=i2cReadAck();
      distance2=i2cReadNak();
      i2cStop();

      distance= (distance1*256) + distance2;
      lcdClear();
        lcdGoto(1,1);
        lcdWriteText("mesure");
        lcdGoto(2,0);
      lcdWriteText(toString(distance));

      wait(1000);

  }

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Wenn Du bei 20cm Abstand ganze 141cm mißt, dann zieh doch einfach immer 
121cm (ca. 3,5ms) vom Ergebnis ab.
Ach ja, Du sitzt sicher in einem Haus mit Wänden. Evtl. mißt Du auch 
Reflektionen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.