Ú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: