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

  • Mediu de dezvoltare folosut - Arduino IDE
  • Librarii aditionale
    • SPI.h - pentru comunicarea cu ecranul
    • TFT.h - pentru comunicarea cu ecarnul
    • PinChangeInt.h - pentru abstractizarea folosirii intreruperii

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:

  • Folosesc librariile SPI.h si TFT.h pentru a realiza comunicarea cu ecranul
  • De aici ma folosesc de functiile de colorare individuala de pixel/ desenare de cercuri

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
    • Se efectuaza cate o masuratoare bruta cu toti cei 5 senzori, iar apoi se trece la urmatorul pas unde se efectueaza masuratori brute cu fiecare senzor
    • Cand se efectueaza 5 masuratori brute, fiecare vector care contine cele 5 masuratori brute ale fiecarui senzor sunt sortate folosind o sortare eficienta inspirata de aici

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.
  • introducere filtru pentur informatii despre Filtrul Kalman
  • 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

  • Inainte:

  • Dupa:

Concluzii

  • Consider ca se poate incerca a se folosi pentru a se desena lucruri.

Download

Jurnal

  • 26.04
    • alegere proiect
    • creare draft initial de wiki
    • lista de piese
    • comandarea pieselor
  • 05.05
    • testarea pieselor
    • ecranul si cei 6 senzori ultrasonici merg
  • 20.05
    • combinarea unui singur senzor cu ecranul (cu datele primite de la senzor trasam o linie la o anumita pozitie fata de o margine a ecranului)
  • 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
    • am descoperit ca doar filtrul cu mediana pentur fiecare masuratoare nu este suficient de stabil pentru proiectul final
    • research kalman filter :(
  • 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
    • adaugarea unui al doilea filtru kalman, pe perechea de coordonate (x, y)
    • stabilitate +++
  • 30.05
    • editare wiki
    • poze, etc

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
  • More Kalman stuff link
  • Conectare ecran link
pm/prj2021/agrigore/lemmepaint.txt · Last modified: 2021/05/30 19:02 by anton_fabian.patras
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0