Semestrální práce: Možnosti práce se zvukem na jednočipovém počítači (Arduino, PICaxe, Raspberry Pi) Martin Beránek 24.



Podobné dokumenty
Výuková laboratorní sestava seminář pro učitele

Merkur perfekt Challenge Studijní materiály

Obsah ZÁKLADNÍ DESKA. O autorech 11 Úvod 13

Arduino Martin Friedl

Raspberry Pi - security system

eses výukový multi shield pro Arduino UNO

1. Připojení analogových senzorů

ArduinotechGSMShield knihovna

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ /14

ODBORNÝ VÝCVIK VE 3. TISÍCILETÍ MEIV Souborná činnost na složitých elektronických zařízeních zaměřená na servisní a profesní působení studenta

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

DIGITÁLNÍ ODPALOVACÍ PULT

Čtečka otisků prstů 1. POPIS 2. SPECIFIKACE. ECLIPSERA s.r.o. Distributor pro ČR. VÝROBNÍ ČÍSLO

Víkendový projekt: Bezklíčové otevírání domovních dveří

Cvičení 2. Obsah a cíle cvičení. Obsah. A5MPL Programování mikropočítačů Digitální vstupy a výstupy - LED a tlačítka.

SEMESTRÁLNÍ PROJEKT Y38PRO

Pro zprovoznění komunikace našeho Sigfox modemu se sítí je potřeba udělat následující kroky. Jako první si otevřeme webové stránky

Modul DHT11 s ESP POPIS 2. SPECIFIKACE. ECLIPSERA s.r.o. Distributor pro ČR. VÝROBNÍ ČÍSLO

Programování mikropočítačů platforma Arduino

Programování. řídících systémů v reálném čase. Střední odborná škola a Střední odborné učiliště - - Centrum Odborné přípravy Sezimovo Ústí

Fyzikální laboratoř. Kamil Mudruňka. Gymnázium, Pardubice, Dašická /8

Cílem dnešní lekce je obohatit náš dosavadní systém a připravit se na připojení do cloudu

Řízení robota senzorem teploty II. Tematický celek: Termodynamika. Komplexní úloha - 2. část:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

ARDUINO L01. Programování a robotika snadno a rychle? Tomáš Feltl. Připraveno pro kroužek robotiky JAOS. Kroužek JAOS Farní sbor ČCE v Poličce

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Matematika v programovacích

Úvod do mobilní robotiky AIL028

PHP tutoriál (základy PHP snadno a rychle)

PŘÍLOHY. PRESTO USB programátor

Programování LEGO robotů pomocí NXC

Katedra fyzikální elektroniky. Modul pro Time Correlated Photon Counting

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

LabView jako programovací jazyk II

Mobilní robot Arduino I

FILIP SCHWANK. Katedra měření, listopad 2017

Popis vývodů desek, jejich zapojování a spárování robota

Prostředí pro výuku vývoje PCI ovladačů do operačního systému GNU/Linux

Témata profilové maturitní zkoušky

METODICKÝ LIST K TECHNICKÉMU KROUŽKU:

Zapojení a řízení činnosti sonarových senzorů MB1220 pomocí Arduino Micro

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

ZAŘÍZENÍ PRO VZDÁLENÝ SBĚR A PŘENOS DAT FIRMWARE

Čtečky s klávesnicí EDK3, EDK3B, EDK3M

Projekt BROB B13. Jízda po čáře pro reklamní robot. Vedoucí projektu: Ing. Tomáš Florián

Měření hlasitosti zvuku. Tematický celek: Zvuk. Úkol:

9. Rozšiřující desky Evb_Display a Evb_keyboard

VISUAL BASIC. Práce se soubory

Laboratorní cvičení z předmětu Elektrická měření 2. ročník KMT

3. Sekvenční logické obvody

Chytkarobot. Karel Chytra. Vyšší odborná škola, Střední škola, Centrum odborné přípravy Budějovická 421 Sezimovo Ústí

