[Aporte] Control remoto infrarrojo de 4 canales con pic

Hola gente, aqui les dejo un un proyecto que seguramente les va ainteresar, se trata de un control remoto infrarrojo de 4 canales con pic 12f629 de mi propia mano :D (copy right) jajaja...
bueno, les dejo el pdf con el proyecto y un video con un intento de explicacion. un gran saludo a todos ;) (y)

 

Adjuntos

  • control remoto infrarrojos.pdf
    919.8 KB · Visitas: 541
  • Proyecto Inrarrojo.rar
    1.5 MB · Visitas: 495
Última edición:
Aunque esta el .hex en tu aporte me gustaria tener en mano la explicación del programa, ya sea en ensamblador o lo que hayas utilizado y particularmente el del transmisor.

Enriqueciendo un poco tu estupendo aporte dejo un programa en Basic (IDE de proton) que utilizo muy regularmente para aplicaciones como la que presentas y que sirve prácticamente en cualquier microcontrolador de microchip (modificando las lineas correspondientes), con el mismo receptor infrarojo que utilizas aunque yo no requiero invertir la señal que entrega el receptor infrarojo.

Por otro lado, este programa que comparto decodifica cualquier transmisor infrarojo de TV SONY y por tanto se pueden obtener tantos comandos como el propio control tenga.

'****************************************************************
'* Name : DECSONYIR.BAS *
'* Author : Miguel Angel Borbolla Bonomi *
'* Notice : Copyright (c) 2012 CIBERTLAN *
'* : All Rights Reserved *
'* Date : 06/03/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************

Device = 18F2550

Xtal = 48

Declare Sonyin_Pin = PORTB.0 ' se asigna el pin RB0 (pin 21) para recibir datos del receptor Infrarojo
Dim SONYIN_WORD As Word ' Se crea una variable de "palabra completa" para recibir el tren de datos
' Se hace un ALIAS de el BYTE BAJO que contiene los comandos de la variable SONYIN_WORD
Dim SONY_COMMAND As SONYIN_WORD.LowByte
' Se hace un ALIAS de el Byte ALTO que contiene el tipo de systema de la variable SONYIN_WORD
Dim SONY_SYSTEM As SONYIN_WORD.HighByte

' Se crean alias del puerto B (Pin 22 al 28) con el nombre LEDX respectivamente

Symbol LED1 PORTB.1
Symbol LED2 PORTB.2
Symbol LED3 PORTB.3
Symbol LED4 PORTB.4
Symbol LED5 PORTB.5
Symbol LED6 PORTB.6
Symbol LED7 PORTB.7



All_Digital = On ' se asignas todas las entradas como digitales

While 1 = 1 ' Se crea un Loop Infinito
Repeat
SONYIN_WORD = SonyIn ' Se recibe el tren de datos del receptor infrarojo
Until SONY_COMMAND<> 255 ' Se queda repitiendose la recepcion hasta que el byte bajo (comandos) sea diferente a 255

'Se procesa la informacion del comando recibido y se prende el led correspondiente

If SONY_COMMAND=0 Then High LED1
If SONY_COMMAND=1 Then High LED2
If SONY_COMMAND=2 Then High LED3
If SONY_COMMAND=3 Then High LED4
If SONY_COMMAND=4 Then High LED5
If SONY_COMMAND=5 Then High LED6
If SONY_COMMAND=6 Then High LED7

DelayMS 1000 ' espera 1 segundo
PORTB=0 ' Se borra el contenido del puerto B y se repite el Loop para recibir otro dato.
Wend

Te dejo un cordial saludo y dejo ya diagrama en donde funciona este programa.
 

Adjuntos

  • decodificador_sony.gif
    decodificador_sony.gif
    26.9 KB · Visitas: 304
  • SON-030.jpg
    SON-030.jpg
    69.5 KB · Visitas: 139
Última edición:
Bueno, aqui les dejo los programas que escribi en pic basic pro por si quieren modificarlos a su guso jeje... al transistor inversor que esta a la salida del tsop1738, lo puse solo para aumentarle algo mas al receptor, de manera que la placa no se viera tan desprovista de componentes. eso se puede eliminar cambiando un poco el prorama tanto del receptor, como del transmisor. lindo codigo el del decodificador de controles sony, ya estoy pensando en una version pbpro :D pero me gustaria saber si hay alguna libreria que se encargue de eso para el microcode... saludosss

transmisor:

Código:
'****************************************************************
'*  Name    : trans629serout.BAS                                *
'*  Author  : Cesar Quinteros                                   *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26/10/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
                         'configuracion de fuses (fusibles)
@ DEVICE pic12F629, intrc_osc_noclkout, wdt_off, pwrt_off, mclr_off, bod_off, protect_off
 
                          'includes
include "modedefs.bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4              'óscilador interno a 4mhz

CMCON=7  'COMPARADOR OFF
                          'configuracion de puertos
TRISIO=%00110011
GPIO=%00110011
                          'declaracion de variables
bot1 var GPIO.0
bot2 var GPIO.1
bot3 var GPIO.4
bot4 var GPIO.5
pulso var GPIO.2
                          'loop de inicio
inicio:
if bot1=0 then pres1
if bot2=0 then pres2
if bot3=0 then pres3
if bot4=0 then pres4
goto inicio
                         'acciones
pres1:
serout pulso,N2400,["A"]
pause 10
goto inicio

pres2:
serout pulso,N2400,["B"]
pause 10
goto inicio

pres3:
serout pulso,N2400,["C"]
pause 10
goto inicio

pres4:
serout pulso,N2400,["D"]
pause 10
goto inicio

end

Receptores:

carrito a control remoto:

Código:
'****************************************************************
'*  Name    : autito (carrito) a control remoto.BAS                                *
'*  Author  : Cesar Quinteros]                                  *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26/10/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
                           'configuracion de fuses (fusibles)
@ DEVICE pic12F629, intrc_osc_noclkout, wdt_off, pwrt_off, mclr_off, bod_off, protect_off 

                      'includes
include "modedefs.bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4  'oscilador interno a 4mhz
CMCON=7  'COMPARADOR OFF

                 'configuracion de puertos
TRISIO=%00001000
GPIO=%00001000

                 'declaracion de variables
LED1 var GPIO.0         
LED2 VAR GPIO.1
LED3 VAR GPIO.4
LED4 VAR GPIO.5
pulso var GPIO.3
ancho var byte
                  'loop de inicio
inicio:
serin pulso,N2400,50,res,ancho
if ancho="A" then adel
if ancho="B" then atras 
if ancho="C" then izq
if ancho="D" then der
goto inicio

adel:
HIGH LED1
low led2
low led3
high led4
goto inicio

atras:
low LED1
high led2
high led3
low led4
goto inicio

izq:
low LED1
high led2
low led3
high led4
goto inicio

der:
high LED1
low led2
high led3
low led4
goto inicio

                 'pone todos los puertos de salida a cero
res:
LOW LED1:LOW LED2:LOW LED3:LOW LED4
goto inicio

end

on off:
Código:
'****************************************************************
'*  Name    : on off.BAS                                *
'*  Author  : Cesar Quinteros]                                  *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26/10/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
                           'configuracion de fuses (fusibles)
@ DEVICE pic12F629, intrc_osc_noclkout, wdt_off, pwrt_off, mclr_off, bod_off, protect_off 

                      'includes
include "modedefs.bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4  'oscilador interno a 4mhz
CMCON=7  'COMPARADOR OFF

                 'configuracion de puertos
TRISIO=%00001000
GPIO=%00001000

                 'declaracion de variables
LED1 var GPIO.0         
LED2 VAR GPIO.1
LED3 VAR GPIO.4
LED4 VAR GPIO.5
pulso var GPIO.3
ancho var byte
 
                  'loop de inicio

clear                  
                  
apagauno:
low led1
pause 300
gosub lectura
if ancho="A" then uno
gosub leepuertos
goto apagauno

uno:
high led1
pause 300
gosub lectura
if ancho="A" then apagauno
gosub leepuertos
goto uno

dos:
high led2
pause 300
gosub lectura
if ancho="B" then apagados
gosub leepuertos
goto dos

apagados:
low led2
pause 300
gosub lectura
if ancho="B" then dos
gosub leepuertos
goto apagados

tres:
high led3
pause 300
gosub lectura
if ancho="C" then apagatres
gosub leepuertos
goto tres

apagatres:
low led3
pause 300
gosub lectura
if ancho="C" then tres
gosub leepuertos
goto apagatres

cuatro:
high led4
pause 300
gosub lectura
if ancho="D" then apagacuatro
gosub leepuertos
goto cuatro

apagacuatro:
low led4
pause 300
gosub lectura
if ancho="D" then cuatro
gosub leepuertos
goto apagacuatro

lectura:
serin pulso,N2400,ancho
return

leepuertos:
if ancho="A" then uno
if ancho="B" then dos 
if ancho="C" then tres
if ancho="D" then cuatro
return

end

push boton:
Código:
'****************************************************************
'*  Name    : receptor push.BAS                                *
'*  Author  : Cesar Quinteros]                                  *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26/10/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
                           'configuracion de fuses (fusibles)
@ DEVICE pic12F629, intrc_osc_noclkout, wdt_off, pwrt_off, mclr_off, bod_off, protect_off 

                      'includes
include "modedefs.bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4  'oscilador interno a 4mhz
CMCON=7  'COMPARADOR OFF

                 'configuracion de puertos
TRISIO=%00001000
GPIO=%00001000

                 'declaracion de variables
LED1 var GPIO.0         
LED2 VAR GPIO.1
LED3 VAR GPIO.4
LED4 VAR GPIO.5
pulso var GPIO.3
ancho var byte
                  'loop de inicio
inicio:
serin pulso,N2400,50,res,ancho
if ancho="A" then adel
if ancho="B" then atras 
if ancho="C" then izq
if ancho="D" then der
goto inicio

adel:
HIGH LED1
low led2
low led3
low led4
goto inicio

atras:
low LED1
high led2
low led3
low led4
goto inicio

izq:
low LED1
low led2
high led3
low led4
goto inicio

der:
low LED1
low led2
low led3
high led4
goto inicio

                 'pone todos los puertos de salida a cero
res:
LOW LED1:LOW LED2:LOW LED3:LOW LED4
goto inicio

end
 
Hasta donde sé, no existe una librería para PBpro para decodificar el protocolo Sirc de Sony, sin embargo cuando utilizaba ese compilador acoplaba el siguiente código (que no es mio y no recuerdo de donde lo obtuve para hacer la referencia) para obtener el comando, ojala te de una idea de como utilizarlo, yo ya no tengo el PBpro como para confirmartelo, pero te aseguro que funcionaba decentemente.

utilizaba un PIC12F629 o un PIC12F675 y el receptor infrarojo lo conectaba al pin GPIO.4

@ DEVICE INTRC_OSC, MCLR_off, PROTECT_OFF, WDT_OFF
CMCON = 7 ‘ Comparators OFF
ANSEL = 0 ‘ A/D OFF — Port pins all digital
TRISIO = %010000 ‘ Todas las salidas de I/O solo GPIO3 como salida
GPIO = %00000000 ‘ Se ponen las salidas en 0
Define OSCCAL_1K 1 ‘ se calibra el OSCCAL para 1K
' se definen variables y se inicializan a cero
IRpulse_length var word(13)
xx var Byte
Command Var Byte
Clear

' se utiliza el comando pulsin para tomar medidas del de los pulsos menores a 2000us e intenta de nuevo, pero si no hay presencia se sale y deja un valor de comando 0

Getstartbits:
Pulsin GPIO.4,0,IRpulse_length(0)
if IRpulse_length(0) < 200 then
goto getstartbits
Endif

'Una ves que el es bit de inicio es recibido el programa comienza a tomar los proximos 12 pulsos y los guarda en el arreglo Irpulse_length.


for xx=1 to 12
pulsin GPIO.4,0,IRpulse_length(xx)
next xx


'despues el programa verifica los anchos de los pulsos y determina si son unos o ceros logicos, si miden menos de 1000us son ceros y en contraparte serian unos.


displaybits:
if IRpulse_length(1) < 100 then
Command.bit0 = 0
Else
Command.bit0 = 1
endif
if IRpulse_length(2) < 100 then
Command.bit1 = 0
Else
Command.bit1 = 1
endif
if IRpulse_length(3) < 100 then
Command.bit2 = 0
Else
Command.bit2 = 1
endif
if IRpulse_length(4) < 100 then
Command.bit3 = 0
Else
Command.bit3 = 1
endif
if IRpulse_length(5) < 100 then
Command.bit4 = 0
Else
Command.bit4 = 1
endif
if IRpulse_length(6) < 100 then
Command.bit5 = 0
Else
Command.bit5 = 1
endif
if IRpulse_length(7) < 100 then
Command.bit6 = 0
Else
Command.bit6 = 1
endif
if IRpulse_length(8) < 100 then
Command.bit7 = 0
Else
Command.bit7 = 1
Endif

