• No results found

Implementace rozhraní pro vývojové kity v prostředí MATLAB/Octave

N/A
N/A
Protected

Academic year: 2022

Share "Implementace rozhraní pro vývojové kity v prostředí MATLAB/Octave"

Copied!
48
0
0

Loading.... (view fulltext now)

Full text

(1)

Implementace rozhraní pro vývojové kity v prostředí MATLAB/Octave

Bakalářská práce

Studijní program: N2612 – Elektrotechnika a informatika

Studijní obor: 2612R011 – Elektronické informační a řídicí systémy Autor práce: Jan Brož

Vedoucí práce: Ing. Petr Mrázek, PhD.

(2)

Implementing an interface for evaluation kits in MATLAB/Octave

Bachelor thesis

Study programme: N2612 – Electrotechnology and informatics

Study branch: 2612R011 – Electronic information and control systems

Author: Jan Brož

Supervisor: Ing. Petr Mrázek, PhD.

(3)

Tento list nahraďte

originálem zadání.

(4)

Prohlášení

Byl jsem seznámen s tím, že na mou bakalářskou práci se plně vztahuje zákon č. 121/2000 Sb., o právu autorském, zejména § 60 – školní dílo.

Beru na vědomí, že Technická univerzita v Liberci (TUL) neza- sahuje do mých autorských práv užitím mé bakalářské práce pro vnitřní potřebu TUL.

Užiji-li bakalářskou práci nebo poskytnu-li licenci k jejímu vyu- žití, jsem si vědom povinnosti informovat o této skutečnosti TUL;

v tomto případě má TUL právo ode mne požadovat úhradu ná- kladů, které vynaložila na vytvoření díla, až do jejich skutečné výše.

Bakalářskou práci jsem vypracoval samostatně s použitím uvedené literatury a na základě konzultací s vedoucím mé bakalářské práce a konzultantem.

Současně čestně prohlašuji, že tištěná verze práce se shoduje s elek- tronickou verzí, vloženou do IS STAG.

Datum:

Podpis:

(5)

Abstrakt

Cílem této práce bylo vytvořit funkční programové rozhraní pro ovládání různých mikrokontrolérů z prostředí MATLAB a GNU Octave. Jako vzorové mikrokontroléry byly vybrány Atmel ATmega328 a Microchip PIC16F690. Programové rozhraní Micro- controller toolbox (MCUt) implementuje základní funkce pro ovlá- dání digitálních vstupů a výstupů obou mikrokontrolérů, je také možné ovládat analogové vstupy a PWM výstupy. V rámci práce dále vznikla vývojová deska pro Microchip PIC16F690 a několik fy- zikálně technických ukázkových úloh, na kterých je demonstrována funkcionalita toolboxu i samotných mikrokontrolérů. Krátká stať je též věnována simulačním metodám využívajícím různý speciali- zovaný hardware, jenž nahrazuje řídící systémy či rozsáhlé řízené soustavy.

Klíčová slova:

MATLAB, GNU Octave, mikrokontrolér, toolbox, sériová komuni- kace

Abstract

The goal of this thesis was to create functional program inter- face for control of various microcontrollers using MATLAB and GNU Octave. As the pattern was chosen microcontroller Atmel AT- mega328 and Microchip PIC16F690. The program interface Micro- controller toolbox (MCUt) implements basic functions for digital inputs and outputs control for booth microcontrollers. It allows also analog inputs and PWM outputs control. A part of the work was a design of development board for the Microchip PIC16F690.

The function of the toolbox and microcontrollers is demonstrated on this development board. A short chapter describes also simu- lation methods applying special hardware which is able to replace control systems or large controlled systems.

Key words:

MATLAB, GNU Octave, microcontroller, toolbox, serial communi- cation

(6)

Poděkování

Na tomto místě bych rád poděkoval Ing. Petru Mrázkovi Ph.D. za čas a pomoc, kterou mi věnoval při tvorbě této práce. Velký dík také patří mé ženě Petře, bez jejíž trpělivosti a pochopení by tato práce nevznikla.

Microsoft a WindowsR jsou registrované ochranné známky spo-R lečnosti Microsoft Corporation. Linux je ochranná známka regis-R trovaná Linusem Torvaldsem. MATLAB a SimulinkR jsou re-R gistrované ochranné známky společnosti The MathWorks, Inc.

V textu jsou použity názvy produktů, firem, apod., které mohou být registrovanými ochrannými známkami příslušných vlastníků.

(7)

Obsah

Seznam obrázků . . . 9

Seznam grafů . . . 10

Seznam tabulek . . . 10

Seznam zkratek . . . 11

1 Úvod 12 1.1 Proč tato práce vznikla . . . 12

2 Spolupráce systému MATLAB s externím hardwarem 14 2.1 Návrh metodou Model in the loop . . . 15

2.2 Návrh metodou Processor in the loop . . . 15

2.3 Návrh metodou Hardware in the loop . . . 16

3 Spolupráce systému GNU Octave s externím hardwarem 17 4 MCU Toolbox 18 4.1 Softwarová část . . . 18

4.2 Hardwarová část . . . 25

4.2.1 Atmel ATmega328 . . . 25

4.2.2 Microchip PIC16F690 . . . 27

4.2.3 Vývojové desky . . . 28

5 Příklady použití MCU Toolboxu 30 5.1 Hello world . . . 31

5.2 PWM regulace . . . 32

5.3 Generování náhodných barev RGB LED diody . . . 32

5.4 Řízení svitu LED diody v závislosti na okolním osvětlení . . . 33

6 Referenční příručka 37 6.1 mcut . . . 37

6.2 mcutdelete . . . 37

6.3 digitalRead . . . 38

6.4 digitalWrite . . . 38

6.5 analogRead . . . 39

6.6 pwmWrite . . . 40

(8)

Literatura 42

A Obsah přiloženého CD 44

B Výkresová dokumentace 45

(9)

Seznam obrázků

2.1 Model-Based Design . . . 14

2.2 Návrh metodou Processor in the loop . . . 15

2.3 Návrh metodou Hardware in the loop . . . 16

4.1 Rozmístění pinů na desce Arduino Diecimila - kompatibilní s Duemi- lanove. Zdroj - www.arduino.cc . . . 26

4.2 Rozmístění pinů na MCU Atmel ATmega328. A - analogové vstupy, D - digitální IO . . . 26

4.3 Rozmístění pinů na MCU Microchip PIC16F690 (pouze digitální IO) 27 4.4 Rozmístění pinů na MCU Microchip PIC16F690 (pouze analogové vstupy) . . . 28

4.5 První generace vývojové desky pro PIC16F690 . . . 28

4.6 Druhá generace vývojové desky pro PIC16F690 . . . 29

5.1 Schéma zapojení soustavy motoru a dynama . . . 30

5.2 Schéma zapojení snímače pro rozpoznávání barev . . . 30

5.3 Připojení LED diody k PIC16F690 . . . 31

5.4 Připojení RGB LED diody k PIC16F690 . . . 33

5.5 Připojení fotodiody k PIC16F690 . . . 34

6.1 mcut . . . 37

6.2 digitalRead . . . 38

6.3 digitalWrite . . . 39

6.4 analogRead . . . 40

6.5 pwmWrite . . . 40

7.1 Návrh PCB první generace vývojové desky (obrázek není v měřítku 1:1) . . . 45

7.2 Schéma první generace vývojové desky . . . 46

7.3 Návrh PCB druhé generace vývojové desky (obrázek není v měřítku 1:1) . . . 47 7.4 Návrh PCB rozšiřující vývojové desky (obrázek není v měřítku 1:1) . 48

(10)

Seznam grafů

5.1 Aplikace jednoduchého klouzavého průměru . . . 35 5.2 Skutečný signál na vstupu (modrý) a výstupu (červený) při řízení

svitu LED diody v závislosti na okolním osvětlení . . . 36

Seznam tabulek

2.1 Porovnání metod Processor in the loop a Hardware in the loop . . . . 16 3.1 Podpora různých komunikačních rozhraní obsažená v balíčku Instru-

ment control pro jednotlivé operační systémy . . . 17

(11)

Seznam zkratek

MCU mikrokontrolér

MCUt Microcontroller Toolbox

GUI Graphical User Interface (grafické uživatelské rozhranní)

GNU GNU’s Not Unix

HW hardware

SW software

PLC Programmable Logic Controller (Programovatelný logický automat) FPGA Field Programmable Gate Array (Programovatelná hradlová pole) USB Universal Serial Bus (univerzální sériová sběrnice)

MIL Model in the loop PIL Processor in the loop HIL Hardware in the loop

PID proporcionální, integrační a derivační

PSD proporcionální, sumační a derivační (diferenční) VMRL Virtual Reality Modeling Language

I2C Inter-Integrated Circuit

TCP Transmission Control Protocol USBTMC USB Test & Measurement Class GPIB General Purpose Interface Bus SPI Serial Peripheral Interface COM Communication port

PWM Pulse-width modulation (pulzně šířková modulace) DMA Direct memory access (přímý přístup do paměti)

RISC Reduced Instruction Set Computing (redukovaná instrukční sada) UART Universal Asynchronous Receiver and Transmitter (asynchronní séri-

ové rozhraní)

ADC Analog-to-digital converter (analogově-digitální převodník) LDO Low-dropout regulator

DPS deska plošných spojů

FIR Finite Impulse Response (filtr s konečnou impulzní odezvou) SMA Simple Moving Average (jednoduchý klouzavý průměr)

(12)

1 Úvod

Programové balíky MATLAB i GNU Octave jsou nástroje pro vědeckotechnické výpočty. Jedná se de facto o vysokoúrovňové programovací jazyky (4. generace) po- stavené na stejném principu - malé rychlé kompilované výpočetní jádro, nad kterým lze spouštět různé skripty a nadstavby, vč. grafických (GUI). Více o obou systémech lze najít v českém jazyce např. v [1] a [2].

Jak MATLAB tak GNU Octave též umožňují připojit externí hardware a dokáží s ním spolupracovat v „reálném čase”. Spolupráce s externím hardwarem je však velmi rozsáhlá oblast v obou systémech, proto je tato práce zaměřena pouze na jediné užší téma – externí hardwarové kity připojené přes rozhraní USB k počítači. Řízení těchto kitů pak probíhá pouze z úrovně MATLABu a GNU Octave (tj. neprobíhá např. z úrovně Real-Time Windows Target). K tomuto řízení je pak použit právě MCU Toolbox, který je hlavním výstupem této bakalářské práce.

Práce je členěna do čtyř hlavních celků. První část práce se zaměřuje na obecné možnosti použití MATLABu a GNU Octave s hardwarem. Druhá část je pak vě- nována popisu MCU Toolboxu, jeho implementaci a hardwaru, na kterém MCUt funguje. Předposlední kapitola popisuje reálné příklady použití MCUt při řízení fyzikálních modelů. Samotný závěr práce je pak věnován kompletnímu popisu všech funkcí MCU Toolboxu.

1.1 Proč tato práce vznikla

Během svého studia jsem si systém MATLAB značně oblíbil zejména pro jeho mno- hostranné využití. Jakožto příznivce Open-source softwaru a Open-source hard- waru jsem též experimentoval se systémem GNU Octave, který je logikou práce a dostupnými funkcemi velmi podobný MATLABu.

Při tvorbě ročníkové práce jsem pak poprvé narazil na problematiku spojení těchto systémů s externím hardwarem. Využíval jsem přitom kit Arduino, ke kterému lze snadno připojit další snímače a údaje z nich je možné využívat právě v MATLABu při vykreslování grafů. Celkově mě však zklamala rychlost tohoto kitu i složitost, s jakou byla napsána část pro MATLAB i pro Arduino. Jiný podporovaný hardware jsem však k dispozici neměl. Vzhledem k mému zájmu o toto téma jsem proto provedl menší rešerši, jejímž výsledkem bylo zjištění, že žádný hardware, který by splňoval mé požadavky (levný, dostupný, vytvořený a odladěný pro MATLAB) neexistuje.

(13)

Tato nedostupnost hotového řešení mne přivedla na myšlenku návrhu vlastního softwaru, který by pro mé účely nahradil originální podporu pro Arduino od firmy MathWorks. Po dalším studiu původního návrhu od firmy MathWorks a na zá- kladě vlastních zkušeností jsem se rozhodl udělat komunikační protokol i samotnou vnitřní strukturu jednotlivých funkcí co nejjednodušší a pokud možno co nejrych- lejší. Daní za toto řešení je menší robustnost oproti originálnímu návrhu, výhodou je ovšem snadná implementovatelnost pro konkrétní mikrokontrolér. Abych si ověřil, že navržené řešení je skutečně univerzální, vytvořil jsem implementaci pro zcela jiný mikrokontrolér, než je původní ATmega328 od firmy Atmel. Konkrétně jsem použil PIC16F690 od společnosti Microchip.

Během vývoje pro mikrokontrolér PIC jsem však stále více postrádal hotový HW modul (kit, vývojovou desku), který by kromě samotného MCU obsahoval i napájení, rozhraní pro připojení programátoru, převodníku pro sériovou linku atd. Proto postupně vznikly dvě generace vývojových desek pro procesory PIC.

Zejména druhá generace (obr. 4.6) je velmi dobře použitelná, protože je navržena jako univerzální vývojová deska pro mnohem širší škálu obvodů od firmy Microchip, než jen PIC16f6XX.

(14)

2 Spolupráce systému MATLAB s externím hardwarem

Možnosti spolupráce systému MATLAB jsou velmi široké a jen jejich kompletní výčet a popis by vydal na několik odborných publikací. V základu však lze rozdělit možnosti spolupráce s HW do tří základních skupin

1. Připojení HW přes podporované rozhranní (RS-232, USB, Ethernet apod.), připojený HW nemá podporu reálného času (real-time) v MATLABu, ani v ope- račním systému.

2. Připojení HW přes podporované rozhraní, přičemž daný HW má podporu re- álného času v MATLABu i v operačním systému (Real-Time Windows Target, xPC Target).

3. Generování kódu pro výslednou platformu (MCU, PLC, FPGA apod.) z algo- ritmů MATLABu či Simulinku.

Tyto skupiny se navíc mohou dále prolínat (např. testování v real-time režimu

→ po odladění vygenerování finálního kódu → konečné naprogramování zařízení), běžně se tak děje u přístupu zvaného Model-Based Design, který je uplatňován jako náhrada či doplněk tradičního vývoje.

Obrázek 2.1: Model-Based Design

(15)

Vývoj real-time aplikací metodou Model-Based Design lze ještě dále rozdělit dle toho, jakou část systému simulujeme:

• Model in the loop (MIL)

• Processor in the loop (PIL)

• Hardware in the loop (HIL)

2.1 Návrh metodou Model in the loop

Model in the loop (MIL) je prvním z možných přístupů k modelu systému. V tomto případě je modelován celý systém, tj. regulovaná soustava i samotný řídící systém.

Takovýto model však nikdy nedokáže zachytit veškeré vlastnosti systému, je tedy pouze jeho více či méně přesnou aproximací. V této části vývoje je též běžné vytvo- ření několika MIL např. s různými metodami regulace pro jejich vzájemné srovnání a výběr nejoptimálnější varianty.

2.2 Návrh metodou Processor in the loop

Často též nazývaný Rapid Control Prototyping. Tento typ návrhu se využívá v pří- padě, kdy máme reálnou soustavu (či její odpovídající model) a chceme simulo- vat regulátor. Simulace se však provádí na cílovém řídícím systému či jeho modelu (prototypová deska, vývojový kit apod.). V tomto případě můžeme využívat si- mulovaných analogových (PID, PSD apod.) i digitálních (logické obvody, stavové automaty) regulátorů a mnoha různých metod a nástrojů pro jejich nastavování (Simulink Control Design, Simulink Design Optimization, Robust Control Toolbox apod.). Pro identifikaci soustavy pak lze používat experimentální metody a ná- stroje stejně jako matematicko-fyzikální analýzu (např. System Identification Tool- box, Simscape). Z uvedeného popisu lze dovodit, že MCUt je určen právě pro tento způsob prototypování řídících systémů.

Obrázek 2.2: Návrh metodou Processor in the loop

(16)

2.3 Návrh metodou Hardware in the loop

Jedná se o obrácenou situaci – reálným regulátorem řídíme simulovanou soustavu.

V prostředí MATLABu lze pro návrhy soustav opět využívat celou řadu nástrojů, a to i hardwarových např. dSPACE. U konkurenčního prostředí LabVIEW je pro tento typ úloh určena platforma PXI. Zajímavá je též možnost danou soustavu vizualizo- vat v MATLABu prostřednictvím virtuální reality – VMRL. K tomuto účelu slouží nástroj Simulink 3D Animation, ve kterém lze modely vytvářet (či importovat a ex- portovat např. z/do CAD systémů). Výsledný model tak může zobrazovat nejen parametry dané regulované soustavy ale i jeho kompletní fyzickou podobu vč. inter- akcí s okolním prostředím.

Obrázek 2.3: Návrh metodou Hardware in the loop

Zajímavé srovnání těchto tří metod se nabízí i z hlediska nutnosti práce v reálném čase. Zatímco u MIL prakticky není potřeba pracovat v reálném čase, u HIL je tomu právě naopak, protože se zkoumají reakce modelované regulované soustavy se skuteč- ným regulátorem. Při použití návrhu metodou PIL je většinou vhodné s podporou reálného času i bez ní. Regulátory totiž bývají ve svých reakcích mnohonásobně rychlejší než regulovaná soustava, proto pro rychlé ověření není třeba plýtvat ča- sem. Naopak při určitých specifických simulacích se podpora práce v reálném čase jeví vhodnější.

Typické vlastnosti PIL HIL

HW řídícího systému MCU, vývojový kit, FPGA apod.

konkrétní řídící systém HW regulované soustavy PC s potřebným SW pro

simulaci soustavy či přímo regulovaná soustava

simulační HW (např.

dSPACE) či přímo regu- lovaná soustava

Způsob běhu simulace v reálném čase nebo mimo reálný čas

v reálném čase

Tabulka 2.1: Porovnání metod Processor in the loop a Hardware in the loop

(17)

3 Spolupráce systému GNU Octave s exter- ním hardwarem

GNU Octave je vysokoúrovňový interpretovaný jazyk určený pro numerické výpočty.

Základním stavebním kamenem výpočtů jsou matice a i z tohoto důvodu je tento SW do značné míry kompatibilní s MATLABem. GNU Octave má se systémem MATLAB též společnou filozofii ovládání pomocí interaktivní příkazové řádky, pří- padně lze spouštět vlastní skripty. Je též možné tento SW rozšiřovat o tzv. balíčky (packages), které jsou obdobou toolboxů u systému MATLAB. Místem, kde lze tato rozšíření získat (a nebo vlastní rozšíření publikovat) je Octave-Forge [5]. Pro ovlá- dání MCU pomocí MCUt je třeba GNU Octave rozšířit balíčkem Instrument control [6]. V tomto ohledu je však důležité, pod jakým operačním systémem GNU Octave, resp. Instrument Control běží, protože plnou funkcionalitu poskytuje pouze v linu- xových distribucích (viz následující tabulka).

Linux Windows (Cygwin) Windows FreeBSD Mac OS X

Serial √ √

– připravuje se připravuje se Parallel √

– – připravuje se –

I2C √

– – připravuje se –

TCP √ √ √

– –

USBTMC √

– – – –

GPIB √

– – – –

VXI11 √

– – – –

Tabulka 3.1: Podpora různých komunikačních rozhraní obsažená v balíčku Instru- ment control pro jednotlivé operační systémy

Pro potřeby MCUt je třeba pouze sériová komunikace, proto lze toto rozšíření použít v GNU Octave pod Linuxem i pod systémem Windows.

(18)

4 MCU Toolbox

4.1 Softwarová část

Všechny funkce, které MCUt podporuje, jsou napsány samostatně, jako například funkce mcut(comPort,mcuType) ve verzi pro MATLAB a Octave.

Kód 4.1 Hlavní funkce MCUt v systému MATLAB

1 function matmcu=mcut ( comPort , mcuType )

Kód 4.2 Hlavní funkce MCUt v systému Octave

1 function octmcu=mcut ( comPort , mcuType )

Význam jednotlivých parametrů lze nalézt v Referenční příručce. Jednotlivé funkce jsou mezi sebou provázány pomocí několika globálních proměnných.

Kód 4.3 Globální proměnné MCUt

1 global debugConst

2 global D i g i t a l P i n s 3 global A n a l o g P i n s

4 global TypeMCU

5 global pwmPins

Tyto globální proměnné se nastavují pouze a jenom ve funkci mcut(comPort,mcuType), ostatní funkce tyto proměnné pouze čtou. Vyjímkou je mcutdelete(id), která dané proměnné vymaže z instance MATLABu či Octave.

Kód 4.4 Funkce mcutdelete

1 function m c u t d e l e t e ( matmcu ) 2 c l e a r debugConst

3 c l e a r D i g i t a l P i n s 4 c l e a r A n a l o g P i n s 5 c l e a r TypeMCU 6 c l e a r pwmPins 7

8 f c l o s e ( matmcu ) 9 c l e a r matmcu

10 disp ( ’ D e l e t e s e r i a l communication s u c c e s f u l l ! ’ ) ; 11 end

(19)

Nejdůležitější z globálních proměnných jsou DigitalPins, AnalogPins a pwmPins, které popisují periferie konkrétního MCU a definují tak jeho možnosti. Na toto ozna- čení poté navazuje struktura programu v konkrétním typu MCU.

Kód 4.5 Definice portů pro jednotlivé mikrokontroléry

1 i f ( strcmp ( ’ Arduino ’ , mcuType ) )

2 D i g i t a l P i n s = [ 2 3 4 5 6 7 8 9 10 11 12 1 3 ] ; 3 A n a l o g P i n s = [ 0 1 2 3 4 5 ] ;

4 pwmPins = [ 3 5 6 9 10 1 1 ] ;

5 TypeMCU = ’ Arduino ’ ;

6 e l s e i f ( strcmp ( ’ PIC16F690 ’ , mcuType ) )

7 D i g i t a l P i n s = [ 0 1 2 3 4 5 6 8 10 11 12 13 14 15 16 1 7 ] ; 8 A n a l o g P i n s = [ 0 1 2 3 4 5 6 10 11 12 1 6 ] ;

9 pwmPins = [ 1 ] ;

10 TypeMCU = ’ PIC16F690 ’ ;

11 e l s e

12 error ( ’ The MCU i s n o t s u p p o r t e d ’ ) ;

13 end

Chceme-li kupříkladu zapsat hodnotu logické jedničky na port 0 mikrokontro- léru PIC16F690, použijeme příkaz digitalWrite(id,0,’HIGH’), kde id je identi- fikátor spojení, 0 je číslo portu a ’HIGH’ značí zápis logické jedničky na tento port.

První věcí, kterou funkce digitalWrite je právě existence zadaného portu pro daný typ MCU.

Kód 4.6 Ošetření špatně zadaného čísla portu

1 i f isempty ( f i n d ( D i g i t a l P i n s == pinNumber , 1 ) )

2 error ( ’ U n d e f i n e d p i n number f o r d i g i t a l W r i t e ! ’ ) ;

3 end

Pokud port existuje, zahájí funkce komunikaci s mikrokontrolérem tím, že ode- šle číselnou hodnotu (pro funkci digitalWrite je tato hodnota 4) a následně sle- duje, zda mu mikrokontrolér zašle korektní potvrzovací (acknowledge – ack) hodnotu pro danou funkci (korektní hodnota pro tuto funkci je 124). Poté funkce odešle číslo pinu, na který se má zapsat logická hodnota. V poslední části se odesílá hodnota 72 pro zápis logické 1 na výstup MCU či 76 pro zápis 0.

Kód 4.7 Navázání a průběh komunikace po sériové lince funkce digitalWrite()

1 %% s t a r t i n g communication 2 f w r i t e ( matmcu , 4 , ’ u c h a r ’ ) ; 3 %p a u s e ( 0 . 1 ) ;

4 ack=f s c a n f ( matmcu , ’%u ’ ) ; 5

6 %% c h e c k i n g a c k b i t and s e n d i n g p i n number 7 i f isempty ( ack )

8 m c u t d e l e t e ( matmcu ) ;

9 error ( ’ Communication u n s u c c e s f u l l (ACK f o r w r i t e i s empty ) ! ’ ) ; 10 e l s e i f ( ack == 1 2 4 )

11 i f debugConst == 1

(20)

14 f w r i t e ( matmcu , pinNumber , ’ u c h a r ’ ) ; 15 e l s e

16 i f debugConst == 1

17 f p r i n t f ( 1 , ’ACK i s %u\n ’ , ack ) ;

18 end

19 error ( ’ Unexpected e r r o r ( p i n number ACK i s wrong ) ’ ) ;

20 end

21

22 %% s e n d i n g p i n s t a t e 23 s w i t c h p i n S t a t e 24 c a s e ’HIGH ’

25 f w r i t e ( matmcu , 7 2 , ’ u c h a r ’ ) ; % 72 i s ”H” i n ASCII 26 c a s e ’LOW’

27 f w r i t e ( matmcu , 7 6 , ’ u c h a r ’ ) ; % 76 i s ”L” i n ASCII 28 o t h e r w i s e

29 error ( ’ U n d e f i n e d s t a t e f o r d i g i t a l W r i t e ! Allowed s t a t e s a r e HIGH o r LOW. ’ ) ;

30 end

Základní programovou konstrukcí na straně mikrokontroléru je nekonečná smyčka, ve které se neustále vyhodnocuje přepínač switch, pomocí kterého jsou následně vo- lány jednotlivé funkce, které může mikrokontrolér vykonávat.

Kód 4.8 Základní konstrukce switch() v MCU PIC16F690

1 d = g e t c ( ) ; 2

3 s w i t c h ( d ) { 4 c a s e 1 :

5 Connect ( ) ;

6 break ;

7 c a s e 3 :

8 d i g i t a l R e a d ( ) ;

9 break ;

10 c a s e 4 :

11 d i g i t a l W r i t e ( ) ;

12 break ;

13 c a s e 5 :

14 analogRead ( ) ;

15 break ;

16 c a s e 7 :

17 pwmWrite ( ) ;

18 break ;

19 }

(21)

Kód 4.9 Základní konstrukce switch() v Arduinu

1 i f ( v a l != 0 ) { 2

3 s w i t c h ( v a l ) {

4 c a s e 1 :

5 f u n c t i o n C o n n e c t ( ) ;

6 break ;

7

8 c a s e 3 :

9 f u n c t i o n D i g i t a l R e a d ( ) ;

10 break ;

11

12 c a s e 4 :

13 f u n c t i o n D i g i t a l W r i t e ( ) ;

14 break ;

15

16 c a s e 5 :

17 f u n c t i o n A n a l o g R e a d ( ) ;

18 break ;

19

20 c a s e 7 :

21 functionPwmWrite ( ) ;

22 break ;

23

24 d e f a u l t :

25 S e r i a l . p r i n t l n ( 6 ) ; /∗ return error v a l u e ∗/

26 v a l = 0 ;

27 ack = 0 ;

28 }

29 }

V tomto konkrétním případě se po přijetí čísla 4 zavolá funkce digitalWrite.

V první části této funkce je odpověď (acknowledge) odeslaná na sériovou linku do PC. Pomocí této odpovědi MATLAB či Octave rozezná, že úspěšně navázal spo- jení. V další části funkce se načítají dvě různé hodnoty – číslo pinu a stav – které se na něj mají zapsat (log. 0, log. 1). Poslední částí funkce digitalWrite v mikrokont- roléru je výběr konkrétního pinu pomocí další konstrukce switch, na který se zapíše přijatá logická hodnota. Mikrokontrolér přijetí čísla pinu ani přijetí jeho stavu již ne- potvrzuje, takže tím veškerá komunikace pro danou funkci končí.

Kód 4.10 Funkce digitalWrite() v MCU PIC16F690 (kráceno)

1 v o i d d i g i t a l W r i t e ( ) { 2

3 s i g n e d i n t incomingNumber = −1, pinNumber = −1;

4 u n s i g n e d i n t TRISstate , PORTstate ; 5

6 p u t c ( ’ 1 ’ ) ; 7 p u t c ( ’ 2 ’ ) ; 8 p u t c ( ’ 4 ’ ) ; 9 p u t c ( ’ \ r ’ ) ;

(22)

12 while ( pinNumber == −1) { 13 pinNumber = g e t c ( ) ;

14 }

15

16 while ( incomingNumber == −1) {

17 incomingNumber = g e t c ( ) ;

18 }

19

20 i f ( incomingNumber == 7 2 ) { // s e t a s o u t p u t − HIGH 21 T R I S s t a t e = 0 ;

22 PORTstate = 1 ;

23 }

24

25 i f ( incomingNumber == 7 6 ) { // s e t a s o u t p u t − LOW 26 T R I S s t a t e = 0 ;

27 PORTstate = 0 ;

28 }

29

30 s w i t c h ( pinNumber ) { 31 c a s e 0 :

32 TRISA0 = T R I S s t a t e ;

33 RA0 = PORTstate ;

34 break ;

35 c a s e 1 :

36 TRISA1 = T R I S s t a t e ;

37 RA1 = PORTstate ;

38 break ;

39 c a s e 2 :

40 TRISA2 = T R I S s t a t e ;

41 RA2 = PORTstate ;

42 break ;

43 . . .

Kód 4.11 Funkce functionDigitalWrite() v Arduinu

1 v o i d f u n c t i o n D i g i t a l W r i t e ( ) { 2

3 S e r i a l . p r i n t l n ( 1 2 4 ) ; /∗ return v a l u e ∗/

4

5 pinNumber = −1;

6

7 while ( pinNumber == −1) { 8 pinNumber = S e r i a l . r e a d ( ) ; 9 d e l a y ( 5 0 ) ;

10 }

11

12 p i n S t a t e = −1;

13

14 while ( p i n S t a t e == −1) { 15 p i n S t a t e = S e r i a l . r e a d ( ) ; 16 d e l a y ( 5 0 ) ;

17 }

18

(23)

20 i f ( pinNumber >= 2 && pinNumber <=13) { 21 i f ( p i n S t a t e == 7 2 ) {

22 pinMode ( pinNumber ,OUTPUT) ; 23 d i g i t a l W r i t e ( pinNumber , HIGH) ;

24 }

25

26 i f ( p i n S t a t e == 7 6 ) {

27 pinMode ( pinNumber ,OUTPUT) ; 28 d i g i t a l W r i t e ( pinNumber , LOW) ;

29 }

30 }

31

32 return ;

33 }

Hlavním rozdílem mezi kódem pro MATLAB a pro Octave je v obsluze sériové linky. Následující dva úryvky kódu se prakticky neliší, oba programy používají stej- nou funkci serial() pro definici sériové komunikace. Mírně odlišná je pouze syntaxe jejich parametrů.

Kód 4.12 Struktura parametrů funkce serial() v systému MATLAB

1 i f ( strcmp ( ’ Arduino ’ , mcuType ) )

2 matmcu= s e r i a l ( comPort , ’ BaudRate ’ , 1 1 5 2 0 0 ) ; 3 disp ( ’ Arduino s e l e c t . ’ ) ;

4 e l s e i f ( strcmp ( ’ PIC16F690 ’ , mcuType ) )

5 matmcu= s e r i a l ( comPort , ’ BaudRate ’ , 9 6 0 0 ) ; 6 disp ( ’ PIC16F690 s e l e c t . ’ ) ;

7 end

Kód 4.13 Struktura parametrů funkce serial() v systému Octave

1 i f ( strcmp ( ’ Arduino ’ , mcuType ) ) 2 octmcu= s e r i a l ( comPort , 1 1 5 2 0 0 ) ; 3 disp ( ’ Arduino s e l e c t . ’ ) ;

4 e l s e i f ( strcmp ( ’ PIC16F690 ’ , mcuType ) ) 5 octmcu= s e r i a l ( comPort , 9 6 0 0 ) ; 6 disp ( ’ PIC16F690 s e l e c t . ’ ) ;

7 end

Největší rozdíl je v samotném odesílání a příjmu jednotlivých zpráv. Požado- vané datové typy parametrů jsou u každého systému jiné, takže zatímco MATLAB korektně pracuje s datovým typem uchar (unsigned char), který bez problémů na- čítá z grafického rozhranní, u Octave je nutné implicitní datový typ před použitím přetypovat.

Kód 4.14 Zápis a čtení na sériové lince v systému MATLAB

1 f w r i t e ( matmcu , 1 , ’ u c h a r ’ , ’ s y n c ’ ) ; 2 chk=f s c a n f ( matmcu , ’%u ’ ) ;

Funkce srl flush() slouží k vymazání zásobníku sériové komunikace. srl timeout() nastavuje čas, po kterém se sériová komunikace ukončí, pokud nepřijde odpověď (v

(24)

případně sériovou komunikaci zcela zablokovat. Hodnota 2 ms byla určena experi- mentálně, při menších hodnotách nestíhal v některých případech MCU dostatečně rychle odeslat odpověď, větší hodnoty již naopak nepřinesly žádné zvýšení spolehli- vosti komunikace. Konečně srl write() zapíše na sériovou linku. Funkce srl read() slouží k načtení dat z bufferu linky, první parametr identifikuje linku, druhý pa- rametr určuje, kolik bytů se načítá. Současná verze všech funkcí v Octave načítá striktně 5 bytů. První 3 byty jsou vyhrazeny pro číslo z MCU, zbylé 2 pak pro znaky \r a \n, které automaticky odesílá Arduino a které jsou tudíž odesílány i z PIC16F690 kvůli kompatibilitě.

Kód 4.15 Zápis a čtení na sériové lince v systému Octave

1 s r l f l u s h ( octmcu ) ;

2 hodnota = 1 ;

3 hodnota = u i n t 8 ( hodnota ) ; 4 s r l t i m e o u t ( octmcu , 2 ) ; 5 s r l w r i t e ( octmcu , hodnota ) ; 6

7 chk = s r l r e a d ( octmcu , 5 ) ;

(25)

4.2 Hardwarová část

MCUt v současnosti podporuje dva mikrokontroléry – Atmel ATmega328 (s bootlo- aderem Arduino) a Microchip PIC16F690. Právě původní, dle mého názoru nepříliš povedená implementace podpory pro Arduino [7], mne přivedla na myšlenku tvorby MCU toolkitu. MCUt je proto napsán jako univerzální MATLAB/Octave interface pro libovolný mikrokontrolér připojitelný přes COM port. Tuto podmínku splňují oba mikrokontroléry, protože obsahují hardwarový UART modul. Oba jsou též za- loženy na RISC architektuře a mají osmibitovou šířku datové sběrnice.

4.2.1 Atmel ATmega328

ATmega328 je mikrokontrolérem z rodiny megaAVR. Oproti nejnižší řadě tinyAVR mohou mít procesory této řady vyšší programovou paměť (až 512kB), rozšířenou instrukční sadu (podporují např. hardwarové násobení) a mohou být pouzdřeny ve velkých pouzdrech (až 100 pinových). Narozdíl od vyšších řad však nepodporují DMA a nemají podporu pro speciální hardware (AVR s FPGA, kryptografická jed- notka apod.). Typ ATmega328 má pak tyto konkrétní základní vlastnosti [8]:

• Paměť programu (flash) – 32kB

• Paměť RAM (SRAM) – 2kB

• Pouzdro – DIL 28

• Max. operační frekvence – 20MHz

• I/O pinů – 23

• AD kanálů – 8

• Rozlišení AD převodníku – 10 bitů

• DA převodník – žádný

• PWM kanálů – 6

• Podpora sběrnic – I2C (1), SPI (2), UART (1)

Rozmístění pinů v MCUt odpovídá rozmístění pinů na vývojové desce Arduino Duemilanove.

(26)

Obrázek 4.1: Rozmístění pinů na desce Arduino Diecimila - kompatibilní s Duemi- lanove. Zdroj - www.arduino.cc

Obrázek 4.2: Rozmístění pinů na MCU Atmel ATmega328. A - analogové vstupy, D - digitální IO

(27)

4.2.2 Microchip PIC16F690

PIC16F690 náleží do rodiny Midrange (A2) osmibitových mikrokontrolérů společ- nosti Microchip. Ta dále vyrábí šestnáctibitová (B) a dvaatřicetibitová (C) MCU, obdobně jako firma Atmel. Midrange MCU mají na rozdíl od Baseline (A1) řady mnoho vylepšení - např. hardwarový zásobník, rozšířený systém přerušení apod., hlavně jsou však již vybaveny důležitými periferiemi (UART, ADC, PWM, přesný interní OSC apod.). Od vyšších řad (Enhanced Midrange - A3, Enhanced - A4) je odlišuje nižší počet instrukcí, menší programová paměť (max. 8kB) i RAM a nižší taktovací frekvence. Typ PIC16F690 má tyto konkrétní základní vlastnosti [9]:

• Paměť programu (flash) – 7kB

• Paměť RAM (SRAM) – 256B

• Pouzdro – DIL 20

• Max. operační frekvence – 20MHz

• AD kanálů – 12

• Rozlišení AD převodníku – 10 bitů

• DA předodník – žádný

• PWM kanálů – 4

• Podpora sběrnic – I2C, SPI (1), UART, USART

Obrázek 4.3: Rozmístění pinů na MCU Microchip PIC16F690 (pouze digitální IO)

(28)

Obrázek 4.4: Rozmístění pinů na MCU Microchip PIC16F690 (pouze analogové vstupy)

4.2.3 Vývojové desky

Pro lepší práci s PIC16F690 vznikla vývojová deska. První generace (výkresová do- kumentace viz příloha 7, konečná podoba je na obr. 4.5) obsahuje mimo samotný MCU i relé Omron G5V1 pro spínání výkonové zátěže až 1A/24V, dvojitý H můstek (tj. 4 řízené výkonové kanály) L293D [10] pro ovládání motorů. Dále deska obsa- huje napěťový dělič (se vstupním odporem 6kΩ)na jednom z AD vstupů pro měření větších napětí než je napájecí (typicky 0 – 10V). Krom toho je na desce umístěn i stabilizovaný zdroj napětí realizovaný pomocí lineárního regulátoru L4940V05 [11].

Tento regulátor dokáže dodat výstupní proud až 1,5A, takže dostačuje nejen pro napájení samotné desky, ale i pro napájení okolních komponent. Speciálně pro na- pájení H můstku L293D obsahuje vývojová deska druhý napájecí konektor a pinovou lištu.

Obrázek 4.5: První generace vývojové desky pro PIC16F690

(29)

Správným umístěním propojky lze pro napájení obvodu L239D volit napájecí napětí připojené přes CON1 (tj. napětí před lineárním regulátorem), napětí 5V z regulátoru a nebo právě jakékoliv jiné napětí přivedené z vhodného zdroje na CON2.

Všechny porty MCU, napájení, kontakty relé i výstupy z L293D jsou vyvedeny jak na pinové lišty, tak na svorkovnice ARK500, aby bylo vývojovou desku snadné připojit do jakékoliv aplikace.

Po prvních pokusech se vývojová ukázala jako zbytečně komplikovaná, proto vznikla druhá generace, která již neobsahuje driver motorů, relé ani vstupní děliče.

Vylepšením proti původnímu návrhu je však možnost připojení přes USB pomocí integrovaného USB - UART převodníku. V první generaci vývojové desky byl jako USB - UART převodník použit externí modul, což se ukázalo jako poměrně neprak- tické řešení. Proto je v současnoti na desce osazen obvod FTDI FT232RL [12] v zapojení „USB Bus Powered” tj. samotný obvod je napájený z USB. Zbytek této druhé generace vývojové desky je naopak stále napájen z LDO L4940V05, který se ukázal jako velmi přesný (měřením zjištěna přesnost 5V± 0,5% při odběru 0-800mA) a odolný vůči krátkodobému přetížení i zkratu. Pro tuto druhou generaci bylo též vytvořeno prototypovací pole, které se dá připojit přímo k hlavní desce. Vzhledem k jednoduchosti obou návrhů byla obě zapojení vytvořena rovnou jako deska ploš- ných spojů (DPS) bez jakéhokoliv schématu. Návrh layoutu obou desek lze nalézt v příloze 7, konečná podoba je na obrázku 4.6.

Obrázek 4.6: Druhá generace vývojové desky pro PIC16F690

(30)

5 Příklady použití MCU Toolboxu

Jak je již uvedeno v úvodních částech této práce, kapitola Příklady použití MCU Toolboxu popisuje reálné příklady použití MCUt při řízení fyzikálních modelů. Bě- hem tvorby MCUt vznikla celá řada modelů a konceptů úloh pro řešení tímto tool- boxem. Mezi zajímavější lze jistě zařadit například řízení otáček motoru v závislosti na napětí generovaném na připojeném dynamu (princip viz obrázek fig:motordynamo), nebo snímání barev za pomoci vyhodnocení intenzity odraženého světla od povrchu (obrázek fig:detektorBarev). Tato kapitola má však sloužit zároveň jako tutoriál a zejména by měla čtenáře uvést do problematiky použití MCU Toolboxu. Proto jsou jako příklady použití zvoleny jednoduché a snadno realizovatelné úlohy, které nevy- žadují žádný speciální hardware a lze je realizovat přímo v této práci na uvedených vývojových prostředcích.

Obrázek 5.1: Schéma zapojení soustavy motoru a dynama

Obrázek 5.2: Schéma zapojení snímače pro rozpoznávání barev

(31)

5.1 Hello world

„Je již zažitým pravidlem, že první program v jakémkoliv programovacím jazyce nutně musí být „Hello world”, neboli počeštěně „Ahoj světe”. Důvod je jednoduchý, vypsat něco na výstup patří k nejzákladnějším programovým operacím a také jde o primární ladící nástroj.”

[13]

Stejně jako se v programovacích jazycích pro vysokoúrovňové programování pou- žívá Hello world, v nízkoúrovňovém programování se používá rozblikání LED diody.

Stejně jako v uvedeném citátu se jedná o jednu z nejzákladnějších operací (dobře nastavit a spustit MCU a zapsat hodnotu na jeden z jeho portů) a také o nejjed- nodušší ladící nástroj. Proto je rozblikání LED prvním z příkladů, na kterém lze demonstrovat funkcionalitu MCU toolboxu.

Kód 5.1 Blikání LED diodou pomocí PIC16F690 v systému MATLAB

1 matmcu = mcut ( ’COM6 ’ , ’ PIC16F690 ’ ) ; 2

3 f o r n =1:10

4 d i g i t a l W r i t e ( matmcu , 1 4 , ’LOW’ ) ; 5 pause ( 1 ) ;

6 d i g i t a l W r i t e ( matmcu , 1 4 , ’HIGH ’ ) ;

7 pause ( 1 ) ;

8 end

9

10 m c u t d e l e t e ( matmcu ) ;

Výše uvedený příklad představuje základní kostru pro práci s MCUt. První částí je navázání komunikace s MCU pomocí mcut(), druhou samotný kód, který se má v součinnosti s MCU vykonat a poslední částí jest korektní ukončení komunikace funkcí mcutdelete(). Kód uvedený v tomto příkladu pouze desetkrát rozsvítí a po vte- řinové pauze zhasne LED diodu připojenou k portu 14 tak, jak to znázorňuje násle- dující schéma.

Obrázek 5.3: Připojení LED diody k PIC16F690

Použití MCUt v programu Octave se neliší od jeho použití v MATLABu, sa- mozřejmě až na syntaktické rozdíly ostatních funkcí. Jedinou výjimkou je nutnost nahrát balíček instrument-control pro ovládání sériových linek následujícícm pří- kazem.

Kód 5.2 Nahrání balíčku instrument-control do systému Octave

(32)

Že se další práce s MCUt neodlišuje od MATLABu dokazuje následující „Hello world” napsaný v Octave. Parametr /dev/ttyUSB0 či COM6 je specifikován operač- ním systémem, pod OS Windows přistupujeme na sériovou linku pomocí COMxx, pod GNU Linuxem pak pomocí /dev/ttyUSBx.

Kód 5.3 Blikání LED diodou pomocí Arduina v systému Octave

1 octmcu = mcut ( ’ / dev / ttyUSB0 ’ , ’ Arduino ’ ) ; 2

3 f o r n =1:10

4 d i g i t a l W r i t e ( octmcu , 1 3 , ’HIGH ’ ) ; 5 pause ( 1 ) ;

6 d i g i t a l W r i t e ( octmcu , 1 3 , ’LOW’ ) ;

7 pause ( 1 ) ;

8 end

9

10 m c u t d e l e t e ( octmcu ) ;

5.2 PWM regulace

V dalším příkladě je implementována možnost „spojitě” (pomocí 8 bitového PWM) ovládat připojené zařízení. Připojené zařízení je opět LED dioda, zapojení je reali- zováno stejně jako v předchozím příkladě (obr. 5.3)

Kód 5.4 PWM regulace LED pomocí PIC16F690

1 f o r PWM = 2 5 5 : − 1 : 0

2 pwmWrite ( matmcu , 1 , PWM) ; 3 i f mod ( (PWM∗ 1 0 ) , 2 5 5 ) == 0

4 f p r i n t f ( 1 , ’ R o z s v i c e n o na %d p r o c e n t \n ’ , ( 1 0 0 − ( 1 0 0 / 2 5 5 ) ∗PWM) ) ;

5 end

6 pause ( 0 . 1 )

7 end

Oproti předchozím ukázkam je zde zároveň demonstrována možnost uživatel- ského výstupu – v tomto případě výpisu do prostředí MATLABu pomocí funkce fprintf. Právě možnost zobrazování textů, grafů či přímo interaktivního ovládaní připojených MCU značně rozšiřuje možnosti uplatnění MCUt např. při výuce.

5.3 Generování náhodných barev RGB LED diody

Tento příklad ukazuje použití „pokročilých” funkcí MATLABu v součinnosti s MCUt.

Zde konkrétně je použita funkce randi(), která dle zadaných parametrů vygeneruje pseudonáhodná celá čísla v rozsahu zadaných mezí. Například příkaz

randi([4,6],1,10); vygeneruje vektor o deseti prvcích (jinak řečeno vygeneruje matici MxN o rozměru 1x10), ve kterém budou pseudonáhodně vygenerovaná čísla ze zadaného rozsahu [4,6] včetně. Druhý příkaz randi([0,1],1,10); vygeneruje také vektor o deseti prvcích, ovšem tentokrát pouze s hodnotami 0 a 1. Poslední

(33)

částí programu je for cyklus, který postupně projde oba vektory a náhodně vyge- nerovaným číslům portů přiřadí náhodně vygenerované stavy. Připojená LED dioda (schéma zapojení je na obrázku 5.4) tak může celkem svítit osmi různými barvami.

Aby se schéma barev neopakovalo, je v nekonečné smyčcce vždy po deseti změnách vygenerován nový vektor portů a stavů.

Kód 5.5 Generování náhodných barev RGB LED pomocí PIC16F690

1 while ( 1 )

2 s t a v = r a n d i ( [ 0 , 1 ] , 1 , 1 0 ) ; 3 p o r t = r a n d i ( [ 4 , 6 ] , 1 , 1 0 ) ; 4

5 f o r i =1:10

6 i f s t a v ( i ) == 0

7 d i g i t a l W r i t e ( matmcu , p o r t ( i ) , ’LOW’ ) ;

8 e l s e

9 d i g i t a l W r i t e ( matmcu , p o r t ( i ) , ’HIGH ’ ) ;

10 end

11 pause ( 0 . 1 ) ;

12 end

13 end

Více podrobností o funkci randi() lze nalézt v [14].

Obrázek 5.4: Připojení RGB LED diody k PIC16F690

5.4 Řízení svitu LED diody v závislosti na okolním osvětlení

Zatímco všechny předchozí ukázky byly pouze příklady jednoduchého ovládání, v tomto případě se již jedná řízení výstupu na základě informací ze vstupu. Kon- krétně jde o regulaci svitu (jasu) LED diody řízené PWM signálem, aktuální hodnota PWM signálu je vypočítávána na základě osvětlení fotodiody zapojené ve fotovol- taickém (hradlovém) režimu.

(34)

1 c l f ( ’ r e s e t ’ ) 2 x = 1 : 1 : 1 0 0 ; 3 ux4 = 0 ; 4 ux3 = 0 ; 5 ux2 = 0 ; 6

7 f o r n = 1 : 1 : 1 0 0

8 v a l u e ( n ) = analogRead ( matmcu , 1 0 ) ; 9 pause ( 0 . 1 ) ;

10 ux ( n ) = ( v a l u e ( n ) + ux2 + ux3 + ux4 ) / 4 ; 11 ux ( n ) = 7∗ ux ( n ) − 2 8 0 ;

12 i f ux ( n ) < 0

13 pwmWrite ( matmcu , 1 , 0 ) ; 14 e l s e i f ux ( n ) > 255

15 pwmWrite ( matmcu , 1 , 2 5 5 ) ;

16 e l s e

17 pwmWrite ( matmcu , 1 , ux ( n ) ) ;

18 end

19

20 ux4 = ux3 ;

21 ux3 = ux2 ;

22 ux2 = v a l u e ( n ) ; 23

24 %f p r i n t f ( 1 , ’%d \n ’ , n ) 25 plot ( ux , ’ C o l o r ’ , ’ r e d ’ ) ;

26 hold on

27 plot ( v a l u e ) ;

28 hold o f f

29 30 end

Obrázek 5.5: Připojení fotodiody k PIC16F690

V tomto příkladě je využit jednoduchý FIR filtr 3. řádu – tzv. jednoduchý klouzavý průměr (simple moving average), dále jen SMA. Samotný filtr tvoří ná- sledující kód.

Kód 5.7 Klouzavý průměr

1 ux4 = 0 ; 2 ux3 = 0 ; 3 ux2 = 0 ; 4

5 ux1 = analogRead ( matmcu , 1 0 ) ; 6

(35)

8

9 ux4 = ux3 ; 10 ux3 = ux2 ; 11 ux2 = v a l u e ( n ) ;

Řádek jedna až tři je inicializačním vektorem všech členů filtru vyjma prvního, jehož inicializace je na řádku pět. Následuje výpočet průměru a dále posunutí hodnot v jednotlivých členech filtru o jedna. V další iteraci se pak celý děj opakuje vyjma prvotní inicializace členů ux2 až ux4. SMA funguje jako dolnopropustní filtr, což znamená, že nám „vyhladí graf”. Příklad použití SMA 3. řádu je zobrazen na ná- sledujícím grafu, kde je k základní funkci 10 · sin(2 · π · t) přičten náhodný šum o maximální amplitudě Asum = 1 a následně je na tento „signál” aplikován SMA.

Graf 5.1: Aplikace jednoduchého klouzavého průměru

SMA jako každý jiný FIR filtr způsobuje zpoždění výstupního signálu oproti vstupnímu. Velmi dobře je to zobrazeno na obrázku 5.1, kde je vidět posun mezi průběhem vstupní (modrá) a výstupní (oranžová) funkce. Na následujícím obrázku je zobrazen reálný naměřený průběh s několika skokovými změnami na vstupu.

I na tomto grafu je vidět zpoždění výstupního signálu (červená) oproti průběhu na vstupu (modrá).

Po výpočtu SMA následuje lineární funkce ux = 7*ux(n) - 280; pro výpočet hodnoty výstupního signálu. Ačkoliv je intenzita osvětlení veličinou logaritmickou (např. 50lx ≈ šero, 500lx ≈ dobře osvětlená místnost, 50 000lx ≈ jasný letní den),

(36)

Graf 5.2: Skutečný signál na vstupu (modrý) a výstupu (červený) při řízení svitu LED diody v závislosti na okolním osvětlení

Hodnoty 7 a 280 byly zvoleny experimentálně, aby nejvíce odpovídali reálným pod- mínkám.

(37)

6 Referenční příručka

6.1 mcut

id = mcut(comPort,mcuType)

Základní funkce pro návázání spojení s MCU (mikrokontrolérem).

• comPort – argument musí obsahovat název portu ve formě řetězce, např. ’COM8’

• mcuType – argument musí obsahovat název MCU ve formě řetězce, např. ’Arduino’

či ’PIC16F690’

Komunikační protokol

• Navázání spojení → 1

• Potvrzení spojení ← 127

Obrázek 6.1: mcut

6.2 mcutdelete

mcutdelete(id)

Uzavře spojení s MCU, smaže globální proměnné, které MCUt využívá pro své potřeby.

• id – identifikátor spojení, obsahuje informaci o sériové komunikaci

(38)

Komunikační protokol

Nenavazuje spojení, nepotvrzuje spojení.

6.3 digitalRead

value = digitalRead(id,pinNumber)

Čte digitální hodnotu (0 či 1) ze vstupu MCU.

• id – identifikátor spojení, obsahuje informaci o sériové komunikaci

• pinNumber – číslo digitálního vstupu (pinu)

Příklad: hodnota = digitalRead(id,9) - vrátí logickou hodnotu z pinu 9 Komunikační protokol

• Navázání spojení → 3

• Potvrzení spojení ← 125

• Číslo portu → závislé od připojeného MCU

• Digitální hodnota ← 0 či 1

Obrázek 6.2: digitalRead

6.4 digitalWrite

digitalWrite(id,pinNumber,pinState)

Zapíše digitální hodnotu (0 či 1) na výstup MCU.

• id – identifikátor spojení, obsahuje informaci o sériové komunikaci

• pinNumber – číslo digitálního vstupu (pinu)

• pinState – logická hodnota výstupu (LOW nebo HIGH)

(39)

Komunikační protokol

• Navázání spojení → 4

• Potvrzení spojení ← 124

• Číslo portu → závislé od připojeného MCU

• Digitální hodnota → 72 (high) nebo 76 (low)

Obrázek 6.3: digitalWrite

6.5 analogRead

value = analogRead(id,pinNumber)

Čte analogovou hodnotu ze vstupu MCU. U 8b. AD převodníku je výsledná hodnota v rozmezí 0-255, 10b. AD převodníku 0-1023 apod.

• id – identifikátor spojení, obsahuje informaci o sériové komunikaci

• pinNumber – číslo analogového vstupu (pinu)

Příklad: hodnota = analogRead(id,1) – vrátí analogovou hodnotu z pinu 1 Komunikační protokol

• Navázání spojení → 5 (0x05)

• Potvrzení spojení ← 123 (0x7B)

• Číslo portu → závislé od připojeného MCU

• Analogová hodnota hodnota ← např. 0-1023 u 10b. AD převodníku

(40)

Obrázek 6.4: analogRead

6.6 pwmWrite

pwmWrite(id,pinNumber,dutyCycle)

Nastaví PWM modulaci na výtupu MCU v rozsahu 0 až 100% (0-255).

• id – identifikátor spojení, obsahuje informaci o sériové komunikaci

• pinNumber – číslo PWM výstupu (pinu)

• dutyCycle – nastaví střídu výstupu: 0 = 0%, 255 = 100%

Příklad: pwmWrite(id,1,127) - na výtupu 1 nastaví 50% střídu.

Komunikační protokol

• Navázání spojení → 7

• Potvrzení spojení ← 121

• Číslo portu → závislé od připojeného MCU

• Digitální hodnota → 0 až 255

Obrázek 6.5: pwmWrite

(41)

7 Závěr

Základní myšlenka této práce – podpora speciálního hardwaru pro MATLAB – pů- vodně vznikla jako reakce na oficiální software od společnosti MathWorks pro pod- poru mikrokontroléru Atmel ATmega328, resp. Arduino [7]. Tento oficiální software mne však velmi zklamal svou složitostí a zčásti i neefektivností. Proto vznikl Micro- controller toolbox (MCUt), jehož popis i příklady použití najdete v této bakalářské práci. Samotný MCUt není řešením „Out of the box”, je spíše nástinem toho, jak by mohl vypadat návrh a implementace podpory pro určitý typ hardwaru pro software MATLAB, Octave či jiné. To ovšem neznamená, že by byl MCUt nepoužitelný. Jak dokládají jednotlivé ukázky použití, funkčnost MCUt je vyzkoušena a plně dostačuje pro mnoho fyzikálně technických experimentů, při kterých je třeba zaznamenávat a vyhodnocovat data či řídit jiné systémy.

V první kapitole této práce najdeme velmi elementární popis systémů MATLAB a Octave. Dále jsou zde rozebrány důvody, proč vlastně vznikl samotný MCUt.

Ve druhé kapitole lze nalézt rozbor možností spolupráce systému MATLAB s exter- ním hardwarem a jsou zde naznačeny možnosti zapojení externího hardwaru do simulačních úloh. Opět se však jedná spíše o základní tezi než o vyčerpávající soupis možností systému MATLAB. Na tomto místě lze zájemcům o tuto problematiku doporučit některý ze specializovaných seminářů pořádaných společností MathWork, resp. v České republice například firmou Humusoft [15]. Třetí kapitola rozebírá mož- nosti spolupráce externího hardwaru se systémem GNU Octave.

Kapitoly čtyři a pět jsou pak nosnou částí této práce. První z nich popisuje samotnou implementaci Microcontroller toolboxu, kde v jednotlivých částech nalez- neme popis všech důležitých prvků tohoto softwaru. Druhou část této kapitoly tvoří stručný popis hardwaru, pro který byl MCUt implementován. Pátá kapitola je popi- sem několika experimentů, jenž demonstrují možnosti spojení MCUt a MATLABu resp. Octave. Tyto experimenty, byť jednoduché, slouží též jako tutoriál vysvětlující použití jednotlivých funkcí MCUt.

Vzhledem k charakteru tohoto projektu je referenční příručka MCUt jeho důle- žitým prvkem, proto je jí věnovanána šestá a poslední kapitolou této práce. V této příručce lze nalézt nejen popis jednotlivých funkcí Microcontroller toolboxu a jejich parametrů, ale i popis protokolu, pomocí kterého komunikuje s připojeným hard- warem.

(42)

Literatura

[1] HUMUSOFT: Technické výpočty, řídící technika, sumulace: MATLAB:

Jazyk pro technické výpočty [online]. 2014 [cit. 2014-03-02]. Dostupné z:

http://www.humusoft.cz/produkty/MATLAB/MATLAB/

[2] Wikipedie: Otevřená encyklopedie: GNU Octave [online]. 2014 [cit. 2014-03-02].

Dostupné z:

http://cs.wikipedia.org/w/index.php?title=GNU Octave&oldid=11256517

[3] Oetiker E., Kočer M. a kol. Ne příliš stručný úvod do systému LATEX2ε

[4] JELÍNEK, Pavel. Simulace Processor In the Loop a Hardware In the Loop. In: Odborné časopisy [online]. 2013 [cit. 2014-09-21]. Dostupné z:

http://www.odbornecasopisy.cz/index.php?id%20document=34311

[5] Octave-Forge: Extra packages for GNU Octave [online]. 2002, 2014 [cit. 2014- 10-16]. Dostupné z: http://octave.sourceforge.net/

[6] Instrument control package. Octave [online]. 2012, 2013 [cit. 2014-10-16].

Dostupné z: http://wiki.octave.org/Instrument control package

[7] Arduino Support from MATLAB: Hardware support. MathWorks [online].

2013 [cit. 2014-10-28]. Dostupné z: http://www.mathworks.com/hardware- support/arduino-matlab.html

[8] ATmega328. Atmel Corporation: Microcontrollers, 32-bit, and touch solutions [online]. 2014 [cit. 2014-10-28]. Dostupné z:

http://www.atmel.com/devices/atmega328.aspx

[9] PIC16F690: 8-bit PIC R Microcontrollers. Microchip Tech- nology Inc [online]. 2014 [cit. 2014-10-28]. Dostupné z:

http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en023112

(43)

[10] L293D | Peripheral Driver and Actuator | Other Interface | Description

& parametrics. Analog, Embedded Processing, Semiconductor Company, Texas Instruments - TI.com [online]. 2014 [cit. 2014-11-28]. Dostupné z:

http://www.ti.com/product/l293D

[11] L4940 1.5 A very low drop voltage regulator IC - STMicroelectro- nics. STMicroelectronics [online]. 2014 [cit. 2014-11-28]. Dostupné z:

http://www.st.com/web/catalog/sense power

/FM142/CL1015/SC312/SS1733/PF259697?s searchtype=partnumber

[12] FT232R. FTDI Chip Home Page [online]. 2014 [cit. 2014-11-28]. Dostupné z:

http://www.ftdichip.com/Products/ICs/FT232R.htm

[13] FABIAN, David. První program v C, ahoj světe: Vše o jazyku C a C++. Infor- mace, popis jazyka, užitečné rady: Vše o jazyku C a C++ [online]. 2013 [cit. 2014- 11-30]. Dostupné z: http://kmlinux.fjfi.cvut.cz/ fabiadav/cecko/poznamky-k- jazyku-c/prvni-program-v-c

[14] Uniformly distributed pseudorandom integers: MATLAB randi. MathWorks - MATLAB and Simulink for Technical Computing [online]. 2014 [cit. 2014-12-01].

Dostupné z: http://www.mathworks.com/help/matlab/ref/randi.html

[15] Konference — Humusoft. HUMUSOFT: Technické výpočty, ří- dící technika, sumulace [online]. 2014 [cit. 2014-12-06]. Dostupné z:

http://www.humusoft.cz/kalendar/konference/

(44)

A Obsah přiloženého CD

• Text bakalarske prace – BP 2014 Jan Broz.pdf – BP 2014 Jan Broz.tex

– kopie zadani BP 2014 Jan Broz.pdf

– obrazky – složka obsahuje upravené obrázky použité v BP, nutné pro překlad TEXového zdrojového souboru

• Fotografie – fotografie vývojových desek

• Zdrojove kody – MCUt

∗ MATLAB – zdrojové kódy Microcontroller toolboxu pro MATLAB

∗ Octave – zdrojové kódy Microcontroller toolboxu pro GNU Octave – PIC16F690 – zdrojové kódy pro Microchip PIC16F690

– Arduino – zdrojové kódy pro Atmel ATmega328

• Vykresova dokumentace – návrhy DPS z programu Eagle

• Katalogove listy – katalogové listy použitých součástek

(45)

B Výkresová dokumentace

Obrázek 7.1: Návrh PCB první generace vývojové desky (obrázek není v měřítku 1:1)

(46)

Obrázek 7.2: Schéma první generace vývojové desky

(47)

Obrázek 7.3: Návrh PCB druhé generace vývojové desky (obrázek není v měřítku 1:1)

(48)

Obrázek 7.4: Návrh PCB rozšiřující vývojové desky (obrázek není v měřítku 1:1)

References

Related documents

&gt;&gt; for i=1:5, for j=1:5, A(i,j) = sin(i/10)*sin(j/10), end, end Om man skriver end; end; d¨aremot, s˚a f˚ar man samma resultat, dvs semikolon efter end har ingen verkan

Påpekande: för att man ska veta vilken metod man ska använda och för att man ska kunna tolka resultaten från programmen krävs kunskaper i matematik och numerisk analys.. Per

Matlab är mycket effektiv på att lösa stora ekvationssystem med flera obekanta, och det finns många fysikaliska problem där man behöver detta. Till exempel inom elläran så får

IN 21-601-01/01-Měření intenzity vyzařování ve vzdálenosti od zdroje světla pro stranově vyzařující optická vlákna, svazky vláken a textilie se

V následující části si stručně přiblížíme strukturu standardních grafických prvků uživatelského rozhraní v Turbo Vision, Delphi a prostředí Android.. 3.1

Zde byl potřeba nastavit velký zdvih nohou při pohybu, aby nedocházelo k zaseknutí končetin a také byla zvednuta celková výška těla robota.. I přes to občas docházelo

Vektorer används ofta för att spara serier av värden, t.ex. en serie

Vill man att funktionen skall klara elementvisa kalkyler (som i de flesta fall i denna kurs) måste man använda ”punk- terade operationer” (dvs. Om en viss anonym funktion saknar