Update periscopio R2D2 – (3)

Toca montar toda la parte de giro del periscopio. A diferencia de la versión anterior, esta versión coloca el periscopio en la posición correcta usando un Final de carrera óptico: https://www.amazon.es/gp/product/B081TYP382/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1

Para montar el periscopio necesitaremos imprimir estas piezas:


También necesitaremos un conector nuevo entre el motor paso a paso y el eje del periscopio. Deberéis seleccionar el tamaño de los huecos de acuerdo con el eje que tengáis en el periscopio. En mi caso es de 6mm. Antes de montarlo, hay que aplicar pegamento epoxy o similar entre las ranuras de la pieza para que quede rígida y no flexe.

Una vez hecho esto, el montaje es muy sencillo. Os dejo imágenes de como lo tenéis que hacer:

Tras esto probar que el elevador funciona sin problemas.

Ahora solo queda acoplar el periscopio al motor y probar que gira. Para eso podéis usar el programa original

Para controlar el giro necesitamos el fin de carrera óptico y una pieza que pase pro el medio cuando el periscopio esté en la posición correcta. os dejo fotos de lo mio:

El resto ya es sólo conectar cada cosa siguiendo el esquema que publiqué en la entrada anterior y utilizar el siguiente código:

//luces
#define LUZA  A3
#define LUZB  A2
#define LUZC  A1
#define LUZVCC 3
//PERISCOPIO
#define STEP  9
#define DIR  8
#define ACTIVAR  5
#define SENALHIGH  3
#define FINARRIBA  6
#define FINABAJO  7
#define POSICIONGIRO 4 
//GIRO
#define IN1G 10
#define IN2G 11
#define IN3G 12
#define IN4G 13






int Secuencia [ 8 ][ 3 ] =
    {   {0, 0, 0}, // PARPADEO
        {0, 0, 1}, // DAGOBAH
        {0, 1, 0}, // BUSQUEDA
        {0, 1, 1}, // SITH
        {1, 0, 0}, // YODA
        {1, 0, 1}, // OBI WAN
        {1, 1, 0}, // APAGADO
        {1, 1, 1} // ALEATORIO
     };

// Secuencia de pasos
int paso [4][4] =
{
  {1, 0, 0, 0},
  {0, 1, 0, 0},
  {0, 0, 1, 0},
  {0, 0, 0, 1}
};


int numeroPasos;     
int direccionGiro;     
int randomNumber;
int luzActual;

int val = 0;
int velocidadSubida = 85;
int velocidadBajada = 70;
bool subiendo = false;
bool bajando = false;
bool Secdesactivar = false;
int conCambioLuces = 0; //contador cambio luces

void setup ( ) {
  Serial.begin (9600); //Starting the serial communication at 9600 baud rate
  //Inicializamos los pines del motor como salida
  pinMode(STEP, OUTPUT);
  pinMode(DIR, OUTPUT);  
  //Pines de luces como salida
  pinMode(LUZA, OUTPUT); 
  pinMode(LUZB, OUTPUT); 
  pinMode(LUZC, OUTPUT); 
  pinMode(LUZVCC, OUTPUT);
  //Pines de giro
  pinMode(IN1G, OUTPUT);
  pinMode(IN2G, OUTPUT);
  pinMode(IN3G, OUTPUT);
  pinMode(IN4G, OUTPUT);
  // Fin de recorrido
  pinMode (FINARRIBA, INPUT) ;
  pinMode (FINABAJO, INPUT) ;  

  //Pine de activacion y desactivacion como input
  pinMode (ACTIVAR, INPUT) ;
  pinMode (SENALHIGH, OUTPUT) ;                       

  // semilla
  randomSeed(analogRead(A0)); 
  
  // luces apagadas
  luz(6); //apagado
  digitalWrite(LUZVCC, HIGH);

  //COLOCAMOS PERISCOPIO
  colocar();          
}

void loop () {

  delay(500);
  // secuencia de activar
  if (digitalRead(ACTIVAR)== HIGH){
    //marcamos como activo
    Secdesactivar=false;
     Serial.println("ACTIVADO SUBIR");
    // SUBIMOS PERISCOPIO
    subir();
    // ENCENDEMOS LUCES
    Serial.println("ACTIVADO LUCES");
    randomNumber = random(8);
    while (randomNumber==6){
      randomNumber = random(8);  
    }
    Serial.println("LUCES");
    luz(randomNumber);
    luzActual=randomNumber;
    Serial.println("GIROS ALEATORIOS");
    // GIROS ALEATORIOS
    girosAleatorios ();
   }  
       
  
}

//MOTOR PRINCIPAL******************************************************************************************

void subir ()   {
    digitalWrite(8, HIGH);
    while (digitalRead(FINARRIBA)== HIGH){ 
      digitalWrite(9, HIGH);
      delayMicroseconds(velocidadSubida);          
      digitalWrite(9, LOW); 
      delayMicroseconds(velocidadSubida);
    }
    
   
 }


void bajar ()  {

    digitalWrite(8, LOW);
    while (digitalRead(FINABAJO)== HIGH){ 
      digitalWrite(9, HIGH);
      delayMicroseconds(velocidadBajada);          
      digitalWrite(9, LOW); 
      delayMicroseconds(velocidadBajada);
    }
   
  }   
  
  

void ComprobarDesactivar () {
  if (digitalRead(ACTIVAR)== LOW){
    Secdesactivar=true;
    
   }
}

void Desactivar (){
   // APAGAMOS LUCES
   
   luz(6); //apagado
   
   // COLOCAMOS POSICION CENTRAL
   centrar(); 
   delay(500);
   // BAJAMOS PERISCOPIO
   bajar();   
}

//LUCES *****************************************************

void luz(int Posicion)           
{
  digitalWrite( LUZA, Secuencia[Posicion][ 0] );
  digitalWrite( LUZB, Secuencia[Posicion][ 1] );
  digitalWrite( LUZC, Secuencia[Posicion][ 2] );

}

void cambioLuces(){
 
  conCambioLuces++;
  if (conCambioLuces ==1250){
    randomNumber = random(6);
    while (randomNumber==6 || randomNumber== luzActual){
      randomNumber = random(6);  
    }
    luz(randomNumber); 
    luzActual=randomNumber;
    conCambioLuces=0; 
  }
}
//GIRO ***********************************************************
void girosAleatorios(){

   
  // movimientos aleatorios y cambios de luces a los 15 segundos 
    while (!Secdesactivar){
      numeroPasos = random(50,700);
      direccionGiro = random(4); //1-izda 2-parar 3-derecha
      if (direccionGiro==1){
          pararGiro();
          delay (1000);
          for (int i = 0; i < numeroPasos; i++)
          {
            ComprobarDesactivar();
            if (Secdesactivar){
              Desactivar();
              break;
            }  
            izquierda();
            cambioLuces(); 
          }
         
      }
      else if (direccionGiro==2){
        pararGiro();
        for (int i = 0; i < numeroPasos; i++)
          {
            ComprobarDesactivar();
            if (Secdesactivar){
              Desactivar();
              break;
            }  
            delay(10);
            cambioLuces();
          }
        
      }
  
      else if (direccionGiro==3){
        pararGiro();
        delay (1000);
        for (int i = 0; i < numeroPasos; i++)
        {
          ComprobarDesactivar();
            if (Secdesactivar){
              Desactivar();
              break;
            }  
          derecha();
          cambioLuces();
        
              
        }
       
      }
 

    }    
  
}

void derecha () {
  for (int i = 0; i < 4; i++)
    {
      digitalWrite(IN1G, paso[i][0]);
      digitalWrite(IN2G, paso[i][1]);
      digitalWrite(IN3G, paso[i][2]);
      digitalWrite(IN4G, paso[i][3]);
      delay(3);
    }
}

void izquierda (){
  for (int i = 0; i < 4; i++)
    {
      digitalWrite(IN4G, paso[i][0]);
      digitalWrite(IN3G, paso[i][1]);
      digitalWrite(IN2G, paso[i][2]);
      digitalWrite(IN1G, paso[i][3]);
      delay(3);
    }
}

void pararGiro (){
      digitalWrite(IN1G, 0);
      digitalWrite(IN2G, 0);
      digitalWrite(IN3G, 0);
      digitalWrite(IN4G, 0);

}


void centrar (){
 
    while (digitalRead(POSICIONGIRO)== LOW){ 
      izquierda();
    }
    
 }

void colocar (){
  centrar();
  delay (500);
  bajar();
   
}

El periscopio se activará igual que en la versión anterior. Cuando llegue señal de HIGH (5V) en el pin 5 del Arduino comenzará la activación (subida y giros aleatorios). Cuando llegue señal de LOW (0V o GND) en el pin 5, el periscopio se colocará y bajará. Además, cuando enciendas el sistema, el periscopio se colocará y bajará. Esto lo hacemos por si el R2 se apago de una forma anormal cuando el periscopio estaba arriba.

Y eso es básicamente todo. Solo queda colocarlo en su sitio y disfrutar de el.

Y aquí un vídeo del sistema funcionando:

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Blog de WordPress.com.

Subir ↑

A %d blogueros les gusta esto: