Ultrasensor , PID , arduino mierzenia POMOC

0

Witam wszystkich ,

Otoz naszym projektem jest zrobienie platformy ktora rekompensuje roznice w wysokosci. Nie jest to akurat tutaj zbyt wazne, chodzi bardziej o kod.

Otoz ultrasensor jest na tyle nie dokladny ze mierzone wartosci w cm skacza kiedy sensor stoi w miejscu miedzy nawet czasami 1 cm a czasami 3 mm. W mierzeniach nie ma zadnej spojnosci jest to na tyle losowe ze nie mam pojecia jak usunac te nie rowne mierzenia. Filtra nie zbudujemy bo nie jest analogowy sensor. Do tej pory udalo mi sie tyle napisac , moze macie pomysl jakis lepszy.

Hardware wyglada tak ze sensor stoi w miejscu a przed nim rusza sie przeszkoda.

 



#include <Stepper.h>
#define TRIGGER_PIN  4
#define ECHO_PIN 5
#define MAX_DISTANCE 200

 
double aantalstappen;            //ilosc krokow uzywamy stepper motor.
double startPositie;           // pozycja startowa 
double newPositie;                // nowa pozycja
double verschilPositie;  // roznica 

double verschilError; //roznica roznicy
double verschilErrornow,verschilErrorvorige; //roznica roznicy teraz, roznica roznicy poprzednia
int standingstil = 0; // stoi w miejscu 
int moving = 0; 



void setup() {
pinMode(TRIGGER_PIN,OUTPUT);
pinMode(ECHO_PIN,INPUT);
Serial.begin(9600);
verschilErrorvorige = 0;
double uS = avarage();
startPositie = uS;
}


//LOOP
void loop() {
 

newPositie = avarage(); //zo bereken je het afstand in CM avarage functie oproepen.

verschilPositie = startPositie - newPositie; 
verschilErrornow = verschilPositie;
verschilError = verschilErrornow + verschilErrorvorige;


/*
Serial.println("verschilPositie");
Serial.println(verschilPositie);

Serial.println("verschilError");
Serial.println(verschilError);
*/

if(verschilPositie > 0.02){


if((verschilError == verschilPositie) || (verschilError == (verschilPositie + 0.01)) || (verschilError == (verschilPositie - 0.01))){
  Serial.println("STAAT STILL");
 // standingstil++;
 // if(standingstil >= 4){
    //  verschilError = verschilPositie;
 //   standingstil =0;
//    moving--;
 
 }

else{

  //moving++;
  //if(moving > 4){
      Serial.println("BEWEEGT ");
      aantalstappen = (verschilPositie * 25 );
      Serial.println(aantalstappen);
  //    standingstil--;
 // }
  

}
}
delay(20);


startPositie = newPositie;
verschilErrorvorige = verschilPositie;



}



//FUNCITES ONDERAAN

double avarage(){

double duration, distance1,total;
int test = 0;
digitalWrite(TRIGGER_PIN,HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN,LOW);
duration = pulseIn(ECHO_PIN,HIGH);
distance1 = (duration/2)/ 29.1;

if(distance1 > 3 && distance1 < 125){


for(int i =0;i <= 9;i++){
total += distance1;
test++;
//Serial.println(distance1);


}
}
 
  return  (total/test);
  total = 0;

  }













0

Jaki to sensor? Cyfrowy czy analogowy powinieneś bardzo dokładnie filtrować napięcie zasilania dość sporym kondensatorem elektrolitycznym, a najlepiej tantal (lub polimerowy - elektrolityczny) oraz cewka na rdzeniu ferrytowym (czyli filtr LC).
Częstotliwość wyliczasz od częstości pomiarów, czyli jak masz co 20ms daje to 50 hz. Masz mieć filtr głuszący LC do 100Hz w konfiguracji "T", (z tym że tylko połowa "T") cewka od strony zasilania, a kondensator przy czujniku.

Możesz robić powiedzmy 10 pomiarów i potem uśredniać wynik, lub 9, 8 ,7 ... w zależności jaka prędkość odczytu jest Ci potrzebna.

0

Usrednilem juz wynik . Nawet napisalem algorytm ktory filtruje dalej pomiary. Sensor podlaczany jest pod wejscie digital. Niestety nie jest analogowy :S

0

Napisz jaki to jest sensor, pisałem o zasilaniu sensora.

0

utrason hcsr04

0
  1. Dodaj filtr do zasilania
  2. Nie jest to dokładny czujnik, więc musisz zrobić:
    a) więcej pomiarów i uśrednić
    b) może warto przejść na czujniki optyczne?
    c) przyjmij maskę niedokładności

Czy pulseIn() działa przerwaniowo? Jest to bardzo ważne.

Podany czujnik nie będzie dokładny, ale z tego co testowałem to powinien trzymać stabilną dokładność na poziomie delta = 0,5cm.

0

no i to jest niestety o wiele za duzo . No ale dzieki

0

Jak często robiony jest odczyt? Pytam, bo tak radosnie lecisz na typie double, który jest realizowany programowo. Ja wiem, że "jeszcze nie optymalizuj" ale to się czasowo wyrabia?

0

Juz po projekcie :) Udalo sie wszystko zrobic i projekt zdany

1 użytkowników online, w tym zalogowanych: 0, gości: 1