Macro extremo             

Comentarios    

     Macro extremo
      

 

    
Automatizando con arduino el proceso de tomas en el macro extremo
 

 

 

     Se trata de un soporte para la máquina fotográfica. En este soporte encontramos un carril micrométrico de Mamfroto que permite avanzar y retroceder la cámara fotogràfica con facilidad.En la parte posterior hay una platina de microscopio que he tenido que modificar y que permite mover la muestra hacia adelante y hacia los laterales. Uno de los tornillos micrométricos lo movemos con el motor paso a paso.

Este motor está controlado por arduino y permite determinar un determinado valor en micras para cada avance.

Para calcular las micras que supone cada paso hemos comprobado que al dar 9 vueltas el eje del motor la platina avanza 27 mm.  es decir 27000 micras.

Como el motor necesita 500 pasos para dar una vuelta completa (lleva reductora en su interior) para dar las 9 vueltas necesitará 4500 pasos.

De aquí deducimos que un paso equivale a 27000/ 4500 = 6 micras

En el programa multiplicamos por 6 para que en el display leamos en micras el desplazamiento de la platina:
      display.showNumberDec(numpasos*6, false);

También destacamos que en el programa aparece:
pinMode(SUBE, INPUT_PULLUP);
El microcontrolador del Arduino posee resistencias  internas  conectadas internamente a la alimentación a las que podemos acceder. Es más cómodo utilizar estas en lugar de resistencias externas, para ello utilizaremos el argumento INPUT_PULLUP.
De esta manera podemos detectar la pulsación de un botón simplificando el montaje, es decir sin necesidad de poner resistencias. Ejemplo:
if(digitalRead(SUBE) == LOW){
               // Lo que debe hacer el programa al pulsar el botón.
}

Para no sobrecargar el USB del ordenador una vez cargado el programa debemos utilizar una fuente exterior de 5V. Nos puede servir un powerbank.

No hay problema en cargar el programa mientras no hagamos funcionar el motor. Es decir con el cable USB no debemos pulsar ningún botón que haga que el motor gire.

    Esquema:

    Programa en arduino: 

// Librerías
#include <Arduino.h>
#include <TM1637Display.h>

// 1- Declaraciones globales
#define CLK 2 // Display reloj
#define DIO 3 // Display

#define SUBE 4 // Botón para subir el retraso
#define BAJA 5 // Botón para bajar el retraso
#define AVANZA 6 // Botón Disparar y avanzar el micrómetro
#define ACABAR 12 // Botón para pulsar al final y que la pletina retroceda
#define FINALBAJO 7 // Botón para parar al llegar al final de recorrido bajo

TM1637Display display(CLK, DIO);

int IN1 = 8; // pin digital 8 de Arduino a IN1 de modulo controlador
int IN2 = 9; // pin digital 9 de Arduino a IN2 de modulo controlador
int IN3 = 10; // pin digital 10 de Arduin-o a IN3 de modulo controlador
int IN4 = 11; // pin digital 11 de Arduino a IN4 de modulo controlador
int OPTO=13; // Controla el optorelé que dispara la cámara
int demora = 5; // demora entre pasos, no debe ser menor a 10 ms.Forzamos a 5 ms.
int numpasos =25;

// paso completo
int paso [4][4] = // Array bidimensional con el código de pasos
{
{1, 0, 0, 0},
{0, 1, 0, 0},
{0, 0, 1, 0},
{0, 0, 0, 1},
};

void setup() {
pinMode(IN1, OUTPUT); // Pines 8, 9, 10 i 11 deben ir al motor paso a paso.
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(AVANZA, INPUT_PULLUP); // El pin 6 (AVANZA) se activa al llevarlo a +
pinMode(ACABAR, INPUT_PULLUP);
pinMode(SUBE, INPUT_PULLUP);
pinMode(BAJA, INPUT_PULLUP);
pinMode(FINALBAJO, INPUT_PULLUP);
pinMode(OPTO, OUTPUT);

display.setBrightness(0x00); // Brillo del display bajo
enciendedisplay();
}

void loop() {

// Boton AVANZA para el disparo y avance
if (digitalRead(AVANZA) == LOW)
{
avanzaydispara(numpasos);
}

// Boton ACABA para el disparo y avance
if (digitalRead(ACABAR) == LOW)
{
retrocedehome();
}

// Botón SUBE para aumentar el retardo del disparo
if(numpasos < 750 && digitalRead(SUBE) == LOW)
{
numpasos = numpasos +1;
enciendedisplay();
}

// Botón BAJA para reducir el retardo del disparo
if(numpasos > 5 && digitalRead(BAJA) == LOW)
{
numpasos = numpasos – 1;
enciendedisplay();
}
}

// SUBRUTINAS
// Avanza el motor un numero de pasos
void avanzaydispara(int avanza){
delay(300); // Para evitar la posible vibración del motor
digitalWrite(OPTO, HIGH);
delay(100); //se pulsa el botón de la cámara 100 ms
digitalWrite(OPTO, LOW);
delay(1000); // No debe avanzar hasta acabada la foto. Hay fotos de 1 seg de exp.
for (int i = 0; i < avanza; i++) // 10*4 = 40 pasos
{
for (int i = 0; i < 4; i++) // bucle recorre la matriz de a una fila por vez
{ // para obtener los valores logicos a aplicar