Hoy toca comentar como he realizado alguna fotografía panorámica desde el drone Walkera QR x350Pro. Antes de llegar al final he realizado varias peripecias por el camino para intentar obtener una panorámica un poco con clase, pero no sé si lo habré conseguido...
En mi post anterior expliqué cómo cambiar la lente de la GoPro, basicamente la idea consisitia en eliminar la distorsión del objetivo tipo ojo de pez que la caracteriza por uno con un poco más de focal y sin distorsión. Con esto al fín y al cabo ganaba en no tener que corregir las imagenes distorsionadas y así evitaria possibles errores de solape. Obviamente al cambiar también la focal obtuve una mayor definición/calidad del espacio fotografiado y un augmento en la resolución de la foto final.
Para facilitar el movimiento vertical de la cámara modifiqué el mando Devention DevoF7 para que el movimiento arriba/abajo del Gimball se realizara con simples pulsadores en vez de un potenciometro con el que andava descontrolado. antes para subir la camara debia rotar el potenciometro unos -90º (empezamos con una lógica invertida!) , cuando deseaba frenar el movimiento devia desplazarme hasta 90º un momento y luego dejarlo en 0º. Vamos un cachondeo si tienes que estar con la vista al drone, a la pantalla y al potenciometro. Me falta un ojo ! Ahora con un par de pulsadores y bién orientados es fácil subir y bajar la cámara sin tener que perder de vista el "pájaro", este es muy sensible a las corrientes de aire por lo que a la que te despistas...
La modificación interior es muy fácil , tan sólo hay que desmontar el mando , sustituir el interruptor y poténciometro por dos pulsadores. El cableado consiste en utilizar el cable comun del potenciometro (negro) será el comun de los dos pulsadores, mientra que cada uno de los dos cables restantes del potenciometro original (blanco y azul) van a cada uno de los contactos abiertos de los dos pulsadores.
Finalmente el siguiente paso fué en colocar la camara en vértical, para ganar más ángulo . Para ello me fabriqué con un trozo de plástico rígido una pieza que encaja en el soporte del Gimball y acto seguido realizé los agujeros pertinentes. Este metacrilato va fijado al gimball mediante unas bridas tipo Unex que de momento aguantan...
Acto seguido tocó ajustar el Gimbal mediante el uso del potenciometro v1. Para los no habituados, el Gimbal es la soportación con estabilizador de cámara , compuesta aparte del soporte por dos motores. Uno de ellos sirve para subir/bajar la camara mientras que el otro es un estabilizador del la cámara que intenta mantener a esta todo el rato horizontal respecto al plano del suelo. Yo utilizo un Gimbal Walkera G-2D . Si alguien quiere instrucciones, aquí
Todo ajustado, el drone calibrado (muy importante), las baterias a tope (estos drones no aguantan mucho rato en el aire y cuando no hay baterias bajan de golpe!) ya sólo falta poner la camara en modo video 4K (equivalente a 12MPx) . Si ya sé que vamos a hacer una foto, pero mejor hacer un video y extraer los mejores fotogramas no ?
Si teneis una HERO BLACK 3+ grabareis a 12fps, con la HERO4 , la cosa asciende hasta los 30fps. Acordaros de poner una microSD lo suficientemente grande de capacidad y velocidad. Activad también el ProTune ! Por cierto, yo soy de los que desactivan el WiFi de la GoPro pues trabaja a 2.4 GHz, al igual que el mando rmoto del drone. La emisión de video es a 5.7GHz.
Ahora a volaaaarrrr !
Una vez el drone en el aire , ya despegado sin volteretas hacia delante (el que ha pilotado algun trasto de estos ya sabe a que me refiero) pondremos el modo GPS que tiene la función de intentar quedarse quieto en la misma posición y olvidarnos un poco de los mandos (hay que dejarlos en un punto medio).
Obviamente como que giremos la camara 90º, la imagen que veo a través del sistema FPV integrado en el mando es la imagen también girada 90º. Acto seguido consiste en hacer girar el drone una vuelta entera mediante el Rudder Stick en el plano horizontal. Si damos la vuelta a poco a poco y haciendo pausas entre los posibles fotogramas mejor, tened en cuenta el tema del solape, más vale que sobre que no que falte!
Una vez capturado el video con los 360º es hora de aterrizar el drone sin piñarlo. Yo acostumbro a hacerlo descender poco a poco en modo GPS y finalmente cazarlo con la mano.
Vuelta para casa y a descargar el video.
Aqui es cuando empiezo editando el video mediante el software GoPro Studio . Con el software intento corregir los colores y exposición. Podeis encontrar muchos video-tutoriales en youtube.
Una vez "corregido" el color, lo que hago es grabarlo a máxima resolución y a una velocidad lenta (sobre el 30%). Con ello consigo que posteriormente al reproducir el video sea más lento y me sea más fácil pausar , elejir y captar los mejores fotogramas.
Una vez grabado el video en nuestro ordenador es hora de extraer los fotogramas haciendo capturas de pantalla. Para ello lo primero que deberemos hacer es descargarnos el reproductor VLC
¿ Por qué utilizar este reproductor y no el clássico de nuestro ordenador ? Muy fácil, reproducid un video y haced una captura de pantalla; obteneis una captura con resolución del tamaño de vuestra pantalla. Vamos que si la teneis a 1600x1200 obteneis un archivo de unos 2 MB, aunque el video original sean imagenes de 12 MB.
En cambio si utilizamos el VLC podemos hacer capturas de pantalla utilizando otra combinación de teclas: CONTROL + ALT (cmd en MAC) + S . Desde el reproductor vamos reproduciendo y haciendo pausas (teniendo en cuenta el solape!) y capturas hasta obtener todas las necesarias. Obviamente a la hora de reproducir también se nos reproducirá el video girado pero eso no es gran problema. Si vais lo suficientemente rápidos no cojereis dolor de cuello!
Ya nos falta poco! Ahora es questión de entrar en nuestro software de creación de panorámicas e intentar unir todas las imagenes para conseguir nuestra foto final.
En mi caso (utilizo MAC) tuve que rotar las imagenes 90º antes de processarlas con Auto Pano Giga.
Finalmente con la ayuda de otros softwares de edición tipo PhotoShop podreis "maquearla" un poquito y corregir imperfecciones.
En mi caso utilizando una GoPro 3+ Black con la optica cambiada de 5.4 mm realizé 10 capturas con una resolución final de unos 110 MB . Podeis verla en grande en este link:
Hoy os explicaré como cambié esta lente en mi GoPro Hero Black 3+ que es la que uso en mi drone Walkera QR x350 Pro. En principio este método sirve también para la serie Hero 4 pues utiliza la misma lente.
Uno de mis proyectos para este año es la realización de fotografias panorámicas aereas con la ayuda del drone. La cámara que venia de origen, una iLook, tenia muy mala definición, generaba archivos de 1 Mb y encima tenia un efecto de desenfoque en todos los extremos de la imagen muy acentuados, por lo que decidí sustituirla por la GoPro, y tras instalar el sistema de FPV (visión en primera persona) empezé a realizar mis pruebas.
Haciendo caso a consejos de un gran conocedor de las GoPro , MicBergsma (os recomiendo su canal de youtube) , empecé haciendo videos , para luego poder elejir la frame ideal , y posteriormente generar una panorámica. Es un sistema un poco diferente pero tal y como en algun video de Mic comenta, es quizás el mejor sistema para obtener la imagen perfecta.
Con un drone como el mio es susceptible a los cambios de viento, y por mucho que uno active el modo GPS y en principio debería quedarse "estable" se hace díficil controlar el drone y la cámara, por lo que mejor un video, y ya perderemos tiempo en casa buscando la frame deseada sin sufrir por la duración de bateria del drone y no lo piñemos. Otra opción es hacer un burst de imágenes o una toma de secuencias tipo time-lapse, pero claro, un video con esta camara a alta definición 4k da para 12-15fps, en cambio si intentais hacerlo con como fotografia secuencial tomará fotos cada 0.5 segundos.
Pero el tema de hoy es la lente de la GoPro, si queremos hacer panoramicas con un poco más de definición deberemos hacer varias tomas.
La lente que viene de origen tiene un efecto barril tipico de un ojo de pez que nos provoca que cuando fotografiamos desde el cielo quede nuestro horizonte totalmente abombado. Si , ya sé que la tierra es redonda, pero tampoco tanto !
Esta lente original tiene un campo de visión de unos 170º entre sus extremos por lo que practicamente ya tenemos todo el paisaje fotografiado. El equivalente en milimetros es de 2.97 mm. Según he encontrado el sensor que tiene es de 1/2.3"
Si nos queremos cargar este efecto barril en nuestro horizonte, hay dos sistemas, o bién cambiando la lente o bien mediante procesado de la imagen por software. Yo pienso que lo que se pueda corregir con una lente mejor que no por software como os expliqué en el anterior post.
Existen varias lentes, incluso si uno no desea perder este campo de visión tan grande, existen lentes de 2.97 mm sin distorsión.
Para la gente que viene del campo de las réflex, ya sabe lo que vale una lente, pues aquí el tema económico también es un punto a considerar y a tener en cuenta, pues podemos encontrar lentes made in China muy baratas a menos de 5 euros, o otras que superan los 200 euros.
En mi caso, como que no me interesa un gran angular para volar con el drone pues me provoca un efecto de no saber para dónde estoy pues veo los paisajes muy pequeños y alejados , decidí cambiar por una que tiene su buena fama en muchos blogs, la típica 5.4 mm
Otros detalles a tener en cuenta, en algunas webs hablan de que la lente sea MegaPixel, pero quizás lo más importante es que tenga el corte de cristal para IR infrarojos , de lo contrario vais a tomar imágenes de espionaje nocturnas !
Ah! se me olvidava, la rosca de esta lente es de M12 x 0.5mm, o sea que con esto ya podemos empezar a buscar con google, aqui un resumen de las caracteristicas más importantes
Y ahora vamos al grano, queriamos cambiar la lente de la GoPro, antes de nada : NO ME HAGO RESPONSABLE DE LOS DAÑOS QUE PODAIS OCASIONAR EN VUESTRA CAMARA.
He visto dos métodos: el "profesional" sólo apto para manitas con nivel (yo no me atrevo!), y el sistema "bruto". Por si os interesa el video profesional (en youtube hay varios):
Yo os explicaré el método bruto, vamos a ello!
Antes de empezar prepararos todo el material necesario. También es ideal marcar la posición de la lente original por si nunca quereis volver hacia atrás. Si os fijais en la siguiente foto hay una marca en la parte superior realizada con un permanente.
He leido en un blog que hay quien previamente al proceso de desmontaje de la lente original pone la camara hacia arriba (para no rayar la lente original) dentro de un horno a una temperatura de unos 60ºC durante 10 minutos encima de un guante de los que aguantan temperatura (también podriais usar unos tejanos rotos) a una altura intermedia. Previamente sacarle la bateria !
Deducí que este proceso es para ablandar el "loctite" que fija la lente metalica con el soporte de plástico. Yo este paso me lo salté, y los puntos siguientes no se me opusieron.
Acto seguido desmontamos el embellecedor de la lente haciendo una ligera palanca hacia arriba tal y como se observa en la anterior foto. Yo coloqué un trapo de cocina o si teneis una espumita debajo de la cámara, y utilicé un cuchillo muy fino para clararlo suavemente. Luego es cuestion de hacer un poco de palanca. Si no quereis dejar marcas, poner cinta de carrocero, o un plástico fino pero duro (podeis usar un calendario).
Una vez desmontado el embellecedor , ya veremos la lente, ahora es hora de aflojarla. Para ello utilicé una pieza de aluminio de unos 7 mm de grosor con un agujero de 18 mm en el centro al que se le aplico un corte con un disco de 1 mm en un lateral. Una foto vale más que mil palabras…
Con esta pieza y la ayuda de una alicate de presión podemos fijar fuertemente y uniformemente la lente sin romperla. Hay que ajustar las alicates de presión poco a poco! También hay algun bruto que aprieta la lente directamente con las alicates de presión, yo no os lo recomiendo pues correis el riesgo sin quedaros con vuestra lente original , sin mencionar de los mordiscos feos que vais a dejar en la lente, pero cada uno que haga lo que quiera!
Acto seguido intentaremos girar suavemente en ambos sentidos haciendo un vaivén hasta que escuchemos unos clicks que significaran en principio que hemos roto la fijación que habia entre la lente y el porta lente.
Ahora ya es cuestion de aflojar la lente durante bastantes vueltas, ya que el paso de rosca es de 0.5mm. hasta que este totalmente liberada de nuestra cámara.
Una vez la lente ya está fuera, ya podemos respirar tranquilos, pues hemos pasado por el punto con más riesgo del proceso.
Ahora vamos a eliminar los restos del fijador mediante el uso de un elemento punzante, yo sigo con mi cuchillo de cortar patatas! Este proceso consiste en arrancar pequeñas partes de fijador para evitar que entren en el habitaculo del sensor CMOS. Si podeis hacerlo con la camara hacia abajo os asegurareis un poquito más que los restos van hacia el suelo.
Cuando acabeis de arrancar los restos (es muy rápido de hacer), si teneis una pera de las que se usan/usaban para limpiar de polvo los sensores CMOS de las DSLR's es buen momento para aplicarlo aqui también.
Ahora ya nos toca roscar nuestra nueva lente. En mis caso monté una de 5.4 mm de OSTR. Os recomiendo que le pongais teflón a la rosca para que quede el conjunto lente-soporte más fuerte y evitareis polvo y humedad.
Para un correcto ajuste del foco de la lente seria recomendable conectar nuestra camara a un monitor cuanto más grande mejor mediante la salida HDMI de la pequeña cámara situado encima del compartimento de la microSD. Si no disponeis de el cable necesario podeis hacerlo monitorizando la imágen desde la APP de GoPro, que será más lento pues existe un retardo de almenos dos segundos en la imágen. En mi caso son pocas las vueltas que hay roscadas (3 o 4 a lo máximo), por lo que no empeceis a darle muchas vueltas a la lente o debereis desenroscarla de nuevo casi…
Y wualá! Ya tenemos una lente sin distorsión montada en nuestra GoPro, ya podemos salir a probarla.
Obviamente hemos perdido mucho campo de visión y ahora tendreis que afinar más si lo que os gustan son los selfies!
Os dejo unos links que quizás os puedan ser interesantes:
Y aquí la segunda parte del resumen de fotografias gigapanorámicas realizadas durante el 2014. Todas las mostradas a continuación de este post están realizadas con el objetivo Tamron 70-300 ajustado a 300mm (equivalente a 450 mm en el formato DX de Nikon) y con el robot panorámico XS y el cuerpo Nikon d5200.
Sallenthttp://gigapan.com/gigapans/156564
Fecha 8 Junio 2014
1326 capturas
Resolución final = 23.28 GPx
Exposición = 1/400
Diafragma = f/25
ISO = 2000
Distancia focal = 300 mm.
Martorell http://gigapan.com/gigapans/156755
Fecha 7 Junio 2014
1296 capturas
Resolución final = 26.83 GPx
Exposición = 1/320
Diafragma = f/25
ISO = 2000
Distancia focal = 300 mm.
Balsareny http://gigapan.com/gigapans/156947
Fecha 14 Junio 2014
1.372 capturas
Resolución final = 27.02 GPx
Exposición = 1/400
Diafragma = f/25
ISO = 2000
Distancia focal = 300 mm.
Manresa desde els dipòssits de les agües http://gigapan.com/gigapans/157759
Fecha 21 Junio 2014
1300 capturas
Resolución final = 30.76 GPx
Exposición = 1/800
Diafragma = f/20
ISO = 3200
Distancia focal = 300 mm.
Montserrat desde Sant Joan http://gigapan.com/gigapans/158154
Fecha 5 Junio 2014
1080 capturas
Resolución final = 19.97 GPx
Exposición = 1/800
Diafragma = f/20
ISO = 3200
Distancia focal = 300 mm.
Abadia de Montserrat http://gigapan.com/gigapans/158627
Fecha 5 Junio 2014
972 capturas
Resolución final = 37.75 GPx
Exposición = 1/640
Diafragma = f/20
ISO = 3200
Distancia focal = 300 mm.
Diafragma = f/8
ISO = 500
Distancia focal = 300 mm.
Y hasta aquí el resumen de Gigapanorámicas realizadas durante el pasado 2014. Ahora toca ir pensando en nuevos proyectos, que de tenerlos tengo, sólo es cuestión de tiempo, ganas y que los dias acompañen para obtener nítidas imágenes. DIY !
Durante principios del año pasado 2014 diseñé un nuevo robot , la versión XS mucho más fácil de transportar con el cual puedo trasladarlo a cualquier sitio sin muchas dificultades . Este robot está diseñado para mover objetivos más pequeños , todoterrenos que su relación peso-zoom no tienen nada que ver con el Sigma 150-500 f5-6.3. Obviamente al utilizar menos zoom también son menos las fotos a realizar, menos consumo de bateria y menos resolución pero no por ello dejan de ser interesantes. También se reduce mucho el tiempo de procesado, redenderizado, y todo eso a la vez hace que la dedicación sea menor y en consequencia que se pueden llegar a hacer más capturas a lo largo del año. Durante el pasado 2014 fueron 21 gigapanorámicas completas, y dos de ellas las tuve que repetir por problemas que a continuación os contaré.
Durante el inicio del año estube utilizando un Nikkor 18-200 f3.5-5.6, y las últimas están tomadas con un Tamron 70-300 f4-5.6, i todas con el "mismo" equipo, una cámara Nikon d5200. Y digo "mismo" porque a mitad de temporada empezó a aparecer unas motas de polvo raras en el sensor que misteriosamente provenian del terciopelo de un lateral del obturador, llegando a la conclusión que el espejo rascaba sobre el lateral derecho. No tengo ninguna foto pero parecia que tuviera mucha traya. Después de varias limpiezas de sensor junto la pera para soplar, los bastoncillos , el alcohol isopropílico quedaba operativa pero con la incertidumbre de esas "rascadas".
Dias después realizando alguna gigapan escuchaba ruidos anormales en el obturador, como si se encallasen, momento en el cual y tras pausar el robot comprobé que debería llevar un número x de fotos según el contador del Arduino pero que me aparecía un numero inferior en las capturas de cámara. Me dejó intranquilo pero terminé con las capturas y una vez en casa comprobé que las cantidades no cuadraban, había perdido varias fotos aleatoriamente.
Dias después en otra toma de capturas me pasó lo mismo, y aqui por suerte la mia pudé clonar partes de la imágen final para disimular, y no quedó mal!
Entonces es cuando decidí cambiar el equipo, faltaba poco para el verano y queria hacer fotos en mi destino de vacaciones y no podia jugármela con un equipo que fallaba por lo que adquirí otra d5200 y la vieja la vendí en un sitio dónde compran camaras on-line, vamos que no sé que hacen luego con ellas pero que le pongan un precio sin haberla chequeado muy profesionales no son...
Otra de las contramedidas que apliqué es en fotografias dónde hay muchos claros, y últimamente ya lo estoy haciendo en todas es la de implementar un retardo de 1 segundo entre capturas ya que últimamente veo que el led de "tarjeta ocupada" se queda muchas veces con un verde fijo , de esta manera me aseguro que no saturo el buffer de la camara y evito fallo en la grabación de datos.
Este año sólo he realizado una foto con el robot grande + Sigma 150-500 concretamente la realizada en la Vall de Lord, el resto ha sido con el pequeñito que me ha dado muchas alegrias.
Otra mejora "tonta" pero muy práctica ha sido la inclusión de la alimentación de la camara desde el mismo robot, ahora ya me olvido de como están las baterías. Pensad que en principio una bateria para la d5200 no deberia tener capacidad para hacer más de unas 500 fotos, y yo muchas veces he hecho de más de 800, jugandomela a quedarme sin batería. En el robot XS la cámara va fijada al propio balancín del robot y en pleno proceso mejor no desmontarla si no queremos perder el sólape. Pués bién, después de montar un step down y acoplar una batería clónica codificada la cosa ya funciona!
La Nikon d5200 utiliza un tipo de baterias con codificación y la cámara se "entera" si las baterías son originales o clónicas bloqueando la funcionalidad de la cámara. Este tema está más que resuelto. Informar que a veces , en cámaras anteriores el firmware que venia de origen permitía el uso de baterías clónicas pero "grácias" a las actualizaciones se jode el invento! Conclusión: si vais a actualizar algo mirad antes que vais a ganar o a perder, no siempre estar a la última es lo mejor. Yo esta prueba la realizé con la d5200 "mala" que de origen venia con una versión 0 de firmware, al ponerle la 1 aún funcionaban las clónicas, con la versión 2 se acabó!
La Seu de Manresahttp://gigapan.com/gigapans/151600
Fecha 15 Marzo 2014
576 capturas
Resolución final = 10.31 GPx
Exposición = 1/500
Diafragma = f/16
ISO = 1000
Distancia focal = 200 mm.
Súria desde el poble vell http://gigapan.com/gigapans/151988
Fecha 23 Marzo 2014
555 capturas
Resolución final = 9.50 GPx
Exposición = 1/200
Diafragma = f/18
ISO = 1000
Distancia focal = 200 mm.
Vall de Lord http://gigapan.com/gigapans/152891
Fecha 5 Abril 2014
2.955 capturas
Resolución final = 49.05 GPx
Exposición = 1/1000
Diafragma = f/14
ISO = 1600
Distancia focal = 700 mm. (500mm + TC1.4x)
Plaça de St. Domènec de Manresa http://gigapan.com/gigapans/153338
Fecha 14 Abril 2014
852 capturas
Resolución final = 13.69 GPx
Exposición = 1/400
Diafragma = f/22
ISO = 1600
Distancia focal = 200 mm.
Collbaix http://gigapan.com/gigapans/153421
Fecha 17 abril 2014
608 capturas
Resolución final = 10.98 GPx
Exposición = 1/400
Diafragma = f/22
ISO = 1000
Distancia focal = 200 mm.
Cardona http://gigapan.com/gigapans/153499
Fecha 19 abril 2014
468 capturas
Resolución final = 8.57 GPx
Exposición = 1/640
Diafragma = f/16
ISO = 1000
Distancia focal = 200 mm.
Tal y como dije, la primavera es mi estación preferida para fotografiar pues los contrastes de colores suelen ser más accentuados y los verdes son verdes, sólo hay que esperar un dia nítido para ganar en profundidad de campo. Asi que aqui vienen otro grupo de Gigapanes realizadas durante la primavera con el robot panorámico XS.
Barcelona desde el turó de la Rovira:
La primera que hice (siempre por orden cronológico), fué de Barcelona ciudad desde el turó de la Rovira (bunkers anti aereos) , es un lugar que a todos los que visiten esta ciudad les recomiendo que pierdan unas horas para gozar de las vistas de este sitio. Llevaba muchos meses esperando el momento, habia subido a varios lugares intentando buscar el sitio perfecto y este casi lo era. El casi es porque es un lugar muy transitado por visitantes, curiosos, vamos que no te da sni cuenta y tienes mas de un centenar de personas a tu lado y como es de comprender para mi y mi invento es una situación molesta.
Resumen, era un domingo despejado porque por la noche del sábado hizo viento lo que propiciaba que no hubiera la típica contaminación que caracteriza esta ciudad. Fué cuestión de comer temprano para poder llegar a este emblematico lugar con la esperanza de no encontrarme mucha gente y asi fué.
Todos los astros se alinearon y aqui hay la captura resultante tras unir las 693 fotos (33 columnas x 21 filas) y una resolución próxima a los 12 GPx.:
Me habria gustado realizarla con mi robot grande con el sigma 150-500 pero no me atreví por culpa de los curiosos, con el 18-200 de Nikkor tardé menos de una hora, mientras que con el Sigma habrian sido 4 horas, un espacio de tiempo muy grande.
Acto seguido y para aprovechar la tarde del domingo me desplazé hasta otro sitio con buenas vistas hacia Barcelona y comarca, justo en el poblado ibérico de Puig Castellar situado en el término municipal de Badalona.
En la cima de esta montaña hacia mucho viento por lo que el proyecto no pintaba muy bien, a ratos me veia obligado a pausar el proyecto al tener grandes ráfagas de viento que parecia que tenia que salir el trípode + robot volando hasta Mallorca!
Fué la primera vez que utilizaba el estabilizador a la hora de tomar capturas y eso significó que a poco más de la mitad del proyecto me quedé sin batería y tuve que desamblar la camara respecto al robot para poder cambiar la batería con el riesgo que comporta.
Aunque parezca mentira aqui todo y estar perdido en la montaña, el número de curiosos se multiplicó con las frases típicas de "ponlo en el youtube, en que canal de tv va a salir...", en fín que tengo un imán para atraer a los curisosos y a los locos!
Todo y eso, al final no hubo ningún problema a la hora de unir las fotografias y componer la gigafoto de 6 GPx. que podeis verla en grande en http://gigapan.com/gigapans/155459
El plà de Bages:
La siguiente fué realizada sobre Santpedor , en Castellnou de Bages con una vista al sur de la comarca del Bages. En esta ocacisón quedé con Jordi para mostrarle como funcionaba mi robot y como realizaba este tipo de fotografia en cuestión de conceptos de fotografia.
En este caso fueron 532 fotografias (28 lineas x 29 columnas) con la Nikon d5200 y el Nikkor 18-200.
A pocos minutos en coche de mi vivienda fué tomada la siguiente gigafoto, en este caso fotografié el pueblo de Sant Joan de Vilatorrada con 816 capturas (14.5 GPx) , y el resultado fué el siguiente:
En esta ocasión la cosa salió rana...y tuve que repetirla. El problema fué debido a una gran tontería...
Fuí un domingo por la mañana, y empecé a realizar capturas, hasta llegar al campo de futbol en el que estaban haciendo la media parte del partido de futbol y pausé el robot. Pasaban los minutos y los niños no seguian el partido por lo que decidí seguir con mi proyecto, y tras fotografiar el campo, reemprenden el partido. En ese momento intenté repetir esas tomas pero se me descuadró el solape entre capturas y luego el software AutoPano Giga no era capaz de unirmelas correctamente provocandome unos duplicados de casi una fila, por lo que decidí volver una semana después con la Loli para que viera como realizo este tipo de fotografias.
En esta ocasión estrené el sistema de alimentación ininterrumpido hacia la camara (explicado en otro post) y un Tamron 70-300 mm y todo fué bién, sin ninguna anormalidad digna de destacar.
Si la quereis ver en grande (23.3 GPx), sólo hay que visitar el siguiente link:
Otro de los lugares pendientes...pasando por la autopista siempre veia la industria química y pensaba en los infinitos detalles que albergaría una fotografia por lo que un sábado soleado por la tarde decidí ir a fotografiar el paisaje.
Fueron algo más de 1100 fotografias para componerla, pero dió mucha guerra debido a dos motivos principalmente:
* Los coches cortados y matriculas que habria que borrar
* Los cables de alta tensión que no quedaron bién solapados por culpa del punto nodal desajustado.
Mediante Photoshop suelo reparar anormalidades pero se hizo muy pesado al trabajar con un archivo PSD de 150 GBytes todo y utilizar un iMac core i7 con 32 GB de RAM
El resultado de 26.8 GPx (aunque no satisfactorio para mi todo y la guerra que me dió) es el siguiente:
Nota> Se observan varias tomas con una intensidad diferente, pero no sé a que fue debido pues el revelado siempre lo hago en lote con los mismos ajustes en todas las fotos...
Por cierto, después de realizar esta fotografia tuve que hacer limpieza del sensor utilizando alcohol isopropilico para sacar unas motas de polvo que tenia en el CMOS.
Durante la limpieza observé que en un lateral del receptáculo dónde se mueve el espejo de la cámara tenia un desgaste como si el propio espejo lo hubiera rascado y quizas la tela negra era las motas de suciedad que residian en el sensor...en fín que la cosa no pintaba bién.
Balsareny:
Finalmente esta es la última de este post. Cabe decir que horas antes estube haciendo otra gigafoto , que no pude "revelar" porque durante las capturas se perdieron magicamente unas 20 fotos. Lo único que observé es que el ruido del espejo era anormal, como si no actuara correctamente cosa que me dejó preocupado. La desaparición de dichas fotos no me percaté hasta que fuí a procesar la foto.
Pero vamos a la que vamos...
Llegé al sitio, tenia que subir los trastos una cuesta de unos 50 metros, con un sol que deslumbrava, pues tras hacer esas carreras arriba abajo arriba con los trastos tardé 10 minutos en recuperarme. No tenia ni una sombra por lo que me refugié en la que producia un triste arbusto.
Monté todo el invento y empecé con las capturas. Volví a escuchar los ruidos anormales en el espejo, pausé el robot, y apagé la camara y la volví a encender y a partir de ese momento no falló mas...
Una vez en casa me percaté que me habian desaparecido 5 fotos, las cuales eran "fáciles" de disimular pues eran de arbustos por lo que manos a la obra y tras unas horas de photoshop parece que ha quedado disimulado.
Tras procesar las 1372 imagenes, este es el resultado final de 27 GPx. que deseo que os guste:
Ahora toca explicar la segunda parte del programa del robot panorámico. Ahora es el momento del programa para la slide dolly.
Empoezamos borrando la pantalla y en principio ejecutamos la calibración inicial de ejes. Esta subrutina esta comentada para que no se active ya que para que funcione correctamente hay que montar unos sensores extra para marcar los límites.
Acto seguido llamamos a la subrutina define_modo() , programa_limite_recorrido() y la subrutina define_velocidad() que cuando llege el momento ya las explicaré con mas detalle, pero que en resumidas cuentas la primera sirve para elejir si queremos hacer time-lapse, video o un modo joystick. En la segunda subrutina es la encargada de programar los limites mientras que en la tercera definimos la velocidad a la que vamos a mover los motores. También definimos la variable pp con el valor de pdisplay (modo de funcionamiento) . Mágicamente el valor de pdisplay se cambiava sólo y el hecho de definir una variable nueva en este punto sirve para memorizar el valor correctamente.
void slide_dolly(){
lcd.clear();
// calibracion_inicial_ejes(); *********BORRAR
define_modo();
int pp=pdisplay;
programa_limite_recorrido();
define_velocidad();
Acto seguido comprobamos si hemos elejido el modo de time-lapse, si es que si, ejecutaremos la subrutina define_fotos() , define_tiempo(); y acto seguido una vez tengamos ejecutadas estas subrutinas que son las encargadas de definir el número de fotos y el espacio de tiempo entre tomas. A continuación dividimos los pasos totales que hemos definido previamente por el numero de fotos a realizar menos una. Igualmente haremos lo mismo para el segundo eje.
if (pp==0){ // if modo !=timelapse no demani ni define_fotos ni define_tiempo
define_fotos();
Borramos de nuevo la pantalla y nos preparamos para empezar mostrandonos en la pantalla el mensaje de "[ENTER] = Start", acto seguido redondeamos los pasos que se van a mover los diferentes ejes , para ello sumamos +0.4 antes de redondear estos valores, esto lo hago porque se tratan de valores enteros y si tiene que dar 33.7 el arduino entenderia que son 33 pasos enteros , aunque se aproxima más a 34, es por ello que le sumo 0.4 y con eso se convierten en 33.7+0.4=34.1 que una vez redondeado que en 34. En cambio si el valor fuera de 33.4 al sumarle 0.4 quedaria en 33.8 que al ser redondeado por arduino serian 33 igualmente.
Acto seguido provocamos una pausa poniendo la variable a=0 y hasta que no pulsemos select, este valor no cambiará a 1 y estará continuamente en el bucle esperando.
lcd.clear();
lcd.setCursor(1,0);
lcd.print("[ENTER] = Start");
lcd.setCursor(0,1);
for (int k=0 ; k<16; k++){
lcd.print(".");
delay(100);
}
// Convertim pasos amb valor decimal a numero sencer.
/* el paso X es perillos de convertir ja que el valor pot ser superior a 32k i una int no ho aguanta
pasoX=pasoX+0.4;
pasoXX=(int) pasoX;
pasoX=pasoYY;
*/
pasoY=pasoY+0.4;
pasoYY=(int) pasoY;
pasoY=pasoYY;
xy=pasoX/pasoY;
a=0; // provoquem pausa
while(a==0){
if((analogRead(0)/margen)==(select/margen)){ //enter)
a=1;
}
}
Borramos de nuevo la pantalla y depeendiendo del tipo de programa que queramos ejecutar (memorizado en la variable pp) acabaremos ejecutando las subrutinas correspondientes rutina_video_1_eje(), rutina_video_3_ejes(), rutina_time_lapse() o bién la rutina_joystick(). Una vez ejecutada y finalizada la subrutinas , volverá al menú inicial (el que nos deja elejir el modo de Gigapan o le de Slide_dolly), a excepción de si elejimos el modo joystick que sólo podremos salir de ella forzando un reset a nuestro Arduino.
La siguiente subrutina lo único que hace es mostrarnos en la pantalla un mensaje informandonos que se están buscando los limites , empezando primero por el eje X . Para ello va dando impulos en sentido negativo al motor paso a paso hasta que detecta el sensor de origen (limitX) . En el momento que detecte este sensor, el motor avanza 10 pulsos positivos con lo que en principio se espera que el sensor de limite deja de detectar. Una vez tiene el eje X en origen, realizará la misma operación pero en el eje Y siguiendo la misma lógica pero está vez se moverá el motor Y y el límite de posicionamiento vendrá dado por le sensor limitY.
Ahora es el momento de definir el modo de funcionamiento de nuestra slide dolly mediante la subrutina define_modo(). Empezaremos borrando la pantalla e informando de que estamos en el modo de Slide dolly para confirmarlo. Tras unos segundos nos dejará elejir si queremos hacerla funcionar en modo automático o en modo manual (llamado modo Joystick).
Mediante el uso de los pulsadores UP & DOWN nos desplazaremos entre estas opciones hasta que no pulsemos Select para validar.La variable pdisplay será la encargada de memorizar la opción elejida en esta parte del programa, pero luego se convierte en variable pp porque se "perdia" el valor mágicamente.
Si hemos elejido el modo Joystick como que no hay nada más que programar, se ejecutará directamente su subrutina especifica, la rutina_joystick() de lo contrarrio nos dejará elejir entre realizar un time-lapse o un video, y también lo elejiremos mediante las teclas UP y DOWN , y de nuevo hasta que no pulsemos la tecla Select podremos dudar que es lo que queremos hacer. Se observa un delay(1000) justo después de aparecer el menú en la pantalla, esto lo hago para que no se validen automaticamente todos los menús por error evitando que se seleccionen las opciones sin querer por tener aun pulsados la tecla Select desde nuestra anterior elección del menú previo.
Si hemos elejido el moto video, nos aparecerá otro menú que servirá para que elijamos si queremos realizar un video con un sólo eje (motor principal de la dolly) o bién deseamos utilizar los 2 ejes. Esta parte del programa es simplemente igual que las dos anteriores comentadas en concepto de programación.
if(pdisplay==1){ //elejimos 1 o 2 ejes en modo video
lcd.clear();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(">1 = Eje Horizon");
lcd.setCursor(1,1);
lcd.print("2 = Los 2 ejes");
delay(500);
while((analogRead(0)/margen)!=(select/margen)){ // select
delay(100);
if((analogRead(0)/margen)==(abajo/margen)){ //abajo
pdisplay=3;
lcd.setCursor(0,1);
lcd.print(">");
lcd.setCursor(0,0);
lcd.print(" ");
}
if((analogRead(0)/margen)==(arriba/margen)){ //arriba
pdisplay=1;
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print(">");
}
}
}
}
A continuació la secuencia de programación de limites de recorrido: Empezamos con una pausa y acto seguido nos muestra en pantalla un mensaje informandonos que elijamos el punto de inicio del eje X. Acto seguido mediante las teclas LEFT y RIGHT si las pulsamos avanzaremos o retrocederemos el equivalente a 10 pasos de nuestro motor paso a paso.
En caso de que activaramos el sensor de limite, nos aparecerá un mensaje informandonos que estamos en el límite. Podremos mover el carro hasta dónde queramos hasta que no pulsemos la tecla Select, para ello en el inicio de esta subrutina se define el valor de a=0 y para provocar el bucle lo logramos mediante la instrucción while(a==0).
Otra cosa que no he comentado, es que cuando pulsamos cualquier botón lo que hacemos es leer el valor de la entrada análogica0 y la dividimos del valor margen, este sirve para dar una tolerancia de error, cuanto más grande sea el valor margen , mayor será la tolerancia de nuestro pulsador pero no es conveniente que sea muy grande , no sea que se solapen dos valores muy parecidos y luego nuestro Arduino haga lo primero que le parezca...
void programa_limite_recorrido(){
//a=0;
delay(1000);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Elije punto de");
lcd.setCursor(0,1);
lcd.print("inicio del eje X"); //buscar punto INICIO de la dolly eje X
Una vez hallado el punto de inicio del eje X haremos lo mismo pero para el punto final. La lógica usada será la misma que la utilizada para buscar el punto de inicio pero con una pequeña diferencia: ahora memorizaremos en lal variable pasoX los pasos que realice el motor cuando nosotros lo estamos posicionando. Este valor nos lo irá mostrando continuadamente en la pantalla.
a=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Busca punt final");
lcd.setCursor(3,1);
lcd.print("del eje X:"); //buscar el punto FINAL de la dolly eje X
A continuación realizaremos lo mismo pero para el eje Y. Empezaremos buscando el punto inicial en pasos de 50 pulsos, este valor lo podeis modificar a vuestro gusto. Y una vez obtenido este, buscaremos elpunto final del eje Y memorizando la posición mediante la variable PasoY.
if (pdisplay==1){
a=1;
}else{
a=0;
delay(1000);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Elije punto de");
lcd.setCursor(0,1);
lcd.print("inicio del eje Y"); //buscar punto INICIO de la dolly eje Y
delay(200);
}
while(a==0){
if((analogRead(0)/margen)==(select/margen)){ //enter)
a=1;
}
delay(15);
if((analogRead(0)/margen)==(right/margen)) { // derecha +Y
myStepperY.step(5);
}
if((analogRead(0)/margen)==(left/margen)) { // izquierda -Y
myStepperY.step(-5);
}
}
if (pdisplay==1){
a=1;
}else{
a=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Busca punt final");
lcd.setCursor(3,1);
lcd.print("del eje Y:"); //buscar el punto FINAL de la dolly eje Y
delay(500);
}
while(a==0){
Originalmente con la siguiente instrucción forzaba a que el punto final fuera diferente del inicial, simplemente porque cuando luego habia que buscar la proporción de pasosX respecto Y, si este último valor era 0 la división era infinito provocando un error con repercusiones desconocidas. Si quereis modificar esta linea solo teneis que incluir el &(pasoY!=0) y organizar corchetes.
A continuación se colocan los motores en su posición de inicio , es tan fácil como forzar el movimiento de cada uno de los dos motores para que actuen los pasos programados anteriormente pero en sentido inverso. Primero empezamos con el motor X y luego con el Y.
// desplazamos hasta el origen eje X
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Mueve a origen");
lcd.setCursor(5,1);
lcd.print("Eje X");
myStepperX.step(-pasoX);
Una manera muy tonta de tener claro el sentido de trabajo de cada motor es cuestionandonos si el valor de pasos es positivos o negativos. Ahora cuando aun no se ha movido ningun motor es fácil, el problema vendrá luego mas tarde, una vez hechas las proporciones de pasoX/pasoY si ambas son negativas se convierte el resultado positivo todo y aqui es cuando hay que tener una memoria para que en todo momento quede claro el sentido si no queremos enviar la dolly a casa del vecino.
En la siguiente subrutina define_fotos() tal y como dice su nombre sirve para que programemos el número de fotos a realizar, en principio ya viene pre-definida como 25 fotos, pero si vais a hacer un time-lapse de varios segundos necesitareis unas cuantas mas. Tened en cuenta que son necesarias 25 imagenes por segundo como mínimo para que nuestro video de time-lapse tenga un refresco de imagen aceptable . En principio está capado a una capacidad de 250 capturas pero si buscais en las siguientes lineas, vereis que es muy fácil modificarlo/eliminar esta opción.
Utilizo la misma lógica de siempre: se declara la variable a=0 y luego hay un while que viene a decir "mientras a sea 0 ves haciendo el bucle" . Para salir del bucle hay que pulsar Select y automaticamente cambiará el valor de a=1 y acto seguido saldremos del bucle.
Dentro del bucle si pulsamos UP incrementamos una foto y si pulsamos DOWN decrementamos una foto.
También hay unas lineas dónde miramos el valor de fotos (variable shot) que si es superior a un valor quita o pone espacios en blanco en nuestro lcd antes de mostrar el valor, esto lo hago para que quede todo mas pulido, esta es una de las partes más pesadas, hacerlo que quede bonito en nuestra pantalla dentro de las limitadas posibilidades que nos ofrece.
void define_fotos(){
a=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Numero de fotos");
lcd.setCursor(4,1);
lcd.print(shot,1);
lcd.setCursor(6,1);
lcd.print(" fotos");
delay(200);
while(a==0){
if((analogRead(0)/margen)==(select/margen)){ //enter)
a=1;
}
delay(150);
if((analogRead(A0)/margen)==(arriba/margen)) { // arriba
if (shot<250){
shot=shot+1;
lcd.setCursor(3,1);
if (shot<100){
lcd.print(" ");
}
if (shot<10){
lcd.print(" ");
}
lcd.print(shot);
lcd.setCursor(6,1);
lcd.print(" fotos");
}
}
if((analogRead(A0)/margen)==(abajo/margen)) { // abajo
if (shot>1){
shot=shot-1;
lcd.setCursor(3,1);
if (shot<100){
lcd.print(" ");
}
if (shot<10){
lcd.print(" ");
}
lcd.print(shot);
lcd.setCursor(6,1);
lcd.print(" fotos");
}
}
}
}
En la siguiente subrutina define_tiempo() sirve para determinar el tiempo entre fotos de nuestro time-lapse, sigue la misma lógica de la subrutina de define_fotos, pero esta vez la variable a memorizar es segundos_secuencia.
En la siguiente subrutina sirve para definir la velocidad de los ejes. Es una función que he probado poco, lo siento, no tengo tanto tiempo como me gustaria! Basicamente sigue la misma lógica que las subrutinas anteriores en cuanto a control de pulsadores y la variable a tratar es velocidadX, mediante el programa múltiplicamos este valor por 2.5, de esta manera si queremos llegar al 100% de velocidad , el valor real será 40.
Una vez confirmada nuestra selección igualamos el valor en las velocidades de ambos ejes y la aplicamos mediante las funciones myStepper?.setSpeed(velocidad)
velocidadY=velocidadX;
myStepperX.setSpeed(velocidadX); // definimos velocidad impulsos motor
myStepperY.setSpeed(velocidadY); // definimos velocidad impulsos motor
}
A por la rutina de video de 1 eje ! Empezamos haciendo una limpieza de pantalla y nos aparecerá en pantalla un mensaje informandonos que vamos a grabar, y un segundo y medio después se activará la señal de remoto de nuestra cámara. Acto seguido en la pantalla nos mostrará el % de velocidad a que se va a realizar . Si durante la grabación pulsamos UP o DOWN modificaremos esta velocidad.
void rutina_video_1_eje(){ //rutina video
lcd.clear();
lcd.setCursor(0,0);
lcd.print("A T E N C I O N");
lcd.setCursor(0,1);
lcd.print("Grabando video");
delay(1500);
digitalWrite(PinShot, HIGH);
delay(1000);
if(pasoX<0){
pasX=-pasoX;
}else{
pasX=pasoX;
}
En vez de ejecutar con una sola instrucción el movimiento realizando todos los pasos de golpe, realizamos el movimiento paso a paso y verificamos continuamente que no excedamos de la posición de los micros de seguridad. El programa esta preparado, pero no lo tengo implementado y lógicamente no está probado!
for (int i = 0; i<pasX; i++) {
if(digitalRead(limitX)==HIGH){
lcd.clear();
lcd.setCursor(0,1);
lcd.print("ATENCION LIMITE");
delay(10000);
i=pasX;
break;
}else{
Aqui es dónde podemos modificar el valor de velocidad. El hecho de hacer mover el motor paso a paso también sirve para que podamos realizar pequeñas actuaciones como esta , si definieramos todo el movimiento de golpe no podriamos cambiar la velocidad a media trayectoria. Comentar que si entre las instrucciones de movimiento de un paso de motor hasta que se repite si hay muchas instrucciones que aunque sean "tontas" nos frena el programa y podemos provocar que vaya a golpes. Sobretodo instrucciones de visualización en nuestra LCD nos puede provocar este problema. El pobre Arduino le falta velocidad de procesamiento y de tratamiento de datos.
if((analogRead(0)/margen)==(arriba/margen)){ //arriba
if (velocidadX>2 && velocidadX<40){
velocidadX=velocidadX+1;
myStepperX.setSpeed(velocidadX); // definimos velocidad impulsos motor
}
}
if((analogRead(0)/margen)==(abajo/margen)){ //abajo
if (velocidadX>2 && velocidadX<40){
velocidadX=velocidadX-1;
myStepperX.setSpeed(velocidadX); // definimos velocidad impulsos motor
}
}
if (sentidoX==1){
myStepperX.step(-1);
}else{
myStepperX.step(1);
}
}
}
delay(200);
digitalWrite(PinShot, LOW);
Una vez recorrido el espacio, en nuestra LCD nos confirmará el fín de la grabación y el carro retornará a la posición de inicio.
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Fin del video");
delay(2000);
lcd.setCursor(0,1);
lcd.print("Retorno a inicio");
myStepperX.setSpeed(10); // definimos velocidad impulsos motor
myStepperX.step(-pasoX);
lcd.clear();
lcd.setCursor(5,2);
lcd.print("F I N !");
delay(5000);
}
Vamos a por el video de 2 ejes, este todo y ser casi igual al de 1 eje da mucha guerra... Arduino SÓLO puede ejecutar una acción a la vez y por lo tanto mientras mueve un motor el otro está quieto, es otra de las limitaciones que tiene y que ya he repetido varias veces. Otra cosa es que lo intentemos engañar con pequeños movimientos entre ambos motores y de sensación de que todo va sincronizado...pero ja! Es más , nosotros estamos utilizando motores paso a paso y confiamos en que no se pierda ningún paso por el camino, lo suyo seria tener un encoder o aunque fuera muy guarro un potenciometro variable para tener medio controlada la posición de nuestro invento...
Previamente a este punto hay una línea dónde dice algo asi: xy=pasoX/pasoY que sirve para buscar una proporción de los pasos que va a dar el eje X respecto el Y. Como que el resultado de xy es un valor entero quiere decir que si multiplico xy*pasoY es posible que no de pasoX, y esto es lo que hacemos en la formula dónde definimos el resto. Este valor serán los pasos "perdidos" del eje X.
Para que me entendais mejor, imaginamos que pasoX=1000, pasoY= 220, cuando hacemos xy=pasoX/pasoY , sería 1000/220 = 4.54, como que xy está definido como una int , es un número entero y va a memorizar con valor 4.
Entonces se moveria 4 pasos durante 220 veces el eje X y a cada paso 4 pasos de X se moveria uno de Y, resultado final = nos faltarian 1000-880 pasos = 120 pasos perdidos.
¿ Como lo arreglo? calculo el resto = 120 pasos y lo divido de 2.
Arrancamos el eje X durante la mitad de pasos del resto (60 pasos) y acto seguido hago la secuendica de 220 veces 4 pasos de X por 1 paso de Y (total 880 pasos de X y 220 de Y). Llegados a este punto llevamos 940 pasos de X y 220 de Y . Ya sólo falta mover el eje X durante la mitad del resto (60 pasos) para completar todo el recorrido de X y de Y. Si estos "escalones" no os gustan siempre podeis eliminarlos o editar el video...
¿Vaya toston no? Pues es lo que hay! Si a alguién se le ocurre una manera mejor que me la explique!
void rutina_video_3_ejes(){ //rutina video 2 ejes
resto=pasoX-(xy*pasoY);
lcd.setCursor(0,0);
lcd.print("A T E N C I O N");
lcd.setCursor(0,1);
lcd.print("Grabando video");
delay(1500);
digitalWrite(PinShot, HIGH);
delay(1000);
delay(200);
digitalWrite(PinShot, LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Fin del video");
delay(2000);
Luego después de que se nos muestre el mensaje de "Fín de video" volvemos a inicio y acabamos con nuestra rutina. Lo siento no tengo fotos, mirad el video...
lcd.setCursor(0,1);
lcd.print("Retorno a inicio");
myStepperX.step(-pasoX);
myStepperY.step(-pasoY);
lcd.clear();
lcd.setCursor(5,1);
lcd.print("F I N !");
delay(10000);
}
Ahora es la hora de la rutina time-lapse, xD ! creo que nunca acabaré este post! Es muy parecido en cuanto a funcionamiento al video de 2 ejes pero no se ha implementado la funcion resto ya que es "tonteria" que se mueva un espacio y luego se descuadre . Dónde hay más trabajo es en la visualización de datos en nuestra LCD.
Empezamos creando una rutina que se repetirá tantas veces como numero de fotos a realizar. Actualizamos valores en pantalla y realizamos una foto mientras el gif cierra el diafragma.
void rutina_time_lapse(){ //rutina time-lapse
for(int i = 1; i< shot; i++){
//logo0();
logo2();
lcd.setCursor(0,0);
lcd.print("s:");
lcd.print(i);
lcd.setCursor(7,1);
lcd.print(i*100/shot);
lcd.print("%");
lcd.setCursor(1,1);
lcd.print("F O T O ! ");
digitalWrite(PinShot, HIGH);
logo2();
delay(300);
digitalWrite(PinShot, LOW);
delay(300);
logo3();
lcd.setCursor(1,1);
lcd.print("M O V E ! ");
if(pasoX<0){
pasX=-pasoX;
}else{
pasX=pasoX;
}
if(pasoY<0){
pasY=-pasoY;
}else{
pasY=pasoY;
}
Acto seguido y tras un pequeño retardo de 300 mS se mueve la dolly paso a paso en el eje X verificando que no exista contacto con el sensor de limite del ejeX, luego moverá el ejeY.
for (int i = 0; i<pasX; i++) {
if(digitalRead(limitX)==HIGH){
lcd.setCursor(0,1);
lcd.clear();
lcd.print("ATENCION LIMITE!");
delay(10000);
i=pasX;
break;
}else{
if (sentidoX==1){
myStepperX.step(-1);
}else{
myStepperX.step(1);
}
}
}
for (int i = 0; i<pasY; i++) {
if (sentidoY==1){
myStepperY.step(-1);
}else{
myStepperY.step(1);
}
}
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(7,1);
lcd.print(i*100/shot);
lcd.print("%");
Mientras está efectuando el retardo entre fotos podemos incrementar este retardo mediante las teclas UP y DOWN, si pulsais UP al incrementar el valor os va a parecer que no haceis nada, pero a cada decima de segundo le estais incrementando una más , y os dareis cuenta en la siguiente "pausa". Si por el contrario pulsais DOWN decrementais este valor
Si por el contrario pulsais SELECT provocaremos una pausa.
Una vez realizadas todos los movimientos nos faltará la última foto para completar, y a continuación ya nos aparecerá el mensaje de MotionLapse completo! Momento en que la dolly retrocederá a su punto de origen.
La subrutina peticiopausadolly() preguntará diez veces si está el pulsador de SELECT apretado, si sólo pusieramos una, se lo pasaria por el forro.. aqui si que corre el Arduino! Si detecta que esta pulsado entraremos en modo pausa y no saldremos hasta que pulsemos la tecla DOWN, momento en el cual actualizaremos datos de la pantalla y continuaremos (saldremos de la subrutina)
void peticiopausadolly(){
for (int k=0; k<10; k++){ //prova pausa
if((analogRead(0)/margen)==(select/margen)){ // tecla SELECT si apretem provoquem una pausa fins que no apretem ENTER
lcd.clear();
lcd.setCursor(2,0);
lcd.print("P a u s a ! ");
lcd.setCursor(0,1);
lcd.print("[DOWN] = reStart");
delay(1000); //abans no hi era i em rearrancaba
pause=2;
while(pause>1){
if((analogRead(0)/margen)==(abajo/margen)){ //abajo
pause=0;
lcd.clear();
logo2();
lcd.setCursor(0,0);
lcd.print("s:");
lcd.print(tempi);
lcd.setCursor(7,1);
lcd.print(tempi*100/shot);
lcd.print("%");
}
}
}
}
}
La subrutina joystick nos servirá para mover manualmente nuestra dolly/robot mediante los pulsadores UP, DOWN, LEFT y RIGHT , y realizar capturas cada vez que pulsemos el botón SELECT.
Para salir de esta subrutina hay que forzar un reset a nuestro Arduino.
Creo que si habeis entendido el resto de programa, aqui ya no hace falta ninguna explicación mas, simplemente es mas de lo mismo.
Finalmente implementé la subrutina reset para poner todos los registros de valores a 0 para que una vez realizadas cualquier secuencia y fueramos a hacer otra no aparecieran movimientos ilógicos. Simplemente hay una re-definición de los valores de todas las variables.
void reset(){
progreso=0;
pasoX=0;
pasoY=0;
xact=0; // º actual eje X
yact=0; // º actual eje Y
xmax=0; // º posición máxima eje X
xmin=0; // º posición mínima eje X
ymax=0; // º posición máxima eje Y
ymin=0; // º posición mínima eje Y
xtemp=0;
ytemp=0;
nshot=0;
columnasX=0; // número de filas eje X >> (xmax-xmin)/pasoX
columnasXX=0;
filasY=0; // número de columnas eje Y >> (ymax-ymin)/pasoY
filasYY=0;
previsionShot=0; // prevision número shots columnasX * filasY
segundos=0 ;
minutos=0 ;
horas=0 ;
pause=0;
pdisplay=0;
pdisplay0=0;
valorTempX=0;
valorTempY=0;
progreso=1;
solape=0.20;
retardo=0;
origen=0;
tempj=0;
tempi=0;
a=0;
sentidoX=0;
sentidoY=0;
shot=25;
pasoXX=0; // valor temporal dolly eje X
pasoYY=0; // valor temporal dolly eje Y
pasX=0;
pasY=0;
xy=0;
resto=0;
segundos_secuencia=3;
posicion_actual_X=0;
posicion_actual_Y=0;
velocidadX=0;
velocidadY=0;
tiempo_reloj=0;
espai=0;
paso=0;
menu=2;
menu0=0;
modenight=2;
factor=1.5; // en su defecto : FF = 1, Nikon DX=1.5 , Canon DX=1.6 , Olympus= 2
focal = 200;
}
Y se acabó por hoy ! Reconozco que hay varios puntos a mejorar, se aceptan ayudas jiji! Y no sé cuantos post tengo pendientes de publicar...pero es que me gusta compartirlos pero faltan horas!
Si quereis todo el programa completo, no dudeis en escribirme.