Operácie

Vysielač morzeovky: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
Riadok 187: Riadok 187:
</tabs>
</tabs>


 
'''Foto zapojenia:'''





Verzia z 16:54, 12. apríl 2024

Záverečný projekt predmetu MIPS / LS2024
Autor: Dávid Majba
Študijný odbor: Automobilová mechatronika
Ročník: 2. Bc.

Zadanie

Vysielač Morseovky po sériovej linke. Vysielač Morseovho kódu ktorý prijíma textový vstup prostredníctvom sériovej linky a prehráva ho pomocou reproduktora. Užívateľ pošle textový vstup do zariadenia cez terminálové rozhranie . Po prijatí textu zariadenie automaticky konvertuje text na Morseov kód a následne ho prehráva.

Tieto pomery sú bežne používané v Morseovom kóde na určenie dĺžky bodky, čiarky a pauz medzi znakmi, písmenami a slovami:

  • Bodka: 1 jednotka (t.j. čas trvania krátkeho zvuku)
  • Čiarka: 3 jednotky (t.j. čas trvania dlhého zvuku)
  • Medzi znakmi rovnakého písmena: 1 jednotka (t.j. pauza medzi znakmi rovnakého písmena)
  • Medzi písmenami slova: 3 jednotky (t.j. pauza medzi písmenami)
  • Medzi slovami: 7 jednotiek (t.j. pauza medzi slovami)


Literatúra:


Analýza a opis riešenia

Schéma zapojenia

Ako je možné vidieť podľa schémy zapojenie je veľmi jednoduché. Reproduktor je pripojený k pinu D6 zariadenia ATmega328P a na zem (GND). Pre sériovú komunikáciu je vyhradený vstupný pin zariadenia, umožňujúc užívateľovi zaslať textový vstup.

Po inicializácii čaká zariadenie na sériový textový vstup od užívateľa. Po prijatí textu sa zariadenie automaticky pustí do konverzie textu na Morseov kód, využívajúc Morseovu abecedu na prevod písmen a číslic do Morseovho kódu. Pre správne fungovanie je vhodné, aby sme zabezpečili konverziu aj pre malé písmená a čísla.

Následne prehráva Morseov kód prostredníctvom reproduktora. Prehľadné rozlíšenie medzi bodkami a čiarkami Morseovho kódu je zabezpečené krátkymi a dlhými zvukmi reproduktora. Je možné zmeniť rýchlosť prehrávania, čo je užitočné pre prispôsobenie prehrávania Morseovho kódu rôznym preferenciám užívateľa.

Dodržiavanie špecifikovaných pauz je dôležité pre rozlišovanie medzi jednotlivými znakmi a slovami v prehrávanom texte. Tieto pauzy zabezpečujú jasné oddelenie jednotlivých znakov a slov v Morseovom kóde, čím umožňujú ľahké sledovanie prehrávaného textu.

Fungovanie projektu:

  • Užívateľ zadáva textový vstup cez sériovú linku.
  • Zariadenie konvertuje vstupný text na Morseov kód podľa špecifikácií Morseovho kódu.
  • Morseov kód je prehrávaný pomocou reproduktora, pričom krátke zvuky reprezentujú bodky a dlhé zvuky čiarky Morseovho kódu.
  • Medzi jednotlivými znakmi a slovami sú dodržané špecifikované časy pauz, aby bolo možné rozlíšiť jednotlivé znaky a slová v prehrávanom texte.

Program

Program je navrhnutý ako jednoduchý prehrávač Morseovho kódu pre zariadenie ATmega328P, pričom využíva reproduktor pripojený k pine PD6. Písmená a čísla sú reprezentované pomocou Morseovho kódu, ktorý je uložený v tabuľkách morseovkaPISMENA a morseovkaCISLA. Každé písmeno alebo číslo je kódované ako sekvencia bodiek (".") a čiar ("-").

Reproduktor je použitý na prehrávanie zvukových signálov, ktoré odpovedajú Morseovým kódom. Rýchlosť prehrávania je možné meniť pomocou premennej rychlost, ktorá určuje dĺžku bodiek (".") a čiar ("-") a aj pauzy medzi jednotlivými znakmi, písmenami a aj slovami.

Po inicializácii program čaká na sériový textový vstup od užívateľa. Po prijatí textu sa zariadenie automaticky pustí do konverzie textu na Morseov kód. Táto konverzia využíva Morseovu abecedu na prevod písmen a číslic do Morseovho kódu. Pre správne fungovanie je dôležité, aby sme zabezpečili aj konverziu pre malé písmená. To znamená, že ak užívateľ pošle text obsahujúci malé písmená, tieto budú automaticky prevedené na veľké písmená, aby sme mohli nájsť ich ekvivalentné Morseové kódy v tabuľkách.

Následne prehráva Morseov kód prostredníctvom reproduktora. Prehľadné rozlíšenie medzi bodkami a čiarkami Morseovho kódu je zabezpečené krátkymi a dlhými zvukmi reproduktora.

#define F_CPU 16000000UL	// Definícia frekvencie CPU
#define BAUDRATE 9600		// Požadovaná rýchlosť pre sériovú komunikáciu
#define BAUD_PRESCALE (((F_CPU / (BAUDRATE * 16UL))) - 1)	

#include <avr/io.h>
#include <util/delay.h>

// Definícia makier pre nastavenie a vynulovanie bitu
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))


#define repracik PD6	// Definícia pinu pre reproduktor

unsigned char znak;

// Tabuľka Morseových kódov pre písmená
const char* morseovkaPISMENA[] = {
    ".-",   // A
    "-...",  // B
    "-.-.",  // C
    "-..",   // D
    ".",     // E
    "..-.",  // F
    "--.",   // G
    "....",  // H
    "..",    // I
    ".---",  // J
    "-.-",   // K
    ".-..",  // L
    "--",    // M
    "-.",    // N
    "---",   // O
    ".--.",  // P
    "--.-",  // Q
    ".-.",   // R
    "...",   // S
    "-",     // T
    "..-",   // U
    "...-",  // V
    ".--",   // W
    "-..-",  // X
    "-.--",  // Y
    "--..",  // Z
    " ",     // Medzera
};

// Tabuľka Morseových kódov pre čísla
const char* morseovkaCISLA[] = {
    "-----", // 0
    ".----", // 1
    "..---", // 2
    "...--", // 3
    "....-", // 4
    ".....", // 5
    "-....", // 6
    "--...", // 7
    "---..", // 8
    "----.", // 9
};

// Inicializácia reproduktora
void hrajreprak(void) {
    DDRD |= (1 << repracik);		// Nastavenie pinu reproduktora ako výstupný
    TCCR0A = (1<<COM0A0)|(1<<WGM01);	// Nastavenie PWM výstupu
    TCCR0B = (1<<CS02);			// Nastavenie preddelečníka časovača
}

// Prehrávanie Morseovho kódu
void prehrajmorseovku(const char* morseovkaPISMENA) {
    

		int rychlost=100; 				// Rychlost prehravanie (mozne zmenit podla potreby)
    
    
	while (* morseovkaPISMENA != '\0') {
        if (* morseovkaPISMENA == '.') {		// Bodka '.'
            set_bit(PORTD, repracik);			// Zapnutie reproduktora
            OCR0A = 100;				
            _delay_ms(rychlost);			// dlzka bodky 
            clear_bit(PORTD, repracik);			// Vypnutie reproduktora
            OCR0A = 0;					
            _delay_ms(rychlost);			// Pauza po bodke
        } else if (* morseovkaPISMENA == '-') { 	// čiarka '-'
            set_bit(PORTD, repracik);			// Zapnutie reproduktora
            OCR0A = 100;				
            _delay_ms(3*rychlost);			// dlzka čiarky
            clear_bit(PORTD, repracik);			// Vypnutie reproduktora
            OCR0A = 0;					
            _delay_ms(rychlost);			// Pauza po čiarke
        } else if (* morseovkaPISMENA == ' ') {		// Pre medzeru
            OCR0A = 0;					
            _delay_ms(7*rychlost);			// Pauza pre medzeru
        }
        morseovkaPISMENA++;				// Posunutie na ďalší znak
        _delay_ms(3*rychlost);				// Pauza po každom znaku
    }
}

int main(void) {
    UBRR0 = BAUD_PRESCALE;			// Nastavenie hodnoty predelečníka UBRR
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);	// Nastavenie počtu bitov pre UART
    UCSR0B = (1 << RXEN0) | (1 << TXEN0);	// Aktivácia RX a TX pre UART

    hrajreprak(); 				// Inicializácia reproduktora
    while (1) {
        while (!(UCSR0A & (1 << RXC0))) {}; 	// Čakanie na príchod znaku
        znak = UDR0; 				// Uloženie prijatého znaku

        if (( znak >= 'A' && znak <= 'Z') || ( znak >= 'a' && znak <= 'z')) { 				// Pre písmená
            if ( znak >= 'a' && znak <= 'z') { 								// Ak je znak malé písmeno, premeníme ho na veľké
                znak -= 32;
            }
            const char* morseovkaznak = morseovkaPISMENA[znak - 'A']; 					// Získanie Morseovho kódu pre písmeno
            prehrajmorseovku(morseovkaznak); 								// Prehratie Morseovho kódu
        } else if ( znak >= '0' && znak <= '9') { // Pre čísla
            const char* morseovkacislo = morseovkaCISLA[znak - '0']; 					// Získanie Morseovho kódu pre číslo
            prehrajmorseovku(morseovkacislo); 								// Prehratie Morseovho kódu
        }

        while (!(UCSR0A & (1 << UDRE0))) {}; 								// Čakanie na možnosť odoslať znak
        UDR0 = znak; 											// Odoslanie prijatého znaku
    }

    return 0; 
}

Foto zapojenia:


Video: