Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2024:vstoica:cristian.chiriac02 [2024/05/16 23:57]
cristian.chiriac02 add electrical schematic and detailed hardware description
pm:prj2024:vstoica:cristian.chiriac02 [2024/05/26 23:33] (current)
cristian.chiriac02 add archive copy on OCW
Line 12: Line 12:
 ==== Schema bloc ==== ==== Schema bloc ====
  
-{{ :​pm:​prj2024:​vstoica:​cristian.chiriac02:​schema_bloc.png?​direct&​750 |Schema bloc}}+{{ :​pm:​prj2024:​vstoica:​cristian.chiriac02:​schema_bloc.png?​direct&​700 |Schema bloc}}
  
 ===== Hardware Design ===== ===== Hardware Design =====
Line 29: Line 29:
  
 === Schema electrică === === Schema electrică ===
-{{ :​pm:​prj2024:​vstoica:​cristian.chiriac02:​schema_electrica.png?​direct&​750 |}}+{{ :​pm:​prj2024:​vstoica:​cristian.chiriac02:​schema_electrica.png?​direct&​700 |}}
  
 === Detaliere hardware === === Detaliere hardware ===
 Încă de la începutul implementării hardware a telecomenzii,​ design-ul final pe care l-am avut în minte a fost unul bazat pe împărțirea în două categorii a componentelor proiectului:​ cele ce au nevoie de alimentare cu 5V și/sau să fie în partea inferioară a telecomenzii și celelalte. Astfel, pot grupa toate componentele din prima categorie în partea inferioară. În practică, pe partea superioară au rămas doar butoanele de control, care pot fi utilizate fără alimentare prin utilizarea rezistențelor de pull-up. Încă de la începutul implementării hardware a telecomenzii,​ design-ul final pe care l-am avut în minte a fost unul bazat pe împărțirea în două categorii a componentelor proiectului:​ cele ce au nevoie de alimentare cu 5V și/sau să fie în partea inferioară a telecomenzii și celelalte. Astfel, pot grupa toate componentele din prima categorie în partea inferioară. În practică, pe partea superioară au rămas doar butoanele de control, care pot fi utilizate fără alimentare prin utilizarea rezistențelor de pull-up.
  
-** Componentele și utilizarea lor: **+{{ :​pm:​prj2024:​vstoica:​cristian.chiriac02:​lipituri.png?​direct&​600 | Hardware top & bottom}} 
 + 
 +{{ :​pm:​prj2024:​vstoica:​cristian.chiriac02:​asamblat.png?​direct&​600 | Hardware asamblat}} 
 + 
 +**Componentele și utilizarea lor:**
   * MPU6050   * MPU6050
-    * ** Scop: ** detectează mișcarea mâinii utilizatorului pentru a o traduce în mișcarea cursorului pe sistemul de calcul +    * **Scop:** detectează mișcarea mâinii utilizatorului pentru a o traduce în mișcarea cursorului pe sistemul de calcul 
-    * ** Conectare: ** fiind un modul ce folosește protocolul de comunicare I²C, am folosit pinii A4 (PC4/SDA) și A5 (PC5/SCL) specifici acestui protocol+    * **Conectare:​** fiind un modul ce folosește protocolul de comunicare I²C, am folosit pinii A4 (PC4/SDA) și A5 (PC5/SCL) specifici acestui protocol
  
   * FS1000A   * FS1000A
-    * ** Scop: ** trimite comenzi către receptorul conectat la sistemul de calcul +    * **Scop:** trimite comenzi către receptorul conectat la sistemul de calcul 
-    * ** Conectare: ** din motive de simplitate a organizării hardware a componentelor,​ am ales pinul A3 (PC3); biblioteca utilizată pentru comunicarea wireless poate fi configurată să folosească orice pin de GPIO+    * **Conectare:​** din motive de simplitate a organizării hardware a componentelor,​ am ales pinul A3 (PC3); biblioteca utilizată pentru comunicarea wireless poate fi configurată să folosească orice pin de GPIO
  
   * XY-MK-5V   * XY-MK-5V
-    * ** Scop: ** recepționează datele transmise de telecomandă +    * **Scop:** recepționează datele transmise de telecomandă 
-    * ** Conectare: ** pinul D11 (PB3) este cel default al bibliotecii pentru recepționarea de date și nu am avut niciun motiv să îl schimb+    * **Conectare:​** pinul D11 (PB3) este cel default al bibliotecii pentru recepționarea de date și nu am avut niciun motiv să îl schimb
  
   * Butoanele superioare   * Butoanele superioare
-    * ** Scop: ** fiecare buton reprezintă o comandă pe care telecomanda o poate transmite sistemului de calcul +    * **Scop:** fiecare buton reprezintă o comandă pe care telecomanda o poate transmite sistemului de calcul 
-    * ** Conectare: ** deoarece ​numărul ​acestora ​este foarte mic, am ales să folosesc pinii D2 - D6 (PD2 - PD6), deoarece, fiind pe același port, pot activa întreruperile de schimbare ale pinilor doar pe acest port, putând astfel să detectez în mod rapid schimbarea stării butoanelor fără a recurge la polling; suplimentar,​ am ales ca butoanele PREV și NEXT să fie conectate la pinii D2 și D3 (PD2/INT0 și PD3/INT1), deoarece acestea vor fi folosite cel mai mult în cadrul prezentărilor,​ așa că vrem ca ele să aibă prioritate față de celelalte butoane din punct de vedere al întreruperilor+    * **Conectare:​** ​întrucât ​numărul ​de butoane ​este foarte mic, am ales să folosesc pinii D2 - D6 (PD2 - PD6), deoarece, fiind pe același port, pot activa întreruperile de schimbare ale pinilor doar pe acest port, putând astfel să detectez în mod rapid schimbarea stării butoanelor fără a recurge la polling; suplimentar,​ am ales ca butoanele PREV și NEXT să fie conectate la pinii D2 și D3 (PD2/INT0 și PD3/INT1), deoarece acestea vor fi folosite cel mai mult în cadrul prezentărilor,​ așa că vrem ca ele să aibă prioritate față de celelalte butoane din punct de vedere al întreruperilor
  
   * Butonul inferior   * Butonul inferior
-    * ** Scop: ** în funcție de starea telecomenzii,​ acesta poate controla ori pointerul laser de pe telecomandă,​ ori transmiterea unui click al cursorului sistemului de calcul +    * **Scop:** în funcție de starea telecomenzii,​ acesta poate controla ori pointerul laser de pe telecomandă,​ ori transmiterea unui click al cursorului sistemului de calcul 
-    * ** Conectare: ** am ales pinul A2 (PC2) doar din considerente de rutare ale cablurilor, orice pin de pe această parte a Nano-ului ce nu are deja o utilizare consacrată poate fi utilizat la fel de bine+    * **Conectare:​** am ales pinul A2 (PC2) doar din considerente de rutare ale cablurilor, orice pin de pe această parte a Nano-ului ce nu are deja o utilizare consacrată poate fi utilizat la fel de bine
  
   * TTP223   * TTP223
-    * ** Scop: ** detectarea degetului utilizatorului,​ pentru a comuta între modul normal de funcționare al telecomenzii și cel de control al cursorului: în prezența degetului, telecomanda transmite constant mișcarea telecomenzii pentru a mișca cursorul, iar butonul inferior controlează click-ul, iar în absența degetului, butonul inferior controlează laserul +    * **Scop:** detectarea degetului utilizatorului,​ pentru a comuta între modul normal de funcționare al telecomenzii și cel de control al cursorului: în prezența degetului, telecomanda transmite constant mișcarea telecomenzii pentru a mișca cursorul, iar butonul inferior controlează click-ul, iar în absența degetului, butonul inferior controlează laserul 
-    * ** Conectare: ** fiind echivalentul unui buton, din motive similare cu butonul inferior, am ales pinul A0 (PC0) pentru acest senzor+    * **Conectare:​** fiind echivalentul unui buton, din motive similare cu butonul inferior, am ales pinul A0 (PC0) pentru acest senzor
  
   * KY-008   * KY-008
-    * ** Scop: ** proiectează un punct roșu laser, asemeni telecomenzilor de prezentare tradiționale,​ pentru a indica detalii pe slide-urile prezentării +    * **Scop:** proiectează un punct roșu laser, asemeni telecomenzilor de prezentare tradiționale,​ pentru a indica detalii pe slide-urile prezentării 
-    * ** Conectare: ** similar cu butonul inferior, orice pin GPIO putea fi folosit pentru laser; singurul rămas neutilizat pe partea inferioară (partea stângă în schema electrică) a fost A1 (PC1), așa că pe acesta l-am utilizat+    * **Conectare:​** similar cu butonul inferior, orice pin GPIO putea fi folosit pentru laser; singurul rămas neutilizat pe partea inferioară ​a Nano-ului ​(partea stângă în schema electrică) a fost A1 (PC1), așa că pe acesta l-am utilizat
  
   * Boost Converter 5V   * Boost Converter 5V
-    * ** Scop: ** ridică tensiunea bateriilor la 5V, tensiunea nominală a componentelor utilizate +    * **Scop:** ridică tensiunea bateriilor la 5V, tensiunea nominală a componentelor utilizate 
-    * ** Conectare: ** pinii de GND și 5V sunt comuni cu cei ai tuturor celorlalte componente, iar pinul de intrare a tensiunii este conectat, printr-un switch, la terminalul pozitiv al bateriilor; terminalul negativ este conectat tot la GND+    * **Conectare:​** pinii de GND și 5V sunt comuni cu cei ai tuturor celorlalte componente, iar pinul de intrare a tensiunii este conectat, printr-un switch, la terminalul pozitiv al bateriilor; terminalul negativ este conectat tot la GND 
 + 
 +<​html>​ 
 +<iframe width="​700"​ height="​394"​ src="​https://​www.youtube.com/​embed/​4hf4uMTWSRc"​ title="​Demo PM Wireless Presenter - Chiriac Cristian-Alexandru,​ 331CC" frameborder="​0"​ allow="​accelerometer;​ autoplay; clipboard-write;​ encrypted-media;​ gyroscope; picture-in-picture;​ web-share"​ referrerpolicy="​strict-origin-when-cross-origin"​ allowfullscreen></​iframe>​ 
 +</​html>​
  
 ===== Software Design ===== ===== Software Design =====
- 
-GitHub: [[https://​github.com/​Alexander1752/​wireless_presenter]] 
  
 <note tip> <note tip>
-Descrierea codului aplicaţiei (firmware): +GitHub[[https://​github.com/​Alexander1752/​wireless_presenter]]
-  * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) +
-  * librării şi surse 3rd-party (e.gProcyon AVRlib) +
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +
-  * (etapa 3) surse şi funcţii implementate+
 </​note>​ </​note>​
 +
 +Am dezvoltat proiectul în [[https://​code.visualstudio.com/​|Visual Studio Code]] cu ajutorul [[https://​platformio.org/​|PlatformIO]],​ la fel ca în cadrul laboratoarelor. Codul de pe microcontrollere este scris aproape complet folosind regiștrii și laboratoarele relevante, întrucât implementările din acestea sunt foarte optimizate, ceea ce ajută în economisirea ciclilor de ceas și a energiei consumate din baterie. Cu toate acestea, am folosit și câteva biblioteci în proiect, acestea fiind:
 +
 +  * [[https://​github.com/​latchdevel/​VirtualWire|VirtualWire]] - utilizată pentru transmisia comenzilor de la telecomandă și recepționarea lor de către receiver
 +  * [[https://​onlinedocs.microchip.com/​pr/​GUID-A834D554-5741-41A3-B5E1-35ED7CD8250A-en-US-5/​index.html?​GUID-825A28EE-C4E4-4C03-864F-92AA9BA41231|AVR Sleep]] - bibliotecă ce oferă apeluri simple pentru punerea în repaus a microcontrollerului,​ cu scopul de a economisi energie; dezactivarea perifericelor este, totuși, realizată prin interfațarea directă cu registrul PRR (power reduction register)
 +  * [[https://​onlinedocs.microchip.com/​pr/​GUID-317042D4-BCCE-4065-BB05-AC4312DBC2C4-en-US-2/​index.html?​GUID-58B6391E-D914-4F95-ABE0-F0A78C62596A|AVR WDT]] - folosită exclusiv pentru dezactivarea Watch Dog Timer, cu scopul de a economisi energie suplimentară
 +
 +Motivul alegerii acestor biblioteci este pentru că sunt simple și eficiente: cele oferite de AVR merg până la a implementa funcțiile în inline assembly, iar [[https://​github.com/​latchdevel/​VirtualWire|VirtualWire]] conține minimul necesar pentru a putea realiza transmisia cu o oarecare rezistență la erori rapid, fără a consuma cicli pe microcontroller inutil (alternativa ar fi fost biblioteca [[https://​www.airspayce.com/​mikem/​arduino/​RadioHead/​|RadioHead]],​ care are funcționalități suplimentare pentru asigurarea transmiterii mesajelor, dar aduce și complexitate suplimentară,​ pe care am dorit să o evit cât mai mult posibil).
 +
 +Citirea butoanelor se realizează prin întreruperi de schimbare a pinilor la care butoanele sunt conectate, folosind rezistențele de pull-up interne ale microcontrollerului. ​
 +Pentru a realiza debouncing pentru butoane, am implementat versiunea proprie a funcției millis(), similar cu varianta din laborator, folosind timer-ul 2, singurul care se poate utiliza ca sursă de întrerupere în modurile de sleep ale procesorului. Întrucât evitarea debouncing-ului nu are nevoie de o detecție foarte precisă a timpului trecut de la ultimul eveniment, am ales să generez o întrerupere odată la fiecare 4 milisecunde,​ astfel că voi scoate microcontrollerul din sleep de 4 ori mai rar, fără a dăuna preciziei butoanelor, ceea ce ajută la minimizarea consumului.
 +
 +Cât despre modulul accelerometru-giroscop,​ am creat o micro-bibliotecă proprie de comunicare cu acesta, folosind datasheet-ul componentei. Aceasta implementează doar operațiile cele mai simple de configurare și de citire a datelor, întrucât modulul are multiple funcționalități avansate de care nu am avut nevoie în cadrul acestui proiect.
 +
 +În ceea ce privește structurile implementate,​ am creat doar structura (practic clasa) Button, care memorează ultima oară când acesta a fost apăsat (pentru debouncing),​ memorează dacă a avut loc un eveniment cu acel buton și memorează codul (caracterul) ce se trimite către receiver când acel buton este apăsat.
 +
 +Interfațarea dintre computer și receiver este realizată prin Serial over USB; pentru aceasta am implementat un software daemon în Python care să recepționeze comenzile și să le traducă în apeluri de sistem. Astfel, am utilizat următoarele biblioteci:
 +  * [[https://​pyserial.readthedocs.io/​en/​latest/​pyserial.html|PySerial]] - utilizată pentru a citi comenzile de la receiver
 +  * [[https://​www.pysimplegui.org/​|PySimpleGUI]] - oferă interfața grafică minimalistă a aplicației
 +  * [[https://​pypi.org/​project/​pynput/​|pynput]] - simulează evenimente de apăsări de taste și de mișcare a cursorului pentru a controla aplicația de prezentări
 +  * [[https://​docs.python.org/​3/​library/​threading.html|threading]],​ [[https://​docs.python.org/​3/​library/​os.html|os]],​ [[https://​docs.python.org/​3/​library/​logging.html|logging]],​ [[https://​docs.python.org/​3/​library/​queue.html|queue]],​ [[https://​docs.python.org/​3/​library/​subprocess.html|subprocess]],​ [[https://​docs.python.org/​3/​library/​math.html|math]] - biblioteci de bază Python, utilizate în interfațarea celorlalte și realizarea funcționalității într-un tot unitar.
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip> +{{ :​pm:​prj2024:​vstoica:​cristian.chiriac02:​final.png?​direct&​600 | Produs final}} 
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. + 
-</​note>​+Telecomanda rezultată este surprinzător de ușoară și are dimensiuni rezonabile, fiind capabilă să țină o prezentare la o distanță respectabilă de receptorul conectat la calculator. Deși ceva mai greu de controlat, controlul cursorului folosind giroscopul este destul de intuitiv după o scurtă perioadă de acomodare cu această schemă de control. Butoanele sunt tactile, ceea ce ajută la a avea încredere că acestea ​au fost apăsate, iar orientarea lor le face ușor de găsit și apăsat fără a te uita la ele.
  
 ===== Concluzii ===== ===== Concluzii =====
 +
 +Acest proiect a fost o oportunitate să mă apropii mai mult de hardware (este prima dată când fac un design atât de complicat și restricționat de spațiu - plus că mâinile mele tremurânde nu m-au avantajat) și să creez ceva ce voi utiliza cu siguranță la viitoarele prezentări pe care le voi ține în fața colegilor și nu numai. În plus, acum că am control total asupra software-ului ce rulează pe toate dispozitivele din acest lanț de control/​comunicare,​ pot să particularizez oricând vreau telecomanda pentru a-mi servi și la alte scopuri decât doar susținerea de prezentări.
  
 ===== Download ===== ===== Download =====
  
-<​note ​warning+<​note ​tip
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectuluisurse, scheme, etcUn fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).+Arhivă proiect[[https://​github.com/​Alexander1752/​wireless_presenter/​zipball/​main|Alexander1752-wireless_presenter.zip]] 
 + 
 +Daemon download - Windows 64-bit: [[https://​github.com/​Alexander1752/​wireless_presenter/​releases/​download/​daemon_v1.0.0_win64/​daemon_v1.0.0_win64.zip|daemon_v1.0.0_win64.zip]]
  
-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**.+Arhivă proiect OCW{{:pm:prj2024:cc:cristian.chiriac02:alexander1752-wireless_presenter.zip}}
 </​note>​ </​note>​
  
Line 102: Line 129:
   * //​03.05.2024//​ - implementare incipientă a daemon-ului în Python   * //​03.05.2024//​ - implementare incipientă a daemon-ului în Python
   * //​05.05.2024//​ - creare pagină proiect OCW, creare schemă bloc/​electrică de bază   * //​05.05.2024//​ - creare pagină proiect OCW, creare schemă bloc/​electrică de bază
 +  * //​08.05.2024 - 13.05.2024//​ - implementare hardware a schemei electrice (fără baterii)
 +  * //​16.05.2024//​ - implementare a primei versiuni de cod pentru microcontrollere,​ detaliere și documentare schemă electrică
 +  * //​17.05.2024//​ - adăugare funcționalitate completă butoane, control cursor, economisire energie
 +  * //​18.05.2024//​ - proiectare carcasă 3D
 +  * //​22.05.2024 - 23.05.2024//​ - adăugarea bateriilor la hardware; asamblarea produsului final
 +  * //​24.05.2024//​ - adăugare funcționalitate laser; optimizare consum energie
 +  * //​26.05.2024//​ - finalizare documentație
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
   * **Resurse Software**   * **Resurse Software**
 +    * [[https://​github.com/​latchdevel/​VirtualWire|VirtualWire Library]]
     * [[https://​www.python.org/​community/​logos/​|Logo Python utilizat în schema bloc]]     * [[https://​www.python.org/​community/​logos/​|Logo Python utilizat în schema bloc]]
     * [[https://​github.com/​cyberlink1/​Arduino-Eagle-Cad-Library/​|Bibliotecă EAGLE cu plăci Arduino]]     * [[https://​github.com/​cyberlink1/​Arduino-Eagle-Cad-Library/​|Bibliotecă EAGLE cu plăci Arduino]]
pm/prj2024/vstoica/cristian.chiriac02.1715893064.txt.gz · Last modified: 2024/05/16 23:57 by cristian.chiriac02
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