Vysielač morzeovky: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
Riadok 186: | Riadok 186: | ||
</source></tab> | </source></tab> | ||
</tabs> | </tabs> | ||
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:DVPS_Zadanie_ADMP.c|DVPS_Zadanie_ADMP.c]] [[Médiá:Príklad.ogg]] | |||
== Overenie == | == Overenie == | ||
Program sme otestovali a výsledok je demonštrovaný videom. | Program sme otestovali a výsledok je demonštrovaný videom. |
Verzia z 17:11, 12. apríl 2024
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
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.
Princíp fungovania 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;
}
Zdrojový kód: serial.h a DVPS_Zadanie_ADMP.c Médiá:Príklad.ogg
Overenie
Program sme otestovali a výsledok je demonštrovaný videom.
Foto zapojenia:
Video: