Mariagaard: Zonnezoeker "10000"

by tim_lambrecht in Workshop > Solar

346 Views, 0 Favorites, 0 Comments

Mariagaard: Zonnezoeker "10000"

zonnepanelen-veldopstelling-1-1024x465 (1).jpg

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

Afbeelding (4).jpg
Knipsel1.PNG
Knipsel.PNG

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

Afbeelding(1) (1).jpg
Afbeelding(3).jpg
Afbeelding(2).jpg
Afbeelding(1).jpg
Afbeelding (3).jpg
Afbeelding (9).jpg
Afbeelding(3) (1).jpg
Afbeelding(1) (5).jpg
Afbeelding(2) (2).jpg
Afbeelding(1) (4).jpg

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

Afbeelding(1) (3).jpg
Afbeelding (7).jpg

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

zonnezoeker10000 links rechts.png

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

zonnezoeker10000 boven onder.png

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.