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
Data si ora la care a fost predat curierului
Si prestatia FAN Curier pana la destinatie
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
Dupa care un cablu de alimentare in sursa,
si-l leg de o baterie de 9V, pentru ca la detalii despre sursa, scrie urmatoarele
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
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
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...
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
)
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.
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.