Periscopio R2-D2 (4)

Última parte del tutorial de mi elevador del periscopio. Es simplemente el código que hay que cargar a la arduino pro mini. Os recuerdo que para que funcione, se deben ahcer las conexiones tal y como puse en el post anterior.

No obstante, el código es muy sencillo y seguro que se puede mejorar o meter más funcionalidades. Pero para lo básico (subir, bajar, girar y luces) funciona muy bien. 
Os recuerdo que luego debéis modificar vuestro código de SHADOW, PADAWAN, etc para que ponga en high el voltaje del pin que conectéis al pin D5 de la arduino pro mini (tal y como comenté en el post anterior) para que el periscopio suba y comience la secuencia, y que lo ponga a low para que el periscopio baje. 

Código Arduino pro mini:

 //luces
#define LUZA  13
#define LUZB  12
#define LUZC  11
#define LUZVCC 2
//PERISCOPIO
#define STEP  9
#define DIR  8
#define ACTIVAR  5
#define SENALHIGH  3
//GIRO
#define IN1G A0
#define IN2G A1
#define IN3G A2
#define IN4G A3





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 posicion = 0;
int numeroPasos;     
int direccionGiro;     
int randomNumber;
int luzActual;

int val = 0;
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(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);

  //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);

  //CONTADOR POSICION 0
  posicion=0; 
  delay(5000);          
}

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, LOW);
    // RAPIDO
    for(int i=0;i<28000;i++){
      digitalWrite(9, HIGH);
      delayMicroseconds(70);          
      digitalWrite(9, LOW); 
      delayMicroseconds(70);
    }
    //LENTO
    for(int i=0;i<3000;i++){
      digitalWrite(9, HIGH);
      delayMicroseconds(100);          
      digitalWrite(9, LOW); 
      delayMicroseconds(100);
    }
  }


void bajar ()
  {
    Serial.println("BAJAR");
    digitalWrite(8, HIGH);
    //LENTO
    for(int i=0;i<3000;i++){
      digitalWrite(9, HIGH);
      delayMicroseconds(100);          
      digitalWrite(9, LOW); 
      delayMicroseconds(100);
    }
    // RAPIDO
    for(int i=0;i<28000;i++){
      digitalWrite(9, HIGH);
      delayMicroseconds(70);          
      digitalWrite(9, LOW); 
      delayMicroseconds(70);
    }
  }    
  
  

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

void Desactivar (){
   // APAGAMOS LUCES
   
   luz(6); //apagado
   
   // COLOCAMOS POSICION CENTRAL
   centrar(posicion); 
   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(8);
    while (randomNumber==6 || randomNumber== luzActual){
      randomNumber = random(8);  
    }
    luz(randomNumber); 
    luzActual=randomNumber;
    conCambioLuces=0; 
  }
}
//GIRO ***********************************************************
void girosAleatorios(){

    posicion=0;
    
  // 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){
          for (int i = 0; i < numeroPasos; i++)
          {
            ComprobarDesactivar();
            if (Secdesactivar){
              Desactivar();
              break;
            }  
            izquierda();
            posicion = posicion -1;
            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){
        for (int i = 0; i < numeroPasos; i++)
        {
          ComprobarDesactivar();
            if (Secdesactivar){
              Desactivar();
              break;
            }  
          derecha();
          cambioLuces();
        
          posicion = posicion +1;           
        }
       
      }
 

    }    
  
}

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 (int pos){
 
  if (pos >0){
    while (pos >= 512){
      pos = pos - 512;
    }
    for (int i = 0; i < pos; i++)
    {
      izquierda();
    
    }
    
  }
  if (pos <0) {
    while (abs(pos) >= 512){
      pos = abs(pos) - 512;
    }
    for (int i = 0; i < abs(pos); i++)
    {
      derecha();
      
    }
    
  }
}

y de ejemplo, esto es lo que yo tengo en mi código del SHADOW cuando pulso el botón PS + Flecha arriba.

ACTIVAR_PERIS es el pin que usamos.
En el setup:

//periscopio  
    #define ACTIVAR_PERIS 13
    pinMode(ACTIVAR_PERIS,OUTPUT);
    digitalWrite(ACTIVAR_PERIS,LOW); //DESACTIVADO POR DEFECTO

en la parte donde se ejecuta el código de PS + Flecha arriba.

 // ACTIVAMOS O DESACTIVAMOS PERISCOPIO
        if (ActivadoPer == 0){
          digitalWrite(ACTIVAR_PERIS,HIGH);
          ActivadoPer=1;
        }
        else {
          digitalWrite(ACTIVAR_PERIS,LOW);
          ActivadoPer=0;   
        }

En este vídeo uso PS+arriba para subir y PS+abajo par abajar. En el código lo he simplificado para que usando solo PS+arriba suba o baje según toque, y así ahorrar una combinación, que el el SHADOW siempre escasean.

Cosas a mejorar del sistema:

  • El eje del motor paso a paso de giro tiene cierta holgura y eso hace que el periscopio tenga un pequeño movimiento no deseado. Tengo que ver como dejarlo aún más fijo.

Y esto es todo.
Cualquier duda estaré encantado de resolverla.  🙂 🙂 :R2D2: :R2D2:

Un comentario sobre “Periscopio R2-D2 (4)

Agrega el tuyo

Responder

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 )

Google photo

Estás comentando usando tu cuenta de Google. 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: