mikrocontroller.net

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


Autor: yassine98 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: yassine98 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yassine98 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: yassine98 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yassine98 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

  }

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.