Proyecto Panoramic Rig

Buenas tardes,

Estoy intentando construirme un dispositivo automático para tomar fotografías panorámicas accionado por un simple servo tipo mg995R.
Dado mi escaso conocimiento del tema programación, me hace falta ayuda para resolver un par de asuntos de mi código...
El dispositivo inicia un paneo horizontal desde 0 a 180 grados en pasos de 10 grados. En cada parada, hace una fotografía. Mi problema es que al completar los 180 grados sigue funcionando el sistema obturador de la cámara, en circunstancias, que debería detenerse.

Podría alguien ayudarme con las líneas de código que se deben agregar para resolver esto? Muchas gracias anticipadamente.

Un saludo

Este es mi código:

#include <Servo.h>

Servo myservo;  // crea servo controlable


int pos = 0;    // variable para almacenar la posición del servo
void setup() {
pinMode(8,OUTPUT);    //enfoque camara 
pinMode(9,OUTPUT);    //shutter camara

  myservo.attach(3);  // conecta servo en pin 3 
}

void loop() {
  for (pos = 0; pos <= 180; pos += 10) { // va desde 0 a 180 grados
    // en pasos de 10 grados
    myservo.write(pos);              // indica al servo ir a variable indicada en 'pos'
    delay(1000);    
    // espera 15ms para que el servo alcance la posición
digitalWrite(8, HIGH); // enfoque 
delay(1500); //espera 1.5 segundos 
digitalWrite(9, HIGH); // shutter
delay(1000); // espera 1 segundo
digitalWrite(8, LOW); //( LOW para Pentax)
digitalWrite(9, LOW); // ( LOW para Pentax)

  } 
  for (pos = 180; pos >= 0; pos -= 1) { // va desde 180 a 0 grados    
    myservo.write(pos);              // indica al servo ir a variable indicada en  'pos'
    delay(15); 
    // espera 15ms para que el servo alcance la posición
  }
   myservo.detach();

}

Podrías simplemente hacer esto

#include <Servo.h>

Servo myservo;  // crea servo controlable

void setup() {
  pinMode(8,OUTPUT);    //enfoque camara 
  pinMode(9,OUTPUT);    //shutter camara

  myservo.attach(3);  // conecta servo en pin 3 
  for (pos = 0; pos <= 180; pos += 10) { // va desde 0 a 180 grados
    // en pasos de 10 grados
    myservo.write(pos);              // indica al servo ir a variable indicada en 'pos'
    delay(1000);    
    // espera 15ms para que el servo alcance la posición
    digitalWrite(8, HIGH); // enfoque 
    delay(1500); //espera 1.5 segundos 
    digitalWrite(9, HIGH); // shutter
    delay(1000); // espera 1 segundo
    digitalWrite(8, LOW); //( LOW para Pentax)
    digitalWrite(9, LOW); // ( LOW para Pentax)

  } 
  for (pos = 180; pos >= 0; pos -= 1) { // va desde 180 a 0 grados    
    myservo.write(pos);              // indica al servo ir a variable indicada en  'pos'
    delay(15); 
    // espera 15ms para que el servo alcance la posición
  }
  myservo.detach();

}

void loop() {
  
}

al ponerlo en el setup se ejecuta solo una vez y luego nada...

Muchas gracias Surbyte!

Ese código ya lo había probado. Efectivamente al sacarlo del loop se ejecuta solamente una vez al iniciar el programa. Se necesita que se ejecute en cada una de las paradas (cada 10 grados en este caso) por lo tanto, imagino que habrá que indicarle de alguna manera que el ciclo ha terminado.

Cada 10 grados tomas una foto. Bien. No comprendo que esta mal entonces.
Ese código que pusiste dijiste que hacía lo que querias pero que no se detenía, entonces ahora. Si.

El dispositivo inicia un paneo horizontal desde 0 a 180 grados en pasos de 10 grados. En cada parada, hace una fotografía. Mi problema es que al completar los 180 grados sigue funcionando el sistema obturador de la cámara, en circunstancias, que debería detenerse.

El sistema obturador es?

  pinMode(8,OUTPUT);    //enfoque camara 
  pinMode(9,OUTPUT);    //shutter camara

No comprendo que esta mal

Lo que hace ahora lo hace bien estando en el setup()?

Lo que ocurre es que si se ponen las lineas de código en la sección Setup, solamente se ejecuta la secuencia de obturación de la cámara una vez, osea, cuando se energiza el circuito y el servo se encuentra en su posición inicial, es decir en el grado 0.
Debería seguir ejecutándose esta secuencia de obturación hasta completar el grado 180

Acá puedes ver un vídeo que muestra como anda esto...disculpas por la mala calidad del mismo

El video lo vi en 1028p asi que de mala calidad no se qué hablas.

Eso que mostraste es lo que corresponde a moverse cada 10 grados. Lo entendí y qué falta?

El código no esta comentado.
La secuencia de obturación cual es?

Gracias Surbyte, lo que falta, es que al terminar el ciclo, es decir cuando retorna a la posición de 0 grados, la secuencia de obturación, también se detenga.

O sea cambiar el estado al obturador pero como no lo has documentado no se cual es.
Ya te respondió ArduMyth, prueba su ejemplo a ver como trabaja.

Gracias de vuelta Surbyte. La secuencia es simple:primero high el pin 8 durante 1.5 segundos para el enfoque y despues, high el pin 9 durante 1 segundo para el obturador.

Ahora le responderé a ArduMyth

Un saludo

Gracias ArduMyth por el código "a tu manera". Desde luego luce mucho más ingenieril y funcional que el mio...

Lo estoy probando y funciona perfectamente, sin embargo, no se necesita que se repita el ciclo indefinidamente.

Si eventualmente, se requiere repetir las tomas, simplemente lo apagaría y al encenderlo nuevamente, debería comenzar a ejecutarse. Por lo tanto, habría que agregarle algo que lo detenga una vez completado.

Más adelante, me gustaría colocarle un display LCD12C y un rotary switch para manejar un menú simple que permita previamente seleccionar la cantidad de angulos y el tamaño de estos...

Un saludo y nuevamente agradecido por tu aporte

Baja el nivel que @camilob se esta debatiendo con cosas mas simples @ArduMyth.
Deja que vaya absorviendo los códigos a su ritmo.

Por eso yo no quise cambiarle demasiado asi el código resultaba amigable para sus ojos.

La secuencia es simple:primero high el pin 8 durante 1.5 segundos para el enfoque y despues, high el pin 9 durante 1 segundo para el obturador.

Si la secuencia es simple, porque no la terminas. A eso me refiero.
El código puesto en el setup esta terminado, si el obturador queda abierto, agrega el comando que lo cierre y listo.

Hola, nuevamente gracias por la colaboración del código propuesto para mi proyecto. Solamente le he cambiado el valor de cada paso (de 10 a 8 grados) para permitir un mayor traslape entre cada toma de manera de facilitarle la tarea al programa de sticher o pegado de las fotos para componer la panorámica.
También, le he modificado el valor de la pausa para ir regresar de los 180 grados (de 200 a 100) para acelerar el ciclo.

En general, funciona muy bien y según lo previsto, solamente me queda por mejorar la parte mecánica para minimizar el backlash que se produce por efecto del peso de la cámara (unos 800 gramos). Creo que voy a mantener el montaje con doble cojinete pero la transmisión la haré con unas poleas dentadas y correa GT2.

Pueden ver el prototipo funcionando en este vídeo que dejo acá

Un saludo