Lemme Paint
Introducere
Acest proiect incearca sa detecteze coordonatele un obiect intr-un plan 2D pe care sa le foloseasca sa deseneze pixeli pe un ecran.
De ce? Mi se pare interesant sa poti desena pe un ecran miscand un obiect in aer.
Proiectul nu presupune doar legarea a doua rezistente in paralel in serie cu un led, ci este un pic mai greu hardware din cauza senzorilor.
Descriere generală
Din cei 6 senzori 3 vor fi plasati pe axa Ox, iar 3 2 pe axa Oy. Cu ei se va determina distanta de la axe la obiect. Cu aceasta distanta se va calcula ce pixel se va aprinde pe ecran.
Butonul este pentru clear screen sau pentru modificarea culorii. TBD
Pe ecran se va forma un desen care se va updata live in functie de unde se detecteaza obiectul in plan.
Schema bloc
Hardware Design
Schema hardware
Pentru conectarea unui senzor am folosit doua fire cu 3 cabluri fecare din care am folosit cate doua fire de la fiecare.
Breadboardul unde sunt facute conexiunile
Vederea de sus a zonei unde se plaseaza obectul cu care se va desena (aici un cub Rubik cu latura de apx 5,5 cm)
Vederea de ansamblu al proiectului
Piese
Denumire | Cantitate |
Arduino Uno | 1 |
HC-SR04 | 6 5 |
LCD Display st7735 | 1 |
Butoane | 1 |
Fire (senzori) | 8 x cabluri (3 fire) F-F + 4 fire M-F + 12 fire M-M |
Fire (ecran) | 8 fire M-M |
Software Design
Implementare
Sunt 5 senzori HC-SR04, un ecran LCD ST7735 si un buton care trebuie controlati prin software
Idee principala:
se efectueaza 5 masuratori (cate una per senzor)
primii doi senzori corespund axei Ox
, urmatorii 3 axei Oy
obiectul nu se afla mereu in raza de actiune a tuturor senzorilor deci pentru a determina pozitia obiectului
se alege pe fiecare axa minimul dintre masuratorile asociate axelor
nu este suficienta aceasta abordare, trebuie filtrare masuratorile, dar strategia de a alege minimul dintre masuratori (filtrate sau nu) este una valida
Ecranul:
Senzorii:
Senzorii au pe langa VCC
is GND
alti doi pini: TRIG
si ECHO
. Pentru a efectua o masurtoare pe un sezor se trimite tensiune HIGH
pe pinul de TRIG
timp de 10µs
, iar apoi se masoara timpul cat tensiunea pe pinul ECHO
este HIGH
. Acel timp este timpul necesar sunetului sa ajunga la obiect si inapoi. Stiind viteza sunetului si timpul se determina distanta.
O singura astfel de masuratoare la distante mici (pana in 40 cm) dureaza foarte putin (ordin de ms). Astfel se pot efectua foarte multe masuratori pana a ajunge la un rezultat concret.
La o astefel de viteza de masurare trebuie filtrat inputul de la senzori pentur ca e foarte noisy.
Primul filtru pentru eliminarea zgomotului este efectuarea a 5 masuratori consecutive si de a alege mediana
Poza cu incercarea de trasare a unei linii drepte folosind doar masuratori filtrare cu mediana
Nu este suficient de stabil sa folosesc doar filtrul cu mediana. O voi pastra pentru sanitizeaza destul de bine citirile brute.
Am incercat sa aplicat doua filtre ale medianei unul peste celalalt dar asta ar insemna 125 de masuratori brute de senzor ceea ce nu este de dorit. Rezultatele nu sunt astronomic mai bune, iar timpul necesar calcularii pozitiei este foarte mare (~ 1-2 masuratori pe secunda yuck
)
Al doilea filtru, Filtru Kalman, a fost necesar pentru a stabiliza si mai mult, dar de data asta intr-un mod inteligent, masuratorile pentru detectarea obiectului in plan.
-
TLDR: el estimeaza starea sistemului (pentru noi, masuratoarea individuala a fecarui senzor in parte), o eroare si apoi pe baza masuratorii noi efectuate se updateaza estimarile sistemului si a erorii. Estimarea sistemului este rezultatul filtrat la fiecare pas (masuratoare)
Am introdus un filtru Kalman pentru fiecare senzor in parte deoarece o masuratoare nu depinde de alta
Dupa ce se filtreaza masuratorile fiecarui sezor se ia minimul pe axe pentru determinarea coordonatelor
Aceasi incercare ca mai sus, doar ca de data asta avem filtru cu mediana si un filtru kalman
se poate observa ca linia este considerabil mai dreapta (din cauza filtrului kalman aplicat pe masuratori), dar mai sunt erori unde punctul determinat cu minimul dintre masuratori sare
Aceste coordonate intermediare suntr introduse in alt filtru kalman independent pe x si pe y.
Acest al doilea filtru kalman este introdus pentru ca atunci cand minimul unui filtru se schimba de pe un senzor pe altul sa nu existe schimbari bruste reflectate in punctul desenat.
Cand se schimba obiectul din campul de masurare al unui senzor in campul de masurare al altui senzor (de pe ac axa) rezultatul final nu ar trebui sa fie foarte diferit. De aceea este folosit si cel de-al doilea filtru Kalman pe pozitia finala
Rezultatul celui de-al doilea filtru Kalman este pozitia finala
Aici se poate vedea efectul celui de-ai doilea filtru kalman aplicat pe pozitia finala determinata (acea dâră din dreapta jos este datorata calibrarii initiale ale filtrului)
Rezultate obtinute
Incercare de trasare a unu dreptunghi inainte si dupa filtrarea Kalman
Concluzii
Download
Jurnal
26.04
05.05
20.05
22.05
documentarea despre folosirea mai multor senzori in acelasi timp
adaugarea a inca unui senzor la testul precedent → doua linii pe ecran: verde si rosu
introducerea unei metode e filtrare a zgomotului - mediana din 5 masuratori consecutive
24.05
am luat niste cutii de carton de la lidl in care sa dau gauri
am nevoie de cutii pentru a avea un fundal la senzori ca daca nu vad fundal drept masoara garbage
pentru conectarea unui senzor este nevoie de 4 fire cu cel putin un capat female. Nu aveam atatea fire pentru toate cele 6 5.
deasemenea, am renuntat la un senzor
ediate wiki
27.05
28.05
adaugarea filtrului kalman pentur fiecare senzor in parte (pe langa filtrul cu mediana)
stabilitarea rezultatului final perechea de coordonate (x, y) masurata a fost imbunatatita foarte mult
29.05
30.05
Bibliografie/Resurse
Filtru Kalman Wikipeadia
link
Filtrarea masuratorilor brute folosind mediana a 5 masuratori consecutive:
link
Implementare minimalista a unui filtru Kalman pentru un sistem cu o variabila o variabila:
link
-
-