Table of Contents

SimplePlot

Introducere

SimplePlot este un calculator matematic care se specializează pe trasarea funcțiilor in 2D sau 3D. Utilizatorul poate introduce de la tastatură o funcție în maxim 2 variabile, în mod simbolic. Aceasta va fi parsată, eșantionată și apoi desenată pe un ecran. Utilizatorul va dispune de două joystick-uri cu care poate controla rotația în jurul originii și poziția originii relativă la punctul de origine stabilit global în 0. Userul va putea seta și alți parametri cum ar fi numărul de puncte de eșantionare, distanța intre două puncte de eșantionare (determină un fel de “zoom in”) și va putea salva pe un SD card funcțiile sale preferate (pe lângă un istoric al funcțiilor).

Descriere generală

Componentele sistemului:

Hardware Design

Listă componente:

Notă: Cele 5 module 74HC541PW fac parte din TFT Mega Shield.

Componentele principale sunt un ecran ILI9341 TFT LCD si un ATmega2560. Ecranul funcționează la 3.3V deci am avut nevoie de un shield care să efectueze conversia. Am folosit TFT Mega Shield V2.2. Acesta are următoarea schemă: Dintre cele 5 module 74HC541PW care realizează conversia de la 5V la 3.3V, folosesc efectiv doar 4 (au fost incluși efectiv în schema proiectului). Shield-ul a fost conectat la plăcuță în felul următor:

Ecranul și SD reader-ul au fost apoi conectate prin intermediul shield-ului la plăcuță (SD reader-ul funcționează și el în regim de 3.3V).

Modul de conectare al ecranului la shield:

Modul de conectare al SD reader-ului cu shieldul:

Modul de conectare Joystick 1:

Modul de conectare Joystick 2:

Modul de conectare al Keypad-ului:

Deoarece SD-reader-ul nu este conectat direct la plăcuță, ci este folosit shield-ul intermediar, plăcuța va vedea următorii pini pentru comunicarea SPI:

Software Design

Mediu de dezvoltare:

Librării şi surse 3rd-party:

Modul de reprezentare al numerelor reale.

Operațiile pe floats sunt lente pe ATmega2560. Am ales să folosesc operații pe virgulă fixă. Voi folosi 16 biți pentru partea întreagă și 16 biți pe partea fracțională, respectiv, o valoare reală va fi reprezentată de un int32_t.

Modul de randare al funcțiilor 3D

Așa cum am mai menționat, pentru a evalua o funcție, aceasta va fi evaluată pe un grid NxN. Aceste puncte, fiind în 3D trebuie proiectate în spațiul 2D al ecranului. Pentru aceasta, am definit un punct origine unde va fi centrat gridul. Acest punct va reprezenta punctul look at pentru proiecție. Camera va fi mereu poziționată pe o sferă de rază R (camera orbitează punctul de origine) și se va uita la punctul de look_at. Poziția camerei pe sferă va putea fi schimbată cu unul dintre joystick-uri iar pozișia originii cu celălalt. Fiecare 3D punct din grid, va fi conectat cu vecinii săi cu o linie, iar obiectul final va fi un fel de “line mesh”. Nu voi randa explicit triunghiuri. Deoarece primitivele nu vor fi triunghiuri ci linii, nu este necesar un test de adâncime, respectiv un framebuffer, care ar fi mult prea mare pentru a încăpea în cei 8KB de SRAM.

Logarea datelor

User-ul își va putea salva funcțiile preferate pe un SD card. Pentru aceasta voi folosi SPI. Înițierea SPI-ului este realizată în fișierul spi.h. Pentru montarea și lucrul cu fișiere voi folosi librăria externă Petit FatFs. Fișierul pentru funcții data.txt deja există pe cardul SD. Acolo voi stoca funcțiile în formă simbolică.

Algoritmi și structuri de date:

Elemente de UI și User Experience

UI

Pagina de pornire va permite utilizatorului să tasteze o funcție de la tastatură, încarce una deja existentă de pe micro SD sau să marcheze funcția tastată pentru salvare. Va fi un meniu simplu, în partea de sus va fi o bară unde funcția curentă va putea fi vizualizată simbolic.

User Experience

Deoarece tastatura are doar 16 butoane, voi folosi 2 “layout-uri”. Unul din cele 16 butoane va schimba layout-ul:

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF