Ako vyfiltrovat chyby v meranie?

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

Používateľov profilový obrázok
zen
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 22 Nov 2013, 14:33
Bydlisko: Cadca

Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa zen » 31 Máj 2017, 15:53

Mieram vzdialenosti pomocou hc-sr04, program prakticky z internetu:

Kód: Vybrať všetko

void setup() {
  Serial.begin (9600);

                      //HC-SR04: GND  <--> GND
  pinMode(3, INPUT);  //HC-SR04: Echo green
  pinMode(2, OUTPUT); //HC-SR04: Trig blue
                      //HC-SR04: VCC  <--> 5V
  Serial.println("measure_min measure_max measure_mean error distance seconds");
}
int cm;     //distance measured by hc_sr04()

//--------------------------------------
int hc_sr04() {
  digitalWrite(2,LOW);
  delayMicroseconds(2);
  digitalWrite(2,HIGH);
  delayMicroseconds(10);
  digitalWrite(2,LOW);
  return int(pulseIn(3,HIGH)/58.2);
}
//--------------------------------------
int do_it() {
  int measure_min=999;
  int measure_max=0;
  int error=0;
  unsigned long int total=0;
  char format[80];
  for(int i1=0;i1<99;++i1) {
    int measure=hc_sr04();
    if(measure>250) ++error;
    else {
      if(measure_min>measure) measure_min=measure;
      if(measure_max<measure) measure_max=measure;
      total+=measure;
    }
  }
  int measure_mean=int(total/100);
  int distance=int(total/(100-error));
  sprintf(format,"%11d %11d %12d %5d %8d %7d",measure_min,measure_max,measure_mean,error,distance,millis()/1000);
  Serial.println(format);
  return distance;
}
//--------------------------------------
void loop() {
  cm=do_it();
}
Je zameraný na strop, mal by dávať porad tu istú vzdialenosť. Strašlivo to skace. Aké sú možnosti filtrovať, ktoré moc nezatazuju CPU?
Prílohy
gpg.png
0
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)

Používateľov profilový obrázok
djwiktor
Ultimate člen
Ultimate člen
Príspevky: 1624
Dátum registrácie: 01 Júl 2010, 00:00
Bydlisko: Šaľa
Vek: 36
Kontaktovať používateľa:

Re: Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa djwiktor » 31 Máj 2017, 16:09

kedze to len pise na seriak,

tak by som skusil pred meranim disablovat vsetky interrupty, a po zmerani pred odoslanim na seriak ich enablov.

cli() a sei() prikazy. Info si najdes na webe ;)

To zvycajne zlepsi trosku stabilitu.
0
Tlacim na 3D tlaciarni Felix 3.0 dual
Stormchasers.sk

Používateľov profilový obrázok
mac26
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1298
Dátum registrácie: 01 Feb 2010, 00:00
Bydlisko: Martin

Re: Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa mac26 » 31 Máj 2017, 16:20

Co tak to porovnavat s plavajucim priemerom? Napr posledne 4 hodnoty, nech to nieje moc pomale.
Alebo odosielat proste ten priemer
0

Používateľov profilový obrázok
zen
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 22 Nov 2013, 14:33
Bydlisko: Cadca

Re: Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa zen » 31 Máj 2017, 18:12

djwiktor napísal:tak by som skusil pred meranim disablovat vsetky interrupty, a po zmerani pred odoslanim na seriak ich enablov.
Zkusil som dat meranie medzi noInterrupts() a interrupts() - necita hodnoty.
djwiktor napísal:cli() a sei() prikazy. Info si najdes na webe ;) .
Nasiel som:
https://forum.arduino.cc/index.php?topic=130583.0
mac26 napísal:Co tak to porovnavat s plavajucim priemerom? Napr posledne 4 hodnoty, nech to nieje moc pomale.
Ked to dava take zle hodnoty tak je obrovska pravdepodobnost, ze aj plavajuci priemer bude zly.

Co tak vidim:

Kód: Vybrať všetko

spocitat priemer;
p1=sqrt(priemer);
for(int i1=0;i1<100;++i1) 
   if (abs(value[i]-priemer)) 
     value[i]=priemer;
spocitat a odoslat priemer
Nie je cosi lepsie?
0
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)

Používateľov profilový obrázok
daqq
Power user
Power user
Príspevky: 2528
Dátum registrácie: 10 Jún 2008, 00:00
Bydlisko: Bratislava
Vek: 36
Kontaktovať používateľa:

Re: Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa daqq » 31 Máj 2017, 18:21

Ked to dava take zle hodnoty tak je obrovska pravdepodobnost, ze aj plavajuci priemer bude zly.
No, podla toho ako robis priemer. Uvazujuc ze mas pole poslednych N dobrych vzoriek z ktorych ratas priemer a ak je hodnota zla, tak ju nezahrnies do tych pola poslednych N vzoriek. Pridas tam daku logiku, ze ak dostanes viacero za sebou iducich zlych vzoriek tak vynulujes pole poslednych dobrych vzoriek.
0
Outsource your thinking: Get religious!
Zistenie: Ked robite sucasne v C, C++, C#, Matlabe, trocha pokukujete po VHDL, sialenstvo nemoze byt daleko...este stastie, ze som lietadlo a nemam tieto problemy.

Používateľov profilový obrázok
mac26
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1298
Dátum registrácie: 01 Feb 2010, 00:00
Bydlisko: Martin

Re: Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa mac26 » 31 Máj 2017, 18:38

kuk sem, je tam pekne vysvetlene ako to moze vyzerat
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa peterple » 31 Máj 2017, 18:46

ja si myslím že pulseIn je principiálne zlá metóda na meranie odozvy. Funguje iba keď je povolené prerušenie. Takže zákaz prerušení je mimo. Kedže počas prerušenia beží aj timer, ktorého pretečenie aktivuje obsluhu tak nikdy nevieš kedy zmeriaš blbosť.
Filtrovanie blbostí je pomerne jednoduché ak sú tie blbosti dosť ďaleko od priemeru a sú iba občas. Počítaš si kĺzavý priemer ale hodnoty ktoré sú totálne mimo do neho nezahrneš. A samozrejme to počítaj na int a nie na float
A na klzavý priemer je najlepšia kruhová fronta plus celková suma. a je výhodné ak dĺžka fronty je mocnina dvojky (8,16,32...)

Ja by som v prvom rade zmenil spôsob merania. respektíve v prvom rade by som si overil či naozaj neblbe ten snímač.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
zen
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 22 Nov 2013, 14:33
Bydlisko: Cadca

Re: Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa zen » 31 Máj 2017, 19:40

peterple napísal:ja si myslím že pulseIn je principiálne zlá metóda na meranie odozvy.
Ake su alternativy ku hc-sr04?
0
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)

bum
Stály člen
Stály člen
Príspevky: 126
Dátum registrácie: 28 Okt 2016, 21:40
Vek: 66
Kontaktovať používateľa:

Re: Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa bum » 31 Máj 2017, 20:44

Stejné čidlo na měření vzdálenosti používám sice s PICAXE 08M2 s vyhodnocením na PC. Při měření jsem měl stejný problém první věc byla že došlý modul měl vysílač a přijímač na DPS tak že směřovali od sebe a po opravě (seřízení souososti) již měření vzdálenosti ukazuje skutečnost, pak při přepočtu na vzdálenost mám hodnotu 58. Pro inspiraci to je na mém webu v článku PC A PICAXE 08M2 V.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa peterple » 31 Máj 2017, 22:53

myslíš spôsob merania?. Jednoducho časovačom. Postup merania asi takto
  • zakážem prerušenia
  • vygenerujem tie impulzy pre vysielač
  • odchytím stav čítača
  • prijímač je pripojený na ICP vstup. Keď nastane hrana, odchytí sa obsah čítača do ICR to robí hw program len kontroluje či to nastalo.
  • vezmem obsah ICR odčítam hodnotu zapamätanú na začiatku. a mám počet pulzov čo to trvalo.
  • povolím prerušenia.
