Telecomando e Ricevitore IR

  • Ricky85
  • Autore della discussione
  • Anziano Utente
  • Anziano Utente
Di più
14 Anni 1 Mese fa - 14 Anni 1 Mese fa #1 da Ricky85
Telecomando e Ricevitore IR è stato creato da Ricky85
Telecomando e Ricevitore IR

Ecco i componenti principali e gli schemi elettrici:

Telecomando:

Micro PIC18F2520
Trasmettitore IR: Vishay TSAL7600 940nm
4 pulsanti per invio comandi

File allegato:

Nome del file: ir_transmitter.pdf
Dimensione del file:50 KB


Ricevitore:

Micro PIC18F4550
Ricevitore IR: OSRAM SFH 5110-36
4 led per visualizzazione comandi

File allegato:

Nome del file: ir_receiver.pdf
Dimensione del file:44 KB


Per quanto riguarda i software ho pensato si potesse fare così:

Telecomando:

Ho bisogno di creare dei treni di impulsi a 36Khz di tre tipi diversi:
Trama di start
Trama per stato logico 1
Trama per stato logico 0

ho pensato di crearli nel seguente modo:

Trama di start: 8ms segnale alto, 1ms segnale basso
Trama 1: 4ms segnale alto, 2ms segnale basso
Trama 0: 2ms segnale alto, 2ms segnale basso

(dovrebbero essere circa i rapporti della codifica Sony)



Per creare il treno di impulsi potrei sfruttare il modulo CCP del PIC18F2520 per creare il segnale e giocando con i delay per gestire il susseguirsi di impulsi alti e impulsi bassi.

Ricevitore:

Qui sono ancora più annebbiato in quanto a idee...
potrei semplicemente leggere lo stato dell'ingresso ed utilizzando magari il timer0 per misurare la durata degli impulsi...

Intanto comincio a scrivere qualche riga di codice che potrebbe andare bene per il trasmettitore...

Ricky
Allegati:
Ultima Modifica 14 Anni 1 Mese fa da Ricky85.

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

  • Ricky85
  • Autore della discussione
  • Anziano Utente
  • Anziano Utente
Di più
14 Anni 1 Mese fa - 14 Anni 1 Mese fa #2 da Ricky85
Risposta da Ricky85 al topic Re: Telecomando e Ricevitore IR
Finalmente ho ricevuto da RS il trasmettitore ed il ricevitore IR e sono riuscito a fare qualche prova...

per ora mi sono limitato a montare in modo "semplice" il circuito del trasmettitore ed alimentare il ricevitore giusto per rilevare con l'oscilloscopio che il segnale venga riconosciuto...

Ecco il codice di "test" del trasmettitore...
Code:
#include <p18f2520.h> #include <pwm.h> #include <timers.h> #include <portb.h> #include <delay.h> #pragma config OSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config PBADEN = OFF void main (void) { // Variabile per la pausa fittizia int i; // Periodo del segnale PWM unsigned char period; // Duty Cycle int duty_cycle = 249; LATA = 0b00000000; TRISA = 0b11111110; LATB = 0b00000000; TRISB = 0b11111110; LATC = 0b00000000; TRISC = 0b11111011; EnablePullups (); // Apro il TMR1 per il PWM OpenTimer2 (TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1); // 36KHz period = 139; while (1){ // Aggiorno il dutycycle SetDCPWM2 (duty_cycle); // Apro il moldulo PWM OpenPWM2(period); delay_ms (1000); ClosePWM2 (); delay_ms (200); OpenPWM2(period); delay_ms (200); ClosePWM2 (); delay_ms (100); OpenPWM2(period); delay_ms (200); ClosePWM2 (); delay_ms (100); OpenPWM2(period); delay_ms (200); ClosePWM2 (); delay_ms (100); } }

Ecco il circuito di prova...



ed il risultato sull'oscilloscopio...

(Sul canale B il dato trasmesso e sul canale A il dato ricevuto)

Logicamente quando si trasmette alto si riceve basso e viceversa (il ricevitore è studiato apposta così) ma per invertire il segnale ci penserò via software




Ora arriva la parte difficile... "decifrare" che cosa si sta leggendo... non so se utilizzare i timer per capire "quanto tempo" sta su o giu il segnale oppure utilizzare altri metodi...
Allegati:
Ultima Modifica 14 Anni 1 Mese fa da Ricky85.

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

  • Ricky85
  • Autore della discussione
  • Anziano Utente
  • Anziano Utente
Di più
14 Anni 1 Mese fa #3 da Ricky85
Risposta da Ricky85 al topic Re: Telecomando e Ricevitore IR
Ci ho passato la notte ma sono riuscito ad ottenere i risultati voluti...

Sono riuscito a far riconoscere al ricevitore "che cosa" gli viene detto...

Dopo la prima trama di "start" il ricevitore prende dato per dato e lo posiziona in un array, finita la trasmissione lo legge e di conseguenza esegue le operazioni dovute.

Allego i codici:

Trasmettitore
Code:
#include <p18f2520.h> #include <pwm.h> #include <timers.h> #include <portb.h> #include <delay.h> #pragma config OSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config PBADEN = OFF // Periodo del segnale PWM unsigned char period; //Prototipo di funzione void High_Int_Event (void); //Interrupt vector Alta priorità #pragma code high_interrupt_vector = 0x08 void high_interrupt (void) { // Salto per la gestione dell'interrupt _asm GOTO High_Int_Event _endasm } #pragma code #pragma interrupt High_Int_Event //Funzione per la gestione dell'interruzione void High_Int_Event (void) { //Indice per l'antirimbalzo int i; // Controllo che l'interrupt sia stato generato da PORTB if (INTCONbits.RBIF == 1 ) { //Antirimbalzo for (i=0; i<10000; i++) { } //Controllo la pressione del BT4 if (PORTBbits.RB4 == 0) { // Start +5 OpenPWM2(period); delay_ms (5); ClosePWM2(); delay_ms (2); OpenPWM2(period); delay_ms (5); ClosePWM2(); } if (PORTBbits.RB5 == 0) { // Start +3+2 OpenPWM2(period); delay_ms (5); ClosePWM2(); delay_ms (2); OpenPWM2(period); delay_ms (3); ClosePWM2(); delay_ms (2); } // Resetto il flag d'interrupt per permettere nuove interruzioni //USARE SEMPRE// Per chiudere l'interrupt INTCONbits.RBIF = 0; } } void main (void) { // Variabile per la pausa fittizia int i; // Duty Cycle int duty_cycle = 249; LATA = 0b00000000; TRISA = 0b11111110; LATB = 0b00000000; TRISB = 0b11111110; LATC = 0b00000000; TRISC = 0b11111001; EnablePullups(); // Apro il TMR1 per il PWM OpenTimer2 (TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1); // Abilita i resistori di pull-up sulla PORTB //USARE SEMPRE// EnablePullups(); // Abilito le interruzioni su PORTB //USARE SEMPRE// INTCONbits.RBIE = 1; // Abilito modalità compatibile (di default vale già 0) //USARE SEMPRE// RCONbits.IPEN = 0; // Abilito l'interrupt globale //USARE SEMPRE// INTCONbits.GIE = 1; // Abilito l'interrupt periferiche //USARE SEMPRE// INTCONbits.PEIE = 1 ; // 36KHz period = 139; // Aggiorno il dutycycle SetDCPWM2 (duty_cycle); delay_ms (1000); delay_ms (1000); delay_ms (1000); while (1){ } }

