Forum: Mikrocontroller und Digitale Elektronik SRF10 + Handyboard = Messung nur bis 40cm?


von Fabi H. (concord)


Lesenswert?

Hallo Zusammen!

Ich nutze ein Handyboard in Verbindung mit einem SRF10, womit auch 
bereit Messung und einholen + ausgeben der Werte funktioniert. Ebenso 
das Verändern von Reichweite und Verstärkung.

Und jetzt das Problem:
Wenn ich eine max. Reichweite von über ca.40cm (z.B.1m) einstelle gibt 
er mir Werte zwischen 35-40cm aus wenn kein Hinderniss da ist. Ist ein 
Hinderniss zwischen 6-35cm funktioniert die Messung gut! Ab ca.50cm wird 
wieder nur noch 35-40cm ausgegeben.
Setze ich die max. Reichweite unter 40cm (zb. 20cm), so misst er 
zwischen 6-20cm gut, wenn kein Hinderniss = 0. Sprich das Problem tritt 
nur bei max. Reichweiten über ca. 40cm auf!

Kann mir jemand sagen wie ich das Problem lösen kann??

freundliche Grüße,
Concord!

(Addresse wurde bereits auf 226 geändert)

// Einbinden der I2C-Bibliothek
#use i2c_hb_expbrd.ic
// Hauptprogramm
void main()
{
int entfernung;


printf("\n SRF08-Test");
sleep(2.0);

    i2c_init(); // initialisiere I2C-Bus

    while(!start_button());
    printf(2,"\n config:");
    i2c_write_2byte(226, 2,  10);
    i2c_write_2byte(226, 1, 8);
    while(start_button());
    sleep(2.0);


//Starte Schleife. Bricht ab, wenn der Stopknopf gedrueckt wird
while(!stop_button())
{
//Messung auslsoeen
// in Register 0 wird das Komando 81 geschrieben. Damit wird eine
//Messung ausgeloest und das
// Ergebnis wird in cm angegeben
i2c_write_2byte(226, 0, 81); // Adresse des SRF08 ist werkseitig
//224.
sleep(0.065); // 65 ms warten, um abzusichern, dass die Messung
//fertig ist
// Messung fertig

//Aulesen des Ergebnisses
// Zum SRF08 schreiben, welches Register ausgelesen werden soll.
i2c_write_byte(226, 2); // Register 2 --> High-Byte des
//Messergebnisses
entfernung = i2c_receive_byte(226) * 256; // Auslesen des
//High-Bytes des Messergebnisses
i2c_write_byte(226, 3); // Register 3 --> Low-Byte des
//Messergebnisses
entfernung = entfernung + i2c_receive_byte(226); // Low-Byte
//auslesen und zum Ergebnis addieren


printf("\nEntf: %d  ", entfernung); // Anzeigen des
//Ergebnisses
}

}

von Helfer (Gast)


Lesenswert?

Dein Problem könnte daran liegen, dass du bei größeren Abständen nicht 
lange genug auf das Echo wartest. Probiere mal länger als die 65ms zu 
warten z.B. mal das Doppelte oder das Vierfache.

von Helfer (Gast)


Lesenswert?

Im Code steht SRF08 und in der Frage SRF10. Sind die Messbereiche beider 
gleich und > 40cm?

von Helfer (Gast)


Lesenswert?

Vergiss das mit den 65ms. Die beiden Sensoren SRF08 und SRF10 sind 
unterschiedlich.

http://www.robot-electronics.co.uk/htm/srf08tech.shtml
http://www.robot-electronics.co.uk/htm/srf10tech.htm

von Rubelus (Gast)


Lesenswert?

aber beide gehen bis 11 Meter...

ich denke mal das da auch ein Fehler liegen könnte:
1
int entfernung;
2
3
...
4
5
entfernung = i2c_receive_byte(226) * 256;

Je nachdem in welchem Zahlenformat das erhaltene Byte ist, könnte die 
multiplikation mit 256 an die grenzen von int stoßen.

von Fabi H. (concord)


Lesenswert?

>Im Code steht SRF08 und in der Frage SRF10. Sind die Messbereiche beider
>gleich und > 40cm?


richtig den code habe ich teilweise "abgeschrieben" ;) aber soweit ich 
weiß ist das Prinzip von SRF08+SRF10 das gleiche? Der code wurde von mir 
bisher nicht mit einem SRF08 getestet, allerdings werde ich morgen Abend 
vermutlich einen SRF08 zur Verfügung haben dann kann ich das dann mal 
testen



>
> Je nachdem in welchem Zahlenformat das erhaltene Byte ist, könnte die
> multiplikation mit 256 an die grenzen von int stoßen.
>

Kann ich dann einfach die int´s durch long´s ersetzen?

Danke!

von Helfer (Gast)


Lesenswert?

> Kann ich dann einfach die int´s durch long´s ersetzen?

Das ist nicht die Problemursache.

Man sieht nicht, welchen Datentyp die Funtion i2c_receive_byte() 
liefert. Vermutlich ein unsigned char (bzw. uint8_t).

Realistisch angenommen i2c_receive_byte() liefert irgendwas mit 8-Bit 
und die ersten empfangenen 8-Bit werden als MSB (most significant bits) 
behandelt und durch *256 in die Bits 8-15 eines 16-Bit ints geschoben.

Sinnvoller ist es wenn du den Datentyp des Ergebnisses von int nach 
unsigned int (bzw. uint16_t) änderst. Der Sensor liefert so wie so nur 
positive Werte.

von Helfer (Gast)


Lesenswert?

>    i2c_write_2byte(226, 2,  10);
>    i2c_write_2byte(226, 1, 8);

Check mal diese Stellen oder lass die weg. Die sind vielleicht nur in 
der Anwendung wichtig, in der du abgeschrieben hast.

Bei dem SRF10 stellst du damit das Max Gain Register vom default 16 auf 
8 um, d.h. nur halbe Empfängerverstärkung. Und du stellst das Range 
Register vom default 255 (11m) auf 10 um (= 0,43m). Die Zahl 43 cm kommt 
mir verdammt bekannt vor!

von Helfer (Gast)


Lesenswert?

BTW. ich weiss nicht, ob der Sensor sich die Konfiguration merkt. Zur 
Sicherheit also die Defaultwerte selber schreiben:

>>    i2c_write_2byte(226, 2, 255); // Range Register (default 11m)
>>    i2c_write_2byte(226, 1, 16);  // Max Gain Register (default 16)

von Fabi H. (concord)


Lesenswert?

>Sinnvoller ist es wenn du den Datentyp des Ergebnisses von int nach
>unsigned int (bzw. uint16_t) änderst. Der Sensor liefert so wie so nur
>positive Werte.

ich kann das "int" scheinbar nicht "unsigned" machen; ich habe es so 
versucht:
>>unsigned int entfernung;
Fehlermeldung: Error: Syntax error around "int"

>>uint16_t entfernung;
Fehlermeldung: Error: Syntax error around "entfernung"

http://www.krause-robotik.de/service/download/handyboard/ICv4ProgMan.pdf
S.9 "Data Types"

>>16-bit Integers
>>16-bit integers are signified by the type indicator int. They are signed 
>>integers, and may
>>be valued from -32,768 to +32,767 decimal.

-> versteht IC gar keine unsigned?


>  >    i2c_write_2byte(226, 2,  10);
>  >    i2c_write_2byte(226, 1, 8);

>Check mal diese Stellen oder lass die weg. Die sind vielleicht nur in
>der Anwendung wichtig, in der du abgeschrieben hast.

>Bei dem SRF10 stellst du damit das Max Gain Register vom default 16 auf
>8 um, d.h. nur halbe Empfängerverstärkung. Und du stellst das Range
>Register vom default 255 (11m) auf 10 um (= 0,43m). Die Zahl 43 cm kommt
>mir verdammt bekannt vor!


Leider nicht die Lösung!
Die Zeilen hab ich selbst reingeschrieben um mit Reichweite+Verstärkung 
ein wenig zu experimentieren. Hab ich wohl mit ungünstigen Werten hier 
reinkopiert sorry...Das Problem bleibt auch wenn ich die beiden Zeilen 
komplett weglasse oder sie durch
>>    i2c_write_2byte(226, 2, 255); // Range Register (default 11m)
>>    i2c_write_2byte(226, 1, 16);  // Max Gain Register (default 16)
ersetze...

Danke für eure Antworten!

von Andre H. (Gast)


Lesenswert?

Ich habe genau das gleiche Problem mit der Reichweite von nur 40cm.
Darf man fragen ob hier eine Lösung für das Problem gefunden wurde ?

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.