Hallo
Gleich vorweg: Ich besitze das SRF05 nicht und bin mit der bee arg aus der Übung. Deshalb gehe ich das eher theoretisch und ohne die Library der bee an.
Basis ist der Schaltplan der bee und das Datenblatt des SRF:
http://download.nicai-systems.com/ni...matic_1_14.pdf
http://www.robotikhardware.de/download/srf05doku.pdf
Ich wähle den SRF04-Modus, weil mir der Einstieg mit zwei Pins einfacher erscheint. An der bee verwende ich X4 mit den Pins PC0 und PC1 (obwohl das die I2C-Pins sind).
Der Ablauf der Messung scheint einfach: Startimpuls ausgeben und dann messen, wie lange das SRF05 seinen Signalausgang auf high setzt. Aber wie gibt man das Ergebniss aus? Serienmäßig besitzt sie nur 4 LEDs. (Das ist wohl der Schwachpunkt der bee: Sie kann nicht komunizieren.) Wenn man die zur binären Ausgabe nutzt kann man Werte zwischen 0 und 15 anzeigen.
Mein Ansatz: Ich messe in 10cm-Schritten. Da die Schallgeschwindigkeit in Luft ca. 344m pro Sekunde beträgt, legt das US-Signal einen Meter in 1/344 Sekunden zurück. Das sind 2,9 Millisekunden. Für 10cm sind es entsprechend 290µs. Ich hoffe, ich habe mich nicht verrechnet....
Angezeigt wird nach der Messung die gezählten 10cm-Schritte, der Abstand ist aber nur halb so groß wie gemessen, weil das US-Signal ja den Weg doppelt zurücklegt. Auch hier hoffe ich, dass ich richtig liege...
Und nun, tata, das Programm:
Code:
// SRF05 Ansteuerung mit der bee mic 4.6.12
// Anschluß an X4: Vcc, GND, PC0=Start, PC1=Messwert (SRF04-Modus)
// Datenblatt SRF05: http://www.robotikhardware.de/download/srf05doku.pdf
// https://www.roboternetz.de/community/threads/58058-Nibobee-Ultraschall-wie-anschlie%C3%9Fen
// Schallgeschwindigkeit: 344m/s bei 21° (1s/344m oder 2,9ms pro Meter oder 290µs für 0,1m)
// Quelle: http://134.176.128.63/schall.html
#include <avr/io.h>
#include <util/delay.h>
uint16_t messwert, timeout=0;
int main(void)
{
DDRB = 0b0001111; // Die Pins der Leds sind Ausgang
PORTB &= 0b11110000; // 0V ausgeben. Die Leds sind aus
DDRC = 0b00000001; // Im Datenrichtungsregister PC0 als Ausgang definieren (Bit 2^0)
PORTC &= ~(1<<PC0);// 0V ausgeben an PC0
PORTB |= 0x0f; // alle Leds an
_delay_ms(1000); // eine Sekunde warten
PORTC &= 0xf0; // alle Leds wieder aus
while(1)
{
PORTC |= 1; // Startimpuls ausgeben
_delay_us(20); // der Impuls muss mindestens 10µs dauern
PORTC &= 0xfe; // Startimpuls fertig
messwert=0;
while(!(PINC & 0b00000010) && --timeout) _delay_us(1); // Echo nach 40*290µs?
if(timeout>0)
{
while(PINC & 2)
{
messwert++; // Messwert wird in 10cm-Schritten erhöht
_delay_us(290); // 10cm warten
}
if(messwert<16) // bis 75cm können wir so mit 4 Bit messen
{
PORTC &= 0xf0; // alle Leds aus
PORTC |= messwert; // Messwert dual anzeigen
}
}
}
return 0;
}
(selbstverständlich ungetestet)
Keine Ahnung, ob das halbwegs funktioniert.
Gruß
mic
[Edit]
Die Umrechnung der Entfernung wird so nicht stimmen. 1cm bis 400cm sind 100µs bis 25ms. Timeout wird zu knapp sein und wird nicht neu auf null gesetzt.
Lesezeichen