Nota

Ciao, benvenuto nella Community di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino e ESP32 insieme ad altri appassionati.

Perché unirsi a noi?

  • Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.

  • Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime.

  • Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e giveaway: Partecipa a giveaway e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca [qui] e unisciti oggi!

5.14 Controllo remoto IR

Un ricevitore a infrarossi è un componente che riceve segnali a infrarossi e può rilevare e fornire segnali compatibili con il livello TTL in modo autonomo. È simile per dimensioni a un normale transistor incapsulato in plastica ed è comunemente utilizzato in diverse applicazioni, come il controllo remoto a infrarossi e la trasmissione a infrarossi.

In questo progetto, utilizzeremo un ricevitore a infrarossi per rilevare i segnali da un telecomando. Quando viene premuto un pulsante sul telecomando e il ricevitore a infrarossi riceve il segnale corrispondente, può decodificare il segnale per determinare quale pulsante è stato premuto. Decodificando il segnale ricevuto, possiamo identificare il tasto o il comando specifico associato.

Il ricevitore a infrarossi ci permette di integrare la funzionalità di controllo remoto nel nostro progetto, consentendoci di interagire e controllare i dispositivi utilizzando segnali a infrarossi.

Componenti necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

È sicuramente conveniente acquistare un intero kit, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit di avviamento ESP32

320+

ESP32 Starter Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

ESP32 Scheda

ACQUISTA

Estensione Fotocamera ESP32

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Ricevitore IR

ACQUISTA

Pin disponibili

Ecco un elenco di pin disponibili sulla scheda ESP32 per questo progetto.

Pin disponibili

IO13, IO12, IO14, IO27, IO26, IO25, IO15, IO0, IO5, IO18, IO19, IO21, IO22, IO23

Schema

../../_images/circuit_5.14_receiver.png

Quando premi un pulsante sul telecomando, il ricevitore a infrarossi rileva il segnale e puoi utilizzare una libreria a infrarossi per decodificarlo. Questo processo di decodifica ti consente di ottenere il valore del tasto associato alla pressione del pulsante.

Cablaggio

../../_images/5.14_ir_receiver_bb.png

Codice

Nota

  • Apri il file 5.14_ir_receiver.py che si trova nel percorso esp32-starter-kit-main\micropython\codes, oppure copia e incolla il codice in Thonny. Quindi, fai clic su «Esegui script corrente» o premi F5 per eseguirlo.

  • Assicurati di selezionare l’interprete «MicroPython (ESP32).COMxx» nell’angolo in basso a destra.

  • Qui, è necessario utilizzare le librerie contenute nella cartella ir_rx. Assicurati che siano state caricate su ESP32. Per un tutorial completo, fai riferimento a 1.4 Carica le Librerie (Importante).

import time
from machine import Pin, freq
from ir_rx.print_error import print_error
from ir_rx.nec import NEC_8

pin_ir = Pin(14, Pin.IN) # Ricevitore IR

# Decodifica i dati ricevuti e restituisce il nome del tasto corrispondente
def decodeKeyValue(data):
    if data == 0x16:
        return "0"
    if data == 0x0C:
        return "1"
    if data == 0x18:
        return "2"
    if data == 0x5E:
        return "3"
    if data == 0x08:
        return "4"
    if data == 0x1C:
        return "5"
    if data == 0x5A:
        return "6"
    if data == 0x42:
        return "7"
    if data == 0x52:
        return "8"
    if data == 0x4A:
        return "9"
    if data == 0x09:
        return "+"
    if data == 0x15:
        return "-"
    if data == 0x7:
        return "EQ"
    if data == 0x0D:
        return "U/SD"
    if data == 0x19:
        return "CYCLE"
    if data == 0x44:
        return "PLAY/PAUSE"
    if data == 0x43:
        return "FORWARD"
    if data == 0x40:
        return "BACKWARD"
    if data == 0x45:
        return "POWER"
    if data == 0x47:
        return "MUTE"
    if data == 0x46:
        return "MODE"
    return "ERROR"

# Callback utente
def callback(data, addr, ctrl):
    if data < 0:  # Il protocollo NEC invia codici ripetuti.
        pass
    else:
        print(decodeKeyValue(data))


ir = NEC_8(pin_ir, callback) # Istanzia il ricevitore NEC_8

# Mostra informazioni di debug
ir.error_function(print_error)

# Mantieni lo script in esecuzione fino a interruzione da tastiera (Ctrl+C)
try:
    while True:
        pass
except KeyboardInterrupt:
    ir.close()  # Chiudi il ricevitore

Quando il programma è in esecuzione, premi un tasto sul telecomando, il valore e il nome del tasto appariranno nella Shell.

Nota

Il nuovo telecomando ha una linguetta di plastica all’estremità per isolare la batteria all’interno. Per accendere il telecomando durante l’uso, basta rimuovere questo pezzo di plastica.

Come funziona?

  1. Anche se questo programma può sembrare complesso a prima vista, in realtà esegue le funzioni fondamentali del ricevitore IR con poche righe di codice.

    import time
    from machine import Pin, freq
    from ir_rx.nec import NEC_8
    
    pin_ir = Pin(14, Pin.IN) # Ricevitore IR
    
    # Callback utente
    def callback(data, addr, ctrl):
        if data < 0:  # Il protocollo NEC invia codici ripetuti.
            pass
        else:
            print(decodeKeyValue(data))
    
    ir = NEC_8(pin_ir, callback)  # Istanzia il ricevitore
    
    • In questo codice, viene istanziato un oggetto ir, permettendogli di leggere i segnali catturati dal ricevitore IR in qualsiasi momento.

    • Le informazioni risultanti vengono quindi memorizzate nella variabile data all’interno della funzione di callback.

    • Se il ricevitore IR riceve valori duplicati (ad esempio, quando un tasto viene premuto e tenuto premuto), il data sarà inferiore a 0 e questo data deve essere filtrato.

    • Altrimenti, il data sarà un valore utilizzabile, anche se in un codice non leggibile. La funzione decodeKeyValue(data) viene quindi utilizzata per decodificarlo in un formato più comprensibile.

      def decodeKeyValue(data):
          if data == 0x16:
              return "0"
          if data == 0x0C:
              return "1"
          if data == 0x18:
              return "2"
          if data == 0x5E:
          ...
      
  2. Successivamente, incorporiamo diverse funzioni di debug nel programma. Sebbene queste funzioni siano essenziali, non sono direttamente correlate al risultato desiderato che vogliamo ottenere.

    from ir_rx.print_error import print_error
    
    ir.error_function(print_error) # Mostra informazioni di debug
    
  3. Infine, utilizziamo un ciclo vuoto per il programma principale e implementiamo una struttura try-except per garantire che il programma si chiuda con l’oggetto ir correttamente terminato.

    try:
        while True:
            pass
    except KeyboardInterrupt:
        ir.close()