![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
Ln_Mark7930 Guest
|
IR cloner |
Posted: Tue Feb 24, 2009 9:53 am |
|
|
Hi: I want to build a universal Ir remote controller cloner.
I want to record the original signal first, and later riproduce the code.
I think that I need only a few components: ie. a TSOP sensor, one pic16f628 and i IR trasmitter.
Someone Has a similar project o code???
Someone want to help me?
Thank 's at all. |
|
![](templates/subSilver/images/spacer.gif) |
Ln_mark7930 Guest
|
my code |
Posted: Fri Feb 27, 2009 10:42 am |
|
|
I write this code but don't work perfectly. I can play perfectly the recorded input signal, but there are some little difference about the times.
I think that I must use a timer to measure the time witch signal stay low and high.
When i have the timer value, program record all cheange of signal into a buffer. When i want to reproduce the signal, I must reload a timer with the same value of the buffer.
If someone have some different idea please reply my post. Thank's at all.
Here my code:
Code: | /****************************************************
* Registratore IR
*
*
* Acquisisce,memorizza e riproduce il codice ricevuto da
* un sensore tsop1730
******************************************************/
//#define DEBUG
#DEFINE 18F2520
#include <18F2520.h>
#ifdef DEBUG
//#device *=16
#device ICD=TRUE
#fuses HS,NOWDT,NOPUT,BROWNOUT,NOPROTECT,NOLVP,NOCPD
#else
//#device *=16
#device ICD=TRUE
#fuses HS,NOWDT,NOPUT,NOBROWNOUT,NOLVP,NOCPD
#endif
#use delay(clock=8000000)
/***************************************************
* *
* dichiarazione della variabili *
* *
***************************************************/
#define TSOP PIN_C0 // Input
#define LEDSTATO PIN_C1 // 0utput
#define IRout PIN_C2 // 0utput
#define PLAY PIN_C3 // Input
#define REC PIN_C4 // Input
#define LEDPLAY PIN_C5 // Output
#define LEDREC PIN_C6 // Output
#define ERASE PIN_C7 // Input
#use fast_io(c)
#define BUFFER_SIZE 400 // READ / WRITE Buffer
int8 dimensione2=BUFFER_SIZE/2;
int8 dimensione=BUFFER_SIZE;
int16 buffer[BUFFER_SIZE];
/************************************
*
* Cancella Buffer Ingresso
*
************************************/
void Cancella(void)
{
int8 i=0,m=0;
output_low(LEDREC); // output low
output_low(LEDPLAY);
output_low(LEDSTATO);
for (i=0;i<dimensione;i++) // ciclo per cancellare buffer
{
output_TOGGLE(LEDREC);
output_TOGGLE(LEDPLAY);
output_TOGGLE(LEDSTATO);
buffer[i]=0x00;
delay_ms(50);
}
for (m=0;m<255;m++) // ciclo per cancellare memoria eeprom
{
output_TOGGLE(LEDREC);
output_TOGGLE(LEDPLAY);
output_TOGGLE(LEDSTATO);
write_eeprom(m,0x00);
delay_ms(10);
}
output_low(LEDREC);
output_low(LEDPLAY);
}
/*******************************************
*
* Riproduzione
*
********************************************/
void PlayIR(void)
{
int8 j=0,c=0,p=0;
int8 timehigh_zero=0,timelow_zero=0, timehigh_one=0, timelow_one=0;
int16 counter0,counter1;
//for(j=0;j<=200;j++)
// {
// timehigh_zero=read_eeprom ((0x00 + (j*2)));
// timelow_zero=read_eeprom ((0x00 + (j*2)+1));
//
// buffer[j]=make16 (timehigh_zero,timelow_zero);
//
// timehigh_one=read_eeprom ((0x02 + (j*2)));
// timelow_one=read_eeprom ((0x02 + (j*2)+1));
// buffer[j+1]=make16 (timehigh_one,timelow_one);
// }
counter1=0;
counter0=0;
output_high(IRout);
delay_ms(20);
output_low(IRout);
delay_ms(20);
for(p=0;p<=200;p=p+2) // ricostruisco il segnale registrato riproducendo il buffer
{
counter0=buffer[p]; // carico il contatore con il primo dato sul buffer
output_low(IRout); // prima riproduco il tempo in cui il segnale sta a zero
for(c=0;c<5;c++) // 5 è una costante di tempo
{
while(counter0!=0) // finchè il contatore non arriva a zero
{
counter0--; // decremento contatore
delay_us(1); // e aspetto 1 us
}
}
counter1=buffer[p+1]; // carico il contatore con il primo dato + 1 sul buffer
output_high(IRout); // dopo riproduco il tempo in cui il segnale sta a uno
for(c=0;c<5;c++) // 5 è una costante di tempo
{
while(counter1!=0) // finchè il contatore non arriva a zero
{
counter1--; // decremento contatore
delay_us(1); // e aspetto 1 us
}
}
}
output_low(IRout);
}
/*******************************************
*
* Salvataggio dati ricevuti
*
********************************************/
void RecIR(void)
{
int8 high0=0,low0=0,high1=0,low1=0;
int8 k,n;
int16 tempo_zero=0,tempo_one=0;
BYTE next_in = 0;
while (input(TSOP)==1) {}; // Aspetto finchè il TSOP non va a zero ( significa che sta ricevendo qualche segnale IR)
for (k=0;k<=100;k++) // campiono 100 volte= significa 100 salite e 100 discese
{
tempo_zero=0; // resetto contatore
while (input(TSOP)==0) // finche il segnale è basso
{
delay_us(1); // ritardo di 1 us
tempo_zero++; // incremento tempo_zero
}
tempo_one=0; // resetto contatore
while (input(TSOP)==1) // finche il segnale è basso
{
delay_us(1); // ritardo di 1 us
tempo_one++; // incremento tempo_one
if (tempo_one>2000) // se tempo che sta a livello logico 1 è maggiore di 2 ms,interrompo il ciclo e proseguo
{
//tempo1=0;
break;
}
}
buffer[next_in]=tempo_zero; // memorizzo nel buffer il contatore tempo_zero
next_in++; // incremento posizione del buffer
buffer[next_in]=tempo_one; // memorizzo nel buffer il contatore tempo_one
next_in++; // incremento posizione del buffer
// e ricomincio il ciclo
}
//for(n=0;n<=100;++n)
// {
// tempo0= buffer[n];
//
// high0 = make8(tempo0,1);
// low0 = make8(tempo0,0);
// write_eeprom ((0x00 + (n*2)),high0);
// delay_ms(5);
// write_eeprom ((0x00 + (n*2)+1),low0);
//
// tempo1= buffer[n+1];
//
// high1 = make8(tempo1,1);
// low1 = make8(tempo1,0);
// write_eeprom ((0x02 + (n*2)),high1);
// delay_ms(5);
// write_eeprom ((0x02 + (n*2)+1),low1);
// }
//
}
/*******************************************
*
* MAIN
*
********************************************/
void Main()
{
int8 letto;
SET_TRIS_C(0b10011001); // impostazioni di ingresso/uscita port_C
output_low(LEDREC); // abbasso tutte le uscite
output_low(LEDPLAY); //
output_low(LEDSTATO); //
output_low(IRout); //
while (1) // ciclco infinito
{
delay_ms(500); // lampeggio e controllo dei tasti ogni 500 millisecondi
output_toggle(LEDSTATO);
if (input(REC)==1) // se premuto tasto REC
{
while (input(REC)){}; // attendo che venga rilasciato
output_high(LEDREC); // accendo led registrazione
//DELAY_MS(1000);
RecIR(); // chiamo routine per la registrazione
output_low(LEDREC); // dopo aver registrato spengo il led
}
if (input(PLAY)==1) // se premuto tasto PLAY
{
while (input(play)){}; // attendo che venga rilasciato
output_high(LEDPLAY); // accendo led registrazione
DELAY_MS(1000); // ritardo di un secondo
PlayIR(); // chiamo routine per la riproduzione
output_low(LEDPLAY); // dopo aver letto ed inviato il segnale spengo il led
}
if (input(ERASE)==1) // se premuto ERASE
{
while (input(ERASE)){}; // aspetto che venga rilasciato il tasto
Cancella(); // cancello buffer e memoria eeprom
}
}
} |
|
|
![](templates/subSilver/images/spacer.gif) |
ln_mark7930 Guest
|
help!! |
Posted: Thu Mar 05, 2009 5:01 am |
|
|
Nobody want / can help me? |
|
![](templates/subSilver/images/spacer.gif) |
yerpa
Joined: 19 Feb 2004 Posts: 58 Location: Wisconsin
|
|
Posted: Thu Mar 05, 2009 3:03 pm |
|
|
I remember using a microprocessor to read an IR remote control. The IR signal from most remote controllers is modulated at a fairly high rate, something like 48 KHz. There are modules available that combine the IR detector with a demodulator and produce a logic level output. If you use one of these you might be able to run a timer interupt at high enough speed to generate time stamps for the demodulated logic signals. You will have to modulate the IR output at the same rate as the original remote. There are a couple of different standard modulation frequencies out there.
Digi-Key lists seven different frequencies ranging from 36.0 KHz to 56.9 KHz. If you don't match frequencies between sender and receiver, it won't work. |
|
![](templates/subSilver/images/spacer.gif) |
ivan
Joined: 03 Apr 2008 Posts: 8 Location: Italy Rome
|
Re: help!! |
Posted: Thu Mar 05, 2009 5:27 pm |
|
|
ln_mark7930 wrote: | Nobody want / can help me? |
how i see in comment you should be italian I have done a "cloner"
I don't have code here but I used a mix of capture compare work perfect
if you contact me I say you about |
|
![](templates/subSilver/images/spacer.gif) |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|