Go Down

Topic: Introducir datos con mando infrarrojos (Read 3673 times) previous topic - next topic

100cass

Saludos,
Estoy intentando hacer un proyecto para mover varios motores paso a paso; necesito introducir datos diferenciados para cada uno y para ello quiero utilizar un mando a distancia de un DVD.
La recepción del mando la consigo sin problemas, pero no puedo meter en distintas variables el dato que recojo de una función de lectura del mando.
Mi montaje cuenta con un receptor de infrarrojos conectado a la patilla 8 del arduino,  y un display de 16x2 conectado por I2c a las patillas A4 y A5.
Paso a poner el código que tengo hecho hasta ahora, pero que no da los resultados esperados.
Code: [Select]

/*
Introducción de datos desde un mando a distancia AIRIS.
Presentación en un display de 16x2, comunicado por I2c.
Con la versión 023 del programa Arduino.
Creado por José Miguel Gallego, con mucha ayuda de la gente que publica sus proyectos en Internet.
*/

#include <WProgram.h>
#include <NECIRrcv.h>  //Librería del protocolo NEC.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define IRPIN 8   // Pin al que conectamos el receptor de IR.

// Mando a distancia  y LCD. -----------------------------------------------------------
NECIRrcv ir(8);  // Pin al que conectamos el receptor de IR.
LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 es la direccion del LCD 16x2
unsigned long ircode;  // Variable que recibe el código del mando de infrarrojos.
long uno = 4127850240; //Código correspondiente al botón 1 del mando a distancia.
long dos = 4194696960; //Código correspondiente al botón 2 del mando a distancia.
long tres = 4261543680; //Código correspondiente al botón 3 del mando a distancia.
long cuatro = 3024879360; //Código correspondiente al botón 4 del mando a distancia.
long cinco = 3091726080; //Código correspondiente al botón 5 del mando a distancia.
long seis = 3158572800; //Código correspondiente al botón 6 del mando a distancia.
long siete = 3041591040; //Código correspondiente al botón 7 del mando a distancia.
long ocho = 3108437760; //Código correspondiente al botón 8 del mando a distancia.
long nueve = 3175284480; //Código correspondiente al botón 9 del mando a distancia.
long cero = 3191996160; //Código correspondiente al botón 0 del mando a distancia.
long enter = 4111138560; //Código correspondiente al botón ENTER del mando a distancia.
long open_close= 4077715200; //Código correspondiente al botón OPEN/CLOSE del mando a distancia.
int led = 13; //Pin al que conectamos el led.
long NumLong;  // Cadena convertida a número de tipo long.
String NumTexto; // Variable de texto para introducir los datos del mando a distancia.
String NumMostrar; // Número que se muestra mientras lo introducimos.
String NumFinal;  // Cadena que nos devuelve el mando después de enter.
// Gestión de tiempo, movimiento y disparo de cámara. -----------------------------------
int fotXseg;  // = 25;  // Fotogramas por segundo del video resultante.
long segVideo;  // = 60;  // Segundos de video que queremos obtener.
boolean est_Mov = true;  // Escogemos entre cámara estática o en movimiento. Por defecto estática.
int V_avanceX = 0;  // Velocidad en el eje X, a lo largo de la guia. En rpm.
int V_rotX = 0;  // Velocidad de rotación sobre el eje X, en rpm.
int V_rotZ = 0;  // Velocidad de rotación sobre el eje Z, en rpm.
long P_avanceX = 0;  // Movimiento en el eje X, a lo largo de la guia. En mm.
int P_rotX = 0;  // Movimiento de rotación sobre el eje X, en mm.
int P_rotZ = 0;  // Movimiento de rotación sobre el eje Z, en mm.
long Ret_avanceX = 0;  // Retardo del eje X respecto del inicio del movimiento. En ms.
int Ret_rotX = 0;  // Retardo de rotación del eje X respecto del inicio del movimiento. En ms.
int Ret_rotZ = 0;  // Retardo de rotación del eje Z respecto del inicio del movimiento. En ms.
//-------------------------------------------------------------
void setup()
{
  pinMode(led, OUTPUT); // Configuramos la patilla del led (13) como salida.
  lcd.init();  // Iniciamos el LCD.
  ir.begin();  // Iniciamos el lector de infrarrojos.
  lcd.backlight(); // Enciende la retroiluminacion del LCD.
  lcd.init();  // Iniciamos el LCD.
  lcd.clear();  // Limpia la pantalla del LCD.
  lcd.print("Intervalometro");
  lcd.setCursor(0,1);
  lcd.print(" V5.4 Por JM.");
  delay(4000);
  lcd.clear();  // Limpia la pantalla del LCD.
  Menu_FtgrmsXseg();
}
//-------------------------------------------------------------
void loop()
{
  Menu_FtgrmsXseg();
}
//-------------------------------------------------------------
void Menu_FtgrmsXseg(){
  lcd.clear();  // Limpia la pantalla del LCD.
  do  {
  long fotXseg = datoMando().toInt();  // Recogemos el valor de la función "datoMando".
      lcd.setCursor(0,0);
      lcd.print("Fotgrm/Seg: ");
      lcd.print(fotXseg);
      }
  while (ircode != enter);  // Si las tlclas pulsadas no son enter, seguimos ejecutando el do.
      ircode = 0;
      lcd.setCursor(0,1);
      lcd.print("            ");
      delay(3000);
  Menu_DurVideo();
}
//-------------------------------------------------------------
void Menu_DurVideo(){
  lcd.clear();  // Limpia la pantalla del LCD.
  do  {
  long segVideo = datoMando().toInt();  // Recogemos el valor de la función "datoMando".
      lcd.setCursor(0,0);
      lcd.print("Tiempo/Seg: ");
      lcd.print(segVideo);
      }
  while (ircode != enter);  // Si las tlclas pulsadas no son enter, seguimos ejecutando el do.
      ircode = 0;
      lcd.setCursor(0,1);
      lcd.print("            ");
      delay(3000);
  MenuCamaraMotor();
}
//-------------------------------------------------------------
void MenuCamaraMotor(){
      lcd.clear();  // Limpia la pantalla del LCD.
      lcd.setCursor(0,0);
      lcd.print("MenuCamaraMotor");
      delay(3000);
      lcd.clear();  // Limpia la pantalla del LCD.
      lcd.print("Tiempo/Seg: ");
      lcd.print(segVideo);
    Serial.println(segVideo);   
      lcd.setCursor(0,1);
      lcd.print("Fotgrm/Seg: ");
      lcd.print(fotXseg);
    Serial.println(fotXseg);   
      delay(3000);
     
  }
//-------------------------------------------------------------
String datoMando()    // FUNCIÓN para leer la entrada del mando a distancia.
{                     // ---------------------------------------------------
//  unsigned long ircode;  // Variable que recibe el código del mando de infrarrojos.
    NumFinal= ("");  // Vaciamos la variable para el siguiente código.
  while (ir.available())  // Hacemos un bucle para recibir la señal del mando si se reciben Ir.
  {                       // Comienzo del bucle.
     ircode = ir.read() ;  //Cargamos en la variable el código recibido el mando.
    if (ircode == uno){NumTexto +=1; NumMostrar=1;}    //Tecla 1  // Cuando pulsamos una tecla,
    if (ircode == dos){NumTexto +=2; NumMostrar=2;}    //Tecla 2  // vamos acumulando en la variable
    if (ircode == tres){NumTexto +=3; NumMostrar=3;}   //Tecla 3  // "NumTexto" un número detrás de
    if (ircode == cuatro){NumTexto +=4; NumMostrar=4;} //Tecla 4  // otro, hasta completar una cifra
    if (ircode == cinco){NumTexto +=5; NumMostrar=5;}  //Tecla 5  // que es un dato de texto y luego
    if (ircode == seis){NumTexto +=6; NumMostrar=6;}   //Tecla 6  // hay que convertir en un número.
    if (ircode == siete){NumTexto +=7; NumMostrar=7;}  //Tecla 7
    if (ircode == ocho){NumTexto +=8; NumMostrar=8;}   //Tecla 8
    if (ircode == nueve){NumTexto +=9; NumMostrar=9;}  //Tecla 9
    if (ircode == cero){NumTexto +=0; NumMostrar=0;}   //Tecla 0
    if (ircode == enter)                               //Tecla enter
        {
       NumFinal += NumTexto;  // Cogemos los caracteres acumulados uno detrás de otro.
       NumTexto= ("");  // Vaciamos la variable para la siguiente cifra.
      digitalWrite(led,HIGH);  // Encendemos el led.
      delay (100);  // Esperamos 100 ms.
      digitalWrite(led,LOW);  // Apagamos el led.
        }
    if (ircode == open_close)                          // Tecla open_close.
      {
      lcd.init();  // Iniciamos el LCD.
      lcd.backlight(); // Enciende la retroiluminacion del LCD.
      lcd.clear();  // Limpia la pantalla del LCD.
      }
    lcd.setCursor(0,1);
    lcd.print(NumTexto); // Mostramos en el LCD el número pulsado.
  }
return NumFinal;  // Valor que devuelve esta función.
}

Cuando el programa se ejecuta, nos pide que introduzcamos "Fotgrm/Seg", introducimos un número que se va mostrando mientras lo escribimos con los números del mando, al pulsar enter validamos el dato lo pasamos a una variable "fotXseg", pero el dato aunque se muestra correctamente en el display, no permanece en la variable que se pone a cero. Esto sucede con los dos datos que he comenzado a introducir, el programa final ha de recoger muchos más datos, pero si funcionan estos dos, lo demás será facil de reazlizar.

Espero poder solucionarlo, pero de momento estoy muy atascado, si alguien tiene alguna idea, agradeceré cualquier sugerencia. Gracias anticipadas.

100cass

Hola nuevamente,

Voy a poner un esquema del conexionado para que quede más claro.

No consigo poner una imagen grande, pero dejo el enlace para verla http://www.subirimagenes.com/privadas-intervalmetro002-2201290.html
Respecto del fallo, creo que está en el bucle "do - while":

Code: [Select]
void Menu_FtgrmsXseg(){
  lcd.clear();  // Limpia la pantalla del LCD.
  do  {
  long fotXseg = datoMando().toInt();  // Recogemos el valor de la función "datoMando".
      lcd.setCursor(0,0);
      lcd.print("Fotgrm/Seg: ");
      lcd.print(fotXseg);
      }
  while (ircode != enter);  // Si las tlclas pulsadas no son enter, seguimos ejecutando el do.
      ircode = 0;
      lcd.setCursor(0,1);
      lcd.print("            ");
      delay(3000);
  Menu_DurVideo();
}


Cuando pulsamos la tecla enter del mando, es como introducir un dato nuevo, y aunque en el display no lo muestra, la variable "fotXseg" pasa a valer cero. No se como hacer para guardar el valor antes de pulsar enter, pues es con esta tecla con la que hay que validarlo. Si alguien tiene una idea, agradeceré cualquier sugerencia. Gracias.

100cass

Hola de nuevo:

Asunto solucionado, el problema lo tenía en la definición de las variable y su ámbito. Las variables "fotXseg" y "segVideo" las definía dos veces, una de forma general, al principio del programa, al declararlas y después lo hacía localmente dentro de las funciones donde introducía los datos desde el mando a distancia. Pongo a continuación la parte del código que varía, para que quede más claro lo que digo:

Code: [Select]
void Menu_FtgrmsXseg(){
  do  {
      fotXseg = datoMando().toInt();  // Recogemos el valor de la función "datoMando" y la convertimos de string a Long.
      lcd.setCursor(0,0);
      lcd.print("Fotgrm/Seg: ");
      lcd.print(fotXseg);
      }
  while (ircode != enter);  // Si las tlclas pulsadas no son enter, seguimos ejecutando el do.
      ircode = 0;
      lcd.setCursor(0,1);
      lcd.print("            ");
      delay(3000);
  Menu_DurVideo();
}
//-------------------------------------------------------------
void Menu_DurVideo(){
  lcd.clear();  // Limpia la pantalla del LCD.
  do  {
      segVideo = datoMando().toInt();  // Recogemos el valor de la función "datoMando" y la convertimos de string a Long.
      lcd.setCursor(0,0);
      lcd.print("Tiempo/Seg: ");
      lcd.print(segVideo);
      }
  while (ircode != enter);  // Si las tlclas pulsadas no son enter, seguimos ejecutando el do.
      ircode = 0;
      lcd.setCursor(0,1);
      lcd.print("            ");
      delay(3000);
  MenuCamaraMotor();
}


Como se ve aquí no está el "long" que antes figuraba delante de la línea "fotXseg = datoMando().toInt();  // Recogemos el valor de la función "datoMando" y la convertimos de string a Long." y "segVideo = datoMando().toInt();  // Recogemos el valor de la función "datoMando" y la convertimos de string a Long.".

Ahora continuo con el programa y cuando lo tenga terminado o más avanzado, iré poniéndolo. Gracias por dedicar tiempo a leer este post.

manuelin

Hola soy nuevo en esto .Tengo que hacer un proyecto para el instituto sobre arduino con un mando inflarrojo. Despues de un mes probando no consigo que me saque el codigo por el arduino .Me podreis decir que puede pasar o poner link en librerias que me falten y sketch . Muchisimas gracias de antemano

surbyte

#4
Dec 04, 2014, 02:32 pm Last Edit: Dec 04, 2014, 02:34 pm by surbyte
estas librerías?

#include <NECIRrcv.h>  //Librería del protocolo NEC.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

Google: Arduino NecIRrcv.h
Google: Arduino Wire.h
Google: Arduino LiuidCrystal_I2C.h

lee mi Perfil, dice: busca en GOOGLE o en el foro antes de cualuier consulta. Bien, tu buscaste en el foro, ahora resta que lo hagas en google.
todas las librerias estan disponibles. Las encuentras en poco tiempo.

Por otro lado hablas de un código pero no lo posteas.
Lo mismo... imposible adivinar que has hecho si no compartes.

Lee las normas del foro y verás que todos los links y códigos deben postearse con los tags correspondientes que figuran en este editor.

Go Up