Real Time programování v LabView. Ing. Martin Bušek, Ph.D.

Laboratorní zdroj - 6. část

Algoritmizace a programování

Mikrokontroléry. Doplňující text pro POS K. D. 2001

Software pro vzdálenou laboratoř

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jízda po čáře pro reklamní robot

Ing. Michal Martin. Spojení PLC CLICK s NA-9289

METODICKÝ LIST K TECHNICKÉMU KROUŽKU:

Maturitní otázky z předmětu PROGRAMOVÁNÍ

SEKVENČNÍ LOGICKÉ OBVODY

Manuál FrSky Smart Port Dashboard

METODICKÝ LIST K TECHNICKÉMU KROUŽKU:

Témata profilové maturitní zkoušky

Zařízení pro měření teploty, atmosférického tlaku a nadmořské výšky

Modul GPS přijímače ublox LEA6-T

Uživatelská příručka

Nejčastěji pokládané dotazy

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Rozklad na prvočinitele. 3. prosince 2010

FTTX - Měření v optických sítích. František Tejkl

Návrh čítače jako automatu

Arduino Data Logger Shield

Jazyk C++, některá rozšíření oproti C

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

Příloha A návod pro cvičení 1. SESTAVENÍ MODELU V PROSTŘEDÍ MATLAB SIMULINK Zapojení motoru

Jízda po čáře pro robot FEKTBOT BROB BAMT VUT FEKT. Michal Lesák, Tomáš Trenčan, Ondřej Balga Vedoucí projektu: Ing.

Činnost počítače po zapnutí

PROGRAMOVÁNÍ ROBOTŮ LEGO MINDSTORM S VYUŽITÍM MATLABU

Kinematika Trajektorie pohybu, charakteristiky pohybu Mirek Kubera

LABORATORNÍ CVIČENÍ Střední průmyslová škola elektrotechnická

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY. MRBT Robotika

5. Sekvenční logické obvody

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 8

K8055D.DLL v Technická příručka. Úvod. Obecné. Konvence volání. Nastavení adresy karty

TQS3. popis modifikace s protokolem MODBUS RTU. 29. února 2008 w w w. p a p o u c h. c o m 0199

STŘEDOŠKOLSKÁ ODBORNÁ ČINNOST

METODICKÝ LIST K TECHNICKÉMU KROUŽKU:

5. A/Č převodník s postupnou aproximací

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

GEOTECHNICKÝ MONITORING

VINCULUM VNC1L-A. Semestrální práce z 31SCS Josef Kubiš

Algoritmizace a programování

Automatické sněhoměrné zařízení

Úloha 9. Stavové automaty: grafická a textová forma stavového diagramu, příklad: detektory posloupností bitů.

Students for Automotive (S4A)

Transkript:

Semestrální práce: Možnosti práce se zvukem na jednočipovém počítači (Arduino, PICaxe, Raspberry Pi) Martin Beránek 24. května 2015 1

Obsah 1 Úvod 3 2 Vývojové prostředí 3 3 Příklad pro výuku 3 3.1 Základní rozdělení kódu................................. 4 3.2 Práce s GPIO....................................... 4 3.3 Ultrazvukový senzor HCSR04............................... 5 3.4 Senzor pro detekci zvuku LM393............................. 6 3.5 Příklad s oběma senzory................................. 7 3.6 Popis vlastností senzorů................................. 7 3.6.1 HC SR04..................................... 7 3.6.2 LM393....................................... 7 4 Raspberry Pi 8 5 Závěr 9 6 Seznam zkratek 10 Seznam obrázků 1 Popis pinů GPIO na Arduino.............................. 3 2 Ultrazvukový senzor HCSR04............................... 4 3 Senzor zvuku LM393................................... 5 4 Popis pinů na senzoru HCSR04.............................. 6 5 Popis pinů na senzoru LM393.............................. 6 6 Popis pinů na Raspberry Pi model A.......................... 8 2

1 Úvod Tato práce obsahuje jednoduchý úvod do programování Arduino Uno [1] se senzorem HCSR04 [2] a komparátorem LM393 [3]. Oba senzory jsou akustické. Důvodem volby tohoto tématu je praktické využití ve výuce. Tato práce tak umožní formalizovat postup a vytvořit vhodný materiál. Arduino bylo vybráno kvůli reakcím blížícím se reálnému času. Raspberry Pi obsahuje operační systém, jehož jádro rozhodně není stavěno tak, aby v reálném čase zpracovalo všechny požadavky. Důvodem je v tomto případě teorie front [4]. Ve většině případů, jako je detekce, měření,... nám to nemusí vadit. Problémy nastávají při časování krokových motorů, odkládání procesu do paměti swap v případě, kdy není proces dlouho používán a tím i docílení toho, že reakce v rámci GPIO může trvat i milisekundy. 2 Vývojové prostředí K vývoji se dá využít IDE vydávané společností Arduino, který nalezneme na stránce http://www. arduino.cc/en/main/software. V této práci využijeme verzi 1.6.4. Prostředí pro programování jednočipu Arduino pracuje s jazykem C++. IDE obsahuje vlastní knihovny, možnost překladu (crosscompiler) na jednočip a následné nahrání firmware pomocí virtuální sériové linky. Na platformě GNU Linux se po připojení Arduino prezentuje na tty s touto adresou /dev/tty/acm0. Vývojové prostředí jej dokáže samo detekovat. Pro přidávání knihoven pro další rozvíjení funkcí IDE použijeme adresář libraries v adresáři IDE. To je velice důležité v případě, že výrobce senzoru podporuje Arduino, ale podpora senzoru není součástí IDE. Platforma Arduino obsahuje jednočip ATmega328. Pro čip není potřeba programátor, ten je přímo na desce. Rozdílem mezi jednotlivými deskami Arduino je často frekvence čipu. Nám postačí 16 MHz. Obě součástky podporují GPIO. Napájení je v obou případech na 5 V. Arduino podporuje digitální i analogový vstup a výstup. Na následujícím obrázku je ukázka platformy Arduino Uno: Obrázek 1: Popis pinů GPIO na Arduino Na schématu je patrné, že napájení pro více senzorů budeme muset vyvést na spojovací destičku. Arduino obsahuje také usměrňovače napájení, takže případné výchylky nemusí vyústit v katastrofu. 3 Příklad pro výuku Tato část práce počítá s tím, že studenti měli aspoň úvod do programování. Vzhledem k tomu, že výsledný program je velice krátký, dá se snadno pochopit a vysvětlit. Pro třídu se zkušenými studenty úloha vystačí na pár minut. Protože Arduino podporuje C++ není problém programovat pomocí objektů. Nicméně řádková velikost projektů většinou nepřekračuje 1000 řádků. Objekty jsou spíše zbytečné. Většina kódu se dá zavést z knihoven dodavatelů součástek. 3

3.1 Základní rozdělení kódu Arduino pracuje s dvěma bloky kódu: void setup() { // jednou provedená část nastavení void loop() { // neustále se opakující část V části setup se provádí inicializace různých knihoven a funkcí, které potřebují statické nastavení. Část loop se užívá pro programování dynamického kódu. V základní ukázce čtení digitálního vstupu ze sériového portu [5] se můžeme soustředit na použití příkazu delay(1), který je vložen do části loop tak, aby se cyklení chovalo stabilně. V následujícím příkladu vidíme ukázku jednoduchého nastavení a nikdy nekončícího výpisu hvězdičky: void setup() { Serial.begin(9600); // inicializace konzole void loop() { Serial.println("*"); // výpis hvězdiček delay(1); Všimněme si, že jsme nastavili konzoly na 9600 bitů za sekundu. To je údaj sloužící spíše k lepší synchronizaci. K sériové lince tedy přistupujeme jako k objektu a následně v části loop používáme metodu println, která vždy vypíše řádek na konzoli. 3.2 Práce s GPIO Podle diagramu v úvodu můžeme zapojit součástky. Ty jsou již zmíněné: HCSR04 a LM393. Na následujících obrázcích je můžeme vidět tak, jak je vyfotografoval distributor: Obrázek 2: Ultrazvukový senzor HCSR04 4

Obrázek 3: Senzor zvuku LM393 Ukážeme si ještě, jak v IDE budeme pracovat s GPIO. Následující příkaz nám umožní namapovat digitální vstup z pinu 7. int dio = 7; // číslo pinu pro namapování void setup() { Serial.begin(9600); pinmode(dio, INPUT); // port bude vstupní void loop() { int hodnota = digitalread(dio); // načtení hodnoty z pinu Serial.println(hodnota); // výpis hodnoty delay(1); Proměnná dio je globální proměnnou, ke které mohou přistupovat všechny funkce. Není to moc dobrá praktika. Vzhledem k tomu, že Arduino projekty jsou většinou hodně malé, není to problém. Je dobré si ale uvědomit, že takovýmto přístupem je možné zakrýt třeba jméno knihovní funkce nebo knihovní konstantu. 3.3 Ultrazvukový senzor HCSR04 Tato část se zabývá namapováním portů senzoru HCSR04. Ten má dva piny. Jeden je výstupní a slouží jako spouštěč. Druhý je odrazový a slouží jako vstup. Je možné využít proměnné, které vyhodnotí překladač, aby Arduino zbytečně nepoužívalo paměť zásobníku za běhu [6]. Tyto proměnné se vytvářejí pomocí příkazu define a mají charakter maker. #define CM 1 // centimetr #define TRI 8 // port spouštěče #define ECHO 9 // port odezvy void setup() { pinmode(tri,output); // nastavení portu výstupu na pro spouštěč pinmode(echo,input); // nastavení portu vstupu na port pro odezvu Serial.begin(9600); // nastavení seriálového portu void loop() { long mc = TRI_init(); // inicializace long dist_cm = Distance(mc, CM); // Výpočet vzdálenosti Serial.print("Vzdálenost "); Serial.println(dist_cm); // Výpis vzdálenosti v cm 5

delay(3000); V příkladu vidíme, jak namapovat dva porty ze senzoru HCSR04 tak, abychom mohli vypsat vzdálenost na sériový port. Nezapomínejme, že je nutné správně zapojit celý senzor [7]. Na obrázku vidíme, jaké piny k čemu slouží: Obrázek 4: Popis pinů na senzoru HCSR04 Pokud zakoupíme již připravený senzor ve formě modulu, předejdeme dlouhému pájení přidaných součástek. Ačkoliv hotový modul obsahující senzor je dražší, než senzor, často si tím můžeme ulehčit spoustu práce. 3.4 Senzor pro detekci zvuku LM393 Další část popisuje, jakým způsobem můžeme naprogramovat senzor pro detekci zvuku LM393. Ten je čistě analogového charakteru. Na následující ukázce [8] si předvedeme, jak využít hranici hlasitosti, kterou můžeme nastavit. Jakmile je hranice překročena, vypíšeme do konzole hlášku: int threshold = 22; // nastavení hranice hlasitosti void setup() { Serial.begin(9600); void loop() { int volume; // proměnná pro uložení hlasitosti volume = analogread(a0); // přečtení hlasitosti ze vstupu A0, který je analogový if(volume >= threshold){ Serial.println("Hranice překročena"); // hláška při překročení hranice delay(300); V této chvíli tedy na terminál vždy Arduino vypíše hlášku, když je překročena hranice hlasitosti zvuku. Všimněme si různého způsobu práce s vstupy/výstupy, pokud jsou analogové nebo digitální. V tomto případě jsme použili analogový vstup a načítáme jej pomocí funkce analogread. Správné zapojení pinů senzorů je popsáno na následujícím obrázku: Obrázek 5: Popis pinů na senzoru LM393 6

3.5 Příklad s oběma senzory Teď už je popsáno dostatek informací k tomu, aby bylo možné sestavit malý projekt pro Arduino za použití obou senzorů. Řekněme, že potřebujeme zjistit vzdálenost od senzoru v případě, kdy je hranice hlasitosti překročena nějakým zvukem v místnosti. Vyjdeme z druhého příkladu se senzorem LM393 a dosadíme výpis vzdálenosti na sériovou linku v případě, kdy je zaregistrován nějaký hluk: #define CM 1 // centimetr #define TRI 8 // port spouštěče #define ECHO 9 // port odezvy int threshold = 22; // nastavení hranice hlasitosti void setup() { pinmode(tri,output); // nastavení portu výstupu na pro spouštěč pinmode(echo,input); // nastavení portu vstupu na port pro odezvu Serial.begin(9600); // nastavení seriálového portu void loop() { int volume; // proměnná pro uložení hlasitosti volume = analogread(a0); // přečtení hlasitosti ze vstupu A0, který je analogový if(volume >= threshold){ Serial.println("Hranice překročena"); // hláška při překročení hranice long mc = TRI_init(); // inicializace long dist_cm = Distance(mc, CM); // Výpočet vzdálenosti Serial.print("Vzdálenost "); Serial.println(dist_cm); // Výpis vzdálenosti v cm delay(300); Takto jednoduše můžeme spojit vlastnosti obou akustických senzorů. Na základě vlastností senzorů je možné stanovit mnoho případů použitelnosti. Vybral jsem jen několik: Detekce příchozích oba detektory mohou pomoci třeba detekovat pohyb v místnosti. Nějaký rozruch a na základě toho změnit i vzdálenost. Hlídání objektů na základě zvuku je možné detekovat, zdali se nějaký pohnul. Robot je možné vybavit pohyblivého robota akustickým detektorem tak, aby se mohl vyhýbat překážkám. 3.6 Popis vlastností senzorů V této části jsou nastíněny fyzikální vlastnosti čidel. Na základě těchto principů jsou čidla schopná fungovat. 3.6.1 HC SR04 Senzor vysílá ultrazvukové pulsy. Následně čeká na přijetí odrazu pulsu. Nejdříve je nutné znát rychlost zvuku: 346, 3 m s 1 při teplotě 25 C. Z toho můžeme stanovit, že za jednu mikrosekundu urazí puls v metrech 346,3 1000000, tedy 0, 0003463 m. Vzhledem k tomu, že vlna vlastně putuje dvakrát (tam a zpátky), je nutné tuto vzdálenost ještě vydělit dvěma. Vzhledem k tomu, že takový výpočet může být složitý, návrháři senzoru přidali knihovní funkci Distance, která za nás všechno provede. 3.6.2 LM393 Jméno LM393 je spíše označení pro komparátor. Senzor vlastně nedělá nic jiného, než že čeká na změnu v kondenzátoru. Ten je citlivý na chvění generované podélným vlněním zvuku. Po změně kapacity kondenzátoru zareaguje komparátor a předá analogový signál na svůj výstup. 7

4 Raspberry Pi V této části je popis, jakým způsobem je možné pracovat se zmíněnými akustickými senzory na platformě Raspberry. Jak už bylo popsáno v úvodu, vlastnosti Raspberry jsou někdy na obtíž, ale v tomto případě, kdy jde pouze o detekci, to nemusí být nutně špatně. Schéma GPIO portů na Raspberry popisuje následující obrázek. Pro tento příklad byl vybrán model A. Obrázek 6: Popis pinů na Raspberry Pi model A K zapojení tedy budeme potřebovat dva digitální GPIO, napájení a uzemnění. V rámci ukázky je možné použít programovací jazyk Python, který na Raspberry má nainstalovaný modul obsahující funkce pro práci s GPIO. Také budeme potřebovat knihovnu time ke změření odezvy senzoru. # přidání knihoven import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) # namapování portů GPIO triger = 12 echo = 13 GPIO.setup(triger,GPIO.OUT) GPIO.setup(echo,GPIO.IN) GPIO.output(triger, False) # čekání na uklidnění portu time.sleep(2) # nastavení portů GPIO.output(triger, True) time.sleep(0.00001) GPIO.output(triger, False) # načtení počáteční hodnoty while GPIO.input(echo)==0: impulse_start = time.time() # načtení vracejícího se pulsu while GPIO.input(echo)==1: impulse_konec = time.time() # změření času přenosu cas = impulse_konec - impulse_start # vzdálenost se zaokrouhlením na dvě desetinná místa 8

distance = round(pulse_duration * 17150,2) # výpis vzdálenosti print "Vzdálenost: " + str(distance) + " cm" # navrácení GPIO systému GPIO.cleanup() Povšimněme si, že manipulace se senzorem je prakticky stejná jako na Arduino. Je nutné namapovat porty a následně je nastavit pomocí metody setup. Následuje vyčkávání, než se senzor uklidní a potom naměření hodnot. Potom se provede výpočet vzdálenosti, který se vypíše na řádek konzole. 5 Závěr Důvodem volby této práce bylo popsat akustické senzory na platformě Arduino a přidat několik příkladů. Na základě vypracování této práce bylo možné vytvořit malé cvičení pro studenty, kteří senzory nasazovali na své malé roboty. Místo detektoru hluku se spíše použije senzor PIR, který se aktivuje, pokud detekuje pohyb. Přidáním ukázky na platformě Rasbperry Pi s použitím programovacího jazyka Python došlo ke zvýšení kontrastu práce. Čtenář se tak může podívat, jak je implementace rozdílná. Práce s GPIO je velice jednoduchá i pro začínajícího programátora. 9

6 Seznam zkratek IDE Integrated Development Environment GPIO General Purpose Input/Output PIR Passive Infrared Detector Reference [1] Arduino: Arduino Uno. [cit. 2015-05-28]. Dostupné z: http://www.arduino.cc/en/main/ ArduinoBoardUno [2] EasyDuino: Ultrazvukový senzor HC-SR04. [cit. 2015-04-28]. Dostupné z: http://www. easyduino.cz/ultrazvukovy-senzor-hc-sr04-d43.htm [3] EasyDuino: Detektor zvuku, zvukový senzor, kompatibilní s Arduino. [cit. 2015-04-28]. Dostupné z: http://www.easyduino.cz/ Detektor-zvuku-zvukovy-senzor-kompatibilni-s-Arduino-d179.htm [4] Medhi, J.: Stochastic Models in Queueing Theory. Elsevier Science, 2002, ISBN 9780080541815. Dostupné z: https://books.google.cz/books?id=hg1vxqp4pdkc [5] Arduino: Digital Read Serial. [cit. 2015-05-28]. Dostupné z: http://www.arduino.cc/en/ Tutorial/DigitalReadSerial [6] ElecFreaks: HC-SR04 Demo For Arduino. [cit. 2015-05-28]. Dostupné z: http://www. elecfreaks.com/244.html [7] ElecFreaks: Ultrasonic Ranging Module HC-SR04. [cit. 2015-05-28]. Dostupné z: http:// elecfreaks.com/store/download/hc-sr04.pdf [8] Nakamura, H.: Arduino Sound Sensor. [cit. 2015-05-28]. Dostupné z: https://sites.google. com/site/summerfuelrobots/arduino-sensor-tutorials/arduino-sound-sensor 10