If Command.bit7 = 0 then ‘El Bit 7 indica si es TV, VCR u otro sistema, en este caso tomaremos como valido solo los de un control de TV
Command = Command + 1
Endif
If Command = 10 then
Command = 0
Endif

Una ves que el comando fue decodificado (esta guardado en la variable Command) se puede tratar para los fines que se desee, en la linea siguiente se envia el dato decodificado a 9600 bps invertidos y espera el siguiente comando desde el infrarojo.

SEROUT GPIO.0,2,[Command]
pause 100
goto Getstartbits

Saludos
 
Última edición:
Hola, seria posible hacerlo de 12-16 canales con un pic 16f628 o similar no necesito mucha distacia entre 8-10 centimetro, es para un camion y el remorque, yo enciendo las luces con la emisora, pero me falta poder encender las luces del remorque cuando lo engancho sin tener usar un conector y si es posible en (ASM) que es lo que estoy usando pues soy novato. GRACIAS

P.D. si es con otro pic me da igual lo conseguiria
 
Hola, seria posible hacerlo de 12-16 canales con un pic 16f628 o similar no necesito mucha distacia entre 8-10 centimetro, es para un camion y el remorque, yo enciendo las luces con la emisora, pero me falta poder encender las luces del remorque cuando lo engancho sin tener usar un conector y si es posible en (ASM) que es lo que estoy usando pues soy novato. GRACIAS

P.D. si es con otro pic me da igual lo conseguiria

Por supuesto que puede ser de tantos canales como se quiera, si utilizas el ejemplo que comparto con un control remoto de sony, puedes usar tantos como el propio control remoto tenga, ahora si eres novato, como comentas, lograrlo en asembler no es tan fácil; por estas razones es que utilizo el lenguaje de programación BASIC que da muchas prestaciones y ya tienes tanto el proyecto de D@ario como el de tu servidor en mano.

Obvio necesitas del compilador correspondiente para lograrlo, pero bueno son cosas imprescindibles par lograrlo.

Por ultimo, el alcance de los infrarojos puede alcanzar los 8 9 metros sin mucho problema, yo lo utilizo muchísimo por que un control remoto de Sony, es verdaderamente muy barato.

Saludos y ojala te sirva el aporte.
 
Hola, gracias "MIBORBOLA" : entonces seria mejor que lo hiciera en Basic, si es asi que programa tendria que usar para escribir el codigo,compilarlo y grabarlo (tengo el MPLAB IDE v8.00, el grabador PICKIT 2 v2.1, el PROTEUS v8 PROFESSIONAL, el PCB WIZARD v? y alguno mas sin instalar.

SOLO necesito de 8 a 10 centimetros de alcance que es la distancia aproximada entre camion y remolque (DE JUGUETE) no quisiera interferir en algun aparato de TV
 
(tengo el MPLAB IDE v8.00, el grabador PICKIT 2 v2.1, el PROTEUS v8 PROFESSIONAL, el PCB WIZARD v? y alguno mas sin instalar.

SOLO necesito de 8 a 10 centimetros de alcance que es la distancia aproximada entre camion y remolque (DE JUGUETE) no quisiera interferir en algun aparato de TV


Tendrías que conseguirte o instalarte el compilador de basic http://melabs.com/ que no se si tengas, a mi parecer el ejemplo que nos aporta D@rio se acerca mucho mas a lo que requieres y requiere de este compilador en particular.

Saludos
 
Tengo un par de preguntas para miborbolla o para quien me pueda ayudar a aclararlas.
1.-En estas instrucciones:

If SONY_COMMAND=0 Then High LED1
If SONY_COMMAND=1 Then High LED2
If SONY_COMMAND=2 Then High LED3
If SONY_COMMAND=3 Then High LED4
If SONY_COMMAND=4 Then High LED5
If SONY_COMMAND=5 Then High LED6
If SONY_COMMAND=6 Then High LED7

De donde sacas el 0,1,2,3,4,5,6.,etc en base a que o que me representan,mi duda es por que hace tiempo arme un circuito con arduino y un receptor TSOPXXXX y bueno abri la Consola Serial y probe un control remoto con protocolo NEC y hacia lo siguiente aprieto un boton digamos ENTER y me aparecia 0XF807FF00,STOP=0XBA45FF00...y asi sucesivamente y ya con esos valores tomar decisiones,como por ejemplo mover un carrito Adelante,Reversa,giros.,etc.
En resumen los valores me los arrojaba en formato Hexadecimal de este tipo 0XF807FF00
y bueno esa es mi duda esos valores (1,2,3,4,5,6) de tus IF SONY_COMMAND, son los que manda el control remoto o son la teclas que presionas,haber si me puedes aclarar esas dudas por que no me quedo claro...Gracias

2.-Si quiero utilizar un PIC16f628A que mas necesito cambiar?,voy a utilizar un cristal de 20 Mhz,puedo ocupar cualquier pin como entrada del receptor TSOPXXXX?

3.- Me podras ayudar como probar este programa que amablemente compartes en el SERIAL COMUNICATOR de Proton IDE osea que Hardware necesito logicamente un control tv Sony,el circuito receptor sin el USB que se ve en tu diagrama.quiero probar varios controles remotos.En si como le hago para que me muestre los valores(datos) en la pantalla de la consola serial de proton ide...Gracias por sus opiniones
 
Hola Cosmico74:

Los valores los obtuve presentando en un display LCD, el contenido de la variable "SONY_COMMAND", este display lo conecte al pic y obtuve la tabla que te anexo en el archivo adjunto y el programa que utilize es el siguiente:

'****************************************************************
'* Name : lcd1.BAS *
'* Author : Miguel Angel Borbolla Bonomi *
'* Notice : Copyright (c) 2012 CIBERTLAN *
'* : All Rights Reserved *
'* Date : 31/05/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Device = 18F4550

Xtal = 48


Declare LCD_ENPin PORTB.0
Declare LCD_RSPin PORTB.1
Declare LCD_DTPin PORTB.4
Symbol lcdw PORTB.2 ' la linea se utiliza para poner en 0 la linea RW del LCD
LCD_Interface=4
LCD_Lines=2
LCD_Type=0
Declare LCD_DataUs 255 ' comado que da un tiempo de espera al enviar datos al display

Declare Sonyin_Pin = PORTB.3
Dim SONYIN_WORD As Word

Dim SONY_COMMAND As SONYIN_WORD.LowByte

Dim SONY_SYSTEM As SONYIN_WORD.HighByte

Dim Imprime As String *40

Imprime="Decodificador IR"

All_Digital = On
Low lcdw ' la linea se utiliza para poner en 0 la linea RW del LCD
Print $FE, 1
DelayMS 500
Print At 1,1, Imprime

While 1 = 1
Repeat
SONYIN_WORD = SonyIn '
Until SONY_COMMAND<> 255
DelayMS 500
Print At 2,1," "
Print At 2,1,"Valor recibido=",Dec SONY_COMMAND
Print At 3,1," "


Wend

Con respecto a tu segunda pregunta, si puedes usar cualquier pin, si te fijas en este codigo, utilizo un PIC diferente, con un PIN diferente...

En un una oportunidad te comparto un código que envié por el puerto serial del pic el valor de "SONY_COMMAND" espero no tardarme en hacerlo.

Espero te aclare tus dudas, entre tanto recibe un cordial saludo.
 

Adjuntos

  • TABALVALORSONYTV.txt
    430 bytes · Visitas: 178
Última edición:
hola, miborbolla.Ya tengo el compilador PBP, pero ahora tengo una pregunta si utilizo el codigo Sony podre usar varios botones a la vez?, yo lo que necesito es lo siguiente a travez de la emisora con un interructor enciendo la luz de pocision y queda encendido es Toggle (fijo), pulso otro y tambien hace lo mismo pero el primero sigue encendido y asin con todos un total de 16 pulsadores que enciendo o apago por separado cuando yo quiero, en el receptor quiero poner antes de la salida a los reles una toma para que active el pulsador (o entrada del emisor)del infrarrojo y enviar la señal al remolque,. Mi proyecto es para un camion con remorque de juguete sin tener que utilizar cables entre C. y R.

Hos agradesco de antemano toda la ayuda que reciba: Saludos a todos desde Barcelona
 
Última edición:
Hola fj7495sa, en mi ultimo comentario dirigido a ti, comente que a mi parecer, la forma que utiliza D@rio para comunicación es mas adecuado para lo que buscas y que No es el sistema Sirc de SONY, el que utiliza D@rio es una comunicación serial estándar a 2400 BPS y por tanto tienes la ventaja de poder hacer prácticamente lo que quieras con este protocolo, mientras que con un control remoto como el de sony, aunque tienes muchos botones en realidad solo puedes aprovechar uno a la vez y no muchos al mismo tiempo como pretendes.

Yo pienso que si realizas el montaje que nos propone D@rio y ya que lo tengas en marcha (con sus 4 canales) ya después podrás explorar y vislumbrar con mucho mas claridad llevar a buen fin tu proyecto y expandirlo a los canales y/o botones que deseas.

Yo utilizo o aprovecho el sistema SIRC de SONY, en primero por que un control remoto SONY es muy barato y fácil de conseguir y en segundo tengo a mi disposición muchos comandos o botones ocupando un solo PIN de mi microcontrolador, pero te aclaro nuevamente que no puedo utilizar 2 o mas botones a la vez, definitivamente eso no se puede hacer en un control remoto de TV, VCR, DVD etc, etc.

Por estas razones en mis comentarios he estado dirigiéndote a utilizar la forma de comunicación que aprovecha en su proyecto nuestro compañero D@rio y que en un principio de su aporte le solicite a D@rio que nos compartiera el código ya que de esta manera nos ayudaría mucho a todos y que yo agradezco esta gentileza de su parte.

Te dejo un cordial saludo y espero estar ayudándote lo suficiente.
 
Última edición:
Me gusta tu aporte, me gusta jejeje ya se en que lo voy a utilizar, excelente, tenes 10 amigo...!!!



Por otro lado, este programa que comparto decodifica cualquier transmisor infrarojo de TV SONY y por tanto se pueden obtener tantos comandos como el propio control tenga.
Te dejo un cordial saludo y dejo ya diagrama en donde funciona este programa.


Explica un poquito amigo, yo soy un poco rudo para esto y voy aprendiendo a patadas y trompadas, te lo agraeceria..!!
 
Última edición:
Que tal miborbolla! estaba ensamblando este codigo en protoboard y LCD


'************************************************* ***************
'* Name : lcd1.BAS *
'* Author : Miguel Angel Borbolla Bonomi *
'* Notice : Copyright (c) 2012 CIBERTLAN *
'* : All Rights Reserved *
'* Date : 31/05/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'************************************************* ***************
Device = 18F4550

Xtal = 48


Declare LCD_ENPin PORTB.0
Declare LCD_RSPin PORTB.1
Declare LCD_DTPin PORTB.4
Symbol lcdw PORTB.2 ' la linea se utiliza para poner en 0 la linea RW del LCD
LCD_Interface=4
LCD_Lines=2
LCD_Type=0
Declare LCD_DataUs 255 ' comado que da un tiempo de espera al enviar datos al display

Declare Sonyin_Pin = PORTB.3
Dim SONYIN_WORD As Word

Dim SONY_COMMAND As SONYIN_WORD.LowByte

Dim SONY_SYSTEM As SONYIN_WORD.HighByte

Dim Imprime As String *40

Imprime="Decodificador IR"

All_Digital = On
Low lcdw ' la linea se utiliza para poner en 0 la linea RW del LCD
Print $FE, 1
DelayMS 500
Print At 1,1, Imprime

While 1 = 1
Repeat
SONYIN_WORD = SonyIn '
Until SONY_COMMAND<> 255
DelayMS 500
Print At 2,1," "
Print At 2,1,"Valor recibido=",Dec SONY_COMMAND
Print At 3,1," "


Wend


Para decodificar el control sony tv pero me marca error en la zona de results (abajo) en proton IDE creo que entender que solamente ese pic soporta esa instruccion este es el mensaje que me manda...string variables only supported with 18F or enhanced core devices!haber si me pueden dar una ayuda o como le puedo hacer...Estoy utilizando un PIC16F628A,cristal 16Mhz...Haber si puedo subir una imagen.
 

Adjuntos

  • pantalla.JPG
    pantalla.JPG
    145.2 KB · Visitas: 64
El error es por que se utiliza la instrucción;

"Dim Imprime As String *40" es la linea que te tira el error y en efecto es propia de los microcontroladores mas grandes pero si evitas esta instrucción y dejas el código así:

'****************************************************************
'* Name : lcd1.BAS *
'* Author : Miguel Angel Borbolla Bonomi *
'* Notice : Copyright (c) 2012 CIBERTLAN *
'* : All Rights Reserved *
'* Date : 31/05/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Device = 16F628

Xtal = 16


Declare LCD_ENPin PORTB.0
Declare LCD_RSPin PORTB.1
Declare LCD_DTPin PORTB.4
Symbol lcdw PORTB.2 ' la linea se utiliza para poner en 0 la linea RW del LCD
LCD_Interface=4
LCD_Lines=2
LCD_Type=0
Declare LCD_DataUs 255 ' comado que da un tiempo de espera al enviar datos al display

Declare Sonyin_Pin = PORTB.3
Dim SONYIN_WORD As Word

Dim SONY_COMMAND As SONYIN_WORD.LowByte

Dim SONY_SYSTEM As SONYIN_WORD.HighByte

All_Digital = On
Low lcdw ' la linea se utiliza para poner en 0 la linea RW del LCD
Print $FE, 1
DelayMS 500
Print At 1,1, "Hola"
While 1 = 1
Repeat
SONYIN_WORD = SonyIn '
Until SONY_COMMAND<> 255
DelayMS 500
Print At 2,1," "
Print At 2,1,"Valor recibido=",Dec SONY_COMMAND
Print At 3,1," "

If SONY_COMMAND=21 Then Print At 3,1,"Power "
If SONY_COMMAND=20 Then Print At 3,1,"Muting "
If SONY_COMMAND=18 Then Print At 3,1,"Vol + "
If SONY_COMMAND=19 Then Print At 3,1,"Vol - "
If SONY_COMMAND=16 Then Print At 3,1,"Chan + "
If SONY_COMMAND=17 Then Print At 3,1,"Chan - "
If SONY_COMMAND=96 Then Print At 3,1,"Menu "
If SONY_COMMAND=54 Then Print At 3,1,"Sleep "
If SONY_COMMAND=58 Then Print At 3,1,"Dispaly "
If SONY_COMMAND=22 Then Print At 3,1,"Reset "
If SONY_COMMAND=11 Then Print At 3,1,"Enter "
If SONY_COMMAND=116 Then Print At 3,1,"Flecha arriba"
If SONY_COMMAND=117 Then Print At 3,1,"Flecha abajo "
If SONY_COMMAND=52 Then Print At 3,1,"Flecha izq "
If SONY_COMMAND=51 Then Print At 3,1,"Flecha Der "
If SONY_COMMAND=101 Then Print At 3,1,"Centro "
If SONY_COMMAND=59 Then Print At 3,1,"Jump "
If SONY_COMMAND=23 Then Print At 3,1,"MTS/SAP "
If SONY_COMMAND=37 Then Print At 3,1,"TV/Video "

Wend

Ya te compilara sin ningún problema y podrás usar el código con tu PIC 16f628, ya lo comprobé.

Saludos
 
Tengo un par de preguntas para miborbolla o para quien me pueda ayudar a aclararlas.
1.-En estas instrucciones:

If SONY_COMMAND=0 Then High LED1
If SONY_COMMAND=1 Then High LED2
If SONY_COMMAND=2 Then High LED3
If SONY_COMMAND=3 Then High LED4
If SONY_COMMAND=4 Then High LED5
If SONY_COMMAND=5 Then High LED6
If SONY_COMMAND=6 Then High LED7

De donde sacas el 0,1,2,3,4,5,6.,etc en base a que o que me representan,mi duda es por que hace tiempo arme un circuito con arduino y un receptor TSOPXXXX y bueno abri la Consola Serial y probe un control remoto con protocolo NEC y hacia lo siguiente aprieto un boton digamos ENTER y me aparecia 0XF807FF00,STOP=0XBA45FF00...y asi sucesivamente y ya con esos valores tomar decisiones,como por ejemplo mover un carrito Adelante,Reversa,giros.,etc.
En resumen los valores me los arrojaba en formato Hexadecimal de este tipo 0XF807FF00
y bueno esa es mi duda esos valores (1,2,3,4,5,6) de tus IF SONY_COMMAND, son los que manda el control remoto o son la teclas que presionas,haber si me puedes aclarar esas dudas por que no me quedo claro...Gracias

2.-Si quiero utilizar un PIC16f628A que mas necesito cambiar?,voy a utilizar un cristal de 20 Mhz,puedo ocupar cualquier pin como entrada del receptor TSOPXXXX?

3.- Me podras ayudar como probar este programa que amablemente compartes en el SERIAL COMUNICATOR de Proton IDE osea que Hardware necesito logicamente un control tv Sony,el circuito receptor sin el USB que se ve en tu diagrama.quiero probar varios controles remotos.En si como le hago para que me muestre los valores(datos) en la pantalla de la consola serial de proton ide...Gracias por sus opiniones

En este video se ve como se obtienen los valores desde el C/R Sony.

 
Hola a todos, aqui pongo un "proyecto" simulado de lo que voy a hacer, no hacer caso de las conecciones lo he hecho para que tengais una idea y me digais si es posible conectar 2 12f629 de esta forma y asin tener 8 salidas. Si esto es casi correcto ya pondria el proyecto real para su posible rectificacion antes de realizarlo en placa.

P.D. en realidad lo haria, emisor 16f684, receptor 16f628

Gracias y saludos
 

Adjuntos

  • proyecto inrreal.rar
    2.2 KB · Visitas: 127
Última edición:
Que tal miborbolla! Ya probe el codigo con varios controles remoto TV SONY,lcd,en el protoboard y estos fueron mis resultados: al oprimir las teclas 0,1,2,3,4,5,6,7,8,9 me aparecen los valores en LCD= 9,0,1,2,3,4,5,6,7,8 respectivamente hasta aqui todo correcto,conforme a tu tablavalorSony.Pero al apretar Mute,Power,Reset,Jump,Enter,Menu,Power,...etc.,no me aparecen los valores de la tabla me aparecen 1,5,3,4 osea valores en unidades nada que ver con estos valores:

POWER 21
MUTTING 20
SLEEP 54
MTS/SAP 23
DISPLAY 58
TV/VIDEO 37
JUMP 59
ENTER 11
VOL + 18
VOL - 19
CH + 16
CH - 17
RESET 22
MENU 96
FLECHA ARRIBA 116
FLECHA ABAJO 117
FLECHA DERECHA 51
FLECHA IZQUIERDA 52
cENTRO DE CURSOR 101


A que se debera esto?,ya probe con diferentes controles remoto TV SONY.unos con mas funciones que otros...
Utilizo PIC16F628A XTAL=16Mhz

Y suponiendo que ya casi queda este codigo al 100% uffff claro con tu ayuda faltaria nada mas arreglar este detalle...ya puedo utilizar ahora si el codigo de tu mensaje #2


'************************************************* ***************
'* Name : DECSONYIR.BAS *
'* Author : Miguel Angel Borbolla Bonomi *
'* Notice : Copyright (c) 2012 CIBERTLAN *
'* : All Rights Reserved *
'* Date : 06/03/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'************************************************* ***************

Device = 18F2550

Xtal = 48

Declare Sonyin_Pin = PORTB.0 ' se asigna el pin RB0 (pin 21) para recibir datos del receptor Infrarojo
Dim SONYIN_WORD As Word ' Se crea una variable de "palabra completa" para recibir el tren de datos
' Se hace un ALIAS de el BYTE BAJO que contiene los comandos de la variable SONYIN_WORD
Dim SONY_COMMAND As SONYIN_WORD.LowByte
' Se hace un ALIAS de el Byte ALTO que contiene el tipo de systema de la variable SONYIN_WORD
Dim SONY_SYSTEM As SONYIN_WORD.HighByte

' Se crean alias del puerto B (Pin 22 al 28) con el nombre LEDX respectivamente

Symbol LED1 PORTB.1
Symbol LED2 PORTB.2
Symbol LED3 PORTB.3
Symbol LED4 PORTB.4
Symbol LED5 PORTB.5
Symbol LED6 PORTB.6
Symbol LED7 PORTB.7



All_Digital = On ' se asignas todas las entradas como digitales

While 1 = 1 ' Se crea un Loop Infinito
Repeat
SONYIN_WORD = SonyIn ' Se recibe el tren de datos del receptor infrarojo
Until SONY_COMMAND<> 255 ' Se queda repitiendose la recepcion hasta que el byte bajo (comandos) sea diferente a 255

'Se procesa la informacion del comando recibido y se prende el led correspondiente

If SONY_COMMAND=0 Then High LED1
If SONY_COMMAND=1 Then High LED2
If SONY_COMMAND=2 Then High LED3
If SONY_COMMAND=3 Then High LED4
If SONY_COMMAND=4 Then High LED5
If SONY_COMMAND=5 Then High LED6
If SONY_COMMAND=6 Then High LED7

DelayMS 1000 ' espera 1 segundo
PORTB=0 ' Se borra el contenido del puerto B y se repite el Loop para recibir otro dato.
Wend

Osea con los valores arrojados por el SONY_COMMAND=XXX tomar decisiones como encender leds u otras acciones cierto?.
 
Atrás
Arriba