Foros ZackYFileS

Foros ZackYFileS (http://foros.zackyfiles.com/index.php)
-   PROGRAMACIÓN Microcontroladores: PICs , AVRs. (http://foros.zackyfiles.com/forumdisplay.php?f=437)
-   -   Emisor de IR (Infrarrojos) para ROOMBA con PIC16F84 (http://foros.zackyfiles.com/showthread.php?t=523876)

ZackY 25/07/2007 17:00

Emisor de IR (Infrarrojos) para ROOMBA con PIC16F84
 
Desde hace algunos meses dispongo de uno de esos aspiradores autonomos (robotizados) ROOMBA. Como he visto que no hay mucha información en internet sobre el protocolo que se usa para transmitir los comandos IR a este aspirador, y aprovechando que estoy con un proyecto sobre éste, pongo aqui unas rutinas que he creado para enviar esos comandos IR con un PIC16F84.

El protocolo que usa para la emisión de estos comandos Infrarrojos (IR) es el siguiente:

Portadora de Frecuencia = 38 KHz (T = 26,31usg = Ton + Toff)
1 Lógico = 3 msg de envío de la portadora (ON) + 1 msg de OFF
0 Lógico = 1 msg de envío de la portadora (ON) + 3 msg de OFF

Por lo tanto, para enviar un "1 lógico" se deben enviar: 3msg/T = 114 pulsos (Ton+Toff) (3msg/26,31usg=114) y 1 msg a OFF.

Por lo tanto, para enviar un "0 lógico" se deben enviar: 3msg/T = 38 pulsos (Ton+Toff) (1msg/26,31usg=38) y 3 msg a OFF.

El comando CLEAR (comienza a aspirar) es el código 136 = "10001000"

Aquí va el programa que he creado para enviar el comando CLEAR y que el aspirador se ponga a funcionar.

Código:

program Envio_Comandos_ROOMBA
' Envios de comandos IR a ROOMBA
' *******************************************************************************
'  (c) Autor: ZackY - zackyzgz@yahoo.es
'
'-HARDWARE:
'    MCU: PIC 16F84A
'    Cristal: 4 Mhz
'    Diodo IR conectado a PORTA.1 (salida)
'    Pulsador conectado a PORTB.0 (entrada)
' *******************************************************************************
 Dim pulsado as byte

    'Sub-rutina para generar un 1 logico de trama IR
  Sub procedure Env_Uno()
    Dim i as byte
        For i=1 to 114          ' 3msg/26umg= 114 pulsos on-off
        Setbit(PORTA,1)
        Delay_us(12)          '  Ajuste: Debería ser 13usg, pero observando el osciloscipio
        Clearbit(PORTA,1)    '      ese valor se ajusta mejor
        Delay_us(2)            '  Ajuste: Debería ser 13usg, pero observando el osciloscipio
        next i                      '      ese valor se ajusta mejor
        Clearbit(PORTA,1)    ' 1msg a OFF
        Delay_ms(1)
    End sub

    'Sub-rutina para generar un 0 logico de trama IR
  Sub procedure Env_Cero
    Dim i as byte
        For i=1 to 38        ' 1msg/26umg= 38 pulsos on-off
        Setbit(PORTA,1)
        Delay_us(12)
        Clearbit(PORTA,1)
        Delay_us(2)
        next i
        Clearbit(PORTA,1)    ' 3msg a OFF
        Delay_ms(3)
  End sub


Main:
  TRISA = 0                ' PORTA.1 como Salida
  TRISB = 1                ' PORTB.0 como Entrada
  PORTA.1 = 0  ' Inicializo PORTA - Apago led
  PORTB.0 = 1  ' Inicializo PORTB - Entrada OFF
  pulsado = 0
Inicio:

  While true
    If PORTB.0 = 0 then    ' Envio comando CLEAR
        Env_Uno      'Envia 1
        Env_Cero    'Envia 0
        Env_Cero    'Envia 0
        Env_Cero    'Envia 0
        Env_Uno      'Envia 1
        Env_Cero    'Envia 0
        Env_Cero    'Envia 0
        Env_Cero    'Envia 0
        Delay_ms(32)
    end if
  Wend
End.

Este code esta probado y funcionando :). Si tenéis algun comentario o duda sobre el, podéis postearlo aqui.

Quim43 06/02/2009 12:24

Hola Zacky.
Estoy interesado en controlar mi Roomba 560 con un mando programable. ¿Tendrías, por casualidad, los códigos Pronto en formato HEX de las funciones principales de la Roomba? (Clean, Dock, Spot, etc)
Gracias


La franja horaria es GMT +2. Ahora son las 17:02.

Powered por vBulletin™ Version 3.8.10
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
ZackYFileS - Foros de Debate