Catedral
23.03.2013, 22:32
Update:
Hatte das Tutorial von pinsel gesehen und wollte auch gerne zwei SR04 mit meinem Raspi einsetzten.
https://www.roboternetz.de/community/threads/61404-SzP-alias-Hubert-der-Raspi-auf-Ketten
Hatte jetzt ein C Programm geschrieben das zwar Werte zurück liefert.
Allerdings beträgt die Streuung bis zu 20% und ab einer Distanz von ca 50cm ist das Ergebniss nicht mehr zu gebrauchen.Das letzte liegt wohl daran das ich das Modul bei 3.3V betreibe. Andererseits habe ich hier auch keine Idealen Testbedingungen. Weiss vielleicht jemand eine gute Funktion um die Zeit zu stoppen habe jetzt time(),gettimeofdate(),CLOCK_GETTIME() ausprobiert und bin mir nicht sicher ob die Ergebnisse so optimal sind.
Habe auch schon mit Interrupts experimentiert. Macht das ganze etwas sparsamer aber die Streuung bekomme ich damit auch nicht in den Griff.
Werde in nächster Zeit mal einen Spannungteiler aufbauen um den Sensor mit 5V zu betreiben, muss nur ersmal sichten ob ich noch passende Widerstände rumfliegen habe :confused: . Vielleicht wird dann auch die Streuung besser.
Vielen dank und freundliche Grüße
Catedral
#include <wiringPi.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
int TRIGGER = 6;
int ECHO = 7;
struct timespec ts_res, ts_start, ts_end;
void Starttime (void) //Funktion speichert Startzeit
{
clock_gettime(CLOCK_MONOTONIC, &ts_start);
}
void Endtime (void) //Funktion speichert Endzeit
{
clock_gettime(CLOCK_MONOTONIC, &ts_end);
}
int main (void)
{
printf ("Ultrasonic Measurement\n") ;
if (wiringPiSetup () == -1)
exit (1) ;
while(1)
{
clock_getres(CLOCK_MONOTONIC, &ts_res);
pinMode (ECHO, INPUT) ;
pinMode (TRIGGER, OUTPUT);
digitalWrite(TRIGGER,0);
sleep(0.5);
digitalWrite(TRIGGER,1);
delayMicroseconds (10);
Starttime();
digitalWrite(TRIGGER,0);
while(0==digitalRead(ECHO)) //Warten das Burst gesendet wird
{
}
Starttime();
while(1==digitalRead(ECHO)) //Warten auf Reflektion
{
}
Endtime();
long int elapsed=(ts_end.tv_nsec-ts_start.tv_nsec); //Zeit unterschied
long int distance = elapsed/29070; //ns>>cm
distance = distance/2; //Strecke 2 mal durchlaufen
printf ("Abstand: %ld cm \n", distance);
delay(1000);
}
return 0 ;
}
Hatte das Tutorial von pinsel gesehen und wollte auch gerne zwei SR04 mit meinem Raspi einsetzten.
https://www.roboternetz.de/community/threads/61404-SzP-alias-Hubert-der-Raspi-auf-Ketten
Hatte jetzt ein C Programm geschrieben das zwar Werte zurück liefert.
Allerdings beträgt die Streuung bis zu 20% und ab einer Distanz von ca 50cm ist das Ergebniss nicht mehr zu gebrauchen.Das letzte liegt wohl daran das ich das Modul bei 3.3V betreibe. Andererseits habe ich hier auch keine Idealen Testbedingungen. Weiss vielleicht jemand eine gute Funktion um die Zeit zu stoppen habe jetzt time(),gettimeofdate(),CLOCK_GETTIME() ausprobiert und bin mir nicht sicher ob die Ergebnisse so optimal sind.
Habe auch schon mit Interrupts experimentiert. Macht das ganze etwas sparsamer aber die Streuung bekomme ich damit auch nicht in den Griff.
Werde in nächster Zeit mal einen Spannungteiler aufbauen um den Sensor mit 5V zu betreiben, muss nur ersmal sichten ob ich noch passende Widerstände rumfliegen habe :confused: . Vielleicht wird dann auch die Streuung besser.
Vielen dank und freundliche Grüße
Catedral
#include <wiringPi.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
int TRIGGER = 6;
int ECHO = 7;
struct timespec ts_res, ts_start, ts_end;
void Starttime (void) //Funktion speichert Startzeit
{
clock_gettime(CLOCK_MONOTONIC, &ts_start);
}
void Endtime (void) //Funktion speichert Endzeit
{
clock_gettime(CLOCK_MONOTONIC, &ts_end);
}
int main (void)
{
printf ("Ultrasonic Measurement\n") ;
if (wiringPiSetup () == -1)
exit (1) ;
while(1)
{
clock_getres(CLOCK_MONOTONIC, &ts_res);
pinMode (ECHO, INPUT) ;
pinMode (TRIGGER, OUTPUT);
digitalWrite(TRIGGER,0);
sleep(0.5);
digitalWrite(TRIGGER,1);
delayMicroseconds (10);
Starttime();
digitalWrite(TRIGGER,0);
while(0==digitalRead(ECHO)) //Warten das Burst gesendet wird
{
}
Starttime();
while(1==digitalRead(ECHO)) //Warten auf Reflektion
{
}
Endtime();
long int elapsed=(ts_end.tv_nsec-ts_start.tv_nsec); //Zeit unterschied
long int distance = elapsed/29070; //ns>>cm
distance = distance/2; //Strecke 2 mal durchlaufen
printf ("Abstand: %ld cm \n", distance);
delay(1000);
}
return 0 ;
}