Mariagaard: Zonnezoeker "10000"
by tim_lambrecht in Workshop > Solar
346 Views, 0 Favorites, 0 Comments
Mariagaard: Zonnezoeker "10000"
We hebben een zonnezoeker gebouwd,
Die altijd de zonnepaneel naar het licht richt aan de hand van sensoren.
Eerst hebben we de schakelingen op pc gemaakt en een schets gemaakt.
En dan zijn we beginnen bouwen van de zonnezoeker.
Supplies
- Arduino Uno --> brains voor het project
- Screw Shield --> vast maken van kabels aan Arduino
- Motor Shield --> eenvoudig verbinden van servo's aan Arduino + extra voedingsmogelijkheid
- Batterij --> 7,2V --> voeding voor Arduino en andere onderdelen
- DC Jack naar schroefaanlsuiting --> om de batterij te kunnen aansluiten
- Servo's (x2) --> Makeblock analoge servo voor beweging in 2 richtingen (dual axis)
- Display 16x02 --> om de LDR's snel te kunnen aflezen
- LDR's (x4) --> lichtgevoelige weerstanden --> (invoer) sensoren voor ons project
- Makeblock mechanische onderdelen --> bouwen van de zonnezoeker
- Weerstanden --> 10k weerstanden --> tussen LDR en GND
- Small solar cell --> 2V - 200mA - Velleman SOL4N
Andere zaken die we ook gebruikt hebben:
- Hout --> Stevige basis voor het project
- 3D printer --> Basis voor LDR's wordt afgeprint en bovenaan het project geplaats
- Cricut Maker 3 --> versiering (sticker)
- Kabels in verschillende kleuren
- Soldeerhulzen
- Lusterklem --> LDR's verbinden met screw shield
PROOF OF CONCEPT
Kyllian begon aan de schets en deed er 15 minuutjes over en Julien en Gabriël begonnen een lijst te maken van de benodigdheden dan maakte kobe de code en samen begonnen we de eerste test.
Prototyping: BUILDING
We hebben eerst de constructie gebouwd en dan de arduino uno en op het einde het zonnepaneel we nummerde de ldr en maakten een schema
PROTOTYPING: CHECKING
we hebben de codes erop gezet voor de servo's gegontroleerd worden Zo kunnen deze in 'beginpositie' gezet worden. We kiezen hiervoor 90° zowel voor servo1 als voor servo2. We lezen de servo's af via de seriële moniotor in Arduino Ide.
PROTOTYPING: CODING 1: LINKS / RECHTS
Zit het licht links of rechts dan moet de bovenste servo kantelen. Bij links is dat naar 60 graden, bij rechts is dat naar 120 graden.
PROTOTYPING: CODING 2: BOVEN/ONDER
Zit het licht boven of onder dan moet de onderste servo kantelen. Bij boven is dat naar 0 graden, bij onder is dat naar 180 graden. Om de bekabeling niet kapot te maken kiezen we voor 20 en 160 graden.
PROTOTYPING: CODING 3 (Speed En Tolerantie)
Wanneer moet onze zoeker reageren? Niet te snel, maar ook niet te traag. Om dit te regelen schrijven we een nieuwe variabele in onze formule: we noemen deze 'tol'. Dat staat voor 'tolerantie'. Van zodra de tolerantie overschreden wordt mogen de servo's naar de juiste positie beginnen draaien.
Voor de snelheid maken we een variabele 'speed'. Dit zal de 'delay' een waarde geven in de code. Hoe lager deze waarde, hoe sneller de servo's draaien.
De definitieve code vind je hieronder.
//Code opgebouwd via mblock en verder geschreven in Arduino IDE
#include <Adafruit_LiquidCrystal.h>
#include <Servo.h>
#include "DFRobot_RGBLCD1602.h"
const int colorR = 255;
const int colorG = 255;
const int colorB = 255;
DFRobot_RGBLCD1602 lcd(/*lcdCols*/16,/*lcdRows*/2); //16 characters and 2 lines of show
int tl = 0; //beginwaarde top left
int tr = 0; //beginwaarde top right
int dl = 0; //beginwaarde down left
int dr = 0; //beginwaarde down right
int servo1pos = 90;
int servo2pos = 90;
int speed = 30;
int tol = 30;
Servo servo1; // horizontal sero
Servo servo2; // vertical servo
void setup()
{
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
servo1.attach(10); //servo horizontaal
servo1.write(90);
servo2.attach(9); //servo vertikaal
servo2.write(90);
Serial.begin(9600);
//DISPLAY
lcd.init();
lcd.setRGB(colorR, colorG, colorB);
lcd.print("hello sun");
delay(2000); // Wait for 2000 millisecond(s)
lcd.clear();
delay(1000); // Wait for 1000 millisecond(s)
lcd.setCursor(0, 0);
lcd.print("TL:");
lcd.setCursor(0, 1);
lcd.print("DL:");
lcd.setCursor(8, 0);
lcd.print("TR:");
lcd.setCursor(8, 1);
lcd.print("DR:");
}
void loop()
{
int tl = analogRead(A3);
lcd.setCursor(4, 0);
lcd.print(tl);
int tr = analogRead(A2);
lcd.setCursor(12, 0);
lcd.print(tr);
int dl = analogRead(A1);
lcd.setCursor(4, 1);
lcd.print(dl);
int dr = analogRead(A0);
lcd.setCursor(12, 1);
lcd.print(dr);
delay(100); // Wait for 100 millisecond(s)
int avt = (tl + tr)/2; // gemiddelde waarde top
int avd = (dl + dr)/2; // gemiddelde waarde down
int avl = (tl + dl)/2; // gemiddelde waarde links
int avr = (tr + dr)/2; // gemiddelde waarde rechts
if (-1*tol > (avl - avr) || (avl - avr) > tol) { //ZON ZIT AAN LINKER OF RECHTER KANT > SERVO 2 DRAAIT
if (avl > avr){ // ZON ZIT LINKS > SERVO 2 DRAAIT NAAR 60
for (servo2pos >= 0; servo2pos <= 60; servo2pos += 1) {
servo2.write (servo2pos);
delay (speed);
}
for (servo2pos <= 180; servo2pos >= 60; servo2pos -= 1) {
servo2.write (servo2pos);
delay (speed);
}
}
else if (avl < avr) { // ZON ZIT RECHTS > SERVO 2 DRAAIT NAAR 120
for (servo2pos >= 0; servo2pos <= 120; servo2pos += 1) {
servo2.write (servo2pos);
delay (speed);
}
for (servo2pos <= 180; servo2pos >= 120; servo2pos -= 1) {
servo2.write (servo2pos);
delay (speed);
}
}
}
if (-1*tol > (avt - avd) || (avt - avd) > tol) { // ZON ZIT BOVEN OF ONDER > SERVO 1 DRAAIT
if (avt > avd) { // ZON ZIT BOVEN > SERVO 1 DRAAIT NAAR 0
for (servo1pos >= 0; servo1pos <= 20; servo1pos += 1) {
servo1.write (servo1pos);
delay (speed);
}
for (servo1pos <= 180; servo1pos >= 20; servo1pos -= 1) {
servo1.write (servo1pos);
delay (speed);
}
}
else if (avd > avt) { // ZON ZIT ONDER > SERVO 1 DRAAIT NAAR 180
for (servo1pos >= 0; servo1pos <= 160; servo1pos += 1) {
servo1.write (servo1pos);
delay (speed);
}
for (servo1pos <= 180; servo1pos >= 160; servo1pos -= 1) {
servo1.write (servo1pos);
delay (speed);
}
}
}
} //CLOSE LOOP
PILOT (Afwerking)
DISPLAY: Om nog beter te zien wat onze LDR's meten bouwen we een display in. Hier komen de 4 servo's met hun waarde: TL, TR, DL en DR. Bij het opstarten geven we de tekst 'hello sun' gedurende 2 seconden.