Kedže to meral timer a sú zakázané prerušenia tak je to presné. Lebo ani pri vysielaní ani pri čakaní na odozvu ma nemôže nič prerušiť.
Ešte tam treba implementovať nejaký timeout ak by tá odozva nedorazila.
Nerobia ti náhodou problém nejaké stratené odozvy?
Veď logický analyzátor a hurá na to.

-- Spojený príspevok 31 Máj 2017, 22:40 --

Ešte som si kukol ako je urobený ten pulseIn. Pokiaľ nezachytíš odozvu tak nastane timeout a príde ti nula. Tie najväčšie blbiny nespôsobuje práve to? Jednak v tom tvojom programe nenastavuješ hodnotu toho timeout, a za druhé ani nekontroluješ či nastal. Oboje by som urobil
No a samozrejme tu je citát zo zdrojáku tej funkcie. To čo som mal na mysli na začiatku je obsiahnuté v poslednej vete.
// convert the reading to microseconds. The loop has been determined
// to be 20 clock cycles long and have about 16 clocks between the edge
// and the start of the loop. There will be some error introduced by
// the interrupt handlers.
Takže spôsob merania doby príchodu impulzu vhodný akurát tak pre arduinistov. Nevieme ako, ale hlavne že to niečo robí.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
jardo181
Pokročilý člen
Pokročilý člen
Príspevky: 588
Dátum registrácie: 15 Sep 2012, 21:04
Bydlisko: Banská Bystrica

Re: Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa jardo181 » 01 Jún 2017, 08:41

skus dat 100n kondik paralelne voci zemi a arduino pinu..
0
IT bojovník
Ak by bol záujem tak: Ebay, DX, Aliexpress...

Používateľov profilový obrázok
zen
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 22 Nov 2013, 14:33
Bydlisko: Cadca

Re: Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa zen » 15 Jún 2017, 12:03

- urobím 30 meranie
- spočítam priemer
- spočítam koľko merania je v (priemer +/- sqrt(priemer))

Nechal som to štvrt hodiny behať:
- 30 som nedostal
- 20 horná hranica
- 0 sa objaví celkom často, aj viackrát za sebou

Včera som to dovliekol do mesta:
- 30 drtia väčšina
- 28 povestnou spodná hranica
- 24 minimum

Usudzujem z toho, ze tade máme prúd s ihlami. Co ma v tom podporuje:
- odchádzajú celkom pravidelne SD karty
- minimálne jednou do mesiaca praskne žiarovka, at už Edison, LED ci halogén
- mám tie isté problémy s Dallas DS18B20

Len sa čudujem, ze neodišla telka ani žiadny pocítiac.

Napájať Arduino baterkou sa mi nechce - celu tuto inštaláciu robím aby som nahradil LED lampičky z Cíny, ktoré síce fungujú bezvadne, ale u ktorých sa mi nechce meniť baterky Každe dva mesiace.

Stažovať si u SSE? Moje problémy s Arduino im budu asi fuk, no tie problémy zo žiarovkami by mali vyriešiť. Ako ich presvedčiť? A dá naj st riešenie? Bývame na konci dediny.

Nemal by som otvoriť nove téma? V silnoprúdu?

P.S. S tím kondíkom to ešte zdusím, no, mam to 60 km );
0
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)

maestro33
Okoloidúci
Okoloidúci
Príspevky: 47
Dátum registrácie: 11 Aug 2012, 16:11
Bydlisko: Nitra
Vek: 34
Kontaktovať používateľa:

Re: Ako vyfiltrovat chyby v meranie?

Príspevok od používateľa maestro33 » 15 Jún 2017, 14:48

neser sa s tym hod tam kalmanov filter :D
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok