Aplikace C1 Morseova abeceda

V dnešní lekci nejenže využijeme našich znalostí z lekcí řady B, ale doplníme je o další vědomosti a vytvoříme si program, který nám pomůže naučit se Morseovu abecedu.

název: C1 Morseova abeceda
kategorie: C středně pokročilí
ref.číslo: C1
projekt: kurz micro:bit
verze: 01, 2017-04-15
autor: Ivo Obr, Lanškroun


 

V dnešní lekci nejenže využijeme našich znalostí z lekcí řady B, ale doplníme je o další vědomosti a vytvoříme si program, který nám pomůže naučit se Morseovu abecedu. Co to je ?

Morseova abeceda, nebo také morseovka (což je mnohem používanější, ale lidový název), je sestava kódů interpretujících písmena latinky, čísla a některé speciální znaky do podoby teček a čárek, respektive krátkých a dlouhých signálů. Její stěžejní využití tkvělo a stále tkví především v telegrafii, avšak lze ji použít pro prakticky jakoukoliv komunikaci, kde je možné zrakem, sluchem nebo hmatem rozlišit zmiňované signály ve formě teček a čárek a současně také mezery/pauzy mezi nimi (citace z http://morseovaabeceda.cz/).

Těm, kteří se chtějí dozvědět více, doporučuji navštívit výše uvedený server.

První věcí, kterou se naučíme je kódovací tabulka. Zapisuje se takto :

“jméno tabulky” = {
     “1ř_hodnota1″:”1ř_hodnota2”,
     “2ř_hodnota1″:”2ř_hodnota2”,
}

První sloupec v tabulce (hodnota1) je nějaký řetězec znaků, ke kterému hledáme protějšek uvedený ve druhém sloupci (hodnota2). Pro nás bude v prvním sloupci vždy uvedena značka morseovy abecedy jako posloupnost teček a čárek, ve druhém sloupci pak bude znak, který značce odpovídá. Výhodou tohoto postupu je, že nemusíme sami programovat vyhledávání v tabulce hodnot a pak k tomu získat patřičný znak, ale vyhledávání ponecháme na jediném příkazu.

Nejlépe si to ukážeme na příkladu :

MORSE = {
“.-“: “A”,
“-…”: “B”,
“-.-.”: “C”,
}

Pokud jsme získali značku Morseovy abecedy “-…” a máme tento řetězec znaků v proměnné “znacka”, pak odpovídající znak získáme jedním příkazem do proměnné se jménem “znak” a to takto :

znak = MORSE.get(znacka, “*”)

Druhý parametr v závorce je znak, který dostaneme, když se žádný odpovídající kód v prvém sloupce nerovná obsahu proměnné “znacka”.

V programu budeme využívat pro vytvoření značek Morseovy abecedy (dále jen MA) tlačítka “B” pro praváky, leváci si program napíší s obrácenými tlačítky. Je to proto, abychom si pravou rukou nestínily pohled na displej, který budeme potřebovat. Tlačítko “A” (respektive “B” pro leváky) použijeme pro výpis celého textu, který jsme napsali a také pro jeho vymazání. Vypsání celého textu získáme stiskem tlačítka “A” po dobu maximálně do 500msec. Delší stisk tohoto tlačítka text vymaže.

Základem programu bude sledování času – viz lekce B11. Budeme sledovat dobu stisknutí tlačítka “B” a podle toho vyvozovat, zdali se jedná o tečku, čárku nebo konec značky MA. V MA je základní dobou čas trvání tečky(dále jen TT). Čas trvání čárky je 3TT. Časová mezera mezi jednotlivými čárkami a tečkami v jedné značce je v délce TT, časová mezera mezi značkami MA je 3TT (u nás může být větší). Zvolíme si hodnoty tak, abychom bezpečně zvládli stisk tlačítka na Microbitu a tak zvolíme, že čas tečky bude do 200ms, čas čárky trojnásobek, to je do 600ms. Pokud bude časová prodleva větší než 600ms, považujeme to za ukončení značky a budeme pokračovat v získání adekvátního znaku ke značce MA.

Nejprve si nadeklarujeme proměnné, sice to není povinné, ale uděláme si v tom pořádek a jednotlivé proměnné si okomentujeme v programu :

Všimněte si řádku 64 a 68, kde jsme si nadefinovali proměnné, ale jejich obsah jsme nenastavili, zatím je tam prázdno.

V následujícím budu podrobně komentovat jednotlivé části programu, abychom těmto celkům porozuměli.

řádek 82:

Na začátku každého cyklu programu si nastavíme, že tlačítko “B” nebylo stisknuto. To nám umožní se v dalším vyhnout příkazům, které souvisejí s prováděním operací, když bylo tlačítko stisknuto.

řádek 83:

Tady jsme použili “is.pressed” a ne “was.presed” a to z důvodů, abychom zachytili čas stisku tlačítka. Příkaz “if not cas_B1:” dovolí provést odsazený příkaz jen, když proměnná “cas_B1” bude prázdná. (prázdná proměnná v logickém testu je jako False, když otočíme hodnotu pomocí operátoru negace not, tak dostaneme hodnotu True. ) Příkaz “cas_B1 = running_time()” se provede jen jednou, a to na úplném začátku stisku tlačítka “B”.

řádek 88:

Tady se ptáme, jestli bylo stisknuto tlačítko “B”. Pokud je v proměnné “cas_B1” nějaká hodnota, pak tlačítko stisknuté bylo a můžeme provést příkazy odsazené pod tímto “if”.

řádek 88:

Nejdříve si poznačíme čas uvolnění tlačítka “B”.

řádek 91:

A protože máme jak čas stisknutí tlačítka “B” tak čas jeho uvolnění, můžeme spočítat dobu, po kterou bylo tlačítko stisknuté.

řádek 93:

Pokud byl stisk kratší než čas tečky (200ms), pak by to měla být tečka a provedeme řádky 94 a 95.

řádek 94:

Do proměnné “značka” doplníme (přičteme) z pravé strany znak tečky.  Zatím jsem uváděl standardní tvar, ale je možné také zápis zkrácený a to : znacka += ‘.’ .

řádek 95:

Na displeji vypisuji obraz tečky (viz řádek 52). Použil jsem další parametry pro výpis a to, že zobrazení bude trvat jen 120ms, pak se smaže (to by mělo stačit na identifikaci) a prázdný displej podporuje vložení další tečky nebo čárky. Příkaz nečeká na dokončení zobrazení a pokračuje dalšími příkazy.

řádek 96:

Pokud byl čas stisku tlačítka “B” mezi 201 a 599 msec, pak se uplatní tento příkaz a je téměř identický jako případ s tečkou.

řádek 99:

Pokud jsme trochu zaspali a drželi tlačítko déle, než měla být doba čárky, pak do proměnné “znacka” nic nezapíšeme a vykreslíme jen na displeji obrázek chyby.

A pokračujeme dále programem, teď už mimo příkaz “if” na řádku 88. Známe čas uvolnění tlačítka “B”, který je zapsán v proměnné “cas_B0”. Pokud tento čas začne převyšovat čas čárky, jedná se zřejmě o konec značky a my se připravíme na dekódování značky na tisknutelný znak.

řádek 102:

Zde si spočítáme, jak hodně uběhla doba od uvolnění tlačítka “B”. Od aktuálního času odečteme čas posledního uvolnění. Pokud tato doba překročí čas na čárku, pak se jedná o konec značky (zřejmě, můžeme také zadrhnout ve vkládání značky MA, udělat mezi čárkami a tečkami nechtěně velkou časovou mezeru).

řádek 103:

Tady se ptáme na dvě věci. Jestli v proměnné “znacka” jsou vloženy nějaké znaky teček a čárek. Poznáme to podle toho, jaký je obsah této proměnné. Pokud je prázdný (udělali jsme to na řádku 108) pak délka této proměnné je nula. Funkce len (zkratka length) nám vrátí celočíselnou hodnotu délky této proměnné.  Slovo and je logický operátor (logický součin) a můžeme si to do češtiny přeložit jako a_současně. Ta druhá podmínka je, že se jedná o konec značky.

Takže si to můžeme přeložit :
Když proměnná “znacka” není prázdná a současně je konec značky tak:
uděláme, co je odsazeno

řádek 105:

Dekódujeme z kódovací tabulky znak, nebo řetězec (v případě “CH”). Pokud jsme značku zadali chybně, tak bude v proměnné “znak” znak “hvězdička”.

řádek 107:

Dekódovaný znak vypíšeme na displeji, je zrychlen posun znaku a nečeká se.

řádek 108:

Obsah proměnné “znacka” vyprázdníme, nic tam nebude. Délka této proměnné je nyní nula. Takže pokud nezačneme rychle psát další značku stiskem klávesy “B”, cyklus “while True” se bude opakovat stále dokola a “if” na řádku 103 neprovede žádné příkazy v jeho těle.

řádek 110:

Výsledný text vkládáme znak po znaku do proměnné “zprava”. Zde bychom také mohli napsat zkrácený tvar příkazu a to:  zprava += znak .

To je celé pro tvorbu MA značek a jejich skládání do textu. Nyní se podíváme ještě na tlačítko “A” a jeho funkce :

řádek 112:

Všimněte si, že příkazy spojené s tlačítkem “A” jsou téměř shodné jako u tlačítka “B”, viz řádek 82. Takže by Vám to mělo být jasné, pokud ne, vraťte se k řádku 82 a celé si to proberte znovu, aby jste tomu porozuměli.

řádek 123:

Zde si testujeme, jak dlouho jsme tlačítko drželi. Pokud to bylo jen krátký stisk (do 499 msec), pak se text uložený v proměnné “zprava” vypíše na displeji. Výpis textu můžete opakovat opět krátkým stiskem tlačítka “A” (v případě, že Vám něco předtím uteklo). Delším stiskem (od 500msec) text v proměnné “zprava” vymažeme.

S napsaným programem můžete dále experimentovat. Až se naučíte MA a budete dobře vkládat značky, může být delší text hůře čitelnější, protože nemáte mezi slovy mezeru. Kódovací tabulka mezeru nemá. Protože už neděláte chyby v délce čárek a teček, můžeme si dovolit upravit program tak, aby jste si vynutili mezeru mezi slovy v textu delším podržením tlačítka “B” přes hranici 600msec. V současném programu se to bere jako moc dlouhá čárka a na displeji se vypíše chybové upozornění. My si to můžeme (až se naučíme MA a vkládat značky) využít pro vložení mezery do textu (místo podtržítka nebo pomlčky). Zadáme jako samotnou značku MA, a to hodně dlouho čárku.

Mezi řádky 99 a 100 vložíme příkaz

znacka += ‘m’
a do kódovací tabulky doplníme jeden řádek a to
“m”: ” “,
pozor, u druhého parametru je mezi uvozovkami mezera, řádek nejlépe vložíme hned na začátek ještě před první dvojici.

Tak a nakonec ještě kódovací tabulka, aby jste si ji nemuseli celou psát a mohli ji okopírovat rovnou do programu :

from microbit import *
# kodovaci tabulka : znacka -> znak
MORSE = {
“.-“: “A”,
“-…”: “B”,
“-.-.”: “C”,
“-..”: “D”,
“.”: “E”,
“..-.”: “F”,
“–.”: “G”,
“….”: “H”,
“—-“: “CH”,
“..”: “I”,
“.—“: “J”,
“-.-“: “K”,
“.-..”: “L”,
“–“: “M”,
“-.”: “N”,
“—“: “O”,
“.–.”: “P”,
“–.-“: “Q”,
“.-.”: “R”,
“…”: “S”,
“-“: “T”,
“..-“: “U”,
“…-“: “V”,
“.–“: “W”,
“-..-“: “X”,
“-.–“: “Y”,
“–..”: “Z”,
“..–..”: “?”,
“–…-“: “!”,
“-…-“: “=”,
“.-.-.-“: “.”,
“–..–“: “,”,
“—…”: “:”,
“.–.-.”: “@”,
“-….-“: “-“,
“.—-“: “1”,
“..—“: “2”,
“…–“: “3”,
“….-“: “4”,
“…..”: “5”,
“-….”: “6”,
“–…”: “7”,
“—..”: “8”,
“—-.”: “9”,
“—–“: “0”
}

To je pro tuto lekci vše. V některé z dalších lekcí se k tomuto programu vrátíme a budeme ho ještě dále rozšiřovat.

Pokud se Vám tato aplikace zalíbila a máte k dispozici 3D tiskárnu můžete si vytisknout přípravek ve vzhledu starodávného telegrafického zařízení který je ke stažení na stránkách MyMiniFactory zde:

https://cdn.myminifactory.com/assets/object-assets/57b33c8de3396/images/720X720-telegraph.jpg

 

 

Posted in kat C - středně pokročilí.