Forum: Mikrocontroller und Digitale Elektronik Problem SRF08 Reichweite u. Verstärkung ändern


von Falter (Gast)


Lesenswert?

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

von Falter (Gast)


Lesenswert?

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?

von Yaro (Gast)


Lesenswert?

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

von Falter (Gast)


Lesenswert?

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!

von Yaro (Gast)


Lesenswert?

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
}

von Yaro (Gast)


Lesenswert?

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

von Falter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.