This shows you the differences between two versions of the page.
pm:prj2024:mdinica:iustina.caramida [2024/05/02 16:26] iustina.caramida [Descriere generală] |
pm:prj2024:mdinica:iustina.caramida [2024/05/27 11:14] (current) iustina.caramida [Software Design] |
||
---|---|---|---|
Line 17: | Line 17: | ||
Dispozitivul va utiliza un servomotor pentru a ajusta alinierea panourilor solare către direcția de unde provine cea mai intensă lumină solară, detectată de cei doi fotorezistori, puși în direcții opuse pentru a capta un mediu mai larg. Microcontroller-ul va coordona acțiunile servomotorului pentru a evalua mediul înconjurător. Informațiile furnizate de fotorezistori vor fi analizate și utilizate pentru a determina poziția optimă față de sursa de lumină, după care dispozitivul va ajusta orientarea panourilor solare în acea direcție. | Dispozitivul va utiliza un servomotor pentru a ajusta alinierea panourilor solare către direcția de unde provine cea mai intensă lumină solară, detectată de cei doi fotorezistori, puși în direcții opuse pentru a capta un mediu mai larg. Microcontroller-ul va coordona acțiunile servomotorului pentru a evalua mediul înconjurător. Informațiile furnizate de fotorezistori vor fi analizate și utilizate pentru a determina poziția optimă față de sursa de lumină, după care dispozitivul va ajusta orientarea panourilor solare în acea direcție. | ||
- | Mai jos puteți găsi o schemă bloc a proiectului: | + | Mai jos puteți găsi o schemă high-level a proiectului: |
{{ pm:prj2024:mdinica:iustina.caramida:schema_generala.png?nolink }} | {{ pm:prj2024:mdinica:iustina.caramida:schema_generala.png?nolink }} | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | <note tip> | + | Componentele necesare sunt: |
- | Aici puneţi tot ce ţine de hardware design: | + | |
- | * listă de piese | + | |
- | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | + | |
- | * diagrame de semnal | + | |
- | * rezultatele simulării | + | |
- | </note> | + | |
- | ===== Software Design ===== | + | ^ Obiect^ Cantitate ^ |
+ | | Arduino UNO board | 1 | | ||
+ | | Panou solar | 1 | | ||
+ | | SG90 servo motor | 1 | | ||
+ | | senzori LDR | 2 | | ||
+ | | rezistență 10k | 3 | | ||
+ | | rezistență 220 | 1 | | ||
+ | | LED | 1 | | ||
+ | | buton | 1 | | ||
+ | | fire | multe | | ||
+ | | poliester| mult | | ||
+ | Schema electrică este următoarea: | ||
+ | {{ pm:prj2024:mdinica:iustina.caramida:schema_electrica2.png?nolink&600 }} | ||
+ | |||
+ | Design-ul montări este umrătorul: | ||
+ | {{ pm:prj2024:mdinica:iustina.caramida:schema_montare2.png?nolink&600 }} | ||
+ | |||
+ | |||
+ | ===== Software Design ===== | ||
<note tip> | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | + | Link către repo-ul de Github cu codul sursă: https://github.com/iuniod/Solar-Tracker |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
</note> | </note> | ||
+ | |||
+ | Elementul de noutate al acestui proiect constă în integrarea controlului precis al unui panou solar utilizând senzori LDR pentru a maximiza eficiența energetică. Utilizarea întreruperilor pentru a realiza temporizări precise și gestionarea stării panoului printr-un buton de control reprezintă o abordare inovatoare pentru un sistem de urmărire a soarelui simplu și eficient. | ||
+ | |||
+ | În cadrul proiectului au fost utilizate următoarele funcționalități: | ||
+ | |||
+ | * **GPIO (General Purpose Input/Output)**: Utilizat pentru a controla pinul LED-ului și a citi starea butonului, esențial pentru interacțiunea hardware-software. | ||
+ | * **UART (Universal Asynchronous Receiver-Transmitter)**: Utilizat pentru comunicarea serială, permite monitorizarea și debug-ul sistemului prin afișarea mesajelor în Serial Monitor. | ||
+ | * **Interrupții**: Folosite pentru a implementa o temporizare precisă folosind Timer2, necesară pentru funcțiile de întârziere fără a bloca execuția. | ||
+ | * **Timere**: Timer2 a fost utilizat pentru a genera întreruperi la intervale precise de timp, esențiale pentru temporizările exacte în funcția delay_ms(). | ||
+ | * **ADC (Analog-to-Digital Converter)**: Folosit pentru a citi valorile analogice de la senzorii LDR și a le converti în valori digitale utilizabile în algoritmul de control al panoului. | ||
+ | |||
+ | Calibrarea senzorilor LDR a fost realizată prin determinarea valorilor minime și maxime de lumină detectate în diferite condiții de iluminare. Pragul de eroare (error) și valoarea epsilon (eps) au fost ajustate empiric pentru a asigura că panoul se poziționează corect în funcție de diferențele detectate între cei doi senzori. | ||
+ | |||
+ | Optimizările au fost realizate în următoarele moduri: | ||
+ | * **Utilizarea întreruperilor și a Timer2**: Acest lucru a permis implementarea unei funcții de întârziere precise (delay_ms()) fără a bloca execuția altor părți ale codului, optimizând astfel eficiența și responsivitatea sistemului. | ||
+ | ===== Mediul de Dezvoltare ===== | ||
+ | Codul Arduino este dezvoltat utilizând mediul Arduino IDE (Integrated Development Environment), un mediu software folosit pentru a scrie, compila și încărca codul pe plăcile de dezvoltare Arduino. Arduino IDE oferă o interfață simplă și intuitivă, suportând limbajul de programare C/C++ cu adăugiri specifice platformei Arduino. IDE-ul include un editor de cod, un monitor serial pentru debugging și multe alte instrumente utile pentru dezvoltarea de proiecte embedded. | ||
+ | ===== Librării și Surse Terțe ===== | ||
+ | În codul prezentat sunt utilizate două librării esențiale: | ||
+ | |||
+ | * **Servo.h**: Aceasta este o librărie standard în Arduino pentru controlul servomotoarelor. Permite utilizatorilor să controleze poziția unui servomotor folosind funcția write(). | ||
+ | * **avr/interrupt.h**: Aceasta este o librărie specifică microcontrolerelor AVR utilizate de multe plăci Arduino. Permite gestionarea întreruperilor, esențiale pentru implementarea unor funcții precum temporizări precise și reacții rapide la evenimente externe. | ||
+ | ===== Organizarea Codului ===== | ||
+ | Codul este organizat logic în mai multe secțiuni: | ||
+ | |||
+ | ==== Importul librăriilor ==== | ||
+ | Importă librăriile necesare pentru funcționalitatea codului. | ||
+ | <code> | ||
+ | // ------------------- Import libraries -------------------- | ||
+ | // Include the servo motor library | ||
+ | #include <Servo.h> | ||
+ | // Include the interruption library | ||
+ | #include <avr/interrupt.h> | ||
+ | </code> | ||
+ | |||
+ | ==== Definirea pinilor și a erorilor ==== | ||
+ | Definirea pinilor pentru senzori și alte componente hardware, precum și valorile de eroare utilizate în algoritmi. | ||
+ | <code> | ||
+ | // ---------------- Define pins and errors ----------------- | ||
+ | // Define the LDR sensor pins | ||
+ | #define LDR1 A0 | ||
+ | #define LDR2 A1 | ||
+ | // Set epsilon value | ||
+ | #define eps 10 | ||
+ | // Set error code | ||
+ | #define error 1000 | ||
+ | // Starting point of the servo motor | ||
+ | int Spoint = 0; | ||
+ | // Create an object for the servo motor | ||
+ | Servo servo; | ||
+ | // Select the pin for the LED | ||
+ | const int ledPin = 12; | ||
+ | // Select the pin for the button | ||
+ | const int buttonPin = 13; | ||
+ | </code> | ||
+ | |||
+ | ==== Variabile globale ==== | ||
+ | Definirea variabilelor globale necesare pentru stocarea stării sistemului și a temporizărilor. | ||
+ | <code> | ||
+ | // ---------------- Define global variables ---------------- | ||
+ | // Global variable to count milliseconds | ||
+ | volatile unsigned int timer2_millis = 0; | ||
+ | // Global variable to count the time since last position has moved | ||
+ | volatile unsigned int lastPositionChange = 0; | ||
+ | // Global variable to check the button | ||
+ | volatile bool ifPressed = false; | ||
+ | </code> | ||
+ | |||
+ | ==== Funcții utile ==== | ||
+ | Implementarea funcțiilor esențiale pentru funcționarea programului, cum ar fi funcția de întrerupere pentru Timer2, funcția personalizată de întârziere, funcția de mișcare a servomotorului, mesaje pentru utilizatori și funcția de iluminare a LED-ului. | ||
+ | |||
+ | ==== Funcția setup() ==== | ||
+ | Configurarea inițială a hardware-ului, inclusiv atașarea servomotorului, configurarea pinilor și inițializarea temporizărilor. | ||
+ | |||
+ | ==== Funcția loop() ==== | ||
+ | Bucla principală care rulează continuu și care gestionează citirea datelor de la senzori, verificarea stării butonului, mișcarea servomotorului, afișarea mesajelor pentru utilizatori și controlul LED-ului. | ||
+ | |||
+ | |||
+ | ===== Algoritmi și Structuri Implementate ===== | ||
+ | Codul utilizează mai mulți algoritmi și structuri pentru a controla mișcarea unui panou solar: | ||
+ | |||
+ | ==== Controlul Servomotorului ==== | ||
+ | Utilizând valori de la doi senzori LDR (Light Dependent Resistor), codul calculează diferența dintre citirile acestora pentru a ajusta poziția servomotorului. Algoritmul verifică dacă diferența este în limite acceptabile (epsilon), și ajustează poziția panoului solar în consecință. | ||
+ | |||
+ | ==== Gestionarea întreruperilor ==== | ||
+ | Utilizarea întreruperilor prin Timer2 pentru a crea o funcție de întârziere precisă. Acest lucru este esențial pentru temporizări precise fără a bloca execuția altor părți ale codului. | ||
+ | |||
+ | ==== Funcționalitate pe bază de stare ==== | ||
+ | Codul utilizează o variabilă globală `ifPressed` pentru a determina dacă panoul solar trebuie să se miște sau să rămână într-o poziție fixă, în funcție de starea butonului. | ||
+ | |||
+ | ==== Mesaje informative ==== | ||
+ | Pe baza poziției curente a panoului solar, sunt afișate mesaje informative pentru utilizatori, cum ar fi „Good Morning sunshine!” sau „Good Afternoon!”. | ||
+ | |||
+ | ==== Controlul LED-ului ==== | ||
+ | LED-ul este controlat în funcție de timpul scurs de la ultima mișcare a panoului solar, indicând astfel dacă panoul a găsit o poziție bună pentru a se încărca. | ||
+ | |||
+ | Aceste structuri și algoritmi combină citirea senzorilor, controlul precis al hardware-ului și feedback-ul pentru utilizator într-un mod coerent și eficient pentru a controla un panou solar. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== |