miércoles, 7 de julio de 2010

Sun tracking mini edition

Oh hi!, ayer miré al "motor paso a paso", el me miró a mi y coincidiendo que yo llevaba un panel solar en mis manos, se me ocurrió una idea absurda con la que unir ambas cosas. Nada más y nada menos que un super inutil buscador del sol, como los lindos girasoles que hay en los campos.

Lo que más me costó fué ingeniarmelas para poner el panel en el motor, pero al final di con la solución gracias a la parte de goma que tienen los bolis estos caros. he aki una foto de lo bien que encaja.



El motor y las demás piezas las he encajado en un carton para que no se muevan, que sinó, vaya fiesta.

En cuanto al control del motor, he seguido el mismo esquema que en el post anterior.



He tenido que hacerme unas funciones nuevas específicas para girar el motor una cantidad determinada de grados.

La energia del motor la saco de la salida de 5v del arduino, pero tambien se podría meter una fuente externa, o si pusieramos mas paneles , alimentarse a si mismo y al arduino.

En cuanto a la placa solar, he conectado el cable positifo la entrada analogica 0 y la otra a tierra, y así puedo leer la cantidad de energia que pilla la plaquita.

Una vez montado todo esto, gracias a un superelavorado algoritmo , XD , podremos hacer que el panel gire hacia donde haya más luz. Increíble xD

Aki el algoritmo para el arduino


int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;

int angle = 90;
float val = 0;

int step = 0;

void derecha(int delayTime,float angulos){
//96 pasos de 3,75 grados son 360 grados
if (angulos + angle > 180) return;
angle = angle + angulos;
angulos = angulos / 3,75;
for (int i=0; i < angulos ; i++) {
digitalWrite(motorPin1, step==0?HIGH:LOW);
digitalWrite(motorPin2, step==1?HIGH:LOW);
digitalWrite(motorPin3, step==2?HIGH:LOW);
digitalWrite(motorPin4, step==3?HIGH:LOW);
delay(delayTime);
step = (step+1)%4;
}
}

void izquierda(int delayTime,float angulos){
//96 pasos de 3,75 grados son 360 grados
if (angle - angulos < 0) return;
angle = angle - angulos;
angulos = angulos / 3,75;
for (int i=0; i < angulos ; i++) {
digitalWrite(motorPin4, step==0?HIGH:LOW);
digitalWrite(motorPin3, step==1?HIGH:LOW);
digitalWrite(motorPin2, step==2?HIGH:LOW);
digitalWrite(motorPin1, step==3?HIGH:LOW);
delay(delayTime);
step = (step+1)%4;
}
}

void buscabusca(){
float der = 0;
float izk = 0;
float now = 0;
int last = 0;

val = analogRead(0); // lee el valor de tensión del pin
val = val * 6 / 1300;
Serial.println(val);
for(;;) {
now = analogRead(0);
if (last > 0){
derecha(55,5);
der = analogRead(0);
Serial.print("der");
Serial.println(der);
if (abs(der - now)<3) delay(1000);
if (der > now) last = 1;
else last = 0;
} else {
izquierda(55,5);
izk = analogRead(0);
Serial.print("izk");
Serial.println(izk);
if (abs(izk- now)<3) delay(1000);
if (izk > now) last = 0;
else last = 1;
}
}
}

void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);

Serial.begin(9600); // Inicialización del modulo Serial.

}

void loop() {
buscabusca();
}



Como vemos , la lectura del panel, se hace por el pin analogico 0 , y los pines digitales 8,9,10,11 los usamos para mover el estepper.

El programa muestra por el puerto serie información sobre lo leido , por si hay ke debugear. XD

Subiría un video de como se mueve pero ya mejor ke lo averigue cada uno.

Aunque si tuviera que poner un video pondría uno que he visto por youtube que se parece bastante a esto pero en mayor escala xDD


2 comentarios:

  1. Hola muchas gracias por tu proyecto, tengo un monton de ganas de probarlo, pero tengo un par de dudas:
    1-. No entiendo que hace el código:
    digitalWrite(motorPin4, step==0?HIGH:LOW);
    digitalWrite(motorPin3, step==1?HIGH:LOW);
    digitalWrite(motorPin2, step==2?HIGH:LOW);
    digitalWrite(motorPin1, step==3?HIGH:LOW);

    2-.¿Por que pones 55,5 aqui: izquierda(55,5)?

    Gracias de antemano

    ResponderEliminar
  2. como puedo cambiar la celda solar por una ldr

    ResponderEliminar