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:
- Parte1: https://drive.google.com/file/d/1KrBo-nT4H8z-iyhk238DmNRIsA4R4t9S/view?usp=sharing
- Parte2: https://drive.google.com/file/d/11Tk2hz5Q-CmaffBhLDXCROFW7Dz2TP4c/view?usp=sharing
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