PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SR04 mit C Programm Ansteuern.



Catedral
23.03.2013, 21: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 ;


}

Kampi
24.04.2013, 12:05
Hallo,

der SR04 ist für eine 5V Spannung gedacht.
Wenn du ihn mit 3,3V betreibst, misst er super ungenau.
Betreibe ihn mit 5V und statte den Echo-Pin mit einem Spannungsteiler aus zwei 10k Widerständen aus.
Dann hast du die Genauigkeit zurück und das Pi kommt damit klar :)