Sommario:

Telecomando TV Universale - Ardiuino, Infrarossi: 5 Passaggi
Telecomando TV Universale - Ardiuino, Infrarossi: 5 Passaggi

Video: Telecomando TV Universale - Ardiuino, Infrarossi: 5 Passaggi

Video: Telecomando TV Universale - Ardiuino, Infrarossi: 5 Passaggi
Video: Ricevitore ad infrarossi (Sensori con Arduino) 2024, Novembre
Anonim
Telecomando TV universale - Ardiuino, infrarossi
Telecomando TV universale - Ardiuino, infrarossi

Ciao! In questo tutorial, ti mostrerò come costruire e programmare il tuo telecomando universale che funzionerà con la maggior parte delle cose che utilizzano un telecomando a infrarossi e che "ascolterà" e decodificherà un segnale a infrarossi inviato da vari altri telecomandi.

Un po' di background su ciò che mi ha ispirato a costruire questo telecomando: io, come la maggior parte di voi, perdo costantemente i miei telecomandi e questa calamità è piuttosto frustrante, quindi immagino di risolverlo! Ho costruito questo telecomando e l'ho incorporato discretamente nel mio telaio del letto personalizzato (sono anche un falegname) - non posso perdere il telecomando se fa parte del telaio del mio letto!

Forniture

Cose di cui avrai bisogno: -Arduino UNO o Nano - il chilometraggio può variare con altre schede

-Breadboard senza saldatura (o stripboard saldabile se desideri renderlo più permanente)

-Jumperwires di vari colori e lunghezze

-Pulsanti momentanei (5) (è possibile aggiungere più pulsanti, ma è necessario utilizzare pin digitali, poiché vengono utilizzati tutti i pin analogici tranne 1 - è necessario assicurarsi di utilizzare correttamente i resistori di pull-up, o abbattere le resistenze e antirimbalzare i pulsanti)

-10K Ohm resistore (5) (se desideri più pulsanti, te ne serviranno di più)

-470 Ohm resistenza (2)

-LED a infrarossi

-LED rosso

-Sensore a infrarossi (ho usato il numero di parte VS1838B, potresti usarne un altro, basta controllare il pin-out)

(Opzionale) Saldatore, Saldatura, Flusso di saldatura.

Passaggio 1: costruzione del circuito:

Costruzione del circuito
Costruzione del circuito

1). Mi piace sempre iniziare con la disposizione dei miei componenti, poiché questo guida sempre il layout sulla breadboard.

-Premi i pulsanti

-LED: il LED rosso e il LED IR sono cablati in tandem, così puoi vedere cosa sta facendo il LED IR.

-Sensore

2). resistori

- I cinque resistori da 10K che abbiamo collegato ai pulsanti sono chiamati resistori "pull down". I resistori pull down assicurano che quando non viene premuto un pulsante, il pin Arduino corrispondente ottiene 0 Volt (o almeno vicino ad esso). Per maggiori informazioni sui resistori pull down (o pull up) ecco una guida approfondita:

www.electronics-tutorials.ws/logic/pull-up…

Questi resistori potrebbero non essere completamente necessari, ma se ricevi spinte "fantasma", è più che probabile che sia causato dall'accoppiamento capacitivo e i resistori di pull down lo impediscono.

3). Fili del circuito

4). 5V e cavi di terra

Usa l'immagine fornita come riferimento! non aver paura di cambiarlo per le tue esigenze però!

Passaggio 2: codice:

#include const int RECV_PIN = 7; // Sensore IR legge pin int Pulsante1 = A4;// Più a sinistra int Pulsante2 = A3; // 2° da sinistra int Button3 = A2; // Pulsante int centrale4 = A1; // 2° a destra int Button5 = A0; // Più a destra int LED = 3; // LED IR e LED rosso int val = 0; // Modifica del valore IRsend irsend; IRrecv irrecv(RECV_PIN); decode_results risultati;

void setup() {pinMode(Button1, INPUT); pinMode(Button2, INPUT); pinMode(Button3, INPUT); pinMode(Button4, INPUT); pinMode(Button5, INPUT); pinMode(LED, USCITA); Serial.begin(9600); irrecv.enableIRIn(); irrecv.blink13(true);} void loop() {{{if (analogRead(Button1)>900)irsend.sendNEC(0xFF02FD, 32); // utilizzo della lettura analogica invece della lettura digitale per evitare problemi di capacità captive. inoltre, aiuta a rimbalzare i pulsanti. // Avere una lettura analogica a 900 consente un po' di spazio di manovra nei valori, il che significa che il segnale infra verrà inviato anche se al pin non viene applicato un 5V completo. //ma 900 è abbastanza alto da non leggere erroneamente a causa del ritardo di accoppiamento capacitivo (100);}//Strip RGB On&off {if (analogRead(Button5)>900) {for (int i = 0; i < 3; i++) // modificando il valore in "i < 3" cambierà il numero di volte in cui il segnale viene ripetuto immediatamente. quindi "i < 2" ripeterà il segnale due volte. // potresti aver bisogno di giocare con questo numero se la tua TV non risponde, generalmente 1 o 3 funzionano di più, in caso contrario, prova i numeri dispari. // potrebbe anche essere necessario giocare con i valori di ritardo del segnale intra, ad esempio, per la mia TV 10 funziona, ma 30 no. {irsend.sendSony(0xa90, 12); // Codice di alimentazione della TV Sony, per la mia TV, il codice deve essere inviato 3x3, quindi 3 impulsi, tre tempi di ritardo separati (10); // "ritardo del segnale intra" for (int i = 0; i < 3; i++) {irsend.sendSony(0xa90, 12); // "12" è il numero di bit, protocolli diversi richiedono numeri di bit diversi. NEC è 32, Sony è 12, puoi cercare gli altri ritardi(10); for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i < 3; i++) {irsend.sendSony (0xc90, 12); // Sony TV power Volume Down delay(100);}}} delay(100);} if (irrecv.decode(&results)) // la parte sottostante del codice consente di interpretare i segnali infrarossi da vari telecomandi. { Serial.println(results.value, HEX); // genererà la procedura "NEC, Sony, Etc.." e un codice TV "c90, a90, FF02FD " dovrai aggiungere 0x alla parte anteriore dell'interruttore del codice TV (results.decode_type) {case DENON: Serial.println("DENON"); rottura; caso NEC: Serial.println("NEC"); rottura; case PANASONIC: Serial.println("PANASONIC"); rottura; case SONY: Serial.println("SONY"); rottura; caso RC5: Serial.println("RC5"); rottura; case JVC: Serial.println("JVC"); rottura; case SANYO: Serial.println("SANYO"); rottura; case MITSUBISHI: Serial.println("MITSUBISHI"); rottura; case SAMSUNG: Serial.println("SAMSUNG"); rottura; caso LG: Serial.println("LG"); rottura; caso RC6: Serial.println("RC6"); rottura; case DISH: Serial.println("DISH"); rottura; case SHARP: Serial.println("SHARP"); rottura; case WHYNTER: Serial.println("WHYNTER"); rottura; caso AIWA_RC_T501: Serial.println("AIWA_RC_T501"); rottura; default: case SCONOSCIUTO: Serial.println("SCONOSCIUTO"); break;} irrecv.resume();}}

Passaggio 3: codice in profondità: invio di segnali IR

Mi riferirò alle righe di codice in base al loro numero di riga - per seguire, usa questo link:

pastebin.com/AQr0fBLg

Innanzitutto, dobbiamo includere la libreria remota IR di z3t0.

Ecco un link alla libreria:

github.com/z3t0/Arduino-IRremote

Se hai bisogno di una guida su come scaricare correttamente una libreria e installarla nell'IDE:

www.arduino.cc/en/guide/libraries

La riga 1 include la libreria.

Successivamente, dobbiamo dichiarare alcune variabili, le righe 2-12 lo fanno.

Usiamo "cost int" per definire le variabili che non cambieranno, tutte tranne una rientrano in questa categoria.

Usiamo " int " per definire le variabili che cambieranno.

Dobbiamo usare un pin con impulso con modulazione (PWM) per il nostro pin LED - qualsiasi pin che ha "~" accanto sarà sufficiente, nel mio codice - usiamo il pin digitale 3.

Successivamente, dobbiamo eseguire alcune impostazioni: questo codice verrà eseguito solo una volta all'accensione o al ripristino di Arduino.

Nota che stiamo definendo i nostri ingressi e uscite (15-20), accendendo il monitor seriale (21), abilitando il sensore IR (22) e dicendo ad Arduino di far lampeggiare il LED integrato ogni volta che riceviamo un segnale nel sensore (23).

Successivamente, costruiremo il nostro ciclo: questo codice verrà eseguito ripetutamente, dall'alto verso il basso una manciata di volte al secondo.

Alla riga 25, usiamo un'istruzione if, che dice ad Arduino "cerca questo criterio specifico, se quel criterio è soddisfatto, fai questa cosa specifica". In questo caso, il criterio è analogRead(Button1)>900, o in altre parole - "Arduino, Look at button1, che abbiamo definito come pin A4 in precedenza, se il segnale analogico ricevuto è maggiore di 900, procedi con le istruzioni successive, in caso contrario, vai avanti". C'è un po' da spacchettare qui, quindi tuffiamoci dentro: un segnale analogico su Arduino è un valore uguale o inferiore a 5V, con 5V uguale a 1023 e 0V uguale a 0. Qualsiasi data tensione tra 0 e 5V può essere definita da un numero, e con un po' di matematica, possiamo ricavare quel numero, o viceversa, una tensione. Dividi 1024 (includiamo 0 come unità) per 5, che ci dà 204.8. Ad esempio, usiamo il numero 900, per tradurlo in tensione, dividiamo semplicemente 900 per 204,8, ottenendo ~4,4V. Stiamo dicendo all'Arduino di cercare una tensione maggiore di ~ 4,4 volt e, se lo è, esegui la nostra prossima istruzione.

Parlando delle prossime istruzioni (riga 25), vediamo irsend.sendNEC(0xFF02FD, 32). Questo dice "Arduino, invia un impulso modulato che segua il protocollo NEC, in particolare il segnale FF02FD, e assicurati che sia lungo 32 bit". Questo farà lampeggiare il nostro LED IR in modo che altri dispositivi possano capire. Pensalo un po' come il codice Morse, ma solo con la luce invisibile! Esistono molti protocolli diversi, ciascuno con centinaia se non migliaia di segnali individuali e ciascuno con il proprio numero di bit specifico: il nostro dispositivo sarà in grado di riconoscere una grande quantità di questi segnali, ma ci approfondiremo più avanti!

Alla linea 28, abbiamo il nostro primo ritardo - questo è qui per evitare segnali ripetuti involontari, una volta premuto il pulsante e inviato il segnale IR, abbiamo 100 millisecondi per togliere il dito dal pulsante. non sembra molto tempo, ma in pratica sembra funzionare bene. la funzione di ritardo dice ad Arduino "non fare nulla per X millisecondi" e per riferimento, sono 1000 millisecondi in un secondo.

Passando al nostro pulsante successivo alla riga 29, button5 (originariamente avevo 4 pulsanti su questo telecomando, ne ho aggiunto un quinto, ecco perché siamo fuori servizio). Questo, nello spirito, è la stessa cosa del pulsante 1, ma con alcune differenze chiave. La prima differenza che vedrai è un'istruzione for - questo è essenzialmente un altro ciclo - un ciclo con in un altro ciclo più grande, loopception. Nello specifico abbiamo " for (int i = 0; i < 3; i++) ", leggilo come "Arduino, iniziamo da 0, ripeti le istruzioni seguenti fino ad arrivare a 3 volte". La funzione for viene utilizzata perché molti dispositivi sono programmati per cercare un segnale ripetuto, e nel nostro caso qui, 3 volte. Puoi semplicemente cambiare il numero 3 in un numero diverso se il tuo dispositivo richiede un programma di ripetizione diverso. Un'altra differenza fondamentale con button5 è che viene ripetuto di nuovo, 3 volte o 3x3. In altre parole, inviamo il segnale 3 volte, aspettiamo 10 millisecondi, lo inviamo di nuovo 3 volte, aspettiamo altri 10 millisecondi e poi lo inviamo di nuovo 3 volte. Questo tipo di comunicazione è comune per l'accensione e lo spegnimento dei dispositivi e potrebbe essere proprio ciò che la tua TV o dispositivo richiede: la chiave è giocare con tutte le variabili fino a ottenere il risultato desiderato. Modificare il valore di ritardo breve, modificare il valore di ripetizione, inviare 6 batch anziché 3, ecc. I dispositivi sono programmati intenzionalmente con regole di segnale arbitrarie, immagina se il telecomando della tua TV inviasse lo stesso tipo di segnale della soundbar; ogni volta che cambi canale sulla TV, la soundbar si spegne: ecco perché ci sono regole di segnale diverse.

I prossimi tre pulsanti sono programmati con gli stessi principi, almeno in parte, descritti sopra, quindi possiamo saltare fino alla riga 55.

Passaggio 4: codifica in profondità: ricezione di segnali IR

Codice in profondità: ricezione di segnali IR
Codice in profondità: ricezione di segnali IR

Alla riga 55, iniziamo a programmare Arduino per interpretare i segnali IR inviati da altri telecomandi: questo è necessario per poter capire i protocolli e i segnali utilizzati dai tuoi telecomandi. La prima riga di codice alla riga 55 è if (irrecv.decode(&results) leggi questo come "Arduino, cerca un codice IR, se ne trovi uno, restituisci un valore vero, se non viene trovato nulla, restituisci falso. Quando è vero, registra le informazioni in "risultati"".

Passando alla riga 56, abbiamo Serial.println(results.value, HEX) che dice "Ardunio, stampa i risultati nel monitor seriale in un formato HEX". Hex, che significa esadecimale, è un modo per accorciare una stringa binaria (solo 0 e 1) in qualcosa di un po' più facile da digitare. Ad esempio 101010010000 è "a90", il codice utilizzato per spegnere e accendere la mia TV, e 1111111100000001011111101 è 0xFF02FD, che controlla la mia striscia RGB. Puoi usare il grafico sopra per convertire binario in esadecimale e viceversa, oppure puoi usare il seguente link:

www.rapidtables.com/convert/number/hex-to-…

Fino alla riga 57, abbiamo una nuova funzione, chiamata switch case.

In sostanza, uno switch case ci consente di specificare istruzioni diverse in base ai risultati di una determinata variabile (case). l'interruzione esce dall'istruzione switch e viene utilizzata alla fine di ogni istruzione.

Usiamo il case switch qui per cambiare il modo in cui stampiamo nel monitor seriale in base ai protocolli che il nostro Arduino rileva dai vari telecomandi.

Passaggio 5: conclusione

Se hai una domanda, non esitare a contattarmi qui! Sono felice di cercare di aiutarti nel miglior modo possibile.

Spero che tu abbia imparato qualcosa che puoi usare per rendere la tua vita un po' migliore!

-RB

Consigliato: