Progetto Arduino: caleidoscopio a luce polarizzata

Alcuni pezzi di scotch posti tra due filtri polarizzanti in rotazione creano dei giochi di luce ipnotici.


Versione 1.0 (“Mandala”)

Strumenti

  • Arduino UNO
  • Servo-motore
  • Fotoresistenza
  • Due filtri polarizzanti
  • Un foglio trasparente e nastro adesivo

Tra due filtri polarizzanti è posto un foglio di plastica trasparente su cui sono stati appiccicati dei pezzi di nastro adesivo. Mettendo in rotazione uno dei due filtri polarizzanti, la luce che attraversa il nastro adesivo risulterà colorata diversamente a seconda dell’inclinazione del nastro rispetto ai filtri. Il servo-motore provvede a modificare costantemente questa inclinazione, così i colori dei pezzi di nastro adesivo continuano a cambiare. Una fotoresistenza mette in funzione il servo-motore solo quando il retro del caleidoscopio è sufficientemente illuminato.

Diagramma dei collegamenti

Codice

Clicca qui per visualizzare
#include "Servo.h"
#include "SR04.h"
#define SERVO_PIN 5

int delaytime = 18;
int reading;
int soglia = 110;
int direz = 0;
int provv = 1;

Servo myservo;

void setup() {
  myservo.attach(SERVO_PIN);
  Serial.begin(9600);
  delay(1000);
}

void loop() {

  reading = analogRead(0); // fotoresistenza
Serial.println(reading);

  if(reading > soglia) { // se c'è abbastanza luce

    if (direz == 0) { // deve ruotare in senso orario

      for(int i=provv; i<180; i+=1) {

       reading  = analogRead(0);
       myservo.write(i);
       delay(delaytime);

        if(reading < soglia) { // se non c'è più luce
         provv = i;           // memorizza la posizione angolare
         i=200;               // esci dal ciclo
         direz = 0;           // next: senso orario
       }

        if(i == 179) { // se sei arrivato alla fine del giro
         direz = 1;   // next: senso antiorario
         provv = 1;   // nuova posizione angolare
       }

      }

    }

   if (direz == 1) { // deve ruotare in senso antiorario

      for(int i=provv; i<180; i+=1) {

       reading  = analogRead(0);
       myservo.write(179-i);
       delay(delaytime);

        if(reading < soglia) {
         provv = i;
         i=200;
         direz = 1;
       }

        if(i == 179) {
         direz = 0;
         provv = 1;
       }

      }

    }

  }

}

Galleria

Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *