Autor Tema: Convertir pulsos a digitos y transmitirlos por infrarojo  (Leído 3613 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado lorenz3

  • PIC10
  • *
  • Mensajes: 2
Convertir pulsos a digitos y transmitirlos por infrarojo
« en: 30 de Marzo de 2011, 17:39:36 »
Hola a todos,
Me estoy iniciando en el apasionante tema de los microcontroladores y estoy muy interesado en aprender lo más posible al respecto, ya que las posibilidades de realizar proyectos de automatización con ellos son muchas.
Este es primer post en su foro, y a continuación les expongo la idea de mi proyecto para que me orienten sobre la viabilidad de realizar esto con un microcontrolador.
Necesito interpretar los pulsos que envía una vieja máquina tragamonedas e interpretarlos a dígitos para luego enviarlos a través de un infrarrojo a un equipo remoto que los interpretará y reproducirá una melodía contenida en un archivo MP3.
Esta máquina envía pulsos eléctricos (interrupciones) utilizando un voltaje de 24VAC. , de entrada entiendo que los PIC reciben pulsos de no más de 5V dc lo cual habrá que convertir pero que no sería problema.

Lo siguiente, es que necesitaré hacer un programa para interpretar los pulsos en base a una tabla de conversión, esto debido a que la máquina utiliza teclas que van de la A a la V sin utilizar la I y la O, usando un total 20 letras, además de un juego de 8 números que van del 1 al 8. La selección se realiza por la combinación de una letra y un número, ejemplo A1, esto hará que la máquina envíe 21 pulsos o interrupciones por la letra A, seguido de una pausa de aprox. 250 ms y luego 8 pulsos más que corresponde a número seleccionado, esta maquina usa una trama de pulsos en reversa en orden decendende respecto a la letra y número seleccionado, es decir la letra B enviará 20 pulsos o interrupciones, la C enviará 19 pulsos y asñi sucesivamente,  lo mismo sucede con los números.

Esto es básicamente lo que necesito realizar con este proyecto, por lo que les pido su asesoría respecto a la viabilidad de construir este circuito utilizado un PIC el que ustedes me recomienden, y principalmente la viabilidad de transmitir la señal de salida a través de un infrarrojo, que creo deberé reutilizar el circuito del control remoto del equipo receptor para igualar la frecuencia de transmisión.

Dado todo este contexto, lo primero es saber que sea posible hacer esto.
Ojalá que me puedan asesorar ya que no estoy muy relacionado con los microcontroladores.
Les agradeceré toda la información y ayuda que me pueda proporcionar al respecto.

Saludos !!!!

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Convertir pulsos a digitos y transmitirlos por infrarojo
« Respuesta #1 en: 31 de Marzo de 2011, 06:21:08 »
Hola lorenz3, creo que necesitas comentarnos un poco más detalladamente respecto a tu proyecto y tus conocimientos, ya que no estaría de más saber en qué lenguaje piensas programar, cuáles PICs has utilizado, qué módulos del PIC has utilizado y con cuáles crees que se podría realizar, etc.

Veo algunos puntos en tu proyecto que podrían complicarse:

  • Tratándose de una máquina tragamonedas, no veo por qué necesitas transmitir remotamente por infrarrojo, te recuerdo que éste método de comunicacion debe estar alineado y tener libre campo de visión.
  • Dices que deseas reproducir un MP3, no comprendo bien si deseas reproducirlo con un PIC o solo mandarle una señal a otro equipo (me imagino que digital) para que este lo reproduzca, si es el primer caso, esto es posible, pero necesitas manejar memorias SD o algún otro sistema para guardar grán cantidad de datos, además de necesitar una alta velocidad de procesamiento y por ende necesitas como mínimo un PIC18
  • Necesitarás rastrear un teclado, ya sea utilizando un teclado codificado o un teclado matricial para todas las letras que quieres
  • Tambien me gustaría que nos comentaras que tipo de comunicación piensas emplear para transmitir los códigos de tus teclas, síncrona o asíncrona, y si piensas usar un protocolo como I2C, RS232, 1-WIRE, etc, o piensas hacer el tuyo propio
  • Creo que tienes un concepto erroneo de interrupciones, ya que un pulso no es una interrupcion, el pulso puede generar interrupciones, pero en si no lo es, es decir, una interrupción llega al microcontrolador u ocurre dentro de el, no sale de el.
  • Tambien necesitas conocer que tipo de codificación quieres para el infrarrojo, ya que existen varias

Entre todos te podemos ayudar, pero creo que puedes brindarnos más información para poder ver de que manera lo puedes abordar.

Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado lorenz3

  • PIC10
  • *
  • Mensajes: 2
Re: Convertir pulsos a digitos y transmitirlos por infrarojo
« Respuesta #2 en: 01 de Abril de 2011, 17:54:40 »
Hola falflores,
Gracias por tu interés, respondiendo a tus preguntas, tengo conocimientos en electrónica y programación (Algol, Cobol, C), estudié Ingeniería; en cuanto al uso de PIC's, no tengo experiencia, este es mi primer proyecto al respeto, he estado leyendo sobre microcontroladores y me parece que el 16F628A podría ser el elegido para este proyecto usando programación en C, utilizando el contador de pulsos, pero que mejor que tu me des tu recomendación.
 PIC's no se cual será mejor usar, espero sus recomendaciones.
Estas máquinas eran solo selectores remotos de las antiguas rockolas o sinfonolas, en las que se depositaba una moneda y se habilitaba el circuito de selección a través de teclas, en este caso son 20 teclas de letras (de la A a la V eliminando la O y la I), además de 8 teclas de número (del 1 al 8); la combinación de estas permiten alcanzar 160 selecciones, su comunicación con la máquina reproductora de los antiguos discos de vinil era vía cable, a través del que era alimentada con 24VAC y enviaba la señal en base a pulsos que son generados por un disco con contactos que gira impulsado por un pequeño motor al accionar las teclas.
Ahora bien, mi idea es sustituir la máquina reproductora de discos con un pequeño lector de memorias UBS/SD amplificado, este reproductor se opera con un control remoto (IR), y la ventaja aquí es que trae números, no solo teclas de ascendente descendente que solo permiten selección secuencial, por lo que se puede seleccionar los archivos mp3 en forma random o aleatoria, es decir la 1 o la 120 o la 145 o la 200, o regresar a la 23, etc.
Lo que pretendo hacer con un PIC es recibir los pulsos, contarlos y convertirlos en dígitos a través de un programa en C cargado en el PIC,  y que los transmita vía IR al reproductor de memorias; la distancia y la línea de vista deberán ser un problema, pues pueden quedar muy cerca.
En cuanto al concepto de pulsos, en estas máquinas los pulsos que enviaban para comunicarse con la máquina principal, son realmente interrupciones del voltaje enviado en forma constante, es decir como operaban estos equipos era que permanentemente enviaban el voltaje de los 24VAC por el cable de señal, con ello la máquina principal sabia de su presencia, por lo que cuando se hacia una selección en en el selector remoto, los pulsos que generaba eran realmente interrupciones del voltaje de los 24VAC, mismos que interpretaba el receptor de la rockola para reproducir la melodía selecciona, esto fue un protocolo antiguo que usaron estas máquinas entre los años 40's, 50's y principios de los 60's.
En cuanto a la codificación del IR sería RC-5.
Espero que esta información proporciones más claridad sobre lo que pretendo hacer, y me puedan ayudar.
Saludos !!!       


Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Convertir pulsos a digitos y transmitirlos por infrarojo
« Respuesta #3 en: 08 de Abril de 2011, 06:15:35 »
Hola de nuevo Lorenz3, por favor disculpame por no contestaste, pero la verdad no supe si borre tu mensaje de mi bandeja de entrada o que paso, por que no recuerdo haberlo visto.´

Pues creo que ya comprendí mejor tu proyecto.

Por lo que entendí quieres utilizar infrarojo debido a que es la única forma de controlar tu reproductor de MP3 correcto?, entonces, mientras lo mantengas en linea y sin obstaculos entre el emisor y el receptor no habría problemas.

Para la tarea que quieres realizar de contar pulsos, si te queda bien el 16F628A, ya que en comparación al precio, trae todas las prestaciones que necesitas.

Lo de adecuar los niveles de voltaje, no lo veo un problema, ya que debido a que va a ser por infrarojo, simplemente conecta tu emisor de infrarojo a los 24v, calculando que pase por el una corriente de unos 20 mA, con una resistenca de unos 1.2Kohms.

Te conviene usar la interrupcion externa por el PIN_B0, la cuál la puedes configurar de alto a bajo o viceversa, dependiendo de en qué parte de la señal se detecte el pulso, se configura en CCS de la siguiente forma, y un ejemplo de cómo implementar el programa, sería:

Código: [Seleccionar]
// Se definen primero el número de pulsaciones para cada letra
#define TECLA_A   21
#define TECLA_B   20
#define TECLA_C   19
.
.
.
int8 pulsaciones;  // Variable global para contar pulsos
int1 flag_terminacion_pulsos=0; // Variable que dice si ya se transmitieron todos los pulsos de un solo caracter
unsigned char caracter;  // Caracter que se va a transmitir

#INT_TIMER0
void tiempo_entre_pulsos()
{
   // Si ya paso el tiempo máximo entre pulsos del mismo caracter, significa que
   // ya son todos los pulsos de ese caracter, y se activa la bandera de termino.
   flag_terminacion_pulsos=1;
}

#INT_EXT
void pulse_counter()  // Función que determina cual tecla se pulso
{
   pulsaciones++;  // Se incrementa en 1 el contador de pulsos
   set_timer0(0);  // Se reinicia el timer0 para dar tiempo al siguiente pulso
}

void main()
{
   // otras configuraciones del PIC
   EXT_INT_EDGE(L_TO_H);   ó   EXT_INT_EDGE(H_TO_L);
   ENABLE_INTERRUPTS(INT_EXT);  // Habilitas la interrupcion externa
   SETUP_TIMER0.......  // Aquí iria la configuracion para lograr el tiempo entre
                                 // un pulso y otro.
   ENABLE_INTERRUPTS(INT_TIMER0);
   ENABLE_INTERRUPTS(GLOBAL);  // Habilitas interrupciones globales
   while(TRUE)  // Ciclo de polling (infinito)
   {
      if(flag_terminacion_pulsos==1) // Si ya se termino de contar
      {
         switch(pulsaciones)
         {
            case TECLA_A:
            caracter='A'
            break;
            case TECLA_B:
            caracter='B'
            break;
            case TECLA_C:
            caracter='C'
            break;
            .
            .
            .
         }
         flag_terminacion_pulsos=0;  // Se resetea la bandera para recibir otro caracter
      }
   }
}



De esta forma lo que se haría es:

Cada que se empiece a transmitir un caracter nuevo, el contador de pulsos comenzaria a incrementarse, al mismo tiempo que el timer0 se activa para saber cuando se ha terminado de transmitir ese caracter. Es muy importante que al TIMER0 le des el tiempo que tarda entre un pulso y otro, para que cuando se terminen los pulsos de un solo caracter, como ya no se va a transmitir durante un tiempo mayor, el TIMER0 se desbordará y esto significará que ya se transmitió, activandose una bandera, y ya puedes saber que caracter llego por medio del switch en el while(TRUE).

Espero que estos consejos te sirvan, y si tenes más dudas, me dices  ;-)


Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com