domingo, 20 de noviembre de 2011

Primeras pruebas del eje vertical

Una vez preparado el programa (falta depurarlo) y la electrónica (falta mejorar y hacerlo un sistema totalmente "transportable" con el uso de baterías y convertidores DC-DC), empezó la fase de realizar el mecanismo mecánico.

Tal y como dije, me llevaría su tiempo, pues hay que ir colectando material de desguace y buscar material por tiendas y a ratos ir lo diseñando. Lo que se refiere a la parte de diseño creo tenerlo muy claro como hacerlo pero siempre van surgiendo sorpresas.
Este fin de semana me he podido dedicar un poco y tras montar la estructura del eje vertical con su reducción 1:10 mediante piñones he podido probarlo como he podido, pues mi casa no es un taller mecánico y siempre faltan cosas por lo que habrá que esperar a mañana que sea laborable para poder pisar las tiendas y encontrar elementos que me hacen falta.

En principio el motor nema-17 transmite su fuerza a un piñón de 12 dientes (paso 1mm.) y este va "enlazado" al de 120 dientes (por cierto, pesa un huevo, deberé de quitarle peso). Aquí va al eje que me efectúa la rotación de mi "balancín" gracias al uso de unos rodamientos. Toda la parte mecánica de rodamientos, piñones la he encontrado a un buen precio en Indicom.

Una vez tenia todo esto montado quise probar si tenia fuerza, por lo que antes de montar la cámara probé con dos tetabricks de leche de 1.5 ltrs. y comprobé que se movía el invento...bien!

Luego la ansia me dio por montar la cámara y también tenia fuerza suficiente pero aquí aparecen los problemas:

* Cuando quiero inclinar mucho tanto sea hacia arriba como hacia abajo parece que al motor le falta un empujoncito. También he visto que según que posición el piñón me roza con la estructura.
* Se escucha mucho la piñonería metálica, resuena todo pero no sé si es porque los tornillos que fijan la estructura son muy largos y me chocan con el propio perfil.
* El paso es aun grande y con un zoom de 500 mm (equivalente a 750 mm) no puedo lograr que se solapen las imagenes.

Creo que estos tres problemas los puedo resolver de un tirón (casi) montando otra reducción intermedia, esta vez tengo previsto montar unos piñones de Delrin (tipo Nylon) así acabaré quitando el ruido porque esto lo va a absorber. Al mismo tiempo ganaré fuerza , unas 3.6 veces más por lo que no debería tener problemas en los extremos y ganaré más precisión. Ya de paso he calculado la reducción para que se me adapte al paso del motor (200 pulsos por vuelta) así me será más fácil tener controlado los ángulos.

Os dejo un vídeo , pero la cosa aun tiene de cambiar mucho. Esta quincena que tengo tardes libres intentaré avanzar...

sábado, 5 de noviembre de 2011

Programando tus fotos en el tiempo con The Photographer's Ephemeris

El otro dia, navegando por internet descubrí el The Photographer's Ephemeris, se trata de un programa de descarga gratis (almenos bajo windows que es el que analizé) para varios sistemas operativos (incluido Android, pero a simple vista pagando) en inglés (todo no puede ser en esta vida) que nos puede ser util a la hora de planificar nuestras fotos. Obviamente no es tan inteligente como para predecir una tormenta eléctrica, pero si para informarnos de la trayectoria del sol y de la luna.

Una de las ventajas de conocer los horarios y trayectorias tanto del sol como de la luna a partir de una localización en concreto (usando los propios mapas de Google), nos puede servir para mejorar la planificación a la hora de conocer si realmente podremos ver la luna aparecer por un lugar en concreto y con que inclinación. Asi también conoceremos en que hora se encuentra la luna en pleno apogeo para por ejemplo realizar un reflejo en un lago.

Hay muchos programas capaces de decirnos la hora de los crepúsculos, amaneceres pero raramente encontramos la información tan amena como la de este software.

Podeis descargarlo directamente desde su web http://photoephemeris.com/

viernes, 4 de noviembre de 2011

Robot panoramico...vamos prosperando

    Una vez montada la shield de potencia de los motores y tras familiarizarme con el lenguaje Arduino, me faltaba unos pulsadores para mover el motor manualmente, pues la intención era que se pudiera definir el angulo de la panoramica sin tener de entrar en programación, para evitar de pasear el portatil junto la camara mas otros "trastos" para realizar una panoramica. No tenia muy claro si utilizar un mando remoto inhalambrico o bién con pulsadores, finalmente me decanté por lo tradicional:
En la misma placa donde hay los pulsadores en cruz , he dispuesto de dos botones más que sirven para validar los extremos opuestos de la captura, luego el programa se autoajusta al número de filas y columnas necesarios
Ahora tocaba programar para "probar" si realmente me podia salir con la mia, y aquí está (cuidadín falta depurarlo y corregir errores, pero funciona):

/*
 Photo Robot 2x L298N + Nema 17
 language: Wiring/Arduino

 This program drives two bipolar stepper motor.
 The motor is attached to digital pins 8+9 & 10+12 of the Arduino.
 The pthoto-shots signals it's actuated by relay -Pin 13-
 Movement manual motor by array switchs

 Created 26 Oct. 2011

 by XavierGP

 */

// define the pins used


#include <Stepper.h>        // incluimos la Stepper library

#define motorStepsX 200     // Pasos motor X 360º/1.8º
#define motorStepsY 200     // Pasos motor Y 360º/1.8º                     
#define motorPinX1 10       // Pin OUT 1 control motor X
#define motorPinX2 12       // Pin OUT 2 control motor X
#define enablePin 11        // Pin OUT 11 habilita tensión en motores
#define motorPinY1 8        // Pin OUT 1 control motor Y
#define motorPinY2 9        // Pin OUT 2 control motor Y


int pasoX=10;                // º entre capturas eje X DÓNDE 10 SON 18º
int pasoY=10;                // º entre capturas eje Y
int xact=0;                 // º actual eje X
int yact=0;                 // º actual eje Y
int xmax=0;                 // º posición máxima eje X
int xmin=0;                 // º posición mínima eje X
int ymax=0;                 // º posición máxima eje Y
int ymin=0;                 // º posición mínima eje Y
int xtemp=0;
int ytemp=0;
int definecornerA=0;
int definecornerB=0;
int nshot=0;
int filasX;                 // número de filas eje X >> (xmax-xmin)/pasoX
int filasXX=0;
int columnasY;              // número de columnas eje Y    >> (ymax-ymin)/pasoY
int columnasYY=0;
int previsionShot;          // prevision número shots   filasX * columnasY

// initialize of the Stepper library:
Stepper myStepperX(motorStepsX, motorPinX1,motorPinX2); // libreria motor X
Stepper myStepperY(motorStepsY, motorPinY1,motorPinY2); // libreria motor Y

void setup() {

 pinMode(2, INPUT);        // Input digital 2 =  confirmación corner A 
 pinMode(3, INPUT);        // Input digital 3 =  confirmación corner B
 pinMode(4, INPUT);        // Input digital 4 =  -Y
 pinMode(5, INPUT);        // Input digital 5 =  +Y
 pinMode(6, INPUT);        // Input digital 6 =  +X
 pinMode(7, INPUT);        // Input digital 7 =  -X
 pinMode(13, OUTPUT);      // Output digital 13 = shot
 myStepperX.setSpeed(30); // set the motor X speed at 100 RPMS:
 myStepperY.setSpeed(30); // set the motor Y speed at 100 RPMS:
 
 pinMode(enablePin, OUTPUT);
 digitalWrite(enablePin, HIGH);  // habilita tensión en motores

 Serial.begin(9600);           // Initialize the Serial port:
 Serial.println("Posicione mediante cursores el extremo de origen y valide con CORNER A. Este pasara a ser el punto 0,0");
 Serial.println("A continuacion posicione mediante el otro extremo y valide con CORNER B");
}

void loop(){

  if(definecornerA==0 || definecornerB==0)   //  definimos máximos y mínimos de X e Y
 {
  int sensorValue0 = digitalRead(6);   // Input digital 2 =  +X
  int sensorValue1 = digitalRead(7);   // Input digital 3 =  -X
  int sensorValue2 = digitalRead(5);   // Input digital 4 =  -Y
  int sensorValue3 = digitalRead(4);   // Input digital 5 =  +Y
  int sensorValue4 = digitalRead(2);   // Input digital 6 =  confirmación corner A
  int sensorValue5 = digitalRead(3);   // Input digital 7 =  confirmación corner B
   
  if(sensorValue0==HIGH)
  {
    xact=xact+pasoX;
    Serial.print(xact*1.8);
    Serial.print("  ,  ");
    Serial.println(yact*1.8);
  }
 
   if(sensorValue1==HIGH)
  {
    xact=xact-pasoX;
    Serial.print(xact*1.8);
    Serial.print("  ,  "); 
    Serial.println(yact*1.8);
  }
   if(sensorValue3==HIGH)
  {
    yact=yact-pasoY;
    Serial.print(xact*1.8);
    Serial.print("  ,  ");
    Serial.println(yact*1.8);
  }
   if(sensorValue2==HIGH)
  {
    yact=yact+pasoY;
    Serial.print(xact*1.8);
    Serial.print("  ,  ");
    Serial.println(yact*1.8);
  }
   if(definecornerA!=1){
   if(sensorValue4==HIGH)
  {
    xmin=xact;
    ymin=yact;
    definecornerA=1;
    Serial.println("Esquina A -inferior izquierda- CONFIRMADA ! Punto de inicio");
  }
   }
   if(definecornerB!=1 && definecornerA==1){
   if(sensorValue5==HIGH)
  {
    xmax=xact;
    ymax=yact;
    definecornerB=1;
    Serial.println("Esquina B -superior derecha- CONFIRMADA !");
  }
   }
  myStepperX.step(xact-xtemp);
  xtemp=xact;
  myStepperY.step(yact-ytemp);
  ytemp=yact;
  delay(200);
 }
 else{

  xact=-xmin;
  yact=-ymin;
  filasX=((xmax-xmin)/pasoX)+1;
  filasXX=filasX;
  columnasY=((ymax-ymin)/pasoY)+1;
  columnasYY=columnasY;
  previsionShot=filasX*columnasY;
  myStepperX.step(-(filasX-1)*pasoX);
  myStepperY.step(-(columnasY-1)*pasoY);   
  Serial.println("Panorama data:");
  Serial.println("n SHOT :  Filas X , Columna Y , grados X, grados Y");
  Serial.print(previsionShot);
  Serial.print("      ,    ");
  Serial.print(filasX);
  Serial.print("     ,   ");
  Serial.print(columnasY);
  Serial.print("     ,   ");
  Serial.print((-xmin+xmax)*1.8);
  Serial.print("  ,   ");
  Serial.println((-ymin+ymax)*1.8);
  Serial.println("Home position! Pulse Corner A  para empezar");
 
  int sensorValue4 = digitalRead(2);   // Input digital 9 =  confirmación corner A
  while(digitalRead(2)==LOW)
  {
    }
  Serial.println("Start!");
  Serial.println("SHOT numero:  Filas X , Columna Y ,posicion X, posición Y");
 
xmax=xmax-xmin;
ymax=ymax-ymin;
xmin=0;
ymin=0;
xact=0;
yact=0;
 
  for(int i=0; i<(columnasY); (i++))        
  {
   delay(1000);
    for(int j=0; j<filasX; (j++))
   {
     digitalWrite(13, HIGH);
     delay(500);
     digitalWrite(13, LOW);
     nshot=nshot++;
   
   Serial.print(nshot);
   Serial.print("   :   ");
   Serial.print(j+1);
   Serial.print("   ,   ");
   Serial.print(i+1);
   Serial.print("   ,   ");
   Serial.print(xact*1.8);
   Serial.print("   ,   ");
   Serial.println(yact*1.8);
   
     delay(1500);
    
     if(j!=(filasX+1)){  ///   if(j!=(filasX-1*sentidoX)-1)
     myStepperX.step(pasoX);
     xact=xact+(pasoX);
     } 
     delay(1500);
    }
  
   myStepperX.step((-filasXX)*pasoX);
   xact=0;
   if(i!=columnasY-1){         
   myStepperY.step(pasoY);
   }                                
   yact=yact+(pasoY);
   delay(1000);
    }
    Serial.println("Panoramica completa!");
  myStepperY.step((-columnasYY+1)*pasoY);
  delay(1000000);
 }
}


Los que dominais la programación posiblemente lo reduciriais a la mitad....pero eso es cuestion de minimizarlo (ya se hará!)


Tuve varios problemas (dependiendo de si la panoramica iba de izquierda a derechas o al revés) provocandome duros "quebraderos de cabeza" con los signos < > por lo que al final decidí que sólo seria viable en sentido horario al igual que se mueve el sol (de izquierda a derecha y de abajo a arriba).


Luego me di cuenta que los L298N se calentaban un huevo (si , casi para poder hacer huevos fritos) por lo que temporalmente le monté un radiador casero con una platina de aluminio. Ahora tengo pendiente montarle un ventilador forzado. Aparte del factor temperatura me di cuenta porque cada vez tenia que incrementar más el voltaje de los motores Nema 17 (incluso alimentandolos a 6 voltios cuando lo necesario son 2.8 v 2A).

De momento parece que tiene la intención de funcionar, todo y desconocer si los motores seran capaces de mover los 3 kg....

Os dejo un par de capturas de pantalla de como se ve desde el PC:
Y finalmente unos videos en funcionamiento (mañana intentaré grabar uno mejor):



Ahora tocará la parte que para mi es más complicada: la mecánica por lo que tengo previsto tomarmela con muucha calma, pero sin pausa . A cacharrear  !!!