Hallo, wir arbeiten mit SRF08 US-Sensoren in geschlossenen Räumen und haben Probleme beim Ändern der Reichweite bzw. des Verstärkungsfaktors unserer Sensoren. Diese Änderungen bleiben ohne Wirkung. Wir gehen vor wir im Datenblatt beschrieben. Also z.B. zur Änderung des Verstärkungsfaktors auf '777' würden wir '0x24' ins Register 1 schreiben. Aber selbst bei geringster Verstärkung werden min. 10 vagabundierende Echos erfasst. Wie schon erwähnt hat auch die Änderung des Reichweite keinerlei Auswirkungen. (Den Registerwert hierfür berechnen wir mithilfe der Formel, die im Datenblatt angegeben ist...) Das schreiben ins Register sollte eigentlich nicht das Problem sein, da das Auslösen der Messungen tadellos funktioniert (-> schreiben von 81/0x51 in Register 0). Ein Hardwaredefekt ist eigentlich auch ausgeschlossen, weil das Problem bei all unseren sechs SRFs auftritt. Gibt es dabei irgend etwas, dass man übersehen/vergessen könnte? Hatte vllt. irgendjemand schon einmal ein ähnliches Problem? Oder hat jemand schon einmal erfolgreich diese Parameter geändert? Vielen Dank, Andreas
Korrektur: Verstärkung hat doch einen Effekt. Allerdings sehr viel geringer als erwartet. Mit minimalen Verstärkungsfaktor sind noch 3 Echos da, die keinem Objekt zugeordnet werden können. Das Problem bei der Reichweite besteht aber immer noch. Selbst wenn wir 0 ins Register schreiben (minimal Wert -> kürzeste Wartezeit auch Echos; entspricht 43mm Reichweite), werden Entfernungen bis zu 8m gemessen... Ist das normal?
Eigentlich ist es nicht normal.... ich habe gerade ein SRF08 hier liegen und es auch ausprobiert, ich bekomme keinen Wert, der höher als der eingestellte ist. Vielleicht schreibt ihr in das falsche Register... Ihr müsst in das Register Nr. 2 den Reichweitenwert schreiben... Verwendet ihr einen ATmega zum beschreiben des SRF08? Dann könnt ich euch meinen Code Posten, der funktioniert. Gruß, Yaro
Hallo Yaro, danke fürs Ausprobieren und die schnelle Antwort! Wir verwenden eine x86 basierte Architektur (ein RoBoard RB-100; Vortex86DX). Darauf läuft ein Linux. Für den I2C Zugriff liefert der Hersteller eine Bibliothek mit, die wir auch verwenden. Wir schreiben auch in Register 2. Ich fände es trotzdem interessant einmal den Code zu sehen, mit dem es bei deinem ATmega klappt. Hast du vllt. irgendwann schon einmal mit dem Verstärkungsfaktor experimentiert? Weißt du, wie unempfindlich man die Sensoren konfigurieren kann? Mich wundert, dass die Messergebnisse bei uns, trotz reduzierter Verstärkung, immer noch so schlecht sind. (Wie gesagt: 3 bis 10 "Geister-Distanzen") Früher hatten wir solche Probleme (mit vagabundierenden Echos) überhaupt nicht. Selbst ohne Änderung der Verstärkung. Und nun bei allen Sechs... Viele Grüße!
Mit dem Verstärkungsfaktor habe ich noch nicht wirklich rumexperimentiert, werde es aber spätestens nächstes Wochenende nochmal machen. Um vagabundierenden Echos zu vermeiden, könnt ihr versuchen, das Modul von den Seiten und von hinten her zu dämmen (Watte funktioniert ganz gut). Auch könntet ihr versuchen, sowas wie kleine Röhrchen (z.B. aus Pappmaschee) auf die Lautsprecher setzten, damit nur Signale aus einer bestimmten Richtung empfangen werden. Wenn nötig, könnt ihr die Verstärkung eben auch Hardware-seitig kleiner machen, indem ihr ein bisschen (wirklich wenig) Watte vor die Lautsprecher packt. Hier noch mein Code: Ich lese aber nur das erste Echo aus, für meine Anwendung brauche ich die Mehrfachechos nicht.
1 | |
2 | #define READ 1
|
3 | #define WRITE 0
|
4 | #define TWI_READY (TWCR & (1<<TWINT))
|
5 | |
6 | #define SRF08ADR 0xE0
|
7 | |
8 | void TWIInit(void){ |
9 | PORTC |= 0x30; //PULLUP Widerstaende |
10 | TWBR = 0xFF; |
11 | }
|
12 | |
13 | void TWIStart(uint8_t addr, uint8_t RW){ |
14 | uint8_t temp = 1; |
15 | |
16 | while(temp == 1){ |
17 | TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //START |
18 | while(!TWI_READY); |
19 | if(TWSR == 0x00) {TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);}; |
20 | if(TWSR != 0x08 && TWSR != 0x10) {continue;} |
21 | |
22 | TWDR = addr + RW;//LCD_BOARD_ADR; //send ADR+W |
23 | TWCR = (1<<TWINT) | (1<<TWEN); |
24 | while(!TWI_READY); |
25 | if(TWSR == 0x00) {TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);}; |
26 | if(TWSR != 0x18 && TWSR != 0x40) {continue;} |
27 | temp = 0; |
28 | }
|
29 | }
|
30 | |
31 | void TWIStop(void){ |
32 | TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN); |
33 | while(TWCR & (1<<TWSTO)); |
34 | }
|
35 | |
36 | //Byte senden
|
37 | uint8_t TWIWrite(uint8_t data ){ |
38 | TWDR = data; |
39 | TWCR = (1<<TWINT) | (1<<TWEN); |
40 | |
41 | while(!TWI_READY); |
42 | |
43 | if(TWSR != 0x28){return 1;} |
44 | return 0; |
45 | }
|
46 | |
47 | //Byte empfangen
|
48 | uint8_t TWIReadAck(void){ |
49 | TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); |
50 | while(!TWI_READY); |
51 | return TWDR; |
52 | }
|
53 | |
54 | //letztes zu empfangendes Byte empfangen
|
55 | uint8_t TWIReadNack(void){ |
56 | TWCR = (1<<TWINT) | (1<<TWEN); |
57 | while(!TWI_READY); |
58 | return TWDR; |
59 | }
|
60 | |
61 | |
62 | |
63 | void SRF08Init(uint8_t range, uint8_t amp){ |
64 | TWIInit(); |
65 | |
66 | //Reichweite einstellen
|
67 | TWIStart(SRF08ADR, WRITE); //Start |
68 | TWIWrite(2); //Reichweiten-Register (2) |
69 | TWIWrite(range); |
70 | TWIStop(); |
71 | |
72 | //Verstaerkung einstellen
|
73 | TWIStart(SRF08ADR, WRITE); //Start |
74 | TWIWrite(1); //Verstaerkungs-Register (1) |
75 | TWIWrite(amp); |
76 | TWIStop(); |
77 | }
|
78 | |
79 | |
80 | |
81 | |
82 | uint8_t SRF08GetData(void){ |
83 | uint8_t version = 0xFF; |
84 | uint16_t dist; |
85 | |
86 | //In cm auslesen
|
87 | TWIStart(SRF08ADR, WRITE); //Start |
88 | TWIWrite(0); //Command-Register |
89 | TWIWrite(0x51); //Messung in cm |
90 | TWIStop(); |
91 | |
92 | //warten bis fertig
|
93 | while(version == 0xFF){ |
94 | TWIStart(SRF08ADR, WRITE); //Start |
95 | TWIWrite(0); |
96 | TWIStart(SRF08ADR, READ); //Start |
97 | version = TWIReadNack(); |
98 | TWIStop(); |
99 | }
|
100 | |
101 | //auslesen
|
102 | TWIStart(SRF08ADR, WRITE); //Start |
103 | TWIWrite(3); |
104 | TWIStart(SRF08ADR, READ); //Start |
105 | |
106 | dist = TWIReadNack(); |
107 | |
108 | TWIStop(); |
109 | |
110 | return dist; |
111 | }
|
Habe jetzt noch den Verstärkungsfaktor getestet. Ich sehe sehr deutliche Unterschiede, wenn ich den Verstärkungsfaktor ändere! Ändert ihr ihn immer nur bei der Initialisierung, oder könnt ihr ihn dauernd ändern? Wenn man ständig Messungen macht und zwischendurch (z.B. mit einem Poti) den Verstärkungsfaktor ändert, dann sollte man die Unterschiede deutlich erkennen. Gruß, Yaro
Erstmal danke fürs Ausprobieren! Wir hatten schon Joghurtbecher (mit Schaumstoff ausgekleidet) zur Abschirmung gegen störende Echos von der Seite montiert. An Störungen von der ungeschützten Rückseite habe ich noch nicht gedacht. Auch die Idee mit der dünnen Lage Watte über dem Lautsprecher finde ich gut - hört sich vielversprechend an! Also bei der Verstärkung haben wir inzwischen auch Auswirkungen beobachtet. Allerdings sind die kleiner als ich erwartet hatte. Im Moment messen wir einfach von der Tischkante in Richtung Teppichboden. Ich glaube um da noch "unsensibler" zu werden, müssen wir in die Watte-Kiste greifen. Wie viel misst er denn bei dir noch, wenn du die Verstärkung ganz auf den minimal Wert setzt? Misst er dann überhaupt noch etwas?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.