Nota

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

Perché unirsi a noi?

  • Supporto Esperto: Risolvi problemi post-vendita e affronta sfide tecniche con il supporto della nostra community e del nostro team.

  • Impara e Condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime Esclusive: Accedi in anteprima agli annunci di nuovi prodotti e ai primi sguardi sulle novità.

  • Sconti Esclusivi: Godi di sconti esclusivi sui nostri ultimi prodotti.

  • Promozioni Festive e Giveaway: Partecipa a giveaway e promozioni per le festività.

👉 Pronto per esplorare e creare con noi? Clicca [Qui] e unisciti oggi!

3.1.11 Generatore di Codice Morse

Introduzione

In questo progetto, creeremo un generatore di codice Morse, dove puoi digitare una serie di lettere in inglese nel Raspberry Pi per visualizzarle in codice Morse.

Componenti Necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/4.1.16_morse_code_generator_list.png

Schema di Collegamento

T-Board Name

physical

wiringPi

BCM

GPIO17

Pin 11

0

17

GPIO22

Pin 15

3

22

../_images/4.1.16_morse_code_generator_schematic.png

Procedure Sperimentali

Passo 1: Costruisci il circuito. (Fai attenzione ai poli del buzzer: quello con l’etichetta + è il polo positivo e l’altro è il negativo.)

../_images/4.1.16_morse_code_generator_circuit.png

Passo 2: Apri il file del codice.

cd ~/davinci-kit-for-raspberry-pi/python-pi5

Passo 3: Esegui.

sudo python3 3.1.11_MorseCodeGenerator.py

Dopo l’avvio del programma, digita una serie di caratteri, e il buzzer e il LED invieranno i segnali corrispondenti in codice Morse.

Avvertimento

Se compare l’errore RuntimeError: Cannot determine SOC peripheral base address, consulta Se gpiozero non funziona.

Codice

#!/usr/bin/env python3
from gpiozero import Buzzer, LED
import time

# Inizializzazione del Buzzer e del LED sui pin GPIO
BeepPin = Buzzer(22)
ALedPin = LED(17)

# Rappresentazione in codice Morse per i caratteri
MORSECODE = {
    'A': '01', 'B': '1000', 'C': '1010', 'D': '100', 'E': '0', 'F': '0010', 'G': '110',
    'H': '0000', 'I': '00', 'J': '0111', 'K': '101', 'L': '0100', 'M': '11', 'N': '10',
    'O': '111', 'P': '0110', 'Q': '1101', 'R': '010', 'S': '000', 'T': '1',
    'U': '001', 'V': '0001', 'W': '011', 'X': '1001', 'Y': '1011', 'Z': '1100',
    '1': '01111', '2': '00111', '3': '00011', '4': '00001', '5': '00000',
    '6': '10000', '7': '11000', '8': '11100', '9': '11110', '0': '11111',
    '?': '001100', '/': '10010', ',': '110011', '.': '010101', ';': '101010',
    '!': '101011', '@': '011010', ':': '111000',
}

def on():
    """ Turn on the buzzer and LED. """
    BeepPin.on()
    ALedPin.on()

def off():
    """ Turn off the buzzer and LED. """
    BeepPin.off()
    ALedPin.off()

def beep(dt):  # dt indica il tempo di ritardo.
    """
    Produce a beep sound and LED flash for the specified duration.
    :param dt: Duration for the beep and flash.
    """
    on()
    time.sleep(dt)
    off()
    time.sleep(dt)

def morsecode(code):
    """
    Convert the input code into Morse code and signal it using the buzzer and LED.
    :param code: The text to be converted to Morse code.
    """
    pause = 0.25
    for letter in code:
        for tap in MORSECODE[letter]:
            if tap == '0':
                beep(pause / 2)  # Beep corto per il punto
            if tap == '1':
                beep(pause)      # Beep lungo per la linea
        time.sleep(pause)  # Pausa tra le lettere

def destroy():
    """ Clean up resources on script termination. """
    print("")
    BeepPin.off()
    ALedPin.off()

try:
    while True:
        code = input("Please input the messenger:")
        code = code.upper()  # Conversione in maiuscolo per il lookup del codice Morse
        print(code)
        morsecode(code)
except KeyboardInterrupt:
    destroy()

Spiegazione del Codice

  1. Questo segmento include l’importazione delle librerie essenziali per implementare i ritardi e la gestione dei thread. Inoltre, importa le classi LED, Button e TonalBuzzer dalla libreria gpiozero, fondamentali per controllare i dispositivi GPIO sul Raspberry Pi.

    #!/usr/bin/env python3
    from gpiozero import Buzzer, LED
    import time
    
  2. Inizializza il buzzer sul pin GPIO 22 e il LED sul pin GPIO 17, consentendo il controllo di questi componenti.

    # Inizializzazione del buzzer e del LED ai pin GPIO
    BeepPin = Buzzer(22)
    ALedPin = LED(17)
    
  3. Definisce la struttura MORSE, un dizionario contenente le rappresentazioni del codice Morse per i caratteri A-Z, i numeri 0-9 e simboli come “?”, “/”, “:”, “,”, “.”, “;”, “!”, “@”, dove 0 indica un punto e 1 indica una linea.

    # Rappresentazione del codice Morse per i caratteri
    MORSECODE = {
        'A': '01', 'B': '1000', 'C': '1010', 'D': '100', 'E': '0', 'F': '0010', 'G': '110',
        'H': '0000', 'I': '00', 'J': '0111', 'K': '101', 'L': '0100', 'M': '11', 'N': '10',
        'O': '111', 'P': '0110', 'Q': '1101', 'R': '010', 'S': '000', 'T': '1',
        'U': '001', 'V': '0001', 'W': '011', 'X': '1001', 'Y': '1011', 'Z': '1100',
        '1': '01111', '2': '00111', '3': '00011', '4': '00001', '5': '00000',
        '6': '10000', '7': '11000', '8': '11100', '9': '11110', '0': '11111',
        '?': '001100', '/': '10010', ',': '110011', '.': '010101', ';': '101010',
        '!': '101011', '@': '011010', ':': '111000',
    }
    
  4. La funzione on() accende il buzzer e il LED. La funzione off() è usata per spegnere il buzzer e il LED.

    def on():
        """ Turn on the buzzer and LED. """
        BeepPin.on()
        ALedPin.on()
    
    def off():
        """ Turn off the buzzer and LED. """
        BeepPin.off()
        ALedPin.off()
    
  5. Definisce la funzione beep() per far emettere al buzzer e al LED suoni e lampeggi in un determinato intervallo di dt.

    def beep(dt):  # dt per il tempo di ritardo.
        """
        Produce a beep sound and LED flash for the specified duration.
        :param dt: Duration for the beep and flash.
        """
        on()
        time.sleep(dt)
        off()
        time.sleep(dt)
    
  6. La funzione morsecode() gestisce il codice Morse dei caratteri in ingresso, emettendo un segnale di suoni o luci per ogni “1” del codice e un segnale breve per ogni “0”. Ad esempio, inserendo “SOS”, si otterrà un segnale di tre punti, tre linee, e di nuovo tre punti: “ · · · - - - · · · ”.

    def morsecode(code):
        """
        Convert the input code into Morse code and signal it using the buzzer and LED.
        :param code: The text to be converted to Morse code.
        """
        pause = 0.25
        for letter in code:
            for tap in MORSECODE[letter]:
                if tap == '0':
                    beep(pause / 2)  # Suono breve per il punto
                if tap == '1':
                    beep(pause)      # Suono lungo per la linea
            time.sleep(pause)  # Pausa tra lettere
    
  7. Definisce una funzione chiamata destroy che spegne sia il buzzer che il LED. Questa funzione è progettata per essere chiamata alla terminazione dello script per assicurarsi che i pin GPIO non rimangano in uno stato attivo.

    def destroy():
        """ Clean up resources on script termination. """
        print("")
        BeepPin.off()
        ALedPin.off()
    
  8. Quando si digitano i caratteri rilevanti con la tastiera, upper() convertirà le lettere in maiuscolo. print() visualizza il testo chiaro sullo schermo del computer e la funzione morsecode() fa sì che il buzzer e il LED emettano segnali in codice Morse.

    try:
        while True:
            code = input("Please input the messenger:")
            code = code.upper()  # Conversione in maiuscolo per il codice Morse
            print(code)
            morsecode(code)
    except KeyboardInterrupt:
        destroy()