Ricevutore:
Code:
#include <p18f4550.h> #include <portb.h> #include <pwm.h> #include <timers.h> #include <delay.h> #pragma config FOSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config PBADEN = OFF int data_rx[5] = {2,2,2,2,2}; //Prototipo di funzione void High_Int_Event (void); //Interrupt vector Alta priorità #pragma code high_interrupt_vector = 0x08 void high_interrupt (void) { // Salto per la gestione dell'interrupt _asm GOTO High_Int_Event _endasm } #pragma code #pragma interrupt High_Int_Event //Funzione per la gestione dell'interruzione void High_Int_Event (void) { //Indice per l'antirimbalzo int i; // Controllo che l'interrupt sia stato generato da PORTB if (INTCONbits.RBIF == 1 ) { if (PORTBbits.RB5 == 0) { delay_ms (1); if (PORTBbits.RB5 == 0) { delay_ms (1); if (PORTBbits.RB5 == 0) { delay_ms (1); if (PORTBbits.RB5 == 0) { delay_ms (1); if (PORTBbits.RB5 == 0) { delay_ms (1); if (PORTBbits.RB5 == 1) { delay_ms (1); if (PORTBbits.RB5 == 1) { delay_ms (1); data_rx[0] = PORTBbits.RB5; delay_ms (1); data_rx[1] = PORTBbits.RB5; delay_ms (1); data_rx[2] = PORTBbits.RB5; delay_ms (1); data_rx[3] = PORTBbits.RB5; delay_ms (1); data_rx[4] = PORTBbits.RB5; } } } } } } } // Resetto il flag d'interrupt per permettere nuove interruzioni //USARE SEMPRE// Per chiudere l'interrupt INTCONbits.RBIF = 0; } } void main (void){ // Imposto PORTA tutti ingressi LATA = 0b00000000; TRISA = 0b11111110; // Imposto PORTB tutti ingressi LATB = 0b00000000; TRISB = 0b11111111; // Imposto PORTC tutti ingressi LATC = 0b00000000; TRISC = 0b11111111; // Imposto PORTD tutte uscite LATD = 0b00000000; TRISD = 0b11111111; // Imposto PORTE tutti ingressi LATE = 0b00000000; TRISE = 0b11111111; // Abilita i resistori di pull-up sulla PORTB //USARE SEMPRE// EnablePullups(); // Abilito le interruzioni su PORTB //USARE SEMPRE// INTCONbits.RBIE = 1; // Abilito modalità compatibile (di default vale già 0) //USARE SEMPRE// RCONbits.IPEN = 0; // Abilito l'interrupt globale //USARE SEMPRE// INTCONbits.GIE = 1; // Abilito l'interrupt periferiche //USARE SEMPRE// INTCONbits.PEIE = 1 ; // Ciclo infinito while(1){ if (data_rx [0] == 0){ if (data_rx [1] == 0){ if (data_rx [2] == 0){ if (data_rx [3] == 0){ if (data_rx [4] == 0){ LATAbits.LATA0 = 1; delay_ms(1000); LATAbits.LATA0 = 0; data_rx [0] = 2; data_rx [1] = 2; data_rx [2] = 2; data_rx [3] = 2; data_rx [4] = 2; } } } } } if (data_rx [0] == 0){ if (data_rx [1] == 0){ if (data_rx [2] == 0){ if (data_rx [3] == 1){ if (data_rx [4] == 1){ LATAbits.LATA0 = 1; delay_ms(100); LATAbits.LATA0 = 0; delay_ms(100); LATAbits.LATA0 = 1; delay_ms(100); LATAbits.LATA0 = 0; delay_ms(100); LATAbits.LATA0 = 1; delay_ms(100); LATAbits.LATA0 = 0; delay_ms(100); data_rx [0] = 2; data_rx [1] = 2; data_rx [2] = 2; data_rx [3] = 2; data_rx [4] = 2; } } } } } } }

Non fate casp a "come" è strutturato il codice, lo ottimizzerò a breve in modo da gestire meglio il tutto...

Il prossimo passo è sfruttare la modalità SLEEP del PIC18F2520 (quello del nostro telecomando) in modo da migliorare i consumi (logicamente non posso permettermi di cambiare pila ogni 2 giorni al telecomando).

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

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
14 Anni 1 Mese fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Telecomando e Ricevitore IR
Complimenti,

in poco tempo stai tirando su un bel progetto completo di codici.
Non ho capito ancora cosa fai visto che non ti sei presentato alla sezione chi sono!
...mi sembra che tu sappia il fatto tuo e non la racconti tutta! :)

Saluti,

Mauro

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

  • Ricky85
  • Autore della discussione
  • Anziano Utente
  • Anziano Utente
Di più
14 Anni 1 Mese fa - 14 Anni 1 Mese fa #5 da Ricky85
Risposta da Ricky85 al topic Re: Telecomando e Ricevitore IR

Mauro Laurenti ha scritto: Complimenti,

in poco tempo stai tirando su un bel progetto completo di codici.
Non ho capito ancora cosa fai visto che non ti sei presentato alla sezione chi sono!
...mi sembra che tu sappia il fatto tuo e non la racconti tutta! :)

Saluti,

Mauro


Ciao Mauro,

grazie per i complimenti ^^

Sono appena agli inizi in questo mondo dei PIC ma... ho la fortuna di apprendere in fretta ^^

Chiedo venia per la mancata presentazione... l'avevo scritta ed inviata ma era "morta" l'adsl durante l'invio... probabilmente non ha fatto in tempo... la riscrivo subito!

Ho finito giusto ora di saldare su millefori il prototipo del telecomando... ma attualmente sono arenato nel problema dello "sleep" non ho trovato grandi informazioni in giro e non sono ancora riuscito a capire come gestirlo...
Allegati:
Ultima Modifica 14 Anni 1 Mese fa da Ricky85.

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

Moderatori: Mauro Laurenti

Registrati al sito

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

Registrati al sito LaurTec.

Forum - Ultimi messaggi