Il progetto consiste nel far seguire ad una breadboard la luce nelle tre dimensioni.
Materiali
- Arduino Uno (1x)
- HS-422 Deluxe Standard Servo (o simile) (2x)
- Staffa Lunga a U (2x)
- Barre metalliche (4x)
- Breadboard 400 punti (2x)
- Fotoresistenze (4x)
- Resistenze 220 ohm (4x)
- Led RGB (1x)
Realizzazione
Chiedo scusa per la qualità della foto ma il progetto è stato realizzato molto tempo fa ed è l’unica ritrovata; spero tuttavia la struttura risulti chiara.
- Piegare due barre metalliche in modo da far avvolgere loro i due servomotori. Praticare due fori per unirle alle altre due barre.
- Montare la staffa ad U sul servo inferiore
- Montare la seconda staffa ad U ruotata di 90 gradi sulla prima.
- Montare il secondo serv0 sulla seconda staffa.
- Cablare la breadboard con le fotoresistenze (le fotoresistenze devono trovarsi ai quattro angoli)
- Montare la breadboard con le fotoresistenze sulla barra metallica del servo superiore
- Cablare il led RGB
Nel progetto ultimato la breadboard superiore è stata spostata sotto e sostituita da un piccolo pannello fotovoltaico. Ai quattro angoli del pannello sono state fissate le fotoresistenze, prolungate mediante saldatura e ricollegate alla breadboard.
Codice
#include <Servo.h> #include <Adafruit_NeoPixel.h> #include <avr/power.h> #define PIN 11 Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, PIN, NEO_RGB + NEO_KHZ800); const int soglia = 10; //modifica parametro per modificare sensibilità luminosa const int sogliaLED = 500;//inserisci valore media delle fotoresistenze int velocita_servo = 25; //più si alza il valore più rallentano i servo Servo myservoD; int up_averageD; int down_averageD; Servo myservoU; int up_averageU; int down_averageU; int A0_val; int A1_val; int A2_val; int A3_val; int valD = 90; int valU = 90; int diffDpos; int diffDneg; int diffUpos; int diffUneg; int media; int ledR=11; int ledG=10; int ledB=9; int luce=0; int valR; int valG; int valB; void setup() { pinMode(A0, INPUT); pinMode(A1, INPUT); pinMode(A2, INPUT); pinMode(A3, INPUT); pinMode(ledR, OUTPUT); pinMode(ledG, OUTPUT); pinMode(ledB, OUTPUT); myservoD.attach(13); myservoD.write(valD); myservoU.attach(12); myservoU.write(valU); Serial.begin(9600); delay(3000); A0_val = analogRead(A0); //reading data from sensors A1_val = analogRead(A1); A2_val = analogRead(A2); A3_val = analogRead(A4); media = (A0_val + A1_val + A2_val + A3_val) / 4; Serial.println("Media: " + String(media)); Serial.println("A0: " + String(A0_val)); Serial.println("A1: " + String(A1_val)); Serial.println("A2: " + String(A2_val)); Serial.println("A3: " + String(A3_val)); } void loop() { A0_val = analogRead(A0); //reading data from sensors A1_val = analogRead(A1); A2_val = analogRead(A2); A3_val = analogRead(A3); down_averageD = (A0_val + A1_val)/2; //the sum of the two lower sensors /2 up_averageD = (A2_val + A3_val)/2; //the sum of the two upper sensors /2 diffDpos = abs(up_averageD-down_averageD); //checking the difference between the two averages diffDneg = abs(down_averageD-up_averageD); if ((up_averageD > down_averageD) && (diffDpos > soglia)) { if (valD < 180) //if different from max val { valD--; myservoD.write(valD); } } if((down_averageD > up_averageD) && (diffDneg > soglia)) { if (valD > 0) //if different from min val { valD++; myservoD.write(valD); } } delay(velocita_servo); down_averageU = (A0_val + A3_val)/2; //the sum of the two lower sensors /2 up_averageU = (A1_val + A2_val)/2; //the sum of the two upper sensors /2 diffUpos = abs(up_averageU-down_averageU); //checking the difference between the two averages diffUneg = abs(down_averageU-up_averageU); if ((up_averageU > down_averageU) && (diffUpos > soglia)) { if (valU < 180) //if different from max val { valU++; myservoU.write(valU); } } if((down_averageU > up_averageU) && (diffUneg > soglia)) { if (valU > 0) //if different from min val { valU--; myservoU.write(valU); } } delay(velocita_servo); media = (A0_val + A1_val + A2_val + A3_val) / 4; if (media < (sogliaLED - 100)) { strip.setPixelColor(0, 255, 0, 0); //RED strip.show(); } if (media >= (sogliaLED - 100) && media <= (sogliaLED + 100)) { strip.setPixelColor(0, 255, 75, 0); //ORANGE strip.show(); } if (media > (sogliaLED + 100)) { strip.setPixelColor(0, 0, 255, 0); //GREEN strip.show(); } }