- Messaggi: 50
- Ringraziamenti ricevuti 0
Telecomando e Ricevitore IR
- Ricky85
-
Autore della discussione
- Anziano Utente
-
Less
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
Ricevitore:
Micro PIC18F4550
Ricevitore IR: OSRAM SFH 5110-36
4 led per visualizzazione comandi
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
Ecco i componenti principali e gli schemi elettrici:
Telecomando:
Micro PIC18F2520
Trasmettitore IR: Vishay TSAL7600 940nm
4 pulsanti per invio comandi
Ricevitore:
Micro PIC18F4550
Ricevitore IR: OSRAM SFH 5110-36
4 led per visualizzazione comandi
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
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
-
Less
Di più
- Messaggi: 50
- Ringraziamenti ricevuti 0
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...
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...
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...
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
-
Less
Di più
- Messaggi: 50
- Ringraziamenti ricevuti 0
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
Ricevutore:
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).
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.
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
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
-
Less
Di più
- Messaggi: 50
- Ringraziamenti ricevuti 0
14 Anni 1 Mese fa - 14 Anni 1 Mese fa #5
da Ricky85
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...
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...
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.
Forum - Ultimi messaggi
-
- progetto can
- da marcelloraja
-
- MODULO GSM SIM900A
- da Mauro Laurenti
-
- Freedom III e compilazioni fallite
- da Mauro Laurenti
-
- Gestione degli errori su comunicazione seriale
- da Mauro Laurenti
-
- Timer0 e interrupt
- da Mauro Laurenti