Acquisizione segnale IR protocollo RC-5

12 Anni 3 Mesi fa #1 da Video Lab
Acquisizione segnale IR protocollo RC-5 è stato creato da Video Lab
Buona sera a tutti!
Per motivi di lavoro, vorrei realizzare con un PIC16F877 (uso questo perchè gli studi li ho fatti su questo e perchè nel cassetto c'è questo :P ) un circuitino in grado di acquisire 2 o 3 tasti di un telecomando Philips, e successivamente con questi, utilizzando un IC Sanyo LC7533 (uso questo perchè costa 90 centesimi ed è facile da gestire), regolare il volume di un paio di casse amplificate
Praticamente sui i tv di nuova generazione l'audio è scadente e soprattuto le persone anziane non lo gradiscono, nella maggior parte dei casi la soluzione più economica è quella di aggiungere una coppia di casse amplificate, ma purtroppo per regolare il volume tutte le volte bisogna alzarsi e regolare il potenziometro.. :( In alcuni casi, ci si può collegare alla presa cuffia, che risponde direttamente al controllo di volume del telecomando, in altri purtroppo bisogna navigare in scomodi menù per fare questa regolazione.
In commercio si trovano le sound bar, però costano di più di una semplice coppia di casse amplicate ed hanno il loro telecomando :( .
Quindi vorrei realizzare per conto mio qualcosa che risolva questo mio problema.
Ho scelto di utilizzare il protocollo RC-5 della Philips perchè mi sembra il più "semplice".
it.wikipedia.org/wiki/RC-5
Questo è quello che ho pensato di utilizzare come sistema per leggere i segnali in arrivo dal sensore:

#define XTAL_FREQ 20MHZ //setto la frequenza del quarzo
#include <pic.h> //Includo la libreria Pic

__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_ON & DEBUG_OFF & CP_OFF); //configuro i fuses

#include "setting.h"
#include "delay.c"
//Prototipi di funzione //
void main (void); //Funzione Main
void interrupt isr(void); //Funzione per gli interrupt

char code[13]=0;
char i=0;
int counter=0;

void main(void){
setting();
while(1){
if(!IR){
code[0]=IR^1;
counter=0;
while(i!=13){
if(counter==1778){
i++;
code=IR^1;
counter=0;
}
}
}
}
}

void interrupt isr(void){
if(T0IF){
counter++;
TMR0=251;
T0IF=0;
}
}

Cerco di spiegare quello che faccio con questo codice.
Il sensore IR in uscita è sempre a +Vcc, quindi sul pin del pic avrò sempre 1.
Nel momento in cui parte il treno di impulsi dal telecomando, al ricevitore arriverà il primo Bit di start che è un 1, in realtà il pic andrà a livello logico basso quindi a 0 (ecco spiegato la prima IF).
A questo punto memorizzo il primo bit facendo lo XOR nella posizione 0 del mio array.
Inizializzo il counter, che tramite il Timer0 verrà incrementato di 1 ogni microsecondo.
Quando il counter arriverà a 1778, quindi in corrispondenza della trasmissione del bit successivo, incrementerò i di 1, e assegnerò il valore del secondo bit all'array.
Resetto il counter e continuo ad acquisire tutti e 14 i bit.
Per il momento mi sono fermato per capire se questa può essere una valida soluzione per "leggere" il segnale IR.
A grandi linee il tutto dovrebbe funzionare così:
Sul circuitino ci sarà un pulsante che mi attiva la funzione di apprendimento, in sequenza deve "imparare" il tasto stand-by, il tasto per alzare il volume e il tasto per abbassare il volume.
I valori imparati saranno memorizzati nella eeprom interna del pic, così anche tolta la corrente al pic, saranno riutilizzabili, senza dover riprogrammare.
A questo punto alla pressione dei tasti memorizzati il pic piloterà l'altro IC abbassando o alzando il volume.
Scusate il post kilometrico...
Buona serata
Nino

Volere è Potere

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Video Lab
  • Avatar di Video Lab
  • Premium Member
  • Premium Member
Di più
12 Anni 3 Mesi fa - 12 Anni 3 Mesi fa #2 da Video Lab
Risposta da Video Lab al topic Re: Acquisizione segnale IR protocollo RC-5
IN attesa che qualcuno risponda, sono qui che mi arrovello il cervello per trasformare il mio array contenente 1 e 0 in un numero binario o decimale... per certo dovrò usare gli operatori logici e gli operatori di scorrimento... ma mi sfugge l'eventuale istruzione... sicuramente un ciclo di for... ma come...??? Ho letto e riletto le lezioni postate da Giovanni di settore zero sul suo sito... ma sinceramente non capisco.... abbiate pietà....
questo potrebbe essere un sistema ??

device è una variabile di tipo char

for(i=3; i<8; i++){
device=device|code;
device=device<<1;
}

Volere è Potere
Ultima Modifica 12 Anni 3 Mesi fa da Video Lab. Motivo: aggiunto codice

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Video Lab
  • Avatar di Video Lab
  • Premium Member
  • Premium Member
Di più
12 Anni 3 Mesi fa - 12 Anni 3 Mesi fa #3 da gcupini
Risposta da gcupini al topic Re: Acquisizione segnale IR protocollo RC-5
io invertirei le due istruzioni del for

device=device<<1;
device=device|code;

altrimenti all'uscita ti trovi il numero moltiplicato per 2
uno shift equivale anche alla moltiplicazione per 2 del numero.
Saluti

PS: va anche invertito il ciclo for (i=8, i>=3; i--)
altrimenti il nimero binario/decimale ottenuto viene invertito;
se 1000 0000=128 ottieni 0000 0001=1
Ultima Modifica 12 Anni 3 Mesi fa da gcupini.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • gcupini
  • Visitatori
  • Visitatori
12 Anni 3 Mesi fa - 12 Anni 3 Mesi fa #4 da Video Lab
Risposta da Video Lab al topic Re: Acquisizione segnale IR protocollo RC-5
Ti ringrazio per la risposta, però a senso mi sembrerebbe giusta la mia, però cerco di spiegarti perchè e così mi spieghi eventualmente dove sbaglio se è giusto il tuo codice.
di seguito il mio array, poi il segnale del telecomando
[0][1][2][3][4][5][6][7][8][9][10][11][12][13] il bit meno significativo del comando è il 13
1 1 0 1 1 1 1 1 0 1 1 1 1 1 quindi entrarano in questo ordine nell'array
i primi due bit [0] e [1] sono quelli di start e mi servono solo per confermare che il comando è partito, quello di parità [2] al momento non mi interessa, dalla posizione [3] alla posizione [7] compresa ci sono i bit che identificano il tipo di device, il più "alto di valore è il bit contenuto nella posizione [3]
La variabile char device è inizializzata a 0, vista in binario sarebbe 00000000
facendo device=device|code[3] è come se avessi 00000001 giusto ?
facendo device=device<<1 è come se spostassi il bit meno significativo di una posizione a sinistra quindi 00000010 .
Facendo nuovamente device=device|code[4] è come se avessi 00000011 o almeno credo.
Se sto sbagliando , per cortesia spiegami perchè è corretto il tuo codice, perchè voglio capire, non ho bisogno di copiare un codice bello e buono.
Saluti e grazie !
Nino

Volere è Potere
Ultima Modifica 12 Anni 3 Mesi fa da Video Lab. Motivo: errore

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Video Lab
  • Avatar di Video Lab
  • Premium Member
  • Premium Member
Di più
12 Anni 3 Mesi fa #5 da gcupini
Risposta da gcupini al topic Re: Acquisizione segnale IR protocollo RC-5
ciao
hai ragione per quanto riguarda il bit più significativo che deve entrare per primo. Non avevo capito qual'era l'ordine dei tuoi bit.
Non mi pare, se non sbaglio, che questo riguardi l'inversione delle due istruzioni:
Esempio supponi che da 3 a 8 ci siano i bit xxx101011 nell'orcine dal piu significativo al meno.
con le tue istruzioni ottieni 1010110 visto che l'ultima istruzione prima dell'uscita dal ciclo è una shift
device=device<<1;

saluti

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • gcupini
  • Visitatori
  • Visitatori
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login