This is an old revision of the document!
Scopul proiectului este de a arata ca un panou solar orientat corect poate produce mai multa energie decat unul fix. Ideea a pornit de la faptul ca soarele isi schimba pozitia pe parcursul zilei, iar un panou fix nu este mereu orientat optim.
Descrierea modulelor si interactiunea hardware-software:
Explicatia schemei electrice: Schema ilustreaza integrarea perifericelor in jurul unitatii centrale (ATmega328P). Alimentarea logica a senzorilor si a modulelor de comunicatie (LCD, MicroSD) se realizeaza la 5V. Achizitia de date analogice (panou si LDR-uri) se face prin convertorul ADC (pinii PC0, PC1, PC2), in timp ce perifericele folosesc magistrale hardware dedicate (I2C pentru display, SPI pentru cardul SD, PWM pentru buzzer).
Lista de componente:
| Nr. Crt. | Denumire Componenta | Nr. bucati |
|---|---|---|
| 1 | Placa de dezvoltare ATmega328P | 1 |
| 2 | Motor pas cu pas 28BYJ-48 | 2 |
| 3 | Driver motor ULN2003 | 2 |
| 4 | Senzor de lumina (Fotorezistenta / LDR) | 4 |
| 5 | Panou solar | 2 |
| 6 | Ecran LCD 1602 cu modul I2C | 1 |
| 7 | Modul cititor card MicroSD | 1 |
| 8 | Modul amplificator audio SC8002B | 1 |
| 9 | Difuzor | 1 |
Tabel de conectare a pinilor:
| Componenta | Pini ATmega328P | Rol / Functionalitate |
|---|---|---|
| Senzori de lumina (LDR) | PC0, PC1 | Intrari analogice pentru citirea diferentei de lumina |
| Panouri solare | PC2 | Intrare analogica pentru citirea tensiunii generate |
| Ecran LCD 1602 (I2C) | PC4 (SDA), PC5 (SCL) | Pinii hardware I2C/TWI pentru comunicare |
| Modul MicroSD (SPI) | PB2 (CS), PB3 (MOSI), PB4 (MISO), PB5 (SCK) | Pinii hardware SPI pentru salvarea datelor log |
| Modul Audio & Difuzor | PB1 | Iesire PWM pentru alerte sonore |
| Motor 1 (Stanga-Dreapta) | PD2, PD3, PD4, PD5 | Iesiri digitale catre driverul ULN2003 (ax Orizontal) |
| Motor 2 (Sus-Jos) | PD6, PD7, PB0, PC3 | Iesiri digitale catre driverul ULN2003 (ax Vertical) |
Stadiul actual al implementarii si testarea componentelor: In imaginile de mai sus este prezentat stadiul curent al montajului fizic. Structura mecanica (pan/tilt) din lemn a fost asamblata, iar modulele electronice au fost cablate preliminar pe breadboard si placute de test.
Dovada functionarii: Asa cum se poate observa in fotografii, sistemul a fost alimentat cu succes, ecranul LCD 1602 primind tensiune (iluminarea de fundal este activa). De asemenea, driverele motoarelor pas cu pas au fost testate separat si primesc corect semnale de comanda.
Proiectul a fost dezvoltat folosind mediul Visual Studio Code (VS Code), impreuna cu extensia PlatformIO. Aceasta abordare faciliteaza scrierea codului bare-metal in limbajul C, gestionand automat toolchain-ul avr-gcc si procesul de compilare/incarcare a firmware-ului pe microcontrolerul ATmega328P prin intermediul utilitarului avrdude integrat. Pentru depanare (debugging) in timp real, a fost utilizat Serial Monitor-ul oferit nativ de PlatformIO.
Pentru a mentine un control strict asupra resurselor limitate de memorie (RAM si Flash), majoritatea modulelor (LCD, ADC, comunicare I2C, actionare motoare, generare semnal PWM) au fost scrise de la zero, lucrand direct cu registrii microcontrolerului.
Singura librarie 3rd-party integrata in proiect este:
Proiectul este organizat modular, fiecare componenta hardware sau software avand propriul set de fisiere header (.h) si sursa (.c):
Motors_Stop) pentru conservarea energiei.stdout), permitand utilizarea functiei printf() pentru debugging in Serial Monitor.WORD, DWORD, BYTE) pentru a asigura compatibilitatea arhitecturii sistemului de fisiere indiferent de platforma utilizata.Pentru a asigura o functionare stabila si autonoma a tracker-ului solar, s-au implementat urmatoarele mecanisme software:
Arhitectura firmware-ului este modularizata pentru a decupla logica senzorilor de cea a actuatorilor.
1. Modulul Principal (main.c)
Reprezinta inima sistemului. Aici se face preluarea datelor, afisarea pe ecran si rularea masinii de stari pentru tranzitiile audio.
Pentru a stabiliza valorile citite de senzorii optici, a fost implementata functia de Oversampling, care aduna 8 esantioane consecutive si returneaza media lor, ignorand astfel zgomotul electric:
uint16_t ADC_ReadFiltered(uint8_t ch) { uint32_t sum = 0; for (uint8_t i = 0; i < 8; i++) { sum += ADC_Read(ch); _delay_us(300); } return (uint16_t)(sum / 8); }
Logica de tranzitie Zi/Noapte asigura redarea fisierului WAV corespunzator o singura data la trecerea pragului de tensiune, folosind flag-ul este_zi:
// --- C. STATE MACHINE (AUDIO) --- if (voltaj_mv >= PRAG_ZI && este_zi != 1) { este_zi = 1; printf("--> [EVENIMENT] A rasarit soarele!\n"); WAV_Play("COCOS.WAV"); } else if (voltaj_mv <= PRAG_NOAPTE && este_zi != 0) { este_zi = 0; printf("--> [EVENIMENT] S-a intunecat. Trecem pe modul de noapte.\n"); WAV_Play("NOAPTE.WAV"); }
2. Modulul de Motoare (motor.h / motor.c)
Contine secventele de biti pentru driverul ULN2003 (Half-Step, 8 pasi). Deoarece pinii motorului pe axa Y (Verticala) sunt raspanditi pe porturi fizice diferite (PORTD, PORTB, PORTC) pentru a evita conflictele cu interfetele I2C si PWM, functia MotorY_Move implementeaza multiplexarea manuala a semnalelor catre fiecare pin in parte:
void MotorY_Move(int8_t directie) { if (directie > 0) step_index_Y = (step_index_Y + 1) & 7; else if (directie < 0) step_index_Y = (step_index_Y - 1) & 7; uint8_t step = step_sequence[step_index_Y]; // Curatam pinii specifici de pe porturile D, B si C PORTD &= ~((1 << PD6) | (1 << PD7)); PORTB &= ~(1 << PB0); PORTC &= ~(1 << PC3); // Mapam fiecare bit din secventa catre pinul hardware corect if (step & 0x01) PORTD |= (1 << PD6); if (step & 0x02) PORTD |= (1 << PD7); if (step & 0x04) PORTB |= (1 << PB0); if (step & 0x08) PORTC |= (1 << PC3); }
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.