Solar tracker - Arduino

Discutii despre placile de dezvoltare compatibile Arduino
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Solar tracker - Arduino

Unread postby Levy » 25 Mar 2021 12:52

De o vreme ma bate gandul sa construiesc de la zero un dispozitiv care sa urmareasca soarele intr-un mod automat. Ar fi foarte util, pentru cateva panouri solare, astfel incat in orice moment al zilei ele sa produca maximum de energie.

Ar fi doua variante aici, una electronica, si am gasit cateva scheme cu ajutorul Google, destul de usor realizabile, si a doua varianta cu Arduino, unde electronica si putin software scris se imbina si face ca toate sa functioneze corect, sau nu ....

Dintre aceste doua optiuni, am ales a doua varianta, pentru ca, eu cred ca daca putem umbla putin in software, puem aduce mici adaugiri, finisari functionarii finale, si este pana la urma mult mai comod ca sa rescrii un software, decat sa te apuci sa modifici un circuit electronic care deja este facut.

In prima faza am comandat o placa compatibila cu Arduino Uno, 4 bucati senzori de lumina, pentru ca vreau ca soarele sa fie urmarit pe 2 axe, iar pentru fiecare axa avem nevoie de 2 senzori ale caror date sa le comparam, (in realitate senzorul are si iesire analogica cat si digitala, nu este ca in poza lod cu doar 3 terminale, dar o sa pun fotografii cu fiecare compoenta), un cablu de la USB tip A la USB tip B, un modul cu 4 relee, pentru ca o sa am nevoie de 4 relee, ca sa pot schimba sensul la doua motoare de curent continuu (probabil vor fi actuatori), niste fire colorate MAMA --> TATA si niste fire colorate TATA --> TATA.

Avand toate acestea in cos, am dat finalizare comanda, si spre suprinderea mea, a doua zi am si avut componentele la mana. Nu incerc sa fac reclama magazinului, insa rapiditatea cu care a ajuns comanda este de mentionat. Sigur si cei de la firma de curierat (SAMDAY) au un aport mare in acest caz.

Placa compatibila Arduino UNO
Image

Image

Image

Senzorii
Image

releele
Image

Image

si firele colorate cu mufe
Image
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Solar tracker - Arduino

Unread postby Levy » 25 Mar 2021 14:42

Deci primul contact cu Arduino...
Sa inceapa distractia :haha: :haha: :haha:

In primul rand avem nevoie de drivere.
Le-am instalat, dupa care am descarcat Arduino IDE. Eu am descarcat versiunea din link, desi este o versiune beta (Arduino IDE 2.0 beta(2.0.0-beta.4)), cine vrea, poate instala o versiune mai veche finala a acestui software.

Pentru a testa, am conectat unul dintre senzorii de lumina la arduino in felul urmator:
Image

Image

am deschis Arduino IDE si dupa cateva tutoriale vazute si citite m-am apucat sa scriu sa vad cum as putea sa vad date citite de acest senzor de lumina legat de Arduino.

Definim intrarea digitala de care am legat senzorul intrarea 2 in acest caz...

Code: Select all

#define SENZORL1 2 // definim pin 2 pentru senzorul nr 1


Dupa care in Void setup definim portul serial, pe care sa putem monitoriza ce se intampla
si pinul pe care am definit senzorul, i-l definim ca INTRARE

Code: Select all

void setup()
  {
    Serial.begin(9600);// setam Serial Monitor pentru a putea afisa date
    pinMode(SENZORL1, INPUT_PULLUP);// definim pinul ca Intrare din senzor
  }



dupa care in partea a codului care face loop continuu, definim un numar intreg care va fi de fapt valoarea citita din senzor, pe care-l denumim ValoareLumina

Code: Select all

void loop()
  {
  int ValoareLumina =digitalRead(SENZORL1);  // citim datele de pe senzor
     Serial.println(ValoareLumina);                   // afisam datele pe serial
  delay(500);
}
 

Verificam daca totul este corect scris
Image

Daca nu da nici o eroare incarcam datele in arduino
Image

Dupa care la TOOLS --> SERIAL MONITOR urmarim ce afiseaza
Image

Si se pare ca avem o problema....
Pe serial apar doar 0 si 1 valori, valori care corespund cu al doilea LED de pe senzor, 0 apare cand este stins acel led si 1 apare cand acel led este aprins.
Cantitatea de lumina la care se aprinde led-ul de pe senzorul de lumina, cat si datele afisate de acesta se pot regla din potentiometrul de pe senzorul de lumina.

Deci pentru cineva care vrea sa aprinda si sa stinga o lumina in functie de intensitatea luminii, acest montaj este foarte util, dar nu si noua, care vrem sa citim din senzor, valoarea luminii din doi senzori si sa le comparam intre ele, iar in functie de comparatia lor sa-i spunem lui Arduino sa faca ceva, sa cupleze un releu sau altul...

Din fericire, senzorul nostru are nu doar iesire digitala, are si iesire analogica....
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Solar tracker - Arduino

Unread postby Levy » 25 Mar 2021 16:29

Ajuns la faza de mai sus, am realizat ce inseamna cele doua iesiri ale senzorului de lumina. Cel putin asa presupun eu ca ar fi.

Acesta a fost primul meu contact cu un arduino si cu un senzor, deci nu dati cu piatre daca scriu si bazaconii :hehih:
Orice critica constructiva este binevenita !

Deci sa continuam.
Senzorul de lumina are 4 pini. VCC, GND care nu cred ca mai trebuie explicate si inca doi pini DO si AO. Banuiesc Digital Output, cel care ne dadea doar doua valori in primul experiment si Analog Output, despre care va fi urmatorul experiment.

Refacem legaturile, iau firul maro de pe senzor, care era legat de DO si-l leg de iesirea AO.
Image
Am zis waaaw, am rezolvat problema, pornesc aplicatia, intradevar i-mi apar valori, dar par a fi complet nelogice, nici nu stiu cand pare ok valoarea citita, cu senzorul umbrit ba da valori mai mari ba mai mici fara nici o logica aparenta, dar firul maro a ramas pe Arduino pe pinul 2 digital....

Refac legaturile si pe Arduino.
Image

Image

si firul MARO care pe senzor este trecut pe Analog Outpout (AO) i-l infig in primul port de la ANALOG INPUT de pe Arduino (A0), teoretic puteam sa-l introduc in oricare, oricum trebuie rescrisa intrarea in software in Arduino IDE.

Definim portul A0 pentru senzor

Code: Select all

#define LUMINASUS 0 // defineste pinul Analog 0 pentru senzor


Dupa care portul serial pentru verificarea datelor, si PIN ca input pentru senzorul care-l voi folosi pentru directia SUS

Code: Select all

void setup()
  {
    Serial.begin(9600);// Seteaza Serial Monitor pentru afisare date pe serial
    pinMode(LUMINASUS, INPUT_PULLUP);// defineste PIN ca INPUT pentru SENZOR directia SUS
  }


Citim datele din senzor pe variabila proaspat creata (ValoareAnalogSUS) din PIN-ul LUMINASUS care de fapt este pin-ul la care am legat iesirea AO de pe senzorul de lumina, dupa care le afisam pe serial, ca sa vedem ce ne citeste Arduino din senzorul de lumina

Code: Select all

void loop()
  {
    int ValoareAnalogSUS = analogRead(LUMINASUS);
   Serial.println(ValoareAnalogSUS);
   delay(500);
  }


Verificam softwareul si daca nu da erori, i-l incarcam in Arduino

Image

(Inainte de verificat software, am uitat sa scriu ceva.

La BOARD se va alege ARDUINO UNO. Fara sa faci aceasta alegere, codul va da erori chiar daca este corect scris !!!

Image

Deci, software a fost verificat, nu a dat erori, si-l incarcam in Arduino, fotografia este putin mai sus, dupa care deschidem Serial Monitor

Image

si surprizaaa !

Image

De data asta surpriza este placuta, pentru ca datele citite sint niste numere, care chiar variaza in functie de cat de mult sau putin acoperi senzorul de lumina.
Image

Practic primul experiment, poate fi considerat un succes, urmeaa ca dupa modelul celui de aici, sa adaug inca un senzor si sa citesc datele din el, dupa care sa incercam in software sa le comparam, in functie de care este mai mare sa afiseze ceva in serial, iar daca sint egale, sa afiseze altceva. Dar povestea continua...
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Solar tracker - Arduino

Unread postby Levy » 25 Mar 2021 18:57

Si acum cu mai mult curaj, si cu mica victorie in care am reusit sa citesc corect datele de pe senzorul de lumina, ma apuc de continuarea proiectului.

Leg al doilea senzor, de data asta culorile sint urmatoarele
VCC -portocaliu, (nu inteleg de ce intr-o poza facuta cu un Samsung apare aproape alta culoare :haha: :haha:
GND -galben
si AO -alb

Image

Pe care le si conectam de Arduino exact la fel ca si pe cel precedent, sint 2 iesiri de 5V si doua GND (masa), iar iesirea de la AO i-l legam de pinul A1 de pe Arduino, cel precedent fiind legat de A0.

Image

Acum cu legaturile facute ne apucam sa adaugam la software si al doilea senzor, nu-l mai iau la bucati, ca asta s-a vazut in primele postari, acum pun aici toata modificarea dintr-o bucata.

Code: Select all

#define LUMINASUS 0 // defineste pinul Analog 0 pentru senzor sens SUS
#define LUMINAJOS 1 // defineste pinul Analog 1 pentru senzor sens JOS 
void setup()
  {
    Serial.begin(9600);// Seteaza Serial Monitor pentru afisare date pe serial
    pinMode(LUMINASUS, INPUT_PULLUP);// defineste PIN ca INPUT pentru SENZOR directia SUS
    pinMode(LUMINAJOS, INPUT_PULLUP);// defineste PIN ca INPUT pentru SENZOR directia JOS
  }

void loop()
  {
    int ValoareAnalogSUS = analogRead(LUMINASUS);
    int ValoareAnalogJOS = analogRead(LUMINAJOS);
   Serial.print(ValoareAnalogSUS);
  Serial.print(" -- ");
  Serial.println(ValoareAnalogJOS);
   delay(500);
  }


Verificam daca am facut totul corect, bineinteles inainte se alege Arduino Uno, cum am explicat in postarea de mai sus

Image

Pentru ca nu avem erori, incarcam in Arduino

Image

verificam in consola seriala

Image

si se pare ca ambii senzori sint cititi cu succes. deci de aici urmeaza comparatia celor doi senzori, dupa care sa afiseze ceva daca unul este mai mare decat celalalt si inver, iar cand sant egale sa ne spuna ca sint egale, deci la treaba :D

Valorile citite acum sint mult mai mari, pentru ca este aproape bezna langa mine, aceasta parte a tutorialului i-l scriu la lumia de la ecranul laptopului.
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Solar tracker - Arduino

Unread postby Levy » 25 Mar 2021 19:36

Rescriu totul si incerc sa compar cele doua date obtinute de la senzori

Code: Select all

#define LUMINASUS 0 // defineste pinul Analog 0 pentru senzor sens SUS
#define LUMINAJOS 1 // defineste pinul Analog 1 pentru senzor sens JOS 
void setup()
  {
    Serial.begin(9600);// Seteaza Serial Monitor pentru afisare date pe serial
    pinMode(LUMINASUS, INPUT_PULLUP);// defineste PIN ca INPUT pentru SENZOR directia SUS
    pinMode(LUMINAJOS, INPUT_PULLUP);// defineste PIN ca INPUT pentru SENZOR directia JOS
  }

void loop()
  {
   int ValoareAnalogSUS = analogRead(LUMINASUS);
   int ValoareAnalogJOS = analogRead(LUMINAJOS);
       if (ValoareAnalogSUS > ValoareAnalogJOS)
          {
           Serial.print(ValoareAnalogSUS);
            Serial.print(" MOTOR SUS >>>>>> ");
            Serial.println(ValoareAnalogJOS);
          }
      if (ValoareAnalogSUS < ValoareAnalogJOS)
          {
            Serial.print(ValoareAnalogSUS);
            Serial.print(" MOTOR JOS <<<<<< ");
            Serial.println(ValoareAnalogJOS);
          }
    if (ValoareAnalogSUS == ValoareAnalogJOS) 
    {
      Serial.print(ValoareAnalogSUS);
      Serial.print(" MOTOR OPRIT ");
      Serial.println(ValoareAnalogJOS);
    }
   delay(1000);
  }


Verific de erori si incarc in Arduino

Image

Comparatorul functioneaza, insa ceva nu este bine, niciodata nu-mi afiseaza mesajul ca ambii senzori au aceeasi valoare, deci inconcluzie, motorasul actionat de acest sistem va fi in continua miscare, lucru care ar face ca motorasele sa consume mai multa energie, decat ar produce panourile in plus cu aceasta motorizare.
Trebuie sa gasesc o solutie, ca miscarea sa se intample doar daca exista o oarecare diferenta (si aceasta reglabila) intre cele doua valori.

Deci sa trecem la treaba si sa incercam sa facem sa dispara aceasta functionalitate defectuoasa care ar face sistemul complet inutil...

Adaugam la cod un nou numar intreg, diferenta dintre cele doua valori

Code: Select all

  int DIFERENTA = ValoareAnalogSUS - ValoareAnalogJOS;
  DIFERENTA = abs(DIFERENTA);


dar care poate fi si negativa, din aceasta cauza facem ca diferenta sa fie valoarea abstracta a diferentei dintre valorile senzorilor, in asa fel intotdeauna valoarea sa fie pozitiva.

...si mai adaugam un numar intreg pe care-l denumim SENSIBILITATE

int SENSIBILITATE = 50; // AICI SETEZ CAT SA FIE DE SENSIBIL LA SCHIMBAREA VALORILOR LUMINII


i-am dat si o valoare, in acest caz 50, dar schimbarea acelei valori va influenta functionarea corecta sau nu al intregului circuit.

adaugam un if la tot loopul astfel

Code: Select all

if (DIFERENTA >= 0 && DIFERENTA > SENSIBILITATE)


iar la final un else if, si codul nostru complet va arata in acest fel

Code: Select all

#define LUMINASUS 0 // defineste pinul Analog 0 pentru senzor sens SUS
#define LUMINAJOS 1 // defineste pinul Analog 1 pentru senzor sens JOS 
void setup()
  {
    Serial.begin(9600);// Seteaza Serial Monitor pentru afisare date pe serial
    pinMode(LUMINASUS, INPUT_PULLUP);// defineste PIN ca INPUT pentru SENZOR directia SUS
    pinMode(LUMINAJOS, INPUT_PULLUP);// defineste PIN ca INPUT pentru SENZOR directia JOS
  }

void loop() {

 // int L =digitalRead(LIGHT);// citeste un senzor digital (nefolosit aici)

  int ValoareAnalogSUS = analogRead(LUMINASUS);
  int ValoareAnalogJOS = analogRead(LUMINAJOS);
  int DIFERENTA = ValoareAnalogSUS - ValoareAnalogJOS;
  DIFERENTA = abs(DIFERENTA);
  int SENSIBILITATE = 50; // AICI SETEZ CAT SA FIE DE SENSIBIL LA SCHIMBAREA VALORILOR LUMINII

    if (DIFERENTA >= 0 && DIFERENTA > SENSIBILITATE)
    { 
       if (ValoareAnalogSUS > ValoareAnalogJOS)
          {
           Serial.print(ValoareAnalogSUS);
            Serial.print(" MOTOR SUS >>>>>> ");
            Serial.println(ValoareAnalogJOS);
          }
      if (ValoareAnalogSUS < ValoareAnalogJOS)
          {
            Serial.print(ValoareAnalogSUS);
            Serial.print(" MOTOR JOS <<<<<< ");
            Serial.println(ValoareAnalogJOS);
          }
    }     
    else if (DIFERENTA <= SENSIBILITATE && DIFERENTA < SENSIBILITATE)
    {
      Serial.print(ValoareAnalogSUS);
      Serial.print(" MOTOR OPRIT ");
      Serial.println(ValoareAnalogJOS);
    }
   delay(2000);
}


Verificam, incarcam si ne uitam prin consola seriala

Image

Se pare ca in acest mod motorul va fi oprit pentru diferente de valori ce sint mai mici decat valoare stabilita la inceputul rutinei.
Dar toate astea le putem vedea, doar in momentul in care am pus totul in practica.

In functie de timpul liber, am sa continui sa descriu avansul sau problemele pe care le intampin in realizarea acestui montaj.
Dar pentru prima zi cu Arduino, cred ca ajunge cat am avansat.
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Solar tracker - Arduino

Unread postby Levy » 29 Mar 2021 18:54

Si pentru ca am promis ca voi continua, in limita timpului disponibil, am comandat inca cate ceva cu care sa pot lega si releele de arduino, ca sa vedem si ceva concret.
AM zis sa nu alimentez 4 relee si 4 senzori din Arduino, pentru ca nu stiu daca este in stare sa alimenteze toata schema, am comandat o sursa de alimentare, un breadboard, ca sa pot face legaturile mai usor si doua bucati de mufa baterie 9V cu conector.

De data asta nu le-am comandat de la OptimusDigital, pentru ca nu aveau un alt produs de care aveam nevoie, iar aici la Cleste.ro erau disponibile toate produsele de care am avut nevoie pentru Arduino, cat si cel pe care-l folosesc pentru un alt proiect.
Nu stiu cat a fost de inspirata comanda la acest site, din moment ce o comanda din data de 25, a ajuns la destinatie in data de 29. Normal daca tinem cont de faptul ca a fost si un weekend la mijloc...dar nu asta este scopul acestui material.

Data si ora preluarii comenzii
Image

Data si ora la care a fost predat curierului
Image

Si prestatia FAN Curier pana la destinatie
Image

Dar pana la destinatie a ajuns cu cateva minute dupa orele 14.

Dar sa trecem la ale noastre.

In prima faza, infig pinii sursei de alimentare in breadboard
Image

Dupa care un cablu de alimentare in sursa,
Image

si-l leg de o baterie de 9V, pentru ca la detalii despre sursa, scrie urmatoarele
Image

Am zis perfect, de la o baterie de 9V alimentez sursa, acolo aleg din jumperii de pe sursa, cat sa-mi iasa pe ambele alimentari, pentru ca are doua iesiri care se pot seta separat la 3.3V si la 5V, alimentez sursa si o si decuplez...
Am o presimtire. Caut rapid un aparat de masura prin casa, verific tensiunea de iesire cu jumperul setat la 5V, surpriza... scoate peste 7V, iar la cea de 3.3 scoate 5V.
Bine ca nu am apucat sa leg nimic de el setat asa. Totusi zic e acel mic condensator incarcat, si pana nu are sarcina i-mi arata aparatul de masura eronat, zic sacrific un senzor, i-l leg in circuit, masor, chiar sint peste 7V. Senzorul a scapat nevatamat, insa am setat jumperii la 3.3V ca sa-mi iasa 5V. Poate eu nu fac ceva chiar cum trebuie...dar sa continuam...

Deci cu 5V acum in breadboard, scot toate firele din Arduino, si leg la + firele VCC de la ambii senzori pe care-i am deja in circuit, cele pe care scrie GND le leg de polaritarea minus (-) de pe breadboard, la fel si la placuta cu cele 4 relee.
Iesirie AO (analog Out) de pe senzori, le leg de intrarile analogice de pe Arduino, pe portul A0 si A1, iar

Intrarile de comanda la relee
Image

In3 si In4, le-am legat de pini DIGITALI 2 și 3.
Cu legaturile astfel facute, teoretic ar trebui sa fim gata, insa avem nevoie de o masa comuna intre Arduino si breadboard, infigem la GND la POWER in arduino, un fir negru, pe care in breadboard la polaritatea negativa (-), iar daca nu am uitat nimic sintem gata de teste.
Daca am uitat sa descriu vre-un firicel unde vine, sa ma trageti de urechi :D :D

Dar la treaba din nou.
Pornim Arduino IDE si declaram pini digitali pentru doua dintre relee (in momentul in care se continua pentru doua axe, se vor mai declara inca doi senzori si inca doi pini pentru celalalt motor.
Dar pentru teste deocamdata avem asa:

Code: Select all

#define LUMINASUS 0 // defineste pinul Analog 0 pentru senzor sens SUS
#define LUMINAJOS 1 // defineste pinul Analog 1 pentru senzor sens JOS 
#define ReleuSUS 2 // Pinul Digital folosit pentru releul de sens SUS
#define ReleuJOS 3 // Pinul Digital folosit pentru releul de sens JOS


La setup, definim pinii pentru ambele relee ca OUTPUT, astfel incat sa le putem comanda din arduino, si aici se va dubla totul in momentul in care facem pe doua axe

Code: Select all

void setup()
  {
    Serial.begin(9600);// Seteaza Serial Monitor pentru afisare date pe serial
    pinMode(LUMINASUS, INPUT_PULLUP);// defineste PIN ca INPUT pentru SENZOR directia SUS
    pinMode(LUMINAJOS, INPUT_PULLUP);// defineste PIN ca INPUT pentru SENZOR directia JOS
    pinMode(ReleuSUS, OUTPUT); // defineste PIN ca OUTPUT pentru releul de sens SUS
    pinMode(ReleuJOS, OUTPUT);  // defineste PIN ca OUTPUT pentru releul de sens JOS
  }


dupa care in loop modificam in asa fel incat, in momentul in care-mi afiseaza pe consola seriala ca se misca motorul 1 catre un sens, atunci sa cupleze unul din relee, iar celalalt sa fie decuplat, oricum nu s-ar intampla nimic daca cele doua relee s-ar cupla impreuna, pentru ca din contactele relelor o sa avem si o protectie, dar o sa desenez asta mai incolo... :D

Code: Select all

void loop() {

 // int L =digitalRead(LIGHT);// citeste un senzor digital (nefolosit aici)

  int ValoareAnalogSUS = analogRead(LUMINASUS);
  int ValoareAnalogJOS = analogRead(LUMINAJOS);
  int DIFERENTA = ValoareAnalogSUS - ValoareAnalogJOS;
  DIFERENTA = abs(DIFERENTA);
  int SENSIBILITATE = 50; // AICI SETEZ CAT SA FIE DE SENSIBIL LA SCHIMBAREA VALORILOR LUMINII

    if (DIFERENTA >= 0 && DIFERENTA > SENSIBILITATE)
    { 
       if (ValoareAnalogSUS > ValoareAnalogJOS)
          {
           Serial.print(ValoareAnalogSUS);
            Serial.print(" MOTOR 1 sens SUS >>>>>> ");
            digitalWrite(ReleuSUS,LOW);
            digitalWrite(ReleuJOS,HIGH);
            Serial.println(ValoareAnalogJOS);
          }
      if (ValoareAnalogSUS < ValoareAnalogJOS)
          {
            Serial.print(ValoareAnalogSUS);
            Serial.print(" MOTOR 1 sens JOS <<<<<< ");
            digitalWrite(ReleuJOS,LOW);
            digitalWrite(ReleuSUS,HIGH);
            Serial.println(ValoareAnalogJOS);
          }
    }     
    else if (DIFERENTA <= SENSIBILITATE && DIFERENTA < SENSIBILITATE)
    {
      Serial.print(ValoareAnalogSUS);
      Serial.print(" MOTOR 1OPRIT ");
      digitalWrite(ReleuJOS,HIGH);
      digitalWrite(ReleuSUS,HIGH);
      Serial.println(ValoareAnalogJOS);
    }
   delay(500);
}


Verificam --> upload in arduino, dupa care probe.
Releele se cupleaza / decupleaza, in functie de umbrirea unui senzor sau celalalt, iar in momentul in care lumina de pe cei doi senzori are valoare apropiata, nici unul din cele doua relee nu se cupleaza.

Teoretic solar trackerul este in acest moment capabil sa miste un motor de cc in doua sensuri. Pentru a avea si cealalta axa se vor adauga in partea de software fiecare senzor nou adaugat, care la randul lui va fi legat de o intrare analogica nefolosita pana acum in arduino, iar alimentarea o va primi din breadboard.
Pentru 2 axe, la releu nu mai avem mare lucru de legat, decat intrarile nefolosite pana acum IN1 si IN2 la cate un pin digital din arduino, iar acestea la randul lor trebuiesc definite in software, sa ruleze exact ce cele descrise pana acum.

Pun in continuare schema electrica (asa cum am putut s-o desenez eu in paint :haha: :haha: )
Image

Cu legaturile executate in acest fel, chiar daca se suprapun 2 relee, nu se vor suprapune tensiuniile.
In momentul in care ambele relee sint decuplate, pe ambele polaritati ale motorului electric avem minus, in momentul in care unul din relee se cupleaza, ramura respectiva se va cupla pe polaritatea pozitiva, imprimandu-i motorului miscare de rotatie intr-un sens, in momentul in care primul releu ramane pe minus iar al doilea se va cupla pe plus motorul se va misca in sensul opus primei variante.
Iar daca din greseala am cuplat ambele relee, vom avea pe ambele borne ale motorului aceasi polaritate, plusul de data asta.

Motoarele pot fi niste actuatoare, facute acasa sau ca cele care misca antenele parabolice, asta bineinteles daca este vorba de greutati mici, pentru greutati mari se vor adapta si actuatoarele, iar in cazul in care curentul care misca motoarele trece peste cei 10 A pe care le pot duce releele, se vor folosi contactori dupa relee, astfel incat releele sa aclanseze doar contactoarele, iar contactoarele sa alimenteze motorul electric.

Asezarea fizica a senzorilor, ramane la fantezia celui care o construieste, am vazut nenumarate exemple cu un simplu search google.
Cred ca cel mai simplu de realizat este acesta unde o cruce (doua planuri care se intersecteaza la 90 de grade) umbreste unul din senzori, in functie din ce parte bate soarele pe planurile ce formeaza crucea respectiva.

Image

Un copy paste la software

Code: Select all

#define LUMINASUS 0 // defineste pinul Analog 0 pentru senzor sens SUS
#define LUMINAJOS 1 // defineste pinul Analog 1 pentru senzor sens JOS 
#define ReleuSUS 2 // Pinul Digital folosit pentru releul de sens SUS
#define ReleuJOS 3 // Pinul Digital folosit pentru releul de sens JOS
void setup()
  {
    Serial.begin(9600);// Seteaza Serial Monitor pentru afisare date pe serial
    pinMode(LUMINASUS, INPUT_PULLUP);// defineste PIN ca INPUT pentru SENZOR directia SUS
    pinMode(LUMINAJOS, INPUT_PULLUP);// defineste PIN ca INPUT pentru SENZOR directia JOS
    pinMode(ReleuSUS, OUTPUT); // defineste PIN ca OUTPUT pentru releul de sens SUS
    pinMode(ReleuJOS, OUTPUT);  // defineste PIN ca OUTPUT pentru releul de sens JOS
  }

void loop() {

 // int L =digitalRead(LIGHT);// citeste un senzor digital (nefolosit aici)

  int ValoareAnalogSUS = analogRead(LUMINASUS);
  int ValoareAnalogJOS = analogRead(LUMINAJOS);
  int DIFERENTA = ValoareAnalogSUS - ValoareAnalogJOS;
  DIFERENTA = abs(DIFERENTA);
  int SENSIBILITATE = 50; // AICI SETEZ CAT SA FIE DE SENSIBIL LA SCHIMBAREA VALORILOR LUMINII

    if (DIFERENTA >= 0 && DIFERENTA > SENSIBILITATE)
    { 
       if (ValoareAnalogSUS > ValoareAnalogJOS)
          {
           Serial.print(ValoareAnalogSUS);
            Serial.print(" MOTOR 1 sens SUS >>>>>> ");
            digitalWrite(ReleuSUS,LOW);
            digitalWrite(ReleuJOS,HIGH);
            Serial.println(ValoareAnalogJOS);
          }
      if (ValoareAnalogSUS < ValoareAnalogJOS)
          {
            Serial.print(ValoareAnalogSUS);
            Serial.print(" MOTOR 1 sens JOS <<<<<< ");
            digitalWrite(ReleuJOS,LOW);
            digitalWrite(ReleuSUS,HIGH);
            Serial.println(ValoareAnalogJOS);
          }
    }     
    else if (DIFERENTA <= SENSIBILITATE && DIFERENTA < SENSIBILITATE)
    {
      Serial.print(ValoareAnalogSUS);
      Serial.print(" MOTOR 1OPRIT ");
      digitalWrite(ReleuJOS,HIGH);
      digitalWrite(ReleuSUS,HIGH);
      Serial.println(ValoareAnalogJOS);
    }
   delay(500);
}


Atentie pana aici functioneaza doar actionarea unui singur motor !!! Deci in acest moment functioneaza doar pe o singura axa !

Probabil daca voi avea timp, si sanatatea ma ajuta, am sa execut si partea exterioara cu actuatoare etc...si am sa pun complet in practica pe doua axe.
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Solar tracker - Arduino

Unread postby Levy » 23 May 2021 09:42

Schema electrica (partea de forta) pentru alimentarea a doua motoare electrice de curent continuu, doua actuatoare in acest caz, pentru miscarea pe doua axe a trackerului solar.
Se poate folosi in solar trackerul descris in acest thread. Partea de comanda a releelor este explicata in acest thread.

Image

L-am facut in paint, nu dati cu pietre :haha:
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image
User avatar
Levy
Gold User
Posts: 1538
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

Re: Solar tracker - Arduino

Unread postby Levy » 01 Feb 2022 18:35

Pentru ca nu am avut timpul necesar construirii fizice a solar trackerului, deocamdata am facut un mic prototip, cu evolutia pana in acest moment a acestui mic montaj.

phpBB [video]


Deocamdata cum este in descriere, codul este scris doar pentru o singura axa.
Daca sinteti atenti, in videoclip, pentru a face si a doua axa functionala, mai avem nevoie de doar doi conductori, pentru a comanda releele care au ramas neconectate, de facut pe cele doua relee ramase, legaturile cu contactele acelor relee, si conectarea de aceste relee a celui de al doilea actuator, pe care deja i-l am.
Si ca toate acestea sa si functioneze, trebuie rescris codul, unde se adauga comanda a inca doi sensori de lumina, in functie de care sa se comade releele care alimenteaza al doile actuator.

Nu mai revin cu amanunte, despre legaturiile releelor, si de ce am preferat sa folosesc doua relee, pentru schimbarea sensului motorului actuatorului. Acestea au fost descrise mai sus in acest thread.

Daca timpul liber i-mi va permite, voi continua proiectul, pana la ansamblarea unui tracker solar complet functional. Cand vor fi toate rezolvate, am sa revin cu detalii.

Codul este simplu, iar modificarea lui, pentru a adauga si a doua axa, poate fi usor facuta.

Spor la capturat soarele ! :drink:
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image

Return to “Arduino”

Who is online

Users browsing this forum: No registered users and 3 guests