https://senzor.robotika.sk/sensorwiki/api.php?action=feedcontributions&user=DVPS&feedformat=atomSensorWiki - Príspevky používateľa [sk]2024-03-29T06:58:28ZPríspevky používateľaMediaWiki 1.29.0https://senzor.robotika.sk/sensorwiki/index.php?title=Pestovanie_4.0.&diff=9477Pestovanie 4.0.2018-05-30T13:34:03Z<p>DVPS: /* Vzduchové čerpadlo */</p>
<hr />
<div>{|<br />
|Autor: || '''Pavel Sadloň''' <br />
|-<br />
|Študijný odbor: || Robotika a kybernetika || 1. Bc. ('''2018''') <br />
|}<br />
<br />
== Obsah ==<br />
<br />
__TOC__<br />
<br />
== Opis projektu ==<br />
<br />
V dnešnej dobe je trh preplnený zeleninou a ovocím, ktoré sa k nám dovážajú z rôznych štátov Európy, či sveta a s pochybnou kvalitou. Často sú prepravované ešte nedozreté, aby cestou nezhnili, čo sa odráža napríklad na ich zníženom obsahu výživných látok. Mnoho ľudí preto hľadá alternatívu v pestovaní vlastných plodín, no nie každý má však k dispozícii pôdu, na ktorej by mohol pestovať.<br />
<br />
Riešením tohto problému je tzv. hydroponické pestovanie, ktoré nevyžaduje pôdu, iba živný roztok a stály prísun kyslíka. Okrem toho, že takýto spôsob pestovania ušetrí priestor, čas, peniaze, či vodu, rastliny rastú rýchlejšie, čím sa na ne v prípade postreku spotrebuje menšie množstvo pesticídov. Navyše je úplne eliminovaná prítomnosť nežiadúcich druhov rastlín - "buriny" a nájdu sa aj tí, čo ocenia, že sa nemusia "hrabať v zemi".<br />
<br />
Keďže sme doslova obklopení elektronikou, bola by škoda nevyužiť ju v náš prospech aj pri tomto projekte. K samotnému systému vieme pripojiť akékoľvek vhodné senzory, zozbierať z nich dáta a následne ich vyhodnotiť podľa individuálnych požiadaviek.<br />
<br />
Potrebný materiál:<br />
* Pestovanie:<br />
** Nádoba na živný roztok<br />
** 3x Kvetináč<br />
** Veko na prikrytie nádoby, zároveň funguje ako držiak kvetináčov<br />
** Rastliny, v našom prípade chilli papričky<br />
** Oporný materiál pre rastliny - keramzit (ílové granule)<br />
** Vzduchové čerpadlo<br />
* Elektronika:<br />
** Arduino UNO<br />
** Senzory DHT22 a MCP9700<br />
** Displej PCD8544<br />
** Prepojovacie kábliky<br />
** Krabička na Arduino<br />
** 4x Dištančný stĺpik M3x3<br />
** 4x Skrutka M3x5<br />
** 9V baterka a zdrojový káblik<br />
** 1000 ohm rezistor<br />
<br />
<br />
'''Použité zdroje:''' <br />
<br />
* https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf<br />
* https://www.mouser.com/ds/2/268/20001942F-461622.pdf<br />
* https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf<br />
<br />
== Analýza ==<br />
<br />
===Výber hydroponického systému===<br />
<br />
Pod pojmom hydroponické pestovanie sa ukrýva viacero typov tohto spôsobu pestovania. Každý z nich je v niečom odlišný a každý má svoje pre a proti. <br />
<br />
Rozdelenie hydroponických systémov:<br />
# Flood and Drain - Substrát je zaplavovaný živným roztokom, ktorý je následne odvádzaný preč. V podstate ide o dve nádoby umiestnené nad sebou, spojené hadicou cez ktorú je prečerpávaný živný roztok z jednej nádoby do druhej, pričom dochádza k okysličovaniu, prečisteniu koreňovej sústavy a odstráneniu nahromadených plynov. V momente keď sa čerpadlo vypne dochádza k automatickému odtoku živného roztoku z hornej nádoby do spodnej a tým k ešte väčšiemu okysličeniu koreňovej zóny. <br/>[[Súbor:Fnd.jpg]]<br/><br />
# NFT (Nutrient Film Technique) - Živný roztok je tu privádzaný do pestovateľskej nádoby, kde na povrchu vytvára tenkú, pomaly tečúcu vrstvu. Jednou z hlavných výhod NFT je dokonalé okysličovanie dané tým, že sa živný roztok rovnomerne rozprestrie po celej ploche pestovateľskej nádoby a k reakcii medzi živným roztokom a vzduchom dochádza na celej ploche. Čo sa týka okysličovania je NFT jednou z Top metód, ale má aj nevýhody čo sa týka nedostatočnej fyzickej opory rastlín.<br/>[[Súbor:Nft.png]]<br/><br />
# DWC (Deep Water Cultivation) - Ide o nádobu, obvykle 5-10 litrov objemnú ktorej na dno je položený okysličovací kameň (používaný v akváriach) spojený s malým vzduchovým čerpadlom. Nádoba je naplnená živným roztokom a na hladinu umiestnená doska, v ktorej sú otvory na kvetináče s rastinou. Tomuto typu systému skoro nieje čo vytknúť, okrem toho že keď sa pokazí vzduchové čerpadlo, rastliny uhynú za 24 až 30 hodín od vzniku poruchy. Živný roztok sa vymieňa za nový približne raz za 4 týždne.<br/>[[Súbor:DWC.jpg]]<br/><br />
# Aeropónia - Najdokonalejší spôsob ako dostať živiny priamo do rastlín. Živný roztok je pomocou ultrazvukovej membrány premenený na hmlu o veľkosti kvapiek menej ako 5 mikrónov, čo je veľkosť kedy živný roztok prechádza priamo do koreňov poprípade do listov.<br/>[[Súbor:Aero.jpg]]<br/><br />
<br />
Pre riešenie nášho projektu som vybral systém DWC z dôvodu jeho jednoduchosti.<br />
<br />
===Elektronika===<br />
<br />
Na to, aby som mal prehľad o tom, v akom stave je hydroponický systém, je potrebné ho osadiť rôznymi senzormi a mikrokontrolérom, ktorý vie získané údaje spracovať. Údaje, ktoré sú dôležité je teplota vody, teplota prostredia a vlhkosť prostredia. Výška hladiny vody nie je v tomto prípade dôležitá, preože živný roztok sa mení raz za 4 týždne, čo je krátka doba na to, aby sa výška hladiny významne znížila.<br />
<br />
Aby riešenie projektu bolo rýchle, lacné, jednoduché, zvolil som ako mikrokontrolér platformu '''Arduino UNO''' s 8-bitovým procesorom ATMega 328. Ako senzory som vybral senzor teploty a vlhkosti '''DHT22''' a senzor teploty '''MCP9700''' z dôvodu ich optimálneho pomeru cena/použiteľnosť. Získané dáta nám budú na nič, keď ich z Arduina nevieme prečítať. Na to slúži displej '''PCD8544'''.<br />
<br />
<br />
[[Súbor:Hydro-uno.jpg]] [[Súbor:Dht22.jpg]] [[Súbor:Mcp.jpg]] [[Súbor:Pcd.jpg]]<br />
<br />
== Popis riešenia ==<br />
<br />
===Systém na pestovanie===<br />
<br />
====Nádoba====<br />
<br />
Vybral som vhodnú nádobu na živný roztok. Vzhľadom na to, že nemala veko a mal som doma akrylovú dosku, rozhodol som sa, že veko spravím z nej. V programe AutoCAD som navrhol otvory pre kvetináče a hadicu vzduchového čerpadla. Následne som ich dal vyrezať na laserovom vyrezávači.<br />
<br />
Keďže korene potrebujú mať pre svoj zdravý rast tmu a nesmie sa k nim dostať svetlo, musel som zatemniť nádobu aj veko čiernou fóliou.<br />
<br />
[[Súbor:Veko.jpg]]<br />
<br />
Technický nákres: [http://senzor.robotika.sk/sensorwiki/images/b/b8/Holder.dwg Holder]<br />
<br />
====Kvetináče====<br />
<br />
Aby rastliny mohli rásť v živnom roztoku je potrebné, aby ich korene mohli prerásť cez kvetináč do roztoku. Keďže doma som mal nemal kvetináče určené na hydropóniu, ale mal som klasické, upravil som ich navŕtaním dier a vystrihnutím časti dna.<br />
<br />
Následne som do kvetináčov vložil rastliny a zasypal ich keramzitom, ktorý funguje ako ich opora.<br />
<br />
[[Súbor:Kv.jpg]] [[Súbor:Rastl.jpg]] [[Súbor:Both.jpg]]<br />
<br />
====Vzduchové čerpadlo====<br />
<br />
Keďže korene rastlín potrebujú nepretržitý prísun kyslíka, je potrebné vymyslieť systém, vďaka ktorému ho vo vode bude dostatok. Na to slúži vzduchové čerpadlo, ktorého hadica je ukončená vzduchovým kameňom, cez ktorý vháňa vzduch do živného roztoku. Čerpadlo je nepretržite pripojené do siete 230V.<br />
<br />
[[Súbor:Pumpa.jpg]]<br />
<br />
===Elektronika===<br />
<br />
====Zber a spracovanie dát====<br />
<br />
Vzhľadom na povahu výstupu (analógový/digitálny) som pripojil senzory a displej k Arduinu podľa schémy. Keďže senzorom MCP9700 meriame teplotu vody, je nutné zaizolovať samotný senzor aj kabeláž. To som dosiahol pomocou tavnej pištole.<br />
<br />
<br />
[[Súbor:Schema.png]]<br />
<br />
====Krabička na Arduino====<br />
<br />
Aby Arduino a displej boli na hydroponickom systéme niekde uložené, navrhol som krabičku v programe Siemens NX a dal ju vytlačiť na 3D tlačiarni. Krabička funguje ako ochranný obal na Arduino a zároveň ako držiak na displej.<br />
<br />
[[Súbor:Box-web.jpg]] [[Súbor:Top-web.jpg]]<br />
[[Súbor:Krabicka.jpg]] [[Súbor:Electro-web.jpg]]<br />
<br />
3D modely:<br />
* [http://senzor.robotika.sk/sensorwiki/images/a/ad/Arduino-box.stl Arduino-box]<br />
* [http://senzor.robotika.sk/sensorwiki/images/9/90/Arduino-box-top.stl Arduino-box-top]<br />
<br />
=== Algoritmus a program ===<br />
<br />
Algoritmus získava údaje zo senzorov a zobrazuje na displeji. Kód bol napísaný v jazyku C a skompilovaný v Arduino IDE 1.8.5.<br />
<br />
Získavanie dát zo senzorov a zapisovanie do premenných.<br />
<br />
<source lang="c"><br />
hum = dht.readHumidity(); // Read air humidity<br />
temp = dht.readTemperature(); // Read air temperature<br />
<br />
/* Read water temperature <br />
* we need to get the real value by mathematic operations based on datasheet */<br />
tempw = ((float)analogRead(MCPPIN) * 5 / 1024.0) - 0.5; <br />
tempw = tempw / 0.01; <br />
</source><br />
<br />
Vypísanie získanej hodnoty vzdušnej vlhkosti na displej. Rovnaký spôsob používame aj pri ostatných údajov s tým, že vypisujeme hodnotu príslušnej premennej.<br />
<br />
<source lang="c"><br />
//Set cursor position on display and print on display<br />
lcd.setCursor(0, 0); <br />
lcd.print("Hum: ");<br />
lcd.print(hum);<br />
lcd.print("%"); <br />
</source><br />
<br />
Link na github https://github.com/salopadlon/Hydroponics<br><br />
Zdrojový kód: [http://senzor.robotika.sk/sensorwiki/images/5/59/Hydroponics.ino Main]<br><br />
Knižnice: [http://senzor.robotika.sk/sensorwiki/images/b/be/Pcd8544.zip PCD8544], [http://senzor.robotika.sk/sensorwiki/images/a/ac/DHT-sensor-library-master.zip DHT]<br />
<br />
=== Výsledok ===<br />
<br />
Počas inštalácie elektroniky som zistil, že prepojovacie kábliky majú príliš vysoké piny na to, aby sa dala krabička zavrieť vrchnou časťou. Bohužiaľ, už som nemal čas dať tlačiť novú krabičku.<br />
<br />
Čo sa ale týka funkčnosti, všetko funguje tak ako má a s výsledkom som vcelku spokojný.<br />
<br />
Do budúcnosti plánujem dáta ukladať do databázy a zobrazovať ich na web stránke alebo na smartphone aplikácii.<br />
<br />
[[Súbor:Hydroponics-web.jpg]] [[Súbor:Data-web.jpg]] [[Súbor:Roots-web.jpg]] <br />
<br />
<br />
<br />
Späť na [[Projekty študentov DTV-2018|zoznam projektov]].<br />
[[Category:DTV2018]]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Pestovanie_4.0.&diff=9476Pestovanie 4.0.2018-05-30T13:33:27Z<p>DVPS: /* Opis projektu */</p>
<hr />
<div>{|<br />
|Autor: || '''Pavel Sadloň''' <br />
|-<br />
|Študijný odbor: || Robotika a kybernetika || 1. Bc. ('''2018''') <br />
|}<br />
<br />
== Obsah ==<br />
<br />
__TOC__<br />
<br />
== Opis projektu ==<br />
<br />
V dnešnej dobe je trh preplnený zeleninou a ovocím, ktoré sa k nám dovážajú z rôznych štátov Európy, či sveta a s pochybnou kvalitou. Často sú prepravované ešte nedozreté, aby cestou nezhnili, čo sa odráža napríklad na ich zníženom obsahu výživných látok. Mnoho ľudí preto hľadá alternatívu v pestovaní vlastných plodín, no nie každý má však k dispozícii pôdu, na ktorej by mohol pestovať.<br />
<br />
Riešením tohto problému je tzv. hydroponické pestovanie, ktoré nevyžaduje pôdu, iba živný roztok a stály prísun kyslíka. Okrem toho, že takýto spôsob pestovania ušetrí priestor, čas, peniaze, či vodu, rastliny rastú rýchlejšie, čím sa na ne v prípade postreku spotrebuje menšie množstvo pesticídov. Navyše je úplne eliminovaná prítomnosť nežiadúcich druhov rastlín - "buriny" a nájdu sa aj tí, čo ocenia, že sa nemusia "hrabať v zemi".<br />
<br />
Keďže sme doslova obklopení elektronikou, bola by škoda nevyužiť ju v náš prospech aj pri tomto projekte. K samotnému systému vieme pripojiť akékoľvek vhodné senzory, zozbierať z nich dáta a následne ich vyhodnotiť podľa individuálnych požiadaviek.<br />
<br />
Potrebný materiál:<br />
* Pestovanie:<br />
** Nádoba na živný roztok<br />
** 3x Kvetináč<br />
** Veko na prikrytie nádoby, zároveň funguje ako držiak kvetináčov<br />
** Rastliny, v našom prípade chilli papričky<br />
** Oporný materiál pre rastliny - keramzit (ílové granule)<br />
** Vzduchové čerpadlo<br />
* Elektronika:<br />
** Arduino UNO<br />
** Senzory DHT22 a MCP9700<br />
** Displej PCD8544<br />
** Prepojovacie kábliky<br />
** Krabička na Arduino<br />
** 4x Dištančný stĺpik M3x3<br />
** 4x Skrutka M3x5<br />
** 9V baterka a zdrojový káblik<br />
** 1000 ohm rezistor<br />
<br />
<br />
'''Použité zdroje:''' <br />
<br />
* https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf<br />
* https://www.mouser.com/ds/2/268/20001942F-461622.pdf<br />
* https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf<br />
<br />
== Analýza ==<br />
<br />
===Výber hydroponického systému===<br />
<br />
Pod pojmom hydroponické pestovanie sa ukrýva viacero typov tohto spôsobu pestovania. Každý z nich je v niečom odlišný a každý má svoje pre a proti. <br />
<br />
Rozdelenie hydroponických systémov:<br />
# Flood and Drain - Substrát je zaplavovaný živným roztokom, ktorý je následne odvádzaný preč. V podstate ide o dve nádoby umiestnené nad sebou, spojené hadicou cez ktorú je prečerpávaný živný roztok z jednej nádoby do druhej, pričom dochádza k okysličovaniu, prečisteniu koreňovej sústavy a odstráneniu nahromadených plynov. V momente keď sa čerpadlo vypne dochádza k automatickému odtoku živného roztoku z hornej nádoby do spodnej a tým k ešte väčšiemu okysličeniu koreňovej zóny. <br/>[[Súbor:Fnd.jpg]]<br/><br />
# NFT (Nutrient Film Technique) - Živný roztok je tu privádzaný do pestovateľskej nádoby, kde na povrchu vytvára tenkú, pomaly tečúcu vrstvu. Jednou z hlavných výhod NFT je dokonalé okysličovanie dané tým, že sa živný roztok rovnomerne rozprestrie po celej ploche pestovateľskej nádoby a k reakcii medzi živným roztokom a vzduchom dochádza na celej ploche. Čo sa týka okysličovania je NFT jednou z Top metód, ale má aj nevýhody čo sa týka nedostatočnej fyzickej opory rastlín.<br/>[[Súbor:Nft.png]]<br/><br />
# DWC (Deep Water Cultivation) - Ide o nádobu, obvykle 5-10 litrov objemnú ktorej na dno je položený okysličovací kameň (používaný v akváriach) spojený s malým vzduchovým čerpadlom. Nádoba je naplnená živným roztokom a na hladinu umiestnená doska, v ktorej sú otvory na kvetináče s rastinou. Tomuto typu systému skoro nieje čo vytknúť, okrem toho že keď sa pokazí vzduchové čerpadlo, rastliny uhynú za 24 až 30 hodín od vzniku poruchy. Živný roztok sa vymieňa za nový približne raz za 4 týždne.<br/>[[Súbor:DWC.jpg]]<br/><br />
# Aeropónia - Najdokonalejší spôsob ako dostať živiny priamo do rastlín. Živný roztok je pomocou ultrazvukovej membrány premenený na hmlu o veľkosti kvapiek menej ako 5 mikrónov, čo je veľkosť kedy živný roztok prechádza priamo do koreňov poprípade do listov.<br/>[[Súbor:Aero.jpg]]<br/><br />
<br />
Pre riešenie nášho projektu som vybral systém DWC z dôvodu jeho jednoduchosti.<br />
<br />
===Elektronika===<br />
<br />
Na to, aby som mal prehľad o tom, v akom stave je hydroponický systém, je potrebné ho osadiť rôznymi senzormi a mikrokontrolérom, ktorý vie získané údaje spracovať. Údaje, ktoré sú dôležité je teplota vody, teplota prostredia a vlhkosť prostredia. Výška hladiny vody nie je v tomto prípade dôležitá, preože živný roztok sa mení raz za 4 týždne, čo je krátka doba na to, aby sa výška hladiny významne znížila.<br />
<br />
Aby riešenie projektu bolo rýchle, lacné, jednoduché, zvolil som ako mikrokontrolér platformu '''Arduino UNO''' s 8-bitovým procesorom ATMega 328. Ako senzory som vybral senzor teploty a vlhkosti '''DHT22''' a senzor teploty '''MCP9700''' z dôvodu ich optimálneho pomeru cena/použiteľnosť. Získané dáta nám budú na nič, keď ich z Arduina nevieme prečítať. Na to slúži displej '''PCD8544'''.<br />
<br />
<br />
[[Súbor:Hydro-uno.jpg]] [[Súbor:Dht22.jpg]] [[Súbor:Mcp.jpg]] [[Súbor:Pcd.jpg]]<br />
<br />
== Popis riešenia ==<br />
<br />
===Systém na pestovanie===<br />
<br />
====Nádoba====<br />
<br />
Vybral som vhodnú nádobu na živný roztok. Vzhľadom na to, že nemala veko a mal som doma akrylovú dosku, rozhodol som sa, že veko spravím z nej. V programe AutoCAD som navrhol otvory pre kvetináče a hadicu vzduchového čerpadla. Následne som ich dal vyrezať na laserovom vyrezávači.<br />
<br />
Keďže korene potrebujú mať pre svoj zdravý rast tmu a nesmie sa k nim dostať svetlo, musel som zatemniť nádobu aj veko čiernou fóliou.<br />
<br />
[[Súbor:Veko.jpg]]<br />
<br />
Technický nákres: [http://senzor.robotika.sk/sensorwiki/images/b/b8/Holder.dwg Holder]<br />
<br />
====Kvetináče====<br />
<br />
Aby rastliny mohli rásť v živnom roztoku je potrebné, aby ich korene mohli prerásť cez kvetináč do roztoku. Keďže doma som mal nemal kvetináče určené na hydropóniu, ale mal som klasické, upravil som ich navŕtaním dier a vystrihnutím časti dna.<br />
<br />
Následne som do kvetináčov vložil rastliny a zasypal ich keramzitom, ktorý funguje ako ich opora.<br />
<br />
[[Súbor:Kv.jpg]] [[Súbor:Rastl.jpg]] [[Súbor:Both.jpg]]<br />
<br />
====Vzduchové čerpadlo====<br />
<br />
Keďže korene rastlín potrebujú nepretržitý prísun kyslíka, je potrebné vymyslieť systém, vďaka ktorému ho vo vode bude dostatok. Na to slúži vzduchové čerpadlo, ktorého hadica je ukončená vzduchovým kameňom, cez ktorý vháňa vzduch do živného roztoku.<br />
<br />
[[Súbor:Pumpa.jpg]]<br />
<br />
===Elektronika===<br />
<br />
====Zber a spracovanie dát====<br />
<br />
Vzhľadom na povahu výstupu (analógový/digitálny) som pripojil senzory a displej k Arduinu podľa schémy. Keďže senzorom MCP9700 meriame teplotu vody, je nutné zaizolovať samotný senzor aj kabeláž. To som dosiahol pomocou tavnej pištole.<br />
<br />
<br />
[[Súbor:Schema.png]]<br />
<br />
====Krabička na Arduino====<br />
<br />
Aby Arduino a displej boli na hydroponickom systéme niekde uložené, navrhol som krabičku v programe Siemens NX a dal ju vytlačiť na 3D tlačiarni. Krabička funguje ako ochranný obal na Arduino a zároveň ako držiak na displej.<br />
<br />
[[Súbor:Box-web.jpg]] [[Súbor:Top-web.jpg]]<br />
[[Súbor:Krabicka.jpg]] [[Súbor:Electro-web.jpg]]<br />
<br />
3D modely:<br />
* [http://senzor.robotika.sk/sensorwiki/images/a/ad/Arduino-box.stl Arduino-box]<br />
* [http://senzor.robotika.sk/sensorwiki/images/9/90/Arduino-box-top.stl Arduino-box-top]<br />
<br />
=== Algoritmus a program ===<br />
<br />
Algoritmus získava údaje zo senzorov a zobrazuje na displeji. Kód bol napísaný v jazyku C a skompilovaný v Arduino IDE 1.8.5.<br />
<br />
Získavanie dát zo senzorov a zapisovanie do premenných.<br />
<br />
<source lang="c"><br />
hum = dht.readHumidity(); // Read air humidity<br />
temp = dht.readTemperature(); // Read air temperature<br />
<br />
/* Read water temperature <br />
* we need to get the real value by mathematic operations based on datasheet */<br />
tempw = ((float)analogRead(MCPPIN) * 5 / 1024.0) - 0.5; <br />
tempw = tempw / 0.01; <br />
</source><br />
<br />
Vypísanie získanej hodnoty vzdušnej vlhkosti na displej. Rovnaký spôsob používame aj pri ostatných údajov s tým, že vypisujeme hodnotu príslušnej premennej.<br />
<br />
<source lang="c"><br />
//Set cursor position on display and print on display<br />
lcd.setCursor(0, 0); <br />
lcd.print("Hum: ");<br />
lcd.print(hum);<br />
lcd.print("%"); <br />
</source><br />
<br />
Link na github https://github.com/salopadlon/Hydroponics<br><br />
Zdrojový kód: [http://senzor.robotika.sk/sensorwiki/images/5/59/Hydroponics.ino Main]<br><br />
Knižnice: [http://senzor.robotika.sk/sensorwiki/images/b/be/Pcd8544.zip PCD8544], [http://senzor.robotika.sk/sensorwiki/images/a/ac/DHT-sensor-library-master.zip DHT]<br />
<br />
=== Výsledok ===<br />
<br />
Počas inštalácie elektroniky som zistil, že prepojovacie kábliky majú príliš vysoké piny na to, aby sa dala krabička zavrieť vrchnou časťou. Bohužiaľ, už som nemal čas dať tlačiť novú krabičku.<br />
<br />
Čo sa ale týka funkčnosti, všetko funguje tak ako má a s výsledkom som vcelku spokojný.<br />
<br />
Do budúcnosti plánujem dáta ukladať do databázy a zobrazovať ich na web stránke alebo na smartphone aplikácii.<br />
<br />
[[Súbor:Hydroponics-web.jpg]] [[Súbor:Data-web.jpg]] [[Súbor:Roots-web.jpg]] <br />
<br />
<br />
<br />
Späť na [[Projekty študentov DTV-2018|zoznam projektov]].<br />
[[Category:DTV2018]]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Pestovanie_4.0.&diff=9475Pestovanie 4.0.2018-05-30T10:32:19Z<p>DVPS: /* Algoritmus a program */</p>
<hr />
<div>{|<br />
|Autor: || '''Pavel Sadloň''' <br />
|-<br />
|Študijný odbor: || Robotika a kybernetika || 1. Bc. ('''2018''') <br />
|}<br />
<br />
== Obsah ==<br />
<br />
__TOC__<br />
<br />
== Opis projektu ==<br />
<br />
V dnešnej dobe je trh preplnený zeleninou a ovocím, ktoré sa k nám dovážajú z rôznych štátov Európy, či sveta a s pochybnou kvalitou. Často sú prepravované ešte nedozreté, aby cestou nezhnili, čo sa odráža napríklad na ich zníženom obsahu výživných látok. Mnoho ľudí preto hľadá alternatívu v pestovaní vlastných plodín, no nie každý má však k dispozícii pôdu, na ktorej by mohol pestovať.<br />
<br />
Riešením tohto problému je tzv. hydroponické pestovanie, ktoré nevyžaduje pôdu, iba živný roztok a stály prísun kyslíka. Okrem toho, že takýto spôsob pestovania ušetrí priestor, čas, peniaze, či vodu, rastliny rastú rýchlejšie, čím sa na ne v prípade postreku spotrebuje menšie množstvo pesticídov. Navyše je úplne eliminovaná prítomnosť nežiadúcich druhov rastlín - "buriny" a nájdu sa aj tí, čo ocenia, že sa nemusia "hrabať v zemi".<br />
<br />
Keďže sme doslova obklopení elektronikou, bola by škoda nevyužiť ju v náš prospech aj pri tomto projekte. K samotnému systému vieme pripojiť akékoľvek vhodné senzory, zozbierať z nich dáta a následne ich vyhodnotiť podľa individuálnych požiadaviek.<br />
<br />
Potrebný materiál:<br />
* Pestovanie:<br />
** Nádoba na živný roztok<br />
** 3x Kvetináč<br />
** Veko na prikrytie nádoby, zároveň funguje ako držiak kvetináčov<br />
** Rastliny, v našom prípade chilli papričky<br />
** Oporný materiál pre rastliny - keramzit (ílové granule)<br />
** Vzduchové čerpadlo<br />
* Elektronika:<br />
** Arduino UNO<br />
** Senzory DHT22 a MCP9700<br />
** Displej PCD8544<br />
** Prepojovacie kábliky<br />
** Krabička na Arduino<br />
** 4x Dištančný stĺpik M3x3<br />
** 4x Skrutka M3x5<br />
** 9V baterka a zdrojový káblik<br />
<br />
<br />
'''Použité zdroje:''' <br />
<br />
* https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf<br />
* https://www.mouser.com/ds/2/268/20001942F-461622.pdf<br />
* https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf<br />
<br />
== Analýza ==<br />
<br />
===Výber hydroponického systému===<br />
<br />
Pod pojmom hydroponické pestovanie sa ukrýva viacero typov tohto spôsobu pestovania. Každý z nich je v niečom odlišný a každý má svoje pre a proti. <br />
<br />
Rozdelenie hydroponických systémov:<br />
# Flood and Drain - Substrát je zaplavovaný živným roztokom, ktorý je následne odvádzaný preč. V podstate ide o dve nádoby umiestnené nad sebou, spojené hadicou cez ktorú je prečerpávaný živný roztok z jednej nádoby do druhej, pričom dochádza k okysličovaniu, prečisteniu koreňovej sústavy a odstráneniu nahromadených plynov. V momente keď sa čerpadlo vypne dochádza k automatickému odtoku živného roztoku z hornej nádoby do spodnej a tým k ešte väčšiemu okysličeniu koreňovej zóny. <br/>[[Súbor:Fnd.jpg]]<br/><br />
# NFT (Nutrient Film Technique) - Živný roztok je tu privádzaný do pestovateľskej nádoby, kde na povrchu vytvára tenkú, pomaly tečúcu vrstvu. Jednou z hlavných výhod NFT je dokonalé okysličovanie dané tým, že sa živný roztok rovnomerne rozprestrie po celej ploche pestovateľskej nádoby a k reakcii medzi živným roztokom a vzduchom dochádza na celej ploche. Čo sa týka okysličovania je NFT jednou z Top metód, ale má aj nevýhody čo sa týka nedostatočnej fyzickej opory rastlín.<br/>[[Súbor:Nft.png]]<br/><br />
# DWC (Deep Water Cultivation) - Ide o nádobu, obvykle 5-10 litrov objemnú ktorej na dno je položený okysličovací kameň (používaný v akváriach) spojený s malým vzduchovým čerpadlom. Nádoba je naplnená živným roztokom a na hladinu umiestnená doska, v ktorej sú otvory na kvetináče s rastinou. Tomuto typu systému skoro nieje čo vytknúť, okrem toho že keď sa pokazí vzduchové čerpadlo, rastliny uhynú za 24 až 30 hodín od vzniku poruchy. Živný roztok sa vymieňa za nový približne raz za 4 týždne.<br/>[[Súbor:DWC.jpg]]<br/><br />
# Aeropónia - Najdokonalejší spôsob ako dostať živiny priamo do rastlín. Živný roztok je pomocou ultrazvukovej membrány premenený na hmlu o veľkosti kvapiek menej ako 5 mikrónov, čo je veľkosť kedy živný roztok prechádza priamo do koreňov poprípade do listov.<br/>[[Súbor:Aero.jpg]]<br/><br />
<br />
Pre riešenie nášho projektu som vybral systém DWC z dôvodu jeho jednoduchosti.<br />
<br />
===Elektronika===<br />
<br />
Na to, aby som mal prehľad o tom, v akom stave je hydroponický systém, je potrebné ho osadiť rôznymi senzormi a mikrokontrolérom, ktorý vie získané údaje spracovať. Údaje, ktoré sú dôležité je teplota vody, teplota prostredia a vlhkosť prostredia. Výška hladiny vody nie je v tomto prípade dôležitá, preože živný roztok sa mení raz za 4 týždne, čo je krátka doba na to, aby sa výška hladiny významne znížila.<br />
<br />
Aby riešenie projektu bolo rýchle, lacné, jednoduché, zvolil som ako mikrokontrolér platformu '''Arduino UNO''' s 8-bitovým procesorom ATMega 328. Ako senzory som vybral senzor teploty a vlhkosti '''DHT22''' a senzor teploty '''MCP9700''' z dôvodu ich optimálneho pomeru cena/použiteľnosť. Získané dáta nám budú na nič, keď ich z Arduina nevieme prečítať. Na to slúži displej '''PCD8544'''.<br />
<br />
<br />
[[Súbor:Hydro-uno.jpg]] [[Súbor:Dht22.jpg]] [[Súbor:Mcp.jpg]] [[Súbor:Pcd.jpg]]<br />
<br />
== Popis riešenia ==<br />
<br />
===Systém na pestovanie===<br />
<br />
====Nádoba====<br />
<br />
Vybral som vhodnú nádobu na živný roztok. Vzhľadom na to, že nemala veko a mal som doma akrylovú dosku, rozhodol som sa, že veko spravím z nej. V programe AutoCAD som navrhol otvory pre kvetináče a hadicu vzduchového čerpadla. Následne som ich dal vyrezať na laserovom vyrezávači.<br />
<br />
Keďže korene potrebujú mať pre svoj zdravý rast tmu a nesmie sa k nim dostať svetlo, musel som zatemniť nádobu aj veko čiernou fóliou.<br />
<br />
[[Súbor:Veko.jpg]]<br />
<br />
Technický nákres: [http://senzor.robotika.sk/sensorwiki/images/b/b8/Holder.dwg Holder]<br />
<br />
====Kvetináče====<br />
<br />
Aby rastliny mohli rásť v živnom roztoku je potrebné, aby ich korene mohli prerásť cez kvetináč do roztoku. Keďže doma som mal nemal kvetináče určené na hydropóniu, ale mal som klasické, upravil som ich navŕtaním dier a vystrihnutím časti dna.<br />
<br />
Následne som do kvetináčov vložil rastliny a zasypal ich keramzitom, ktorý funguje ako ich opora.<br />
<br />
[[Súbor:Kv.jpg]] [[Súbor:Rastl.jpg]] [[Súbor:Both.jpg]]<br />
<br />
====Vzduchové čerpadlo====<br />
<br />
Keďže korene rastlín potrebujú nepretržitý prísun kyslíka, je potrebné vymyslieť systém, vďaka ktorému ho vo vode bude dostatok. Na to slúži vzduchové čerpadlo, ktorého hadica je ukončená vzduchovým kameňom, cez ktorý vháňa vzduch do živného roztoku.<br />
<br />
[[Súbor:Pumpa.jpg]]<br />
<br />
===Elektronika===<br />
<br />
====Zber a spracovanie dát====<br />
<br />
Vzhľadom na povahu výstupu (analógový/digitálny) som pripojil senzory a displej k Arduinu podľa schémy. Keďže senzorom MCP9700 meriame teplotu vody, je nutné zaizolovať samotný senzor aj kabeláž. To som dosiahol pomocou tavnej pištole.<br />
<br />
<br />
[[Súbor:Schema.png]]<br />
<br />
====Krabička na Arduino====<br />
<br />
Aby Arduino a displej boli na hydroponickom systéme niekde uložené, navrhol som krabičku v programe Siemens NX a dal ju vytlačiť na 3D tlačiarni. Krabička funguje ako ochranný obal na Arduino a zároveň ako držiak na displej.<br />
<br />
[[Súbor:Box-web.jpg]] [[Súbor:Top-web.jpg]]<br />
[[Súbor:Krabicka.jpg]] [[Súbor:Electro-web.jpg]]<br />
<br />
3D modely:<br />
* [http://senzor.robotika.sk/sensorwiki/images/a/ad/Arduino-box.stl Arduino-box]<br />
* [http://senzor.robotika.sk/sensorwiki/images/9/90/Arduino-box-top.stl Arduino-box-top]<br />
<br />
=== Algoritmus a program ===<br />
<br />
Algoritmus získava údaje zo senzorov a zobrazuje na displeji. Kód bol napísaný v jazyku C a skompilovaný v Arduino IDE 1.8.5.<br />
<br />
Získavanie dát zo senzorov a zapisovanie do premenných.<br />
<br />
<source lang="c"><br />
hum = dht.readHumidity(); // Read air humidity<br />
temp = dht.readTemperature(); // Read air temperature<br />
<br />
/* Read water temperature <br />
* we need to get the real value by mathematic operations based on datasheet */<br />
tempw = ((float)analogRead(MCPPIN) * 5 / 1024.0) - 0.5; <br />
tempw = tempw / 0.01; <br />
</source><br />
<br />
Vypísanie získanej hodnoty vzdušnej vlhkosti na displej. Rovnaký spôsob používame aj pri ostatných údajov s tým, že vypisujeme hodnotu príslušnej premennej.<br />
<br />
<source lang="c"><br />
//Set cursor position on display and print on display<br />
lcd.setCursor(0, 0); <br />
lcd.print("Hum: ");<br />
lcd.print(hum);<br />
lcd.print("%"); <br />
</source><br />
<br />
Link na github https://github.com/salopadlon/Hydroponics<br><br />
Zdrojový kód: [http://senzor.robotika.sk/sensorwiki/images/5/59/Hydroponics.ino Main]<br><br />
Knižnice: [http://senzor.robotika.sk/sensorwiki/images/b/be/Pcd8544.zip PCD8544], [http://senzor.robotika.sk/sensorwiki/images/a/ac/DHT-sensor-library-master.zip DHT]<br />
<br />
=== Výsledok ===<br />
<br />
Počas inštalácie elektroniky som zistil, že prepojovacie kábliky majú príliš vysoké piny na to, aby sa dala krabička zavrieť vrchnou časťou. Bohužiaľ, už som nemal čas dať tlačiť novú krabičku.<br />
<br />
Čo sa ale týka funkčnosti, všetko funguje tak ako má a s výsledkom som vcelku spokojný.<br />
<br />
Do budúcnosti plánujem dáta ukladať do databázy a zobrazovať ich na web stránke alebo na smartphone aplikácii.<br />
<br />
[[Súbor:Hydroponics-web.jpg]] [[Súbor:Data-web.jpg]] [[Súbor:Roots-web.jpg]] <br />
<br />
<br />
<br />
Späť na [[Projekty študentov DTV-2018|zoznam projektov]].<br />
[[Category:DTV2018]]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:DHT-sensor-library-master.zip&diff=9474Súbor:DHT-sensor-library-master.zip2018-05-30T10:30:48Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Pcd8544.zip&diff=9473Súbor:Pcd8544.zip2018-05-30T10:28:33Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Pestovanie_4.0.&diff=9472Pestovanie 4.0.2018-05-30T10:26:41Z<p>DVPS: /* Krabička na Arduino */</p>
<hr />
<div>{|<br />
|Autor: || '''Pavel Sadloň''' <br />
|-<br />
|Študijný odbor: || Robotika a kybernetika || 1. Bc. ('''2018''') <br />
|}<br />
<br />
== Obsah ==<br />
<br />
__TOC__<br />
<br />
== Opis projektu ==<br />
<br />
V dnešnej dobe je trh preplnený zeleninou a ovocím, ktoré sa k nám dovážajú z rôznych štátov Európy, či sveta a s pochybnou kvalitou. Často sú prepravované ešte nedozreté, aby cestou nezhnili, čo sa odráža napríklad na ich zníženom obsahu výživných látok. Mnoho ľudí preto hľadá alternatívu v pestovaní vlastných plodín, no nie každý má však k dispozícii pôdu, na ktorej by mohol pestovať.<br />
<br />
Riešením tohto problému je tzv. hydroponické pestovanie, ktoré nevyžaduje pôdu, iba živný roztok a stály prísun kyslíka. Okrem toho, že takýto spôsob pestovania ušetrí priestor, čas, peniaze, či vodu, rastliny rastú rýchlejšie, čím sa na ne v prípade postreku spotrebuje menšie množstvo pesticídov. Navyše je úplne eliminovaná prítomnosť nežiadúcich druhov rastlín - "buriny" a nájdu sa aj tí, čo ocenia, že sa nemusia "hrabať v zemi".<br />
<br />
Keďže sme doslova obklopení elektronikou, bola by škoda nevyužiť ju v náš prospech aj pri tomto projekte. K samotnému systému vieme pripojiť akékoľvek vhodné senzory, zozbierať z nich dáta a následne ich vyhodnotiť podľa individuálnych požiadaviek.<br />
<br />
Potrebný materiál:<br />
* Pestovanie:<br />
** Nádoba na živný roztok<br />
** 3x Kvetináč<br />
** Veko na prikrytie nádoby, zároveň funguje ako držiak kvetináčov<br />
** Rastliny, v našom prípade chilli papričky<br />
** Oporný materiál pre rastliny - keramzit (ílové granule)<br />
** Vzduchové čerpadlo<br />
* Elektronika:<br />
** Arduino UNO<br />
** Senzory DHT22 a MCP9700<br />
** Displej PCD8544<br />
** Prepojovacie kábliky<br />
** Krabička na Arduino<br />
** 4x Dištančný stĺpik M3x3<br />
** 4x Skrutka M3x5<br />
** 9V baterka a zdrojový káblik<br />
<br />
<br />
'''Použité zdroje:''' <br />
<br />
* https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf<br />
* https://www.mouser.com/ds/2/268/20001942F-461622.pdf<br />
* https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf<br />
<br />
== Analýza ==<br />
<br />
===Výber hydroponického systému===<br />
<br />
Pod pojmom hydroponické pestovanie sa ukrýva viacero typov tohto spôsobu pestovania. Každý z nich je v niečom odlišný a každý má svoje pre a proti. <br />
<br />
Rozdelenie hydroponických systémov:<br />
# Flood and Drain - Substrát je zaplavovaný živným roztokom, ktorý je následne odvádzaný preč. V podstate ide o dve nádoby umiestnené nad sebou, spojené hadicou cez ktorú je prečerpávaný živný roztok z jednej nádoby do druhej, pričom dochádza k okysličovaniu, prečisteniu koreňovej sústavy a odstráneniu nahromadených plynov. V momente keď sa čerpadlo vypne dochádza k automatickému odtoku živného roztoku z hornej nádoby do spodnej a tým k ešte väčšiemu okysličeniu koreňovej zóny. <br/>[[Súbor:Fnd.jpg]]<br/><br />
# NFT (Nutrient Film Technique) - Živný roztok je tu privádzaný do pestovateľskej nádoby, kde na povrchu vytvára tenkú, pomaly tečúcu vrstvu. Jednou z hlavných výhod NFT je dokonalé okysličovanie dané tým, že sa živný roztok rovnomerne rozprestrie po celej ploche pestovateľskej nádoby a k reakcii medzi živným roztokom a vzduchom dochádza na celej ploche. Čo sa týka okysličovania je NFT jednou z Top metód, ale má aj nevýhody čo sa týka nedostatočnej fyzickej opory rastlín.<br/>[[Súbor:Nft.png]]<br/><br />
# DWC (Deep Water Cultivation) - Ide o nádobu, obvykle 5-10 litrov objemnú ktorej na dno je položený okysličovací kameň (používaný v akváriach) spojený s malým vzduchovým čerpadlom. Nádoba je naplnená živným roztokom a na hladinu umiestnená doska, v ktorej sú otvory na kvetináče s rastinou. Tomuto typu systému skoro nieje čo vytknúť, okrem toho že keď sa pokazí vzduchové čerpadlo, rastliny uhynú za 24 až 30 hodín od vzniku poruchy. Živný roztok sa vymieňa za nový približne raz za 4 týždne.<br/>[[Súbor:DWC.jpg]]<br/><br />
# Aeropónia - Najdokonalejší spôsob ako dostať živiny priamo do rastlín. Živný roztok je pomocou ultrazvukovej membrány premenený na hmlu o veľkosti kvapiek menej ako 5 mikrónov, čo je veľkosť kedy živný roztok prechádza priamo do koreňov poprípade do listov.<br/>[[Súbor:Aero.jpg]]<br/><br />
<br />
Pre riešenie nášho projektu som vybral systém DWC z dôvodu jeho jednoduchosti.<br />
<br />
===Elektronika===<br />
<br />
Na to, aby som mal prehľad o tom, v akom stave je hydroponický systém, je potrebné ho osadiť rôznymi senzormi a mikrokontrolérom, ktorý vie získané údaje spracovať. Údaje, ktoré sú dôležité je teplota vody, teplota prostredia a vlhkosť prostredia. Výška hladiny vody nie je v tomto prípade dôležitá, preože živný roztok sa mení raz za 4 týždne, čo je krátka doba na to, aby sa výška hladiny významne znížila.<br />
<br />
Aby riešenie projektu bolo rýchle, lacné, jednoduché, zvolil som ako mikrokontrolér platformu '''Arduino UNO''' s 8-bitovým procesorom ATMega 328. Ako senzory som vybral senzor teploty a vlhkosti '''DHT22''' a senzor teploty '''MCP9700''' z dôvodu ich optimálneho pomeru cena/použiteľnosť. Získané dáta nám budú na nič, keď ich z Arduina nevieme prečítať. Na to slúži displej '''PCD8544'''.<br />
<br />
<br />
[[Súbor:Hydro-uno.jpg]] [[Súbor:Dht22.jpg]] [[Súbor:Mcp.jpg]] [[Súbor:Pcd.jpg]]<br />
<br />
== Popis riešenia ==<br />
<br />
===Systém na pestovanie===<br />
<br />
====Nádoba====<br />
<br />
Vybral som vhodnú nádobu na živný roztok. Vzhľadom na to, že nemala veko a mal som doma akrylovú dosku, rozhodol som sa, že veko spravím z nej. V programe AutoCAD som navrhol otvory pre kvetináče a hadicu vzduchového čerpadla. Následne som ich dal vyrezať na laserovom vyrezávači.<br />
<br />
Keďže korene potrebujú mať pre svoj zdravý rast tmu a nesmie sa k nim dostať svetlo, musel som zatemniť nádobu aj veko čiernou fóliou.<br />
<br />
[[Súbor:Veko.jpg]]<br />
<br />
Technický nákres: [http://senzor.robotika.sk/sensorwiki/images/b/b8/Holder.dwg Holder]<br />
<br />
====Kvetináče====<br />
<br />
Aby rastliny mohli rásť v živnom roztoku je potrebné, aby ich korene mohli prerásť cez kvetináč do roztoku. Keďže doma som mal nemal kvetináče určené na hydropóniu, ale mal som klasické, upravil som ich navŕtaním dier a vystrihnutím časti dna.<br />
<br />
Následne som do kvetináčov vložil rastliny a zasypal ich keramzitom, ktorý funguje ako ich opora.<br />
<br />
[[Súbor:Kv.jpg]] [[Súbor:Rastl.jpg]] [[Súbor:Both.jpg]]<br />
<br />
====Vzduchové čerpadlo====<br />
<br />
Keďže korene rastlín potrebujú nepretržitý prísun kyslíka, je potrebné vymyslieť systém, vďaka ktorému ho vo vode bude dostatok. Na to slúži vzduchové čerpadlo, ktorého hadica je ukončená vzduchovým kameňom, cez ktorý vháňa vzduch do živného roztoku.<br />
<br />
[[Súbor:Pumpa.jpg]]<br />
<br />
===Elektronika===<br />
<br />
====Zber a spracovanie dát====<br />
<br />
Vzhľadom na povahu výstupu (analógový/digitálny) som pripojil senzory a displej k Arduinu podľa schémy. Keďže senzorom MCP9700 meriame teplotu vody, je nutné zaizolovať samotný senzor aj kabeláž. To som dosiahol pomocou tavnej pištole.<br />
<br />
<br />
[[Súbor:Schema.png]]<br />
<br />
====Krabička na Arduino====<br />
<br />
Aby Arduino a displej boli na hydroponickom systéme niekde uložené, navrhol som krabičku v programe Siemens NX a dal ju vytlačiť na 3D tlačiarni. Krabička funguje ako ochranný obal na Arduino a zároveň ako držiak na displej.<br />
<br />
[[Súbor:Box-web.jpg]] [[Súbor:Top-web.jpg]]<br />
[[Súbor:Krabicka.jpg]] [[Súbor:Electro-web.jpg]]<br />
<br />
3D modely:<br />
* [http://senzor.robotika.sk/sensorwiki/images/a/ad/Arduino-box.stl Arduino-box]<br />
* [http://senzor.robotika.sk/sensorwiki/images/9/90/Arduino-box-top.stl Arduino-box-top]<br />
<br />
=== Algoritmus a program ===<br />
<br />
Algoritmus získava údaje zo senzorov a zobrazuje na displeji. Kód bol napísaný v jazyku C a skompilovaný v Arduino IDE 1.8.5.<br />
<br />
Získavanie dát zo senzorov a zapisovanie do premenných.<br />
<br />
<source lang="c"><br />
hum = dht.readHumidity(); // Read air humidity<br />
temp = dht.readTemperature(); // Read air temperature<br />
<br />
/* Read water temperature <br />
* we need to get the real value by mathematic operations based on datasheet */<br />
tempw = ((float)analogRead(MCPPIN) * 5 / 1024.0) - 0.5; <br />
tempw = tempw / 0.01; <br />
</source><br />
<br />
Vypísanie získanej hodnoty vzdušnej vlhkosti na displej. Rovnaký spôsob používame aj pri ostatných údajov s tým, že vypisujeme hodnotu príslušnej premennej.<br />
<br />
<source lang="c"><br />
//Set cursor position on display and print on display<br />
lcd.setCursor(0, 0); <br />
lcd.print("Hum: ");<br />
lcd.print(hum);<br />
lcd.print("%"); <br />
</source><br />
<br />
Link na github https://github.com/salopadlon/Hydroponics<br />
<br />
=== Výsledok ===<br />
<br />
Počas inštalácie elektroniky som zistil, že prepojovacie kábliky majú príliš vysoké piny na to, aby sa dala krabička zavrieť vrchnou časťou. Bohužiaľ, už som nemal čas dať tlačiť novú krabičku.<br />
<br />
Čo sa ale týka funkčnosti, všetko funguje tak ako má a s výsledkom som vcelku spokojný.<br />
<br />
Do budúcnosti plánujem dáta ukladať do databázy a zobrazovať ich na web stránke alebo na smartphone aplikácii.<br />
<br />
[[Súbor:Hydroponics-web.jpg]] [[Súbor:Data-web.jpg]] [[Súbor:Roots-web.jpg]] <br />
<br />
<br />
<br />
Späť na [[Projekty študentov DTV-2018|zoznam projektov]].<br />
[[Category:DTV2018]]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Pestovanie_4.0.&diff=9471Pestovanie 4.0.2018-05-30T10:25:21Z<p>DVPS: /* Nádoba */</p>
<hr />
<div>{|<br />
|Autor: || '''Pavel Sadloň''' <br />
|-<br />
|Študijný odbor: || Robotika a kybernetika || 1. Bc. ('''2018''') <br />
|}<br />
<br />
== Obsah ==<br />
<br />
__TOC__<br />
<br />
== Opis projektu ==<br />
<br />
V dnešnej dobe je trh preplnený zeleninou a ovocím, ktoré sa k nám dovážajú z rôznych štátov Európy, či sveta a s pochybnou kvalitou. Často sú prepravované ešte nedozreté, aby cestou nezhnili, čo sa odráža napríklad na ich zníženom obsahu výživných látok. Mnoho ľudí preto hľadá alternatívu v pestovaní vlastných plodín, no nie každý má však k dispozícii pôdu, na ktorej by mohol pestovať.<br />
<br />
Riešením tohto problému je tzv. hydroponické pestovanie, ktoré nevyžaduje pôdu, iba živný roztok a stály prísun kyslíka. Okrem toho, že takýto spôsob pestovania ušetrí priestor, čas, peniaze, či vodu, rastliny rastú rýchlejšie, čím sa na ne v prípade postreku spotrebuje menšie množstvo pesticídov. Navyše je úplne eliminovaná prítomnosť nežiadúcich druhov rastlín - "buriny" a nájdu sa aj tí, čo ocenia, že sa nemusia "hrabať v zemi".<br />
<br />
Keďže sme doslova obklopení elektronikou, bola by škoda nevyužiť ju v náš prospech aj pri tomto projekte. K samotnému systému vieme pripojiť akékoľvek vhodné senzory, zozbierať z nich dáta a následne ich vyhodnotiť podľa individuálnych požiadaviek.<br />
<br />
Potrebný materiál:<br />
* Pestovanie:<br />
** Nádoba na živný roztok<br />
** 3x Kvetináč<br />
** Veko na prikrytie nádoby, zároveň funguje ako držiak kvetináčov<br />
** Rastliny, v našom prípade chilli papričky<br />
** Oporný materiál pre rastliny - keramzit (ílové granule)<br />
** Vzduchové čerpadlo<br />
* Elektronika:<br />
** Arduino UNO<br />
** Senzory DHT22 a MCP9700<br />
** Displej PCD8544<br />
** Prepojovacie kábliky<br />
** Krabička na Arduino<br />
** 4x Dištančný stĺpik M3x3<br />
** 4x Skrutka M3x5<br />
** 9V baterka a zdrojový káblik<br />
<br />
<br />
'''Použité zdroje:''' <br />
<br />
* https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf<br />
* https://www.mouser.com/ds/2/268/20001942F-461622.pdf<br />
* https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf<br />
<br />
== Analýza ==<br />
<br />
===Výber hydroponického systému===<br />
<br />
Pod pojmom hydroponické pestovanie sa ukrýva viacero typov tohto spôsobu pestovania. Každý z nich je v niečom odlišný a každý má svoje pre a proti. <br />
<br />
Rozdelenie hydroponických systémov:<br />
# Flood and Drain - Substrát je zaplavovaný živným roztokom, ktorý je následne odvádzaný preč. V podstate ide o dve nádoby umiestnené nad sebou, spojené hadicou cez ktorú je prečerpávaný živný roztok z jednej nádoby do druhej, pričom dochádza k okysličovaniu, prečisteniu koreňovej sústavy a odstráneniu nahromadených plynov. V momente keď sa čerpadlo vypne dochádza k automatickému odtoku živného roztoku z hornej nádoby do spodnej a tým k ešte väčšiemu okysličeniu koreňovej zóny. <br/>[[Súbor:Fnd.jpg]]<br/><br />
# NFT (Nutrient Film Technique) - Živný roztok je tu privádzaný do pestovateľskej nádoby, kde na povrchu vytvára tenkú, pomaly tečúcu vrstvu. Jednou z hlavných výhod NFT je dokonalé okysličovanie dané tým, že sa živný roztok rovnomerne rozprestrie po celej ploche pestovateľskej nádoby a k reakcii medzi živným roztokom a vzduchom dochádza na celej ploche. Čo sa týka okysličovania je NFT jednou z Top metód, ale má aj nevýhody čo sa týka nedostatočnej fyzickej opory rastlín.<br/>[[Súbor:Nft.png]]<br/><br />
# DWC (Deep Water Cultivation) - Ide o nádobu, obvykle 5-10 litrov objemnú ktorej na dno je položený okysličovací kameň (používaný v akváriach) spojený s malým vzduchovým čerpadlom. Nádoba je naplnená živným roztokom a na hladinu umiestnená doska, v ktorej sú otvory na kvetináče s rastinou. Tomuto typu systému skoro nieje čo vytknúť, okrem toho že keď sa pokazí vzduchové čerpadlo, rastliny uhynú za 24 až 30 hodín od vzniku poruchy. Živný roztok sa vymieňa za nový približne raz za 4 týždne.<br/>[[Súbor:DWC.jpg]]<br/><br />
# Aeropónia - Najdokonalejší spôsob ako dostať živiny priamo do rastlín. Živný roztok je pomocou ultrazvukovej membrány premenený na hmlu o veľkosti kvapiek menej ako 5 mikrónov, čo je veľkosť kedy živný roztok prechádza priamo do koreňov poprípade do listov.<br/>[[Súbor:Aero.jpg]]<br/><br />
<br />
Pre riešenie nášho projektu som vybral systém DWC z dôvodu jeho jednoduchosti.<br />
<br />
===Elektronika===<br />
<br />
Na to, aby som mal prehľad o tom, v akom stave je hydroponický systém, je potrebné ho osadiť rôznymi senzormi a mikrokontrolérom, ktorý vie získané údaje spracovať. Údaje, ktoré sú dôležité je teplota vody, teplota prostredia a vlhkosť prostredia. Výška hladiny vody nie je v tomto prípade dôležitá, preože živný roztok sa mení raz za 4 týždne, čo je krátka doba na to, aby sa výška hladiny významne znížila.<br />
<br />
Aby riešenie projektu bolo rýchle, lacné, jednoduché, zvolil som ako mikrokontrolér platformu '''Arduino UNO''' s 8-bitovým procesorom ATMega 328. Ako senzory som vybral senzor teploty a vlhkosti '''DHT22''' a senzor teploty '''MCP9700''' z dôvodu ich optimálneho pomeru cena/použiteľnosť. Získané dáta nám budú na nič, keď ich z Arduina nevieme prečítať. Na to slúži displej '''PCD8544'''.<br />
<br />
<br />
[[Súbor:Hydro-uno.jpg]] [[Súbor:Dht22.jpg]] [[Súbor:Mcp.jpg]] [[Súbor:Pcd.jpg]]<br />
<br />
== Popis riešenia ==<br />
<br />
===Systém na pestovanie===<br />
<br />
====Nádoba====<br />
<br />
Vybral som vhodnú nádobu na živný roztok. Vzhľadom na to, že nemala veko a mal som doma akrylovú dosku, rozhodol som sa, že veko spravím z nej. V programe AutoCAD som navrhol otvory pre kvetináče a hadicu vzduchového čerpadla. Následne som ich dal vyrezať na laserovom vyrezávači.<br />
<br />
Keďže korene potrebujú mať pre svoj zdravý rast tmu a nesmie sa k nim dostať svetlo, musel som zatemniť nádobu aj veko čiernou fóliou.<br />
<br />
[[Súbor:Veko.jpg]]<br />
<br />
Technický nákres: [http://senzor.robotika.sk/sensorwiki/images/b/b8/Holder.dwg Holder]<br />
<br />
====Kvetináče====<br />
<br />
Aby rastliny mohli rásť v živnom roztoku je potrebné, aby ich korene mohli prerásť cez kvetináč do roztoku. Keďže doma som mal nemal kvetináče určené na hydropóniu, ale mal som klasické, upravil som ich navŕtaním dier a vystrihnutím časti dna.<br />
<br />
Následne som do kvetináčov vložil rastliny a zasypal ich keramzitom, ktorý funguje ako ich opora.<br />
<br />
[[Súbor:Kv.jpg]] [[Súbor:Rastl.jpg]] [[Súbor:Both.jpg]]<br />
<br />
====Vzduchové čerpadlo====<br />
<br />
Keďže korene rastlín potrebujú nepretržitý prísun kyslíka, je potrebné vymyslieť systém, vďaka ktorému ho vo vode bude dostatok. Na to slúži vzduchové čerpadlo, ktorého hadica je ukončená vzduchovým kameňom, cez ktorý vháňa vzduch do živného roztoku.<br />
<br />
[[Súbor:Pumpa.jpg]]<br />
<br />
===Elektronika===<br />
<br />
====Zber a spracovanie dát====<br />
<br />
Vzhľadom na povahu výstupu (analógový/digitálny) som pripojil senzory a displej k Arduinu podľa schémy. Keďže senzorom MCP9700 meriame teplotu vody, je nutné zaizolovať samotný senzor aj kabeláž. To som dosiahol pomocou tavnej pištole.<br />
<br />
<br />
[[Súbor:Schema.png]]<br />
<br />
====Krabička na Arduino====<br />
<br />
Aby Arduino a displej boli na hydroponickom systéme niekde uložené, navrhol som krabičku v programe Siemens NX a dal ju vytlačiť na 3D tlačiarni. Krabička funguje ako ochranný obal na Arduino a zároveň ako držiak na displej.<br />
<br />
[[Súbor:Box-web.jpg]] [[Súbor:Top-web.jpg]]<br />
[[Súbor:Krabicka.jpg]] [[Súbor:Electro-web.jpg]]<br />
<br />
=== Algoritmus a program ===<br />
<br />
Algoritmus získava údaje zo senzorov a zobrazuje na displeji. Kód bol napísaný v jazyku C a skompilovaný v Arduino IDE 1.8.5.<br />
<br />
Získavanie dát zo senzorov a zapisovanie do premenných.<br />
<br />
<source lang="c"><br />
hum = dht.readHumidity(); // Read air humidity<br />
temp = dht.readTemperature(); // Read air temperature<br />
<br />
/* Read water temperature <br />
* we need to get the real value by mathematic operations based on datasheet */<br />
tempw = ((float)analogRead(MCPPIN) * 5 / 1024.0) - 0.5; <br />
tempw = tempw / 0.01; <br />
</source><br />
<br />
Vypísanie získanej hodnoty vzdušnej vlhkosti na displej. Rovnaký spôsob používame aj pri ostatných údajov s tým, že vypisujeme hodnotu príslušnej premennej.<br />
<br />
<source lang="c"><br />
//Set cursor position on display and print on display<br />
lcd.setCursor(0, 0); <br />
lcd.print("Hum: ");<br />
lcd.print(hum);<br />
lcd.print("%"); <br />
</source><br />
<br />
Link na github https://github.com/salopadlon/Hydroponics<br />
<br />
=== Výsledok ===<br />
<br />
Počas inštalácie elektroniky som zistil, že prepojovacie kábliky majú príliš vysoké piny na to, aby sa dala krabička zavrieť vrchnou časťou. Bohužiaľ, už som nemal čas dať tlačiť novú krabičku.<br />
<br />
Čo sa ale týka funkčnosti, všetko funguje tak ako má a s výsledkom som vcelku spokojný.<br />
<br />
Do budúcnosti plánujem dáta ukladať do databázy a zobrazovať ich na web stránke alebo na smartphone aplikácii.<br />
<br />
[[Súbor:Hydroponics-web.jpg]] [[Súbor:Data-web.jpg]] [[Súbor:Roots-web.jpg]] <br />
<br />
<br />
<br />
Späť na [[Projekty študentov DTV-2018|zoznam projektov]].<br />
[[Category:DTV2018]]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Pestovanie_4.0.&diff=9470Pestovanie 4.0.2018-05-30T10:21:31Z<p>DVPS: /* Nádoba */</p>
<hr />
<div>{|<br />
|Autor: || '''Pavel Sadloň''' <br />
|-<br />
|Študijný odbor: || Robotika a kybernetika || 1. Bc. ('''2018''') <br />
|}<br />
<br />
== Obsah ==<br />
<br />
__TOC__<br />
<br />
== Opis projektu ==<br />
<br />
V dnešnej dobe je trh preplnený zeleninou a ovocím, ktoré sa k nám dovážajú z rôznych štátov Európy, či sveta a s pochybnou kvalitou. Často sú prepravované ešte nedozreté, aby cestou nezhnili, čo sa odráža napríklad na ich zníženom obsahu výživných látok. Mnoho ľudí preto hľadá alternatívu v pestovaní vlastných plodín, no nie každý má však k dispozícii pôdu, na ktorej by mohol pestovať.<br />
<br />
Riešením tohto problému je tzv. hydroponické pestovanie, ktoré nevyžaduje pôdu, iba živný roztok a stály prísun kyslíka. Okrem toho, že takýto spôsob pestovania ušetrí priestor, čas, peniaze, či vodu, rastliny rastú rýchlejšie, čím sa na ne v prípade postreku spotrebuje menšie množstvo pesticídov. Navyše je úplne eliminovaná prítomnosť nežiadúcich druhov rastlín - "buriny" a nájdu sa aj tí, čo ocenia, že sa nemusia "hrabať v zemi".<br />
<br />
Keďže sme doslova obklopení elektronikou, bola by škoda nevyužiť ju v náš prospech aj pri tomto projekte. K samotnému systému vieme pripojiť akékoľvek vhodné senzory, zozbierať z nich dáta a následne ich vyhodnotiť podľa individuálnych požiadaviek.<br />
<br />
Potrebný materiál:<br />
* Pestovanie:<br />
** Nádoba na živný roztok<br />
** 3x Kvetináč<br />
** Veko na prikrytie nádoby, zároveň funguje ako držiak kvetináčov<br />
** Rastliny, v našom prípade chilli papričky<br />
** Oporný materiál pre rastliny - keramzit (ílové granule)<br />
** Vzduchové čerpadlo<br />
* Elektronika:<br />
** Arduino UNO<br />
** Senzory DHT22 a MCP9700<br />
** Displej PCD8544<br />
** Prepojovacie kábliky<br />
** Krabička na Arduino<br />
** 4x Dištančný stĺpik M3x3<br />
** 4x Skrutka M3x5<br />
** 9V baterka a zdrojový káblik<br />
<br />
<br />
'''Použité zdroje:''' <br />
<br />
* https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf<br />
* https://www.mouser.com/ds/2/268/20001942F-461622.pdf<br />
* https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf<br />
<br />
== Analýza ==<br />
<br />
===Výber hydroponického systému===<br />
<br />
Pod pojmom hydroponické pestovanie sa ukrýva viacero typov tohto spôsobu pestovania. Každý z nich je v niečom odlišný a každý má svoje pre a proti. <br />
<br />
Rozdelenie hydroponických systémov:<br />
# Flood and Drain - Substrát je zaplavovaný živným roztokom, ktorý je následne odvádzaný preč. V podstate ide o dve nádoby umiestnené nad sebou, spojené hadicou cez ktorú je prečerpávaný živný roztok z jednej nádoby do druhej, pričom dochádza k okysličovaniu, prečisteniu koreňovej sústavy a odstráneniu nahromadených plynov. V momente keď sa čerpadlo vypne dochádza k automatickému odtoku živného roztoku z hornej nádoby do spodnej a tým k ešte väčšiemu okysličeniu koreňovej zóny. <br/>[[Súbor:Fnd.jpg]]<br/><br />
# NFT (Nutrient Film Technique) - Živný roztok je tu privádzaný do pestovateľskej nádoby, kde na povrchu vytvára tenkú, pomaly tečúcu vrstvu. Jednou z hlavných výhod NFT je dokonalé okysličovanie dané tým, že sa živný roztok rovnomerne rozprestrie po celej ploche pestovateľskej nádoby a k reakcii medzi živným roztokom a vzduchom dochádza na celej ploche. Čo sa týka okysličovania je NFT jednou z Top metód, ale má aj nevýhody čo sa týka nedostatočnej fyzickej opory rastlín.<br/>[[Súbor:Nft.png]]<br/><br />
# DWC (Deep Water Cultivation) - Ide o nádobu, obvykle 5-10 litrov objemnú ktorej na dno je položený okysličovací kameň (používaný v akváriach) spojený s malým vzduchovým čerpadlom. Nádoba je naplnená živným roztokom a na hladinu umiestnená doska, v ktorej sú otvory na kvetináče s rastinou. Tomuto typu systému skoro nieje čo vytknúť, okrem toho že keď sa pokazí vzduchové čerpadlo, rastliny uhynú za 24 až 30 hodín od vzniku poruchy. Živný roztok sa vymieňa za nový približne raz za 4 týždne.<br/>[[Súbor:DWC.jpg]]<br/><br />
# Aeropónia - Najdokonalejší spôsob ako dostať živiny priamo do rastlín. Živný roztok je pomocou ultrazvukovej membrány premenený na hmlu o veľkosti kvapiek menej ako 5 mikrónov, čo je veľkosť kedy živný roztok prechádza priamo do koreňov poprípade do listov.<br/>[[Súbor:Aero.jpg]]<br/><br />
<br />
Pre riešenie nášho projektu som vybral systém DWC z dôvodu jeho jednoduchosti.<br />
<br />
===Elektronika===<br />
<br />
Na to, aby som mal prehľad o tom, v akom stave je hydroponický systém, je potrebné ho osadiť rôznymi senzormi a mikrokontrolérom, ktorý vie získané údaje spracovať. Údaje, ktoré sú dôležité je teplota vody, teplota prostredia a vlhkosť prostredia. Výška hladiny vody nie je v tomto prípade dôležitá, preože živný roztok sa mení raz za 4 týždne, čo je krátka doba na to, aby sa výška hladiny významne znížila.<br />
<br />
Aby riešenie projektu bolo rýchle, lacné, jednoduché, zvolil som ako mikrokontrolér platformu '''Arduino UNO''' s 8-bitovým procesorom ATMega 328. Ako senzory som vybral senzor teploty a vlhkosti '''DHT22''' a senzor teploty '''MCP9700''' z dôvodu ich optimálneho pomeru cena/použiteľnosť. Získané dáta nám budú na nič, keď ich z Arduina nevieme prečítať. Na to slúži displej '''PCD8544'''.<br />
<br />
<br />
[[Súbor:Hydro-uno.jpg]] [[Súbor:Dht22.jpg]] [[Súbor:Mcp.jpg]] [[Súbor:Pcd.jpg]]<br />
<br />
== Popis riešenia ==<br />
<br />
===Systém na pestovanie===<br />
<br />
====Nádoba====<br />
<br />
Vybral som vhodnú nádobu na živný roztok. Vzhľadom na to, že nemala veko a mal som doma akrylovú dosku, rozhodol som sa, že veko spravím z nej. V programe AutoCAD som navrhol otvory pre kvetináče a hadicu vzduchového čerpadla. Následne som ich dal vyrezať na laserovom vyrezávači.<br />
<br />
Keďže korene potrebujú mať pre svoj zdravý rast tmu a nesmie sa k nim dostať svetlo, musel som zatemniť nádobu aj veko čiernou fóliou.<br />
<br />
[[Súbor:Veko.jpg]]<br />
<br />
Technický nákres: [[Médiá:Holder.dwg]]<br />
<br />
====Kvetináče====<br />
<br />
Aby rastliny mohli rásť v živnom roztoku je potrebné, aby ich korene mohli prerásť cez kvetináč do roztoku. Keďže doma som mal nemal kvetináče určené na hydropóniu, ale mal som klasické, upravil som ich navŕtaním dier a vystrihnutím časti dna.<br />
<br />
Následne som do kvetináčov vložil rastliny a zasypal ich keramzitom, ktorý funguje ako ich opora.<br />
<br />
[[Súbor:Kv.jpg]] [[Súbor:Rastl.jpg]] [[Súbor:Both.jpg]]<br />
<br />
====Vzduchové čerpadlo====<br />
<br />
Keďže korene rastlín potrebujú nepretržitý prísun kyslíka, je potrebné vymyslieť systém, vďaka ktorému ho vo vode bude dostatok. Na to slúži vzduchové čerpadlo, ktorého hadica je ukončená vzduchovým kameňom, cez ktorý vháňa vzduch do živného roztoku.<br />
<br />
[[Súbor:Pumpa.jpg]]<br />
<br />
===Elektronika===<br />
<br />
====Zber a spracovanie dát====<br />
<br />
Vzhľadom na povahu výstupu (analógový/digitálny) som pripojil senzory a displej k Arduinu podľa schémy. Keďže senzorom MCP9700 meriame teplotu vody, je nutné zaizolovať samotný senzor aj kabeláž. To som dosiahol pomocou tavnej pištole.<br />
<br />
<br />
[[Súbor:Schema.png]]<br />
<br />
====Krabička na Arduino====<br />
<br />
Aby Arduino a displej boli na hydroponickom systéme niekde uložené, navrhol som krabičku v programe Siemens NX a dal ju vytlačiť na 3D tlačiarni. Krabička funguje ako ochranný obal na Arduino a zároveň ako držiak na displej.<br />
<br />
[[Súbor:Box-web.jpg]] [[Súbor:Top-web.jpg]]<br />
[[Súbor:Krabicka.jpg]] [[Súbor:Electro-web.jpg]]<br />
<br />
=== Algoritmus a program ===<br />
<br />
Algoritmus získava údaje zo senzorov a zobrazuje na displeji. Kód bol napísaný v jazyku C a skompilovaný v Arduino IDE 1.8.5.<br />
<br />
Získavanie dát zo senzorov a zapisovanie do premenných.<br />
<br />
<source lang="c"><br />
hum = dht.readHumidity(); // Read air humidity<br />
temp = dht.readTemperature(); // Read air temperature<br />
<br />
/* Read water temperature <br />
* we need to get the real value by mathematic operations based on datasheet */<br />
tempw = ((float)analogRead(MCPPIN) * 5 / 1024.0) - 0.5; <br />
tempw = tempw / 0.01; <br />
</source><br />
<br />
Vypísanie získanej hodnoty vzdušnej vlhkosti na displej. Rovnaký spôsob používame aj pri ostatných údajov s tým, že vypisujeme hodnotu príslušnej premennej.<br />
<br />
<source lang="c"><br />
//Set cursor position on display and print on display<br />
lcd.setCursor(0, 0); <br />
lcd.print("Hum: ");<br />
lcd.print(hum);<br />
lcd.print("%"); <br />
</source><br />
<br />
Link na github https://github.com/salopadlon/Hydroponics<br />
<br />
=== Výsledok ===<br />
<br />
Počas inštalácie elektroniky som zistil, že prepojovacie kábliky majú príliš vysoké piny na to, aby sa dala krabička zavrieť vrchnou časťou. Bohužiaľ, už som nemal čas dať tlačiť novú krabičku.<br />
<br />
Čo sa ale týka funkčnosti, všetko funguje tak ako má a s výsledkom som vcelku spokojný.<br />
<br />
Do budúcnosti plánujem dáta ukladať do databázy a zobrazovať ich na web stránke alebo na smartphone aplikácii.<br />
<br />
[[Súbor:Hydroponics-web.jpg]] [[Súbor:Data-web.jpg]] [[Súbor:Roots-web.jpg]] <br />
<br />
<br />
<br />
Späť na [[Projekty študentov DTV-2018|zoznam projektov]].<br />
[[Category:DTV2018]]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Holder.dwg&diff=9469Súbor:Holder.dwg2018-05-30T10:19:40Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Hydroponics.ino&diff=9468Súbor:Hydroponics.ino2018-05-30T10:17:16Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Arduino-box-top.stl&diff=9467Súbor:Arduino-box-top.stl2018-05-30T10:16:56Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Arduino-box.stl&diff=9466Súbor:Arduino-box.stl2018-05-30T10:16:38Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Arduino-box.prt&diff=9465Súbor:Arduino-box.prt2018-05-30T10:13:36Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9452Meteostanica s Nucleo Board2018-05-29T22:06:48Z<p>DVPS: </p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// Prints output data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
Zdrojový kód aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchým spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
<br />
Čiže budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme na dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9451Meteostanica s Nucleo Board2018-05-29T22:03:34Z<p>DVPS: </p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// Prints output data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
Zdrojový kód aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
<br />
Čiže budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme na dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Bugina_na_dia%C4%BEkov%C3%A9_ovl%C3%A1danie&diff=9450Bugina na diaľkové ovládanie2018-05-29T21:58:42Z<p>DVPS: /* 3D modely */</p>
<hr />
<div>{|<br />
|Autori: || '''Attila Lelkes, Molnár Tomáš, Patrik Šuba, Krištof Cséfalvay''' <br />
|-<br />
|Študijný odbor: || Automobilová mechatronika || 3. Bc. ('''2018''') <br />
|}<br />
<br />
== Opis projektu ==<br />
<br />
Hlavným '''cieľom''' projektu bolo konštrukčne vyhotoviť a zostrojiť model buginy. Reálna bugina je dostupná pre žiakov školy FEI STU. <br />
<br />
Počas práce sme sa oboznámili s rôznymi digitálnymi technológiami výroby a naučili sme sa pracovať v CAD programe. Získané vedomosti určite využívame v budúcnosti počas štúdia alebo v praxi.<br />
<br />
== Analýza ==<br />
<br />
V tejto časti je vysvetlené riešenie pre daný problém. Naznačujeme aj všetky potrebné technické údaje. <br />
<br />
=== Naše úlohy pre vyhotovenie projektu: ===<br />
*Merať parametrov „Elektrickej buginy“ <br />
*Rozložiť a vybrať potrebné súčiastky <br />
*Namerať podvozok auta aby sme presne zistili rozmery podvozku (d x š: 257 x 12,5 mm ) <br />
*Návrh teoretickej koncepcie, aby sme si mohli vytlačiť súčiastky <br />
*Vytlačiť jednotlivé súčiastky a zostrojiť vozidlo <br />
*Kúpa batérie pre riadenie a rádiový ovládač <br />
*Kúpa RC auta<br />
<br />
== Popis riešenia ==<br />
===Meranie parametrov elektrickej buginy=== <br />
<br />
Pred skonštruovaním modelu sme namerali potrebné rozmery.<br />
<br />
<br />
[[Súbor:buggy.png|center|1200px|]]<br />
<br />
<br />
===Kúpa RC auta===<br />
<br />
Pri vypratávaní povaly sme našli používané ale funkčné RC auto ktorého rozmery boli vhodné pre náš projekt. <br />
<br />
<br />
[[Súbor:auticko.png|center|350px|]]<br />
<br />
<br />
===Podvozok=== <br />
<br />
Rozobrali sme RC auto a odstránili sme nepotrebné skrutky a časti modelu. Nakoniec nám zostali 4 kolesá, podvozok, základná doska pre riadenie, anténa pre komunikáciu a LED svetlá. Ponechali sme si diaľkový ovládač, ktorý slúži na vysielanie pokynov pomocou rádiových vĺn. <br />
V Európe sú povolené tieto frekvencie pre RC modely:<br />
*35 MHz: pre lietadla. <br />
*40 MHz: pre auta a lietadla. <br />
*27 MHz: pre všeobecné použitie, hračky, CB rádio. <br />
*2.4 GHz rozprestreté spektrum, pre auta, lietadla a lode.<br />
<br />
'''Rozmery rozobratého RC auta:'''<br />
*dĺžka: 25,7 cm<br />
*šírka: 12,5 cm<br />
*výška: 6 cm<br />
*hmotnosť: 1,2 kg<br />
*rádiová frekvencia: 27 MHz<br />
<br />
<br />
[[Súbor:meraniaa.png|center|]]<br />
<br />
<br />
==Návrh virtuálneho modelu==<br />
<br />
3D modelovanie buginu bolo urobené pomocou softvéru CATIA V5 (Computer Aided Three dimensional Interactive Application). CATIA podporuje rôzne stupne vývoja produktov a má veľmi široký výber funkcií. Tieto sa týkajú konceptualizácie, cez dizajn (CAD) a výrobu (CAM), až po analýzu (CAE). CATIA je riešená ako otvorená vývojová architektúra postavená na rozhraniach, ktoré umožňujú prispôsobovanie alebo vyvíjať nové aplikácie. CATIA umožňuje vytváranie 3D dielov z 2D náčrtov. Modelovanie sa znázornení na kolese, ostatné komponenty boli modelované analogickým spôsobom. Používané moduly pri modelovaní boli : <br />
*Sketcher - skicár <br />
*Part design - solidy, objemové modelovanie <br />
*Assembly Design - zostavy, scény <br />
*Shape - 3D plochy a krivky <br />
*Wireframe and Surface design <br />
[[Súbor:pic2B.png|center|1300px]]<br />
Každý 3D model sa začína 2D náčrtom a zadaním vhodných parametrov. Z 2D náčrtu môžeme vytvoriť 3D model s použitím najčastejšie používaných funkcií: Pad (blok), Pocket (kapsa), Shaft (hriadeľ), Groove (kruhová drážka). Po vytvorení 3D objektu môžeme urobiť tvarové úpravy bez použitia skicára. Tieto funkcie sú napríklad: Edge Fillet (zaoblenie), Chamfer (zarezanie hrany), Shell (škrupina) a Hole(diera). Ďalšie používané funkcie sú: Mirror (odzrkadľovanie), Rectangular Pattern a Circular Pattern. <br />
Pre každého modelu komponentov sa dá nastaviť materiál pomocou funkcií Apply Material a na základe toho nastaviť hmotnosť.<br />
Keď máme všetky komponenty s pridaným materiálom potom môžeme postúpiť k Assembly Designu (návrh konštrukcie). Assembly Design umožňuje návrh zostáv s intuitívnym a flexibilným užívateľským rozhraním. Do Assembly Designu môžeme vložiť hotové časti (.CATPart) alebo zostavy (.CATProduct) pomocou funkcie Existing Component With Positioning. Vložené časti a zostavy manipulujeme funkciou Manipulation. Pomocou tejto funkcie môžeme nastaviť polohu elektromotora, batérie, sedadiel, poháňaných kolies a ostatných komponentov. Súčasne nastavíme aj rázvor, rozchod kolies vpredu aj vzadu a svetlú výšku.<br />
<br />
===Kúpa batérie===<br />
Batérie zabezpečujú elektrickú energiu aj pre vozidlo, aj pre ovládač. Súčasťou podvozka je držiak batérií vďaka ktorého má nižšie ťažisko a lepšie manévrovacie schopnosti. Bugina je napájaná z šiestich 1,5V AA bateriek. <br />
<br />
==Výsledok==<br />
<br />
[[Súbor:patr.jpg|center|350px]]<br />
<br />
[https://www.gearbest.com/3d-printers-3d-printer-kits/pp_337314.html Používaný 3D tlačiareň ]<br />
<br />
<br />
Bugina je poháňaná s dvoma zadnými kolesami. Pomocou predných kolies vieme otočiť vozidlo o 60° do oboch smerov. Programovateľná doska je umiestnená pod sedadlom. V prednej časti vozidla ako je možné vidieť na obrázku sa nachádza zbraň a dva ohňomety. V zadnej časti sú funkčné kuše, ktoré ako náboj vystrelia špáradlo. <br />
<br />
[[Súbor:kombat2.jpg|center|950px]]<br />
<br />
<br />
Kuše, ohňomety a rám vozidla sú vytvorené z materiálu PLA. Ostatné materiály sú neznáme.<br />
<br />
<br />
===3D modely===<br />
<br />
'''Catia V5:'''<br />
Potrebné časti k vyhotoveniu:<br />
[https://drive.google.com/open?id=15IHok5hqsj_hOjwOHUDtRVybBg-DMU-d Model]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9449Meteostanica s Nucleo Board2018-05-29T21:57:37Z<p>DVPS: </p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
Zdrojový kód aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
<br />
Čiže budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme na dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9448Meteostanica s Nucleo Board2018-05-29T21:53:27Z<p>DVPS: </p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
Zdrojový kód aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
<br />
Čiže budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme na dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9447Meteostanica s Nucleo Board2018-05-29T21:49:57Z<p>DVPS: /* Literatúra */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
<br />
Čiže budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme na dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9446Meteostanica s Nucleo Board2018-05-29T21:49:38Z<p>DVPS: /* Python a Flask */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
<br />
Čiže budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme na dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9445Meteostanica s Nucleo Board2018-05-29T21:47:53Z<p>DVPS: /* Literatúra */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
<br />
Čiže budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme na dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9444Meteostanica s Nucleo Board2018-05-29T21:47:33Z<p>DVPS: /* Python a Flask */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
<br />
Čiže budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme na dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9443Meteostanica s Nucleo Board2018-05-29T21:46:31Z<p>DVPS: /* Databáza */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
<br />
Čiže budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme na dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9442Meteostanica s Nucleo Board2018-05-29T21:46:13Z<p>DVPS: /* Raspbian */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
<br />
Čiže budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme na dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9441Meteostanica s Nucleo Board2018-05-29T21:45:41Z<p>DVPS: /* Vízia komplexnej aplikácie Meteostanice */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
<br />
Čiže budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Bugina_na_dia%C4%BEkov%C3%A9_ovl%C3%A1danie&diff=9440Bugina na diaľkové ovládanie2018-05-29T21:45:36Z<p>DVPS: /* Výsledok */</p>
<hr />
<div>{|<br />
|Autori: || '''Attila Lelkes, Molnár Tomáš, Patrik Šuba, Krištof Cséfalvay''' <br />
|-<br />
|Študijný odbor: || Automobilová mechatronika || 3. Bc. ('''2018''') <br />
|}<br />
<br />
== Opis projektu ==<br />
<br />
Hlavným '''cieľom''' projektu bolo konštrukčne vyhotoviť a zostrojiť model buginy. Reálna bugina je dostupná pre žiakov školy FEI STU. <br />
<br />
Počas práce sme sa oboznámili s rôznymi digitálnymi technológiami výroby a naučili sme sa pracovať v CAD programe. Získané vedomosti určite využívame v budúcnosti počas štúdia alebo v praxi.<br />
<br />
== Analýza ==<br />
<br />
V tejto časti je vysvetlené riešenie pre daný problém. Naznačujeme aj všetky potrebné technické údaje. <br />
<br />
=== Naše úlohy pre vyhotovenie projektu: ===<br />
*Merať parametrov „Elektrickej buginy“ <br />
*Rozložiť a vybrať potrebné súčiastky <br />
*Namerať podvozok auta aby sme presne zistili rozmery podvozku (d x š: 257 x 12,5 mm ) <br />
*Návrh teoretickej koncepcie, aby sme si mohli vytlačiť súčiastky <br />
*Vytlačiť jednotlivé súčiastky a zostrojiť vozidlo <br />
*Kúpa batérie pre riadenie a rádiový ovládač <br />
*Kúpa RC auta<br />
<br />
== Popis riešenia ==<br />
===Meranie parametrov elektrickej buginy=== <br />
<br />
Pred skonštruovaním modelu sme namerali potrebné rozmery.<br />
<br />
<br />
[[Súbor:buggy.png|center|1200px|]]<br />
<br />
<br />
===Kúpa RC auta===<br />
<br />
Pri vypratávaní povaly sme našli používané ale funkčné RC auto ktorého rozmery boli vhodné pre náš projekt. <br />
<br />
<br />
[[Súbor:auticko.png|center|350px|]]<br />
<br />
<br />
===Podvozok=== <br />
<br />
Rozobrali sme RC auto a odstránili sme nepotrebné skrutky a časti modelu. Nakoniec nám zostali 4 kolesá, podvozok, základná doska pre riadenie, anténa pre komunikáciu a LED svetlá. Ponechali sme si diaľkový ovládač, ktorý slúži na vysielanie pokynov pomocou rádiových vĺn. <br />
V Európe sú povolené tieto frekvencie pre RC modely:<br />
*35 MHz: pre lietadla. <br />
*40 MHz: pre auta a lietadla. <br />
*27 MHz: pre všeobecné použitie, hračky, CB rádio. <br />
*2.4 GHz rozprestreté spektrum, pre auta, lietadla a lode.<br />
<br />
'''Rozmery rozobratého RC auta:'''<br />
*dĺžka: 25,7 cm<br />
*šírka: 12,5 cm<br />
*výška: 6 cm<br />
*hmotnosť: 1,2 kg<br />
*rádiová frekvencia: 27 MHz<br />
<br />
<br />
[[Súbor:meraniaa.png|center|]]<br />
<br />
<br />
==Návrh virtuálneho modelu==<br />
<br />
3D modelovanie buginu bolo urobené pomocou softvéru CATIA V5 (Computer Aided Three dimensional Interactive Application). CATIA podporuje rôzne stupne vývoja produktov a má veľmi široký výber funkcií. Tieto sa týkajú konceptualizácie, cez dizajn (CAD) a výrobu (CAM), až po analýzu (CAE). CATIA je riešená ako otvorená vývojová architektúra postavená na rozhraniach, ktoré umožňujú prispôsobovanie alebo vyvíjať nové aplikácie. CATIA umožňuje vytváranie 3D dielov z 2D náčrtov. Modelovanie sa znázornení na kolese, ostatné komponenty boli modelované analogickým spôsobom. Používané moduly pri modelovaní boli : <br />
*Sketcher - skicár <br />
*Part design - solidy, objemové modelovanie <br />
*Assembly Design - zostavy, scény <br />
*Shape - 3D plochy a krivky <br />
*Wireframe and Surface design <br />
[[Súbor:pic2B.png|center|1300px]]<br />
Každý 3D model sa začína 2D náčrtom a zadaním vhodných parametrov. Z 2D náčrtu môžeme vytvoriť 3D model s použitím najčastejšie používaných funkcií: Pad (blok), Pocket (kapsa), Shaft (hriadeľ), Groove (kruhová drážka). Po vytvorení 3D objektu môžeme urobiť tvarové úpravy bez použitia skicára. Tieto funkcie sú napríklad: Edge Fillet (zaoblenie), Chamfer (zarezanie hrany), Shell (škrupina) a Hole(diera). Ďalšie používané funkcie sú: Mirror (odzrkadľovanie), Rectangular Pattern a Circular Pattern. <br />
Pre každého modelu komponentov sa dá nastaviť materiál pomocou funkcií Apply Material a na základe toho nastaviť hmotnosť.<br />
Keď máme všetky komponenty s pridaným materiálom potom môžeme postúpiť k Assembly Designu (návrh konštrukcie). Assembly Design umožňuje návrh zostáv s intuitívnym a flexibilným užívateľským rozhraním. Do Assembly Designu môžeme vložiť hotové časti (.CATPart) alebo zostavy (.CATProduct) pomocou funkcie Existing Component With Positioning. Vložené časti a zostavy manipulujeme funkciou Manipulation. Pomocou tejto funkcie môžeme nastaviť polohu elektromotora, batérie, sedadiel, poháňaných kolies a ostatných komponentov. Súčasne nastavíme aj rázvor, rozchod kolies vpredu aj vzadu a svetlú výšku.<br />
<br />
===Kúpa batérie===<br />
Batérie zabezpečujú elektrickú energiu aj pre vozidlo, aj pre ovládač. Súčasťou podvozka je držiak batérií vďaka ktorého má nižšie ťažisko a lepšie manévrovacie schopnosti. Bugina je napájaná z šiestich 1,5V AA bateriek. <br />
<br />
==Výsledok==<br />
<br />
[[Súbor:patr.jpg|center|350px]]<br />
<br />
[https://www.gearbest.com/3d-printers-3d-printer-kits/pp_337314.html Používaný 3D tlačiareň ]<br />
<br />
<br />
Bugina je poháňaná s dvoma zadnými kolesami. Pomocou predných kolies vieme otočiť vozidlo o 60° do oboch smerov. Programovateľná doska je umiestnená pod sedadlom. V prednej časti vozidla ako je možné vidieť na obrázku sa nachádza zbraň a dva ohňomety. V zadnej časti sú funkčné kuše, ktoré ako náboj vystrelia špáradlo. <br />
<br />
[[Súbor:kombat2.jpg|center|950px]]<br />
<br />
<br />
Kuše, ohňomety a rám vozidla sú vytvorené z materiálu PLA. Ostatné materiály sú neznáme.<br />
<br />
<br />
===3D modely===<br />
<br />
'''Catia V5:'''<br />
Všetky 3D časti:<br />
[https://drive.google.com/open?id=15IHok5hqsj_hOjwOHUDtRVybBg-DMU-d Potrebné časti k vyhotoveniu ]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9439Meteostanica s Nucleo Board2018-05-29T21:45:25Z<p>DVPS: /* Vízia komplexnej aplikácie Meteostanice */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
Čiže budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9438Meteostanica s Nucleo Board2018-05-29T21:44:16Z<p>DVPS: /* Vízia komplexnej aplikácie Meteostanice */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia bola komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
Tak budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Bugina_na_dia%C4%BEkov%C3%A9_ovl%C3%A1danie&diff=9437Bugina na diaľkové ovládanie2018-05-29T21:42:31Z<p>DVPS: /* 3D modely */</p>
<hr />
<div>{|<br />
|Autori: || '''Attila Lelkes, Molnár Tomáš, Patrik Šuba, Krištof Cséfalvay''' <br />
|-<br />
|Študijný odbor: || Automobilová mechatronika || 3. Bc. ('''2018''') <br />
|}<br />
<br />
== Opis projektu ==<br />
<br />
Hlavným '''cieľom''' projektu bolo konštrukčne vyhotoviť a zostrojiť model buginy. Reálna bugina je dostupná pre žiakov školy FEI STU. <br />
<br />
Počas práce sme sa oboznámili s rôznymi digitálnymi technológiami výroby a naučili sme sa pracovať v CAD programe. Získané vedomosti určite využívame v budúcnosti počas štúdia alebo v praxi.<br />
<br />
== Analýza ==<br />
<br />
V tejto časti je vysvetlené riešenie pre daný problém. Naznačujeme aj všetky potrebné technické údaje. <br />
<br />
=== Naše úlohy pre vyhotovenie projektu: ===<br />
*Merať parametrov „Elektrickej buginy“ <br />
*Rozložiť a vybrať potrebné súčiastky <br />
*Namerať podvozok auta aby sme presne zistili rozmery podvozku (d x š: 257 x 12,5 mm ) <br />
*Návrh teoretickej koncepcie, aby sme si mohli vytlačiť súčiastky <br />
*Vytlačiť jednotlivé súčiastky a zostrojiť vozidlo <br />
*Kúpa batérie pre riadenie a rádiový ovládač <br />
*Kúpa RC auta<br />
<br />
== Popis riešenia ==<br />
===Meranie parametrov elektrickej buginy=== <br />
<br />
Pred skonštruovaním modelu sme namerali potrebné rozmery.<br />
<br />
<br />
[[Súbor:buggy.png|center|1200px|]]<br />
<br />
<br />
===Kúpa RC auta===<br />
<br />
Pri vypratávaní povaly sme našli používané ale funkčné RC auto ktorého rozmery boli vhodné pre náš projekt. <br />
<br />
<br />
[[Súbor:auticko.png|center|350px|]]<br />
<br />
<br />
===Podvozok=== <br />
<br />
Rozobrali sme RC auto a odstránili sme nepotrebné skrutky a časti modelu. Nakoniec nám zostali 4 kolesá, podvozok, základná doska pre riadenie, anténa pre komunikáciu a LED svetlá. Ponechali sme si diaľkový ovládač, ktorý slúži na vysielanie pokynov pomocou rádiových vĺn. <br />
V Európe sú povolené tieto frekvencie pre RC modely:<br />
*35 MHz: pre lietadla. <br />
*40 MHz: pre auta a lietadla. <br />
*27 MHz: pre všeobecné použitie, hračky, CB rádio. <br />
*2.4 GHz rozprestreté spektrum, pre auta, lietadla a lode.<br />
<br />
'''Rozmery rozobratého RC auta:'''<br />
*dĺžka: 25,7 cm<br />
*šírka: 12,5 cm<br />
*výška: 6 cm<br />
*hmotnosť: 1,2 kg<br />
*rádiová frekvencia: 27 MHz<br />
<br />
<br />
[[Súbor:meraniaa.png|center|]]<br />
<br />
<br />
==Návrh virtuálneho modelu==<br />
<br />
3D modelovanie buginu bolo urobené pomocou softvéru CATIA V5 (Computer Aided Three dimensional Interactive Application). CATIA podporuje rôzne stupne vývoja produktov a má veľmi široký výber funkcií. Tieto sa týkajú konceptualizácie, cez dizajn (CAD) a výrobu (CAM), až po analýzu (CAE). CATIA je riešená ako otvorená vývojová architektúra postavená na rozhraniach, ktoré umožňujú prispôsobovanie alebo vyvíjať nové aplikácie. CATIA umožňuje vytváranie 3D dielov z 2D náčrtov. Modelovanie sa znázornení na kolese, ostatné komponenty boli modelované analogickým spôsobom. Používané moduly pri modelovaní boli : <br />
*Sketcher - skicár <br />
*Part design - solidy, objemové modelovanie <br />
*Assembly Design - zostavy, scény <br />
*Shape - 3D plochy a krivky <br />
*Wireframe and Surface design <br />
[[Súbor:pic2B.png|center|1300px]]<br />
Každý 3D model sa začína 2D náčrtom a zadaním vhodných parametrov. Z 2D náčrtu môžeme vytvoriť 3D model s použitím najčastejšie používaných funkcií: Pad (blok), Pocket (kapsa), Shaft (hriadeľ), Groove (kruhová drážka). Po vytvorení 3D objektu môžeme urobiť tvarové úpravy bez použitia skicára. Tieto funkcie sú napríklad: Edge Fillet (zaoblenie), Chamfer (zarezanie hrany), Shell (škrupina) a Hole(diera). Ďalšie používané funkcie sú: Mirror (odzrkadľovanie), Rectangular Pattern a Circular Pattern. <br />
Pre každého modelu komponentov sa dá nastaviť materiál pomocou funkcií Apply Material a na základe toho nastaviť hmotnosť.<br />
Keď máme všetky komponenty s pridaným materiálom potom môžeme postúpiť k Assembly Designu (návrh konštrukcie). Assembly Design umožňuje návrh zostáv s intuitívnym a flexibilným užívateľským rozhraním. Do Assembly Designu môžeme vložiť hotové časti (.CATPart) alebo zostavy (.CATProduct) pomocou funkcie Existing Component With Positioning. Vložené časti a zostavy manipulujeme funkciou Manipulation. Pomocou tejto funkcie môžeme nastaviť polohu elektromotora, batérie, sedadiel, poháňaných kolies a ostatných komponentov. Súčasne nastavíme aj rázvor, rozchod kolies vpredu aj vzadu a svetlú výšku.<br />
<br />
===Kúpa batérie===<br />
Batérie zabezpečujú elektrickú energiu aj pre vozidlo, aj pre ovládač. Súčasťou podvozka je držiak batérií vďaka ktorého má nižšie ťažisko a lepšie manévrovacie schopnosti. Bugina je napájaná z šiestich 1,5V AA bateriek. <br />
<br />
==Výsledok==<br />
<br />
[[Súbor:patr.jpg|center|350px]]<br />
<br />
<br />
Bugina je poháňaná s dvoma zadnými kolesami. Pomocou predných kolies vieme otočiť vozidlo o 60° do oboch smerov. Programovateľná doska je umiestnená pod sedadlom. V prednej časti vozidla ako je možné vidieť na obrázku sa nachádza zbraň a dva ohňomety. V zadnej časti sú funkčné kuše, ktoré ako náboj vystrelia špáradlo. <br />
<br />
[[Súbor:kombat2.jpg|center|950px]]<br />
<br />
<br />
Kuše, ohňomety a rám vozidla sú vytvorené z materiálu PLA. Ostatné materiály sú neznáme.<br />
<br />
<br />
===3D modely===<br />
<br />
'''Catia V5:'''<br />
Všetky 3D časti:<br />
[https://drive.google.com/open?id=15IHok5hqsj_hOjwOHUDtRVybBg-DMU-d Potrebné časti k vyhotoveniu ]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Bugina_na_dia%C4%BEkov%C3%A9_ovl%C3%A1danie&diff=9436Bugina na diaľkové ovládanie2018-05-29T21:41:28Z<p>DVPS: /* 3D modely */</p>
<hr />
<div>{|<br />
|Autori: || '''Attila Lelkes, Molnár Tomáš, Patrik Šuba, Krištof Cséfalvay''' <br />
|-<br />
|Študijný odbor: || Automobilová mechatronika || 3. Bc. ('''2018''') <br />
|}<br />
<br />
== Opis projektu ==<br />
<br />
Hlavným '''cieľom''' projektu bolo konštrukčne vyhotoviť a zostrojiť model buginy. Reálna bugina je dostupná pre žiakov školy FEI STU. <br />
<br />
Počas práce sme sa oboznámili s rôznymi digitálnymi technológiami výroby a naučili sme sa pracovať v CAD programe. Získané vedomosti určite využívame v budúcnosti počas štúdia alebo v praxi.<br />
<br />
== Analýza ==<br />
<br />
V tejto časti je vysvetlené riešenie pre daný problém. Naznačujeme aj všetky potrebné technické údaje. <br />
<br />
=== Naše úlohy pre vyhotovenie projektu: ===<br />
*Merať parametrov „Elektrickej buginy“ <br />
*Rozložiť a vybrať potrebné súčiastky <br />
*Namerať podvozok auta aby sme presne zistili rozmery podvozku (d x š: 257 x 12,5 mm ) <br />
*Návrh teoretickej koncepcie, aby sme si mohli vytlačiť súčiastky <br />
*Vytlačiť jednotlivé súčiastky a zostrojiť vozidlo <br />
*Kúpa batérie pre riadenie a rádiový ovládač <br />
*Kúpa RC auta<br />
<br />
== Popis riešenia ==<br />
===Meranie parametrov elektrickej buginy=== <br />
<br />
Pred skonštruovaním modelu sme namerali potrebné rozmery.<br />
<br />
<br />
[[Súbor:buggy.png|center|1200px|]]<br />
<br />
<br />
===Kúpa RC auta===<br />
<br />
Pri vypratávaní povaly sme našli používané ale funkčné RC auto ktorého rozmery boli vhodné pre náš projekt. <br />
<br />
<br />
[[Súbor:auticko.png|center|350px|]]<br />
<br />
<br />
===Podvozok=== <br />
<br />
Rozobrali sme RC auto a odstránili sme nepotrebné skrutky a časti modelu. Nakoniec nám zostali 4 kolesá, podvozok, základná doska pre riadenie, anténa pre komunikáciu a LED svetlá. Ponechali sme si diaľkový ovládač, ktorý slúži na vysielanie pokynov pomocou rádiových vĺn. <br />
V Európe sú povolené tieto frekvencie pre RC modely:<br />
*35 MHz: pre lietadla. <br />
*40 MHz: pre auta a lietadla. <br />
*27 MHz: pre všeobecné použitie, hračky, CB rádio. <br />
*2.4 GHz rozprestreté spektrum, pre auta, lietadla a lode.<br />
<br />
'''Rozmery rozobratého RC auta:'''<br />
*dĺžka: 25,7 cm<br />
*šírka: 12,5 cm<br />
*výška: 6 cm<br />
*hmotnosť: 1,2 kg<br />
*rádiová frekvencia: 27 MHz<br />
<br />
<br />
[[Súbor:meraniaa.png|center|]]<br />
<br />
<br />
==Návrh virtuálneho modelu==<br />
<br />
3D modelovanie buginu bolo urobené pomocou softvéru CATIA V5 (Computer Aided Three dimensional Interactive Application). CATIA podporuje rôzne stupne vývoja produktov a má veľmi široký výber funkcií. Tieto sa týkajú konceptualizácie, cez dizajn (CAD) a výrobu (CAM), až po analýzu (CAE). CATIA je riešená ako otvorená vývojová architektúra postavená na rozhraniach, ktoré umožňujú prispôsobovanie alebo vyvíjať nové aplikácie. CATIA umožňuje vytváranie 3D dielov z 2D náčrtov. Modelovanie sa znázornení na kolese, ostatné komponenty boli modelované analogickým spôsobom. Používané moduly pri modelovaní boli : <br />
*Sketcher - skicár <br />
*Part design - solidy, objemové modelovanie <br />
*Assembly Design - zostavy, scény <br />
*Shape - 3D plochy a krivky <br />
*Wireframe and Surface design <br />
[[Súbor:pic2B.png|center|1300px]]<br />
Každý 3D model sa začína 2D náčrtom a zadaním vhodných parametrov. Z 2D náčrtu môžeme vytvoriť 3D model s použitím najčastejšie používaných funkcií: Pad (blok), Pocket (kapsa), Shaft (hriadeľ), Groove (kruhová drážka). Po vytvorení 3D objektu môžeme urobiť tvarové úpravy bez použitia skicára. Tieto funkcie sú napríklad: Edge Fillet (zaoblenie), Chamfer (zarezanie hrany), Shell (škrupina) a Hole(diera). Ďalšie používané funkcie sú: Mirror (odzrkadľovanie), Rectangular Pattern a Circular Pattern. <br />
Pre každého modelu komponentov sa dá nastaviť materiál pomocou funkcií Apply Material a na základe toho nastaviť hmotnosť.<br />
Keď máme všetky komponenty s pridaným materiálom potom môžeme postúpiť k Assembly Designu (návrh konštrukcie). Assembly Design umožňuje návrh zostáv s intuitívnym a flexibilným užívateľským rozhraním. Do Assembly Designu môžeme vložiť hotové časti (.CATPart) alebo zostavy (.CATProduct) pomocou funkcie Existing Component With Positioning. Vložené časti a zostavy manipulujeme funkciou Manipulation. Pomocou tejto funkcie môžeme nastaviť polohu elektromotora, batérie, sedadiel, poháňaných kolies a ostatných komponentov. Súčasne nastavíme aj rázvor, rozchod kolies vpredu aj vzadu a svetlú výšku.<br />
<br />
===Kúpa batérie===<br />
Batérie zabezpečujú elektrickú energiu aj pre vozidlo, aj pre ovládač. Súčasťou podvozka je držiak batérií vďaka ktorého má nižšie ťažisko a lepšie manévrovacie schopnosti. Bugina je napájaná z šiestich 1,5V AA bateriek. <br />
<br />
==Výsledok==<br />
<br />
[[Súbor:patr.jpg|center|350px]]<br />
<br />
<br />
Bugina je poháňaná s dvoma zadnými kolesami. Pomocou predných kolies vieme otočiť vozidlo o 60° do oboch smerov. Programovateľná doska je umiestnená pod sedadlom. V prednej časti vozidla ako je možné vidieť na obrázku sa nachádza zbraň a dva ohňomety. V zadnej časti sú funkčné kuše, ktoré ako náboj vystrelia špáradlo. <br />
<br />
[[Súbor:kombat2.jpg|center|950px]]<br />
<br />
<br />
Kuše, ohňomety a rám vozidla sú vytvorené z materiálu PLA. Ostatné materiály sú neznáme.<br />
<br />
<br />
===3D modely===<br />
<br />
Catia V5:<br />
<br />
Všetky 3D časti:<br />
[https://drive.google.com/open?id=15IHok5hqsj_hOjwOHUDtRVybBg-DMU-d link časti]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Casti.zip&diff=9435Súbor:Casti.zip2018-05-29T21:37:06Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9434Meteostanica s Nucleo Board2018-05-29T21:34:17Z<p>DVPS: /* Python a Flask */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
Tak budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9433Meteostanica s Nucleo Board2018-05-29T21:33:48Z<p>DVPS: /* Databáza */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
Tak budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9432Meteostanica s Nucleo Board2018-05-29T21:33:21Z<p>DVPS: /* Literatúra */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
Tak budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Bugina_na_dia%C4%BEkov%C3%A9_ovl%C3%A1danie&diff=9431Bugina na diaľkové ovládanie2018-05-29T21:33:08Z<p>DVPS: /* Výsledok */</p>
<hr />
<div>{|<br />
|Autori: || '''Attila Lelkes, Molnár Tomáš, Patrik Šuba, Krištof Cséfalvay''' <br />
|-<br />
|Študijný odbor: || Automobilová mechatronika || 3. Bc. ('''2018''') <br />
|}<br />
<br />
== Opis projektu ==<br />
<br />
Hlavným '''cieľom''' projektu bolo konštrukčne vyhotoviť a zostrojiť model buginy. Reálna bugina je dostupná pre žiakov školy FEI STU. <br />
<br />
Počas práce sme sa oboznámili s rôznymi digitálnymi technológiami výroby a naučili sme sa pracovať v CAD programe. Získané vedomosti určite využívame v budúcnosti počas štúdia alebo v praxi.<br />
<br />
== Analýza ==<br />
<br />
V tejto časti je vysvetlené riešenie pre daný problém. Naznačujeme aj všetky potrebné technické údaje. <br />
<br />
=== Naše úlohy pre vyhotovenie projektu: ===<br />
*Merať parametrov „Elektrickej buginy“ <br />
*Rozložiť a vybrať potrebné súčiastky <br />
*Namerať podvozok auta aby sme presne zistili rozmery podvozku (d x š: 257 x 12,5 mm ) <br />
*Návrh teoretickej koncepcie, aby sme si mohli vytlačiť súčiastky <br />
*Vytlačiť jednotlivé súčiastky a zostrojiť vozidlo <br />
*Kúpa batérie pre riadenie a rádiový ovládač <br />
*Kúpa RC auta<br />
<br />
== Popis riešenia ==<br />
===Meranie parametrov elektrickej buginy=== <br />
<br />
Pred skonštruovaním modelu sme namerali potrebné rozmery.<br />
<br />
<br />
[[Súbor:buggy.png|center|1200px|]]<br />
<br />
<br />
===Kúpa RC auta===<br />
<br />
Pri vypratávaní povaly sme našli používané ale funkčné RC auto ktorého rozmery boli vhodné pre náš projekt. <br />
<br />
<br />
[[Súbor:auticko.png|center|350px|]]<br />
<br />
<br />
===Podvozok=== <br />
<br />
Rozobrali sme RC auto a odstránili sme nepotrebné skrutky a časti modelu. Nakoniec nám zostali 4 kolesá, podvozok, základná doska pre riadenie, anténa pre komunikáciu a LED svetlá. Ponechali sme si diaľkový ovládač, ktorý slúži na vysielanie pokynov pomocou rádiových vĺn. <br />
V Európe sú povolené tieto frekvencie pre RC modely:<br />
*35 MHz: pre lietadla. <br />
*40 MHz: pre auta a lietadla. <br />
*27 MHz: pre všeobecné použitie, hračky, CB rádio. <br />
*2.4 GHz rozprestreté spektrum, pre auta, lietadla a lode.<br />
<br />
'''Rozmery rozobratého RC auta:'''<br />
*dĺžka: 25,7 cm<br />
*šírka: 12,5 cm<br />
*výška: 6 cm<br />
*hmotnosť: 1,2 kg<br />
*rádiová frekvencia: 27 MHz<br />
<br />
<br />
[[Súbor:meraniaa.png|center|]]<br />
<br />
<br />
==Návrh virtuálneho modelu==<br />
<br />
3D modelovanie buginu bolo urobené pomocou softvéru CATIA V5 (Computer Aided Three dimensional Interactive Application). CATIA podporuje rôzne stupne vývoja produktov a má veľmi široký výber funkcií. Tieto sa týkajú konceptualizácie, cez dizajn (CAD) a výrobu (CAM), až po analýzu (CAE). CATIA je riešená ako otvorená vývojová architektúra postavená na rozhraniach, ktoré umožňujú prispôsobovanie alebo vyvíjať nové aplikácie. CATIA umožňuje vytváranie 3D dielov z 2D náčrtov. Modelovanie sa znázornení na kolese, ostatné komponenty boli modelované analogickým spôsobom. Používané moduly pri modelovaní boli : <br />
*Sketcher - skicár <br />
*Part design - solidy, objemové modelovanie <br />
*Assembly Design - zostavy, scény <br />
*Shape - 3D plochy a krivky <br />
*Wireframe and Surface design <br />
[[Súbor:pic2B.png|center|1300px]]<br />
Každý 3D model sa začína 2D náčrtom a zadaním vhodných parametrov. Z 2D náčrtu môžeme vytvoriť 3D model s použitím najčastejšie používaných funkcií: Pad (blok), Pocket (kapsa), Shaft (hriadeľ), Groove (kruhová drážka). Po vytvorení 3D objektu môžeme urobiť tvarové úpravy bez použitia skicára. Tieto funkcie sú napríklad: Edge Fillet (zaoblenie), Chamfer (zarezanie hrany), Shell (škrupina) a Hole(diera). Ďalšie používané funkcie sú: Mirror (odzrkadľovanie), Rectangular Pattern a Circular Pattern. <br />
Pre každého modelu komponentov sa dá nastaviť materiál pomocou funkcií Apply Material a na základe toho nastaviť hmotnosť.<br />
Keď máme všetky komponenty s pridaným materiálom potom môžeme postúpiť k Assembly Designu (návrh konštrukcie). Assembly Design umožňuje návrh zostáv s intuitívnym a flexibilným užívateľským rozhraním. Do Assembly Designu môžeme vložiť hotové časti (.CATPart) alebo zostavy (.CATProduct) pomocou funkcie Existing Component With Positioning. Vložené časti a zostavy manipulujeme funkciou Manipulation. Pomocou tejto funkcie môžeme nastaviť polohu elektromotora, batérie, sedadiel, poháňaných kolies a ostatných komponentov. Súčasne nastavíme aj rázvor, rozchod kolies vpredu aj vzadu a svetlú výšku.<br />
<br />
===Kúpa batérie===<br />
Batérie zabezpečujú elektrickú energiu aj pre vozidlo, aj pre ovládač. Súčasťou podvozka je držiak batérií vďaka ktorého má nižšie ťažisko a lepšie manévrovacie schopnosti. Bugina je napájaná z šiestich 1,5V AA bateriek. <br />
<br />
==Výsledok==<br />
<br />
[[Súbor:patr.jpg|center|350px]]<br />
<br />
<br />
Bugina je poháňaná s dvoma zadnými kolesami. Pomocou predných kolies vieme otočiť vozidlo o 60° do oboch smerov. Programovateľná doska je umiestnená pod sedadlom. V prednej časti vozidla ako je možné vidieť na obrázku sa nachádza zbraň a dva ohňomety. V zadnej časti sú funkčné kuše, ktoré ako náboj vystrelia špáradlo. <br />
<br />
[[Súbor:kombat2.jpg|center|950px]]<br />
<br />
<br />
Kuše, ohňomety a rám vozidla sú vytvorené z materiálu PLA. Ostatné materiály sú neznáme.<br />
<br />
<br />
===3D modely===<br />
<br />
Catia V5:<br />
[[Médiá:casti.zip]]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9430Meteostanica s Nucleo Board2018-05-29T21:32:30Z<p>DVPS: /* Literatúra */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
Tak budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
= '''Literatúra''' =<br />
* Datasheets k doske X-NUCLEO-IKS01A1: [http://www.st.com/en/ecosystems/x-nucleo-iks01a1.html klik]<br />
* Datasheets k HTS221: [http://www.st.com/en/mems-and-sensors/hts221.html klik]<br />
* Github repozitár k HTS221 [https://github.com/stm32duino/HTS221 klik]<br />
* Datasheets k LPS25HB: [http://www.st.com/en/mems-and-sensors/lps25hb.html klik]<br />
* Github repozitár k LPS25HB [https://github.com/stm32duino/LPS25HB klik]<br />
* I2C zbernica [http://www.kiwiki.info/index.php/Synchr%C3%B3nna_komunik%C3%A1cia_I2C klik]<br />
* Vývojová doska Acrob [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description klik]<br />
* Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V [https://www.sparkfun.com/products/9716 klik]<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Vlak&diff=9429Vlak2018-05-29T21:25:04Z<p>DVPS: </p>
<hr />
<div>{|<br />
|Autori: || '''Martin Martiška, Matej Lovász''' <br />
|-<br />
|Študijný odbor: || Aplikovaná informatika || 3. bc. ('''2018''') <br />
|}<br />
<br />
== Opis projektu ==<br />
<br />
Cieľom projektu bude vymodelovanie vlaku, a výsledok bude vyzerať ako lokomotíva, ktorá bude mať funkciu svietenia predným svetlom.<br />
Tento projekt sme si zvolili z dôvodu, že sme obaja veľký fanúšikovia vlakov a nikdy sme ako deti nemali možnosť hrať sa s hračkárskym vlakom, ktorý by vedel svietiť predným svetlom. V konečnej fáze bude vlak pozostávať z troch častí a tu sú:<br />
#kolesá<br />
#telo vlaku<br />
#led svetlo napájané batériou<br />
Kolesá a telo budú robené 3D tlačou. Pôvodne sme chceli ešte pridať okná, ktoré by sme vytvorili za pomoci rezania plexiskla. <br />
Telo vlaku sa počas prípravy rozdelilo na 3 časti. Pôvodne sa plánovalo rozdelenie len na dve ale samotné tlačenie určilo, že to budú 3 časti. Konkrétne sú to podvozok, trup rušňa a strecha s komínom.<br />
Svetlo bude možné manuálne zapínať/vypínať za pomoci vypínača, ktorý sa nachádza na spodnej časti podvozku vlaku.<br />
Celé telo vlaku je zhotovené z priehladného filamentu o hrúbke 2 mm kvoli svetelnému efektu z LED diódy. <br />
<br />
Projekt sme vytvárali v prostredí SketchUp a bol rozdelený na niekoľko častí:<br />
* Najskôr je treba určiť parametre lokomotívy, jej podvozku, kolies a svetla<br />
* Ďalej je treba navrhnúť a namodelovať lokomotívu<br />
* Prispôsobiť pre ňu podvozok a kolieska aby sa dali vytlačiť<br />
* Vyspecifikovat potrebny material <BR> vystupom bude zhmotneny napad a aj navod - krok za krokom pre reprodukciu produktu<br />
<br />
== Analýza ==<br />
<br />
Projekt sme sa rozhodli riešiť pomocou prostredia SketchUp. Projekt sme si rozdelili na 2 časti. V prvej časti navrhneme a vyrobíme telo vlaku a v druhej časti do vlaku prirobíme elektrické komponenty. <br><br />
Elektrické komponenty a ich parametre:<br />
#LED dióda - zelená farba<br />
#baterka - lítiová, 3V, model cr2430<br />
#odpor - 27Ω<br />
<br />
== Popis riešenia ==<br />
<br />
Najskôr sme určili za pomoci programu SketchUp parametre jednotlivých častí vlaku. Dĺžka tela lokomotívy bola nastavená na 15.6 cm a šírka 5.6 cm. <br />
<br />
Podvozok musel mať o niečo menšie rozmenry aby sa dal nasunúť do kostry tela zo spodu. <br />
<br />
'''Návrh podvozka'''<br />
[[Súbor:Podvoyek.PNG]]<br />
<br />
Keďže hrúbka stien kostri bola 2 mm, tak šírka podvozku bola 5 cm a dĺžka 15 cm, kôli rezerve. Na kostre nebolo treba spraviť výrezy na kolieska ako sa pôvodne plánovalo, lebo sa nakoniec navrhli, že budú zospodu viď obrázok pod textom. Priemer koliesok sme určili na 2 cm a vnútorný otvor, pre nasunutie na podvozok, sme nastavili na 5 mm.<br />
<br />
'''Nedokončená lokomotíva'''<br />
[[Súbor:NedokoncenyVlak.jpg]]<br />
<br />
Na obrázku je taktiež vidno, že na prvý krát zlyhala funkčnosť tlačiarne a náš subjekt vytlačil len do polovice. Preto sme museli dať tlačiť ešte hornú časť celej lokomotívy. <br />
<br />
Následne sme dotlačené veci prilepili. Potom prišlo na rad vkladanie elektrických komponentov na podvozok. Na obrázku môžeme vidiet schému zapojenia.<br />
<br />
'''Schéma zapojenia'''<br />
[[Súbor:Lepka.png]]<br />
<br />
Požili sa vyššie opísané komponenty, ich umiestnenie a spôsob pripojenia je zobrazený na obrázku nižšie.<br />
<br />
'''Spôsob zapojenia<br />
[[Súbor:InstalaciaVlak.jpg]]<br />
<br />
Na spodnej časti podvozku sa vyrezala diera za účelom umiestnenia vypínača, tak aby sa dal vypínať a zapínať zvonka.<br />
<br />
'''Spínač na ovládanie ledky'''<br />
[[Súbor:SpinacVlaku.jpg]]<br />
<br />
=== Výsledok ===<br />
<br />
Výsledný stav lokomotívy môžme vidieť na obrázkoch.<br />
<br />
'''Náhlad zpredu'''<br />
[[Súbor:VlakSvieti2.jpg]]<br />
<br />
S výsledkom sme spokojní aj napriek komplikáciam v procese výroby.<br />
<br />
<br />
'''Zdrojové kódy'''<br />
<br />
Telo vlaku: [[Médiá:Vlak.stl|Telo]]<br />
<br />
Podvozok: [[Médiá:PODVOZEKopraveny_(1).stl|Podvozok]]<br />
<br />
Koleso: [[Médiá:Koleso.stl|Koleso]]<br />
<br />
[[Category:DTV2018]]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Lepka.png&diff=9428Súbor:Lepka.png2018-05-29T21:24:47Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9427Meteostanica s Nucleo Board2018-05-29T21:24:19Z<p>DVPS: /* Vízia komplexnej aplikácie Meteostanice */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
Tak budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu (prípadne aj klienta)<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver, ktorý nám uľahčí vyvorenie tabuliek v databáze, do ktorých budeme ukladať naše dáta.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Na záver len dodáme, že táto vízia ma naozaj slúžiť ako vízia prípadnej realizácie takejto aplikácie. V skratke vysvetľuje a popisuje čo je potrebné na samotnú realizáciu.<br />
<br />
= '''Literatúra''' =<br />
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Vlak&diff=9426Vlak2018-05-29T21:23:34Z<p>DVPS: </p>
<hr />
<div>{|<br />
|Autori: || '''Martin Martiška, Matej Lovász''' <br />
|-<br />
|Študijný odbor: || Aplikovaná informatika || 3. bc. ('''2018''') <br />
|}<br />
<br />
== Opis projektu ==<br />
<br />
Cieľom projektu bude vymodelovanie vlaku, a výsledok bude vyzerať ako lokomotíva, ktorá bude mať funkciu svietenia predným svetlom.<br />
Tento projekt sme si zvolili z dôvodu, že sme obaja veľký fanúšikovia vlakov a nikdy sme ako deti nemali možnosť hrať sa s hračkárskym vlakom, ktorý by vedel svietiť predným svetlom. V konečnej fáze bude vlak pozostávať z troch častí a tu sú:<br />
#kolesá<br />
#telo vlaku<br />
#led svetlo napájané batériou<br />
Kolesá a telo budú robené 3D tlačou. Pôvodne sme chceli ešte pridať okná, ktoré by sme vytvorili za pomoci rezania plexiskla. <br />
Telo vlaku sa počas prípravy rozdelilo na 3 časti. Pôvodne sa plánovalo rozdelenie len na dve ale samotné tlačenie určilo, že to budú 3 časti. Konkrétne sú to podvozok, trup rušňa a strecha s komínom.<br />
Svetlo bude možné manuálne zapínať/vypínať za pomoci vypínača, ktorý sa nachádza na spodnej časti podvozku vlaku.<br />
Celé telo vlaku je zhotovené z priehladného filamentu o hrúbke 2 mm kvoli svetelnému efektu z LED diódy. <br />
<br />
Projekt sme vytvárali v prostredí SketchUp a bol rozdelený na niekoľko častí:<br />
* Najskôr je treba určiť parametre lokomotívy, jej podvozku, kolies a svetla<br />
* Ďalej je treba navrhnúť a namodelovať lokomotívu<br />
* Prispôsobiť pre ňu podvozok a kolieska aby sa dali vytlačiť<br />
* Vyspecifikovat potrebny material <BR> vystupom bude zhmotneny napad a aj navod - krok za krokom pre reprodukciu produktu<br />
<br />
== Analýza ==<br />
<br />
Projekt sme sa rozhodli riešiť pomocou prostredia SketchUp. Projekt sme si rozdelili na 2 časti. V prvej časti navrhneme a vyrobíme telo vlaku a v druhej časti do vlaku prirobíme elektrické komponenty. <br><br />
Elektrické komponenty a ich parametre:<br />
#LED dióda - zelená farba<br />
#baterka - lítiová, 3V, model cr2430<br />
#odpor - 27Ω<br />
<br />
== Popis riešenia ==<br />
<br />
Najskôr sme určili za pomoci programu SketchUp parametre jednotlivých častí vlaku. Dĺžka tela lokomotívy bola nastavená na 15.6 cm a šírka 5.6 cm. <br />
<br />
Podvozok musel mať o niečo menšie rozmenry aby sa dal nasunúť do kostry tela zo spodu. <br />
<br />
'''Návrh podvozka'''<br />
[[Súbor:Podvoyek.PNG]]<br />
<br />
Keďže hrúbka stien kostri bola 2 mm, tak šírka podvozku bola 5 cm a dĺžka 15 cm, kôli rezerve. Na kostre nebolo treba spraviť výrezy na kolieska ako sa pôvodne plánovalo, lebo sa nakoniec navrhli, že budú zospodu viď obrázok pod textom. Priemer koliesok sme určili na 2 cm a vnútorný otvor, pre nasunutie na podvozok, sme nastavili na 5 mm.<br />
<br />
'''Nedokončená lokomotíva'''<br />
[[Súbor:NedokoncenyVlak.jpg]]<br />
<br />
Na obrázku je taktiež vidno, že na prvý krát zlyhala funkčnosť tlačiarne a náš subjekt vytlačil len do polovice. Preto sme museli dať tlačiť ešte hornú časť celej lokomotívy. <br />
<br />
Následne sme dotlačené veci prilepili. Potom prišlo na rad vkladanie elektrických komponentov na podvozok. Na obrázku môžeme vidiet schému zapojenia.<br />
<br />
'''Schéma zapojenia'''<br />
[[Súbor:Letka.png]]<br />
<br />
Požili sa vyššie opísané komponenty, ich umiestnenie a spôsob pripojenia je zobrazený na obrázku nižšie.<br />
<br />
'''Spôsob zapojenia<br />
[[Súbor:InstalaciaVlak.jpg]]<br />
<br />
Na spodnej časti podvozku sa vyrezala diera za účelom umiestnenia vypínača, tak aby sa dal vypínať a zapínať zvonka.<br />
<br />
'''Spínač na ovládanie ledky'''<br />
[[Súbor:SpinacVlaku.jpg]]<br />
<br />
=== Výsledok ===<br />
<br />
Výsledný stav lokomotívy môžme vidieť na obrázkoch.<br />
<br />
'''Náhlad zpredu'''<br />
[[Súbor:VlakSvieti2.jpg]]<br />
<br />
S výsledkom sme spokojní aj napriek komplikáciam v procese výroby.<br />
<br />
<br />
'''Zdrojové kódy'''<br />
<br />
Telo vlaku: [[Médiá:Vlak.stl|Telo]]<br />
<br />
Podvozok: [[Médiá:PODVOZEKopraveny_(1).stl|Podvozok]]<br />
<br />
Koleso: [[Médiá:Koleso.stl|Koleso]]<br />
<br />
[[Category:DTV2018]]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Letka.png&diff=9425Súbor:Letka.png2018-05-29T21:23:07Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9424Meteostanica s Nucleo Board2018-05-29T21:18:01Z<p>DVPS: /* Raspbian */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
Tak budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu<br />
* Python a framework Flask (web framework)<br />
<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver a iné.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť.<br />
<br />
= '''Literatúra''' =<br />
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Meteostanica_s_Nucleo_Board&diff=9423Meteostanica s Nucleo Board2018-05-29T21:17:16Z<p>DVPS: /* Vízia komplexnej aplikácie Meteostanice */</p>
<hr />
<div>__NOTOC__<br />
<br />
'''Balogh:''' <br />
* výborne opísané senzory, tak som si to predstavoval <br />
* výstup vlastne neviem aký by z toho mal byť<br />
* dokumentácia je zrejme nedokončená<br />
<br />
<br />
{|<br />
|'''Autori:'''|| Kamila Vavríková, Martin Herceg <br />
|-<br />
|'''Študijný odbor:'''|| Aplikovaná mechatronika a elektromobilita || 1. Ing. (2018) <br />
|}<br />
<br />
<br />
__TOC__<br />
<br />
<br />
= '''Zadanie''' =<br />
<br />
Využitím dosky '''''X. MEMS Inertial Nucleo board''''' zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak. <br />
<br />
<br />
=== Úlohy ===<br />
* Nájdite si k senzorom datasheet<br />
* Nájdite si schémy zapojenia dosky<br />
* Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke<br />
* Napíšte základný demonštračný program využívajúci vaše funkcie<br />
* Vymyslite a demonštrujte vhodnú aplikáciu<br />
<br />
<br />
<br />
= '''Komponenty''' =<br />
<br />
Na vypracovanie sme použili nasledujúce komponenty:<br />
* 1 x Vývojovú dosku X-NUCLEO-IKS01A1<br />
* 1 x Vývojová doska Acrob<br />
* 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin<br />
* 1 x Mini USB kábel<br />
* Prepojovacie kábliky<br />
* Software - Arduino IDE<br />
<br />
<br />
== '''Doska X-NUCLEO-IKS01A1''' ==<br />
Je MEMs inerciálna vývojová doska, ktorá môže byť použitá na rozšírenie systému SMT32 Nucleo. Je tiež kompatibilná s Arduino UNO R3. <br />
<br />
[[Súbor:X-Nucleo-IKS01A1.jpg | 500px]]<br />
::::'''Obr. 1: Vývojová doska X-Nucleo-IKS01A1'''<br />
<br />
<br />
'''Zoznam senzorov, ktoré sa nachádzajú na doske:'''<br />
* LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)<br />
* LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)<br />
* LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer<br />
* HTS221: capacitive digital relative humidity and temperature<br />
<br />
<br />
<br />
== '''Vývojová doska Acrob (Arduino Compatible Robot)''' ==<br />
Jedná sa o riadiacú jednotku s mikropocesorom ATmga328 s 32KB Flash pamäte, 2KB SRAM pamäte a 1 KB EEPROM pamäte. Dosku je možné programovať v jazyku C alebo Arduino a teda je možné ju programovať pomocou Arduino IDE. <br />
<br />
<br />
[[Súbor:AcrobBoard.jpg]]<br />
:::::'''Obr. 2: Vývojová doska Acrob'''<br />
<br />
<br />
Technické parametre vývojovej dosky nájdete tu: [http://senzor.robotika.sk/sensorwiki/index.php/Acrob_technical_description Klik]<br />
<br />
<br />
<br />
== '''Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin''' ==<br />
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.<br />
<br />
[[Súbor:Basic_Breakout_5V.jpg|250px]]<br />
::'''Obr. 3: Basic Breakout 5V'''<br />
<br />
<br />
Technické parametre nájdete tu: [https://www.sparkfun.com/products/9716 klik]<br />
<br />
<br />
= '''Analýza''' =<br />
Na realizáciu Meteostanice, ktorá bude merať teplotu vzduchu, atmosferický tlak a vlhkosť vzduchu sme využili senzor '''HTS221''' a senzor '''LPS25HB*''' Na komunikáciu budeme využívať '''zbernicu I2C'''.<br />
<br />
<br />
== '''Zbernica I2C''' ==<br />
<br />
I2C je dvojvodičová obojsmerná sériová zbernica používajúca vodiče SCL a SDA. Úlohou '''SCL''' vodiča je prenášať hodinové signály, úlohou '''SDA''' vodiča je prenášať sériové dáta. Na komunikáciu využíva master - slave komunikáciu. <br />
<br />
Obe linky (SDA, SCL) musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch. Pokiaľ by došlo ku kolízii, poškodili by sa iba úrovne signálu a nie vysielacie obvody. Spätnou väzbou je zaistené, že obvod môže pracovať aj ako vysielač, aj ako prijímač.<br />
<br />
[[Súbor:I2C-vysiela-primac.png]]<br />
:::::'''Obr. 4: Zapojenie liniek'''<br />
<br />
<br />
V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit. Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.<br />
<br />
[[Súbor:I2c-prenos_bitov.png]]<br />
::::::'''Obr. 5: Prenos bitu po zbernici I2C'''<br />
<br />
<br />
K označeniu začiatku a konca prenosu nie sú používané prídavné riadiace linky, ale dva špeciálne stavy zbernice. ŠTART prenosu (S) je oznámený zostupnou hranou SDA pri SLC=1. STOP prenosu (P) je definovaný nábežnou hranou SDA pri SLC=1. Pokiaľ je zbernica v neaktívnom stave, sú signály SDA a SLC v log. 1 (jednotke).<br />
<br />
[[Súbor:I2c-startstop_bit.png]]<br />
:::::'''Obr. 6: START a STOP bit pri I2C zbernici'''<br />
<br />
<br />
Pri prenose nie je počet dátových bitov prenesených medzi START a STOP z vysielača do prijímača obmedzený. Každý dátový bajt (8bitov) je nasledovaný jedným potvrdzovacím bitom ACK (A). ACK predstavuje log. 0 (nulu) vloženú na zbernicu prijímačom, spojenú s potvrdzovacím hodinovým impulzom. Prijímač, ktorý je adresovaný, musí generovať ACK po prijatí každého bajtu.<br />
<br />
<br />
[[Súbor:I2C-ACK.png]]<br />
:::::::::'''Obr. 7: Potvrdzovací ACK bit pri zbernici I2C'''<br />
<br />
<br />
V našom projekte je doska Acrob master a senzory HTS221 a LPS25HB* sú podriadené (slave). Master môže z podriadeného zariadenia údaje čítať alebo naň údaje zapisovať. Prenos údajov môže začať iba Master zariadenie.<br />
<br />
<br />
Viac informácií o I2C zbernici je možné nájsť napr. na:<br />
* [https://www.scribd.com/document/86999221/I2C-UM10204 I2C-bus specification and user manual]<br />
* [http://dlnware.com/theory/I2C-Address-Allocation-Table I2C Address Allocation Table ]<br />
<br />
<br />
== '''Senzor HTS221''' ==<br />
<br />
HTS221 sníma relatívnu vlhkosť a teplotu vzduchu. Obsahuje snímač a zmiešaný signál ASIC na poskytovanie informácií o meraní prostredníctvom digitálnych sériových rozhraní. Snímač pozostáva z dielektrickej štruktúry kondenzátora, ktorá je schopná detekovať zmeny relatívnej vlhkosti. Na komunikáciu používa I2C alebo SPI zbernicu.<br />
<br />
[[Súbor:Puzdro-hts221.PNG]]<br />
::::'''Obr. 8: Púzdro senzora HTS221'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -40 až +120 °C<br />
* Rozsah merania vlhkosti: 0 až 100%<br />
* Presnosť merania teploty: ±0,5 °C, 15 až +40°C<br />
* Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:HTS221-color.PNG]]<br />
:::::::::'''Obr. 9: Schéma zapojenia HTS221'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:HTS221-pin_connection.png]]<br />
::::::::::::'''Obr. 10: Rozloženie pinov HTS221'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Ako sme už spomínali vyššie senzor HTS221 v pracuje ako podriadený (v režime slave) a doska Acrob pracuje ako pán (v režime master). Štartovacia transakcia na zbernici začína cez signál START (ST). Po štartovacej podmienke sa vysiela na zbernicu 7 bit číslo ktoré predstavuje adresu slave zariadenia s ktorým chceme komunikovať. Adresa slave zariadenia je doplnená 1 bitom (Read / Write). Na obrázku môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
[[Súbor:I2C_address_-_HTS221.png]]<br />
:::::::::'''Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
== '''Senzor LPS25HB*''' ==<br />
<br />
LPS25HB je piezoelektrický snímač absolútneho tlaku, ktorý funguje ako digitálny výstupný barometer. Zariadenie obsahuje senzorový prvok a rozhranie IC, ktoré komunikuje cez I2C alebo SPI zo snímacieho prvku s aplikáciou. Senzor taktiež umožňuje získavať dáta o teplote.<br />
<br />
[[Súbor:Pyzdro-LPS25HB.PNG]]<br />
::::'''Obr. 12: Púzdro senzora LPS25HB'''<br />
<br />
<br />
'''Parametre:'''<br />
<br />
* Napájacie napätie: 1,7 až 3,6 V<br />
* Prevádzková teplota: -30 až +105 °C<br />
* Rozsah merania tlaku: 260 až 1260 hPa<br />
* Presnosť merania tlaku: ±1 hPa, 0 až +80°C<br />
<br />
<br />
'''Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):'''<br />
<br />
[[Súbor:LPS25HB-color.PNG]]<br />
:::::::::'''Obr. 13: Schéma zapojenia LPS25HB'''<br />
<br />
<br />
'''Rozloženie pinov senzora:'''<br />
<br />
[[Súbor:LPS25HB-pin_conection.PNG]]<br />
:::::::::::::::'''Obr. 14: Rozloženie pinov LPS25HB'''<br />
<br />
<br />
'''Komunikácia pomocou I2C zbernice:'''<br />
<br />
Tak isto ako v prípade senzora HTS221 aj senzor LPS25H pracuje ako podriadený (v režime slave). taktiež princíp je rovnaký čiže štartovacia transakcia začína signálom START (ST) - kde sa vysiela na zbernicu 7 bit číslo (adresa slave zariadenia). Táto adresa je ďalej doplnená jedným bitom (R/W).<br />
<br />
Adresa slave (SAD) priradená k LPS25HB je 101110xb. SDO / SA0 sa môže použiť na zmenu menej významného bitu adresy zariadenia. Ak je SA0 pripojená k napájaciemu zdroju, LSb je '1' (adresa 1011101b), inak, ak je SA0 pripojená k zemi, hodnota LSb je '0' (adresa 1011100b). Toto riešenie umožňuje pripojiť a osloviť dve rôzne zariadenia LPS25HB na rovnakých linkách I2C.<br />
<br />
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.<br />
<br />
<br />
[[Súbor:I2C_address_-_LPS25HB.png]]<br />
:::::::::'''Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB'''<br />
<br />
<br />
Údaje sa prenášajú v bajtovom formáte (DATA). Každý prenos údajov obsahuje 8 bitov. Počet prenesených bajtov na prenos je neobmedzený. Údaje sa najskôr prenášajú najvýznamnejším bitom (MSB).<br />
<br />
<br />
'''Interpretovanie údajov o tlaku:'''<br />
<br />
Údaje o tlaku sú uložené v 3 registroch:<br />
* PRESS_OUT_H (2Ah)<br />
* PRESS_OUT_L (29h)<br />
* PRESS_OUT_XL (28h)<br />
<br />
<br />
Hodnota je vyjadrená ako dvojkový doplnok, číže ak chceme získať tlak v hPa, zoberieme dvojkový doplnok slova a podelíme ho hodnotou 4096 hPa.<br />
<br />
<br />
[[Súbor:LPS25HB-vyppocet_tlaku.png]]<br />
:::::::'''Obr. 16: Výpočet hodnoty tlaku - LPS25HB'''<br />
<br />
<br />
= '''Riešenie''' =<br />
Po zoznámení sa z jednotlivými komponentami, ktoré potrebuje na zostavenie výslednej aplikácie sme sa pustili do zapájania hardware-ových častí. Zapojenie vývojových dosiek môžeme vidieť na obrázku (Obr. 17). Napájanie je realizované pomocou mini USB kábla, ktorý sa pripája do plošnej dosky Basic Breakout 5V (Sparkfun DEV-09716), ktorá je pripojená na rozhranie FTDI na vývojovej doske Acrob.<br />
<br />
<br />
[[Súbor:Diagram_zapojenia-iks01A1_to_acrob.png]]<br />
:::::::::::::::'''Obr. 17: Znázornenie zapojenia HW komponentov'''<br />
<br />
<br />
'''Fotky z fyzickej realizácie zapojenia:'''<br />
<gallery><br />
Súbor:Meteo-nucleo_pohlad_z_hora.jpg| Pohľad z hora<br />
Súbor:Meteo-nucleo_pohlad_z_boku.jpg| Pohľad z boku<br />
</gallery><br />
<br />
<br />
=== Algoritmus a program ===<br />
<br />
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.<br />
<br />
Zdrojový súbor aplikácie: [[Médiá:Meteo-nucleo.c|meteo-nucleo.c]]<br />
<br />
<br />
'''Vývojový diagram programu:'''<br />
<br />
<br />
[[Súbor:Diagram_meteo-nucleo.jpg]]<br />
::'''Obr. 18: Vývojový diagram aplikácie'''<br />
<br />
<br />
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu. <br />
<br />
<br />
<br />
'''Zdrojový kód aplikácie:''' <br />
<source lang="C++"><br />
/**<br />
* Source code: Arduino IDE<br />
*/<br />
<br />
<br />
// Includes libraries for HTS221 and LPS25HB sensors.<br />
#include <HTS221Sensor.h><br />
#include <LPS25HBSensor.h><br />
<br />
// Includes library for I2C communicate<br />
#include <Wire.h><br />
<br />
// Defining symbolic constants<br />
#define DEV_I2C Wire<br />
#define SerialPort Serial<br />
<br />
// Components<br />
HTS221Sensor *HumTemp;<br />
LPS25HBSensor *PressTemp;<br />
<br />
void setup()<br />
{<br />
// Initialize serial for output.<br />
SerialPort.begin(115200);<br />
<br />
// Initialize I2C bus.<br />
DEV_I2C.begin();<br />
<br />
// Initlialize components.<br />
HumTemp = new HTS221Sensor (&DEV_I2C);<br />
HumTemp->Enable();<br />
<br />
PressTemp = new LPS25HBSensor(&DEV_I2C);<br />
PressTemp->Enable();<br />
<br />
// Prints text to the serial port <br />
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");<br />
SerialPort.print("\n");<br />
SerialPort.print("| ----------------------------------- |");<br />
SerialPort.print("\n");<br />
}<br />
<br />
void loop() <br />
{<br />
// Read humidity and temperature.<br />
float humidity, temperature;<br />
HumTemp->GetHumidity(&humidity);<br />
HumTemp->GetTemperature(&temperature);<br />
<br />
// Read pressure.<br />
float pressure, temperature2;<br />
PressTemp->GetPressure(&pressure);<br />
PressTemp->GetTemperature(&temperature2);<br />
<br />
// // Prints otput data to the serial port<br />
SerialPort.print(" Vlhkost vzduchu : ");<br />
SerialPort.print(humidity, 2);<br />
SerialPort.print(" [%] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Teplota vzduchu : ");<br />
SerialPort.print(temperature, 2);<br />
SerialPort.print(" [C] ");<br />
SerialPort.print("\n");<br />
<br />
SerialPort.print(" Atmosfericky tlak : ");<br />
SerialPort.print(pressure, 2);<br />
SerialPort.print(" [hPa] ");<br />
SerialPort.print("\n\n");<br />
<br />
delay(5000);<br />
}<br />
</source><br />
<br />
<br />
'''Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:'''<br />
<br />
Obidve funkcie sú súčasťou arduino knižnice podporujúcej senzor HTS221. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the temperature<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)<br />
{<br />
int16_t int16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
<source lang="c++"><br />
/**<br />
* @brief Read HTS221 output register, and calculate the humidity<br />
* @param pfData the pointer to data output<br />
* @retval HTS221_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)<br />
{<br />
uint16_t uint16data = 0;<br />
<br />
// Read data from HTS221.<br />
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )<br />
{<br />
return HTS221_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )uint16data / 10.0f;<br />
<br />
return HTS221_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/HTS221 stm32duino / HTS221]<br />
<br />
<br />
'''Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:'''<br />
<br />
Funkcia je súčasťou arduino knižnice podporujúcej senzor LPS25HB. Knižnicu je možné stiahnúť z oficiálneho repozitára stm32duino na githube. <br />
<br />
<source lang="c"><br />
/**<br />
* @brief Read LPS25HB output register, and calculate the pressure in mbar<br />
* @param pfData the pressure value in mbar<br />
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise<br />
*/<br />
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)<br />
{<br />
int32_t int32data = 0;<br />
<br />
// Read data from LPS25HB.<br />
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )<br />
{<br />
return LPS25HB_STATUS_ERROR;<br />
}<br />
<br />
*pfData = ( float )int32data / 100.0f;<br />
<br />
return LPS25HB_STATUS_OK;<br />
}<br />
</source><br />
<br />
Github link: [https://github.com/stm32duino/LPS25HB stm32duino / LPS25HB]<br />
<br />
<br />
== '''Overenie''' ==<br />
<br />
Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.<br />
<br />
[[Súbor:Serial-monitor_meteo-nucleo.png]]<br />
:::::::'''Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor'''<br />
<br />
<br />
<br />
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.<br />
Na jednotlivých grafom môžeme vidieť piky, ktoré sú spôsobené testovaním senzorov a to tým spôsobom, že sme dýchli na senzory, čím sa zmenila teplota vzduchu, vlhkosť vzduchu a tlak vzduchu.<br />
<br />
[[Súbor:untitled1.jpg | 450px]]<br />
[[Súbor:untitled2.jpg | 450px]]<br />
[[Súbor:untitled.jpg | 450px]]<br />
<br />
<br />
Uložené dáta z ktorých boli vykreslené grafy: [[Média:Data-meteo-nucleo.txt|data.txt]]<br />
<br />
Zdrojový kód (Matlab): [[Médiá:ZadanieGrafy.m|grafy.m]]<br />
<br />
<br />
= '''Vízia komplexnej aplikácie Meteostanice''' =<br />
Keďže takto realizovaná aplikácia Meteostanice, nie je moc vhodná na použitie v reálnom svete, popíšeme si ako by sme inak mohli realizovať takúto aplikáciu. Keďže chceme aby aplikácia komplexne navrhnutá, čo znamená, že okrem čítania dát zo senzorov chceme aby vedela aj ukladať namerané dáta napr. do databázy, ďalej aby vedela jednoduchých spôsobom zobrazovať aktuálne hodnoty (ale aj hodnoty namerané v minulosti) napr. prostredníctvom webovej aplikácie, kde by sme si mohli tieto dáta prezerať, prípadne sa pozrieť na grafický priebeh vývoja hodnôt v čase. Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť. Čo teda potrebujeme na to aby sme si vedeli takúto aplikáciu urobiť?<br />
<br />
<br />
No keď si to podrobnejšie rozoberieme, tak určite budeme potrebovať nejaký web server s databázou, ktorý niekde budeme musieť nainštalovať. Na to by sme mohli použiť napríklad jednodoskový počítač Raspberry Pi 3. Raspberry pi je počítač, na ktorom môže bežať operačný systém založený na báze linuxu, najčastejšie to je operačný systém '''Raspbian''' a je možné naň inštalovať rôzny software. Viac o Rasperry Pi je možné sa dočítať napr. na oficiálnych stránkach tu: [https://www.raspberrypi.org/ Klik].<br />
<br />
Tak budeme potrebovať nainštalovať:<br />
* Samotný operačný systém Raspbian<br />
* Databázu<br />
* Python a framework Flask (web framework)<br />
<br />
== '''Raspbian''' ==<br />
Informácie ako nainštalovať operačný systém raspbian nájdeme dokumentačných stránkach tu: [https://www.raspberrypi.org/documentation/installation/installing-images/ Instaling operating system images]<br />
<br />
<br />
== '''Databáza''' ==<br />
<br />
Použijeme napr. MySQL databázový server, ktorý má podporu prácu s databázou z pythonu. Samozrejme po nainštalovaní bude potrebné databázu nakonfigurovať, ako napr. nastavenie hesla a pod. Taktiež pre prácu z databázou je vhodné si nainštalovať aj nejakého databázového klienta ako napr. HeidiSQL (Windows), MySQL Workbench, DBeaver a iné.<br />
<br />
<br />
'''Inštalácia databázového servera na Raspebrry Pi:'''<br />
<source lang="bash"><br />
sudo apt-get install mysql-server python-mysqldb<br />
</source><br />
<br />
Zdroje:<br />
* [https://www.mysql.com/ MySQL Official Page]<br />
* [http://raspberrywebserver.com/sql-databases/using-mysql-on-a-raspberry-pi.html Using MySQL on a Raspberry Pi]<br />
<br />
<br />
== '''Python a Flask''' ==<br />
Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone. <br />
<br />
<br />
'''Inštalácia mikro web frameworku Flask:'''<br />
<source lang="bash"><br />
sudo apt-get install python-pip<br />
pip install flask<br />
</source><br />
<br />
<br />
Zdroje:<br />
* [https://www.python.org/ Official Python Page]<br />
* [http://flask.pocoo.org/ Official Flask Page]<br />
* [https://naucse.python.cz/lessons/intro/flask/ Webové aplikace vo Flask]<br />
* [https://sjaustirni.gitbooks.io/vy-py/content/content/1-instalacia-a-priprava/#in%C5%A1tal%C3%A1cia-a-pr%C3%ADprava Inštalácia a príprava flask]<br />
<br />
<br />
'''Inštalácia podpory pre websockety:'''<br />
<br />
<source lang="bash"><br />
sudo pip install eventlet<br />
sudo pip install flask-socketio<br />
</source><br />
<br />
<br />
'''Adresárová štruktúra flask aplikácie:'''<br />
<source lang="bash"><br />
/meteo-nucleo<br />
├── app.py<br />
├── config.cfg<br />
├── templates/<br />
│ ├── index.html<br />
└── static/<br />
└── style.css<br />
</source><br />
<br />
<br />
* app.py - samotná aplikácia napísaná vo Flask (pythone)<br />
* config.cfg - konfiguračný súbor pre databázu<br />
* index.html - html šablona webovej aplikácie<br />
* style.css - kaskádové štýly webovej aplikácie<br />
<br />
<br />
'''Obsah súboru:''' ''app.py''<br />
<source lang="python"><br />
from flask import Flask, render_template<br />
import MySQLdb <br />
import ConfigParser<br />
<br />
app = Flask(__name__)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.read('config.cfg')<br />
<br />
# Configuration Database<br />
myhost = config.get('mysqlDB', 'host')<br />
myuser = config.get('mysqlDB', 'user')<br />
mypasswd = config.get('mysqlDB', 'passwd')<br />
mydb = config.get('mysqlDB', 'db')<br />
<br />
<br />
# TODO: Source codes our application Meteo - Nucleo<br />
# TODO: Read data from sensors HTS221 and LPS25HB<br />
# TODO: Save data to Database<br />
# TODO: Other codes<br />
# ...<br />
<br />
<br />
@app.route('/')<br />
def index():<br />
return render_template('index.html', async_mode=socketio.async_mode)<br />
<br />
if __name__ == '__main__':<br />
app.run(host="0.0.0.0", port=80, debug=True)<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''config.cfg''<br />
<source lang="text"><br />
[mysqlDB]<br />
host = localhost<br />
db = databaseName<br />
user = userName<br />
passwd = userPassword<br />
</source><br />
<br />
<br />
'''Obsah súboru:''' ''templates/index.html''<br />
<source lang="html"><br />
host = localhost<!DOCTYPE HTML><br />
<html><br />
<head><br />
<title>Application Name</title><br />
<!--<br />
...<br />
--><br />
</head><br />
<br />
<body><br />
<h1>Our Application Meteo- Nucleo</h1><br />
<!-- <br />
TODO: Display value from sensors<br />
TODO: Display progress of the measured values in the charts<br />
<br />
...<br />
--><br />
</body><br />
</html><br />
</source><br />
<br />
Zdroje:<br />
* [https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent Easy WebSockets with Flask and Gevent]<br />
* [https://tutorials.technology/tutorials/61-Create-an-application-with-websockets-and-flask.html Create an application with websockets and flask]<br />
* [https://www.zdrojak.cz/clanky/web-sockets/ Web Sockets]<br />
<br />
<br />
Na realizáciu by sme mohli využiť namiesto vývojovej dosky Acrob, Raspberry Pi 3, ku ktorému by sme pripojili dosku X-NUCLEO-IKS01A1. Ako prepojiť tieto dve zariadenia je popísané napr. na stránke tu: [http://hackman.club/temperature-and-humidity-with-x-nucleo-iks01a1-hts221/ klik], kde je aj popísané akým spôsobom by bolo realizované čítanie dát zo senzora HTS221, prostredníctvom I2C zbernice. Obdobne by sme realizovali aj čítanie dát so senzora LPS25HB či ostatných senzorov nachádzajúcich sa na vývojovej doske NUCLEO-IKS01A1.<br />
<br />
<br />
Takto realizovaná aplikácia by sa už dala v reálnom svete celkom dobre použiť.<br />
<br />
= '''Literatúra''' =<br />
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.<br />
<br />
__TOC__</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Vlak&diff=9422Vlak2018-05-29T21:12:48Z<p>DVPS: </p>
<hr />
<div>{|<br />
|Autori: || '''Martin Martiška, Matej Lovász''' <br />
|-<br />
|Študijný odbor: || Aplikovaná informatika || 3. bc. ('''2018''') <br />
|}<br />
<br />
== Opis projektu ==<br />
<br />
Cieľom projektu bude vymodelovanie vlaku, a výsledok bude vyzerať ako lokomotíva, ktorá bude mať funkciu svietenia predným svetlom.<br />
Tento projekt sme si zvolili z dôvodu, že sme obaja veľký fanúšikovia vlakov a nikdy sme ako deti nemali možnosť hrať sa s hračkárskym vlakom, ktorý by vedel svietiť predným svetlom. V konečnej fáze bude vlak pozostávať z troch častí a tu sú:<br />
#kolesá<br />
#telo vlaku<br />
#led svetlo napájané batériou<br />
Kolesá a telo budú robené 3D tlačou. Pôvodne sme chceli ešte pridať okná, ktoré by sme vytvorili za pomoci rezania plexiskla. <br />
Telo vlaku sa počas prípravy rozdelilo na 3 časti. Pôvodne sa plánovalo rozdelenie len na dve ale samotné tlačenie určilo, že to budú 3 časti. Konkrétne sú to podvozok, trup rušňa a strecha s komínom.<br />
Svetlo bude možné manuálne zapínať/vypínať za pomoci vypínača, ktorý sa nachádza na spodnej časti podvozku vlaku.<br />
Celé telo vlaku je zhotovené z priehladného filamentu o hrúbke 2 mm kvoli svetelnému efektu z LED diódy. <br />
<br />
Projekt sme vytvárali v prostredí SketchUp a bol rozdelený na niekoľko častí:<br />
* Najskôr je treba určiť parametre lokomotívy, jej podvozku, kolies a svetla<br />
* Ďalej je treba navrhnúť a namodelovať lokomotívu<br />
* Prispôsobiť pre ňu podvozok a kolieska aby sa dali vytlačiť<br />
* Vyspecifikovat potrebny material <BR> vystupom bude zhmotneny napad a aj navod - krok za krokom pre reprodukciu produktu<br />
<br />
== Analýza ==<br />
<br />
Projekt sme sa rozhodli riešiť pomocou prostredia SketchUp. Projekt sme si rozdelili na 2 časti. V prvej časti navrhneme a vyrobíme telo vlaku a v druhej časti do vlaku prirobíme elektrické komponenty. <br><br />
Elektrické komponenty a ich parametre:<br />
#LED dióda - zelená farba<br />
#baterka - lítiová, 3V, model cr2430<br />
#odpor - 27Ω<br />
<br />
== Popis riešenia ==<br />
<br />
Najskôr sme určili za pomoci programu SketchUp parametre jednotlivých častí vlaku. Dĺžka tela lokomotívy bola nastavená na 15.6 cm a šírka 5.6 cm. <br />
<br />
Podvozok musel mať o niečo menšie rozmenry aby sa dal nasunúť do kostry tela zo spodu. <br />
<br />
'''Návrh podvozka'''<br />
[[Súbor:Podvoyek.PNG]]<br />
<br />
Keďže hrúbka stien kostri bola 2 mm, tak šírka podvozku bola 5 cm a dĺžka 15 cm, kôli rezerve. Na kostre nebolo treba spraviť výrezy na kolieska ako sa pôvodne plánovalo, lebo sa nakoniec navrhli, že budú zospodu viď obrázok pod textom. Priemer koliesok sme určili na 2 cm a vnútorný otvor, pre nasunutie na podvozok, sme nastavili na 5 mm.<br />
<br />
'''Nedokončená lokomotíva'''<br />
[[Súbor:NedokoncenyVlak.jpg]]<br />
<br />
Na obrázku je taktiež vidno, že na prvý krát zlyhala funkčnosť tlačiarne a náš subjekt vytlačil len do polovice. Preto sme museli dať tlačiť ešte hornú časť celej lokomotívy. <br />
<br />
Následne sme dotlačené veci prilepili. Potom prišlo na rad vkladanie elektrických komponentov na podvozok. Na obrázku môžeme vidiet schému zapojenia.<br />
<br />
'''Schéma zapojenia'''<br />
[[Súbor:ZapojenieElVlak.png]]<br />
<br />
Požili sa vyššie opísané komponenty, ich umiestnenie a spôsob pripojenia je zobrazený na obrázku nižšie.<br />
<br />
'''Spôsob zapojenia<br />
[[Súbor:InstalaciaVlak.jpg]]<br />
<br />
Na spodnej časti podvozku sa vyrezala diera za účelom umiestnenia vypínača, tak aby sa dal vypínať a zapínať zvonka.<br />
<br />
'''Spínač na ovládanie ledky'''<br />
[[Súbor:SpinacVlaku.jpg]]<br />
<br />
=== Výsledok ===<br />
<br />
Výsledný stav lokomotívy môžme vidieť na obrázkoch.<br />
<br />
'''Náhlad zpredu'''<br />
[[Súbor:VlakSvieti2.jpg]]<br />
<br />
S výsledkom sme spokojní aj napriek komplikáciam v procese výroby.<br />
<br />
<br />
'''Zdrojové kódy'''<br />
<br />
Telo vlaku: [[Médiá:Vlak.stl|Telo]]<br />
<br />
Podvozok: [[Médiá:PODVOZEKopraveny_(1).stl|Podvozok]]<br />
<br />
Koleso: [[Médiá:Koleso.stl|Koleso]]<br />
<br />
[[Category:DTV2018]]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Vlak&diff=9421Vlak2018-05-29T21:12:04Z<p>DVPS: </p>
<hr />
<div>{|<br />
|Autori: || '''Martin Martiška, Matej Lovász''' <br />
|-<br />
|Študijný odbor: || Aplikovaná informatika || 3. bc. ('''2018''') <br />
|}<br />
<br />
== Opis projektu ==<br />
<br />
Cieľom projektu bude vymodelovanie vlaku, a výsledok bude vyzerať ako lokomotíva, ktorá bude mať funkciu svietenia predným svetlom.<br />
Tento projekt sme si zvolili z dôvodu, že sme obaja veľký fanúšikovia vlakov a nikdy sme ako deti nemali možnosť hrať sa s hračkárskym vlakom, ktorý by vedel svietiť predným svetlom. V konečnej fáze bude vlak pozostávať z troch častí a tu sú:<br />
#kolesá<br />
#telo vlaku<br />
#led svetlo napájané batériou<br />
Kolesá a telo budú robené 3D tlačou. Pôvodne sme chceli ešte pridať okná, ktoré by sme vytvorili za pomoci rezania plexiskla. <br />
Telo vlaku sa počas prípravy rozdelilo na 3 časti. Pôvodne sa plánovalo rozdelenie len na dve ale samotné tlačenie určilo, že to budú 3 časti. Konkrétne sú to podvozok, trup rušňa a strecha s komínom.<br />
Svetlo bude možné manuálne zapínať/vypínať za pomoci vypínača, ktorý sa nachádza na spodnej časti podvozku vlaku.<br />
Celé telo vlaku je zhotovené z priehladného filamentu o hrúbke 2 mm kvoli svetelnému efektu z LED diódy. <br />
<br />
Projekt sme vytvárali v prostredí SketchUp a bol rozdelený na niekoľko častí:<br />
* Najskôr je treba určiť parametre lokomotívy, jej podvozku, kolies a svetla<br />
* Ďalej je treba navrhnúť a namodelovať lokomotívu<br />
* Prispôsobiť pre ňu podvozok a kolieska aby sa dali vytlačiť<br />
* Vyspecifikovat potrebny material <BR> vystupom bude zhmotneny napad a aj navod - krok za krokom pre reprodukciu produktu<br />
<br />
== Analýza ==<br />
<br />
Projekt sme sa rozhodli riešiť pomocou prostredia SketchUp. Projekt sme si rozdelili na 2 časti. V prvej časti navrhneme a vyrobíme telo vlaku a v druhej časti do vlaku prirobíme elektrické komponenty. <br><br />
Elektrické komponenty a ich parametre:<br />
#LED dióda - zelená farba<br />
#baterka - lítiová, 3V, model cr2430<br />
#odpor - 27Ω<br />
<br />
== Popis riešenia ==<br />
<br />
Najskôr sme určili za pomoci programu SketchUp parametre jednotlivých častí vlaku. Dĺžka tela lokomotívy bola nastavená na 15.6 cm a šírka 5.6 cm. <br />
<br />
Podvozok musel mať o niečo menšie rozmenry aby sa dal nasunúť do kostry tela zo spodu. <br />
<br />
'''Návrh podvozka'''<br />
[[Súbor:Podvoyek.PNG]]<br />
<br />
Keďže hrúbka stien kostri bola 2 mm, tak šírka podvozku bola 5 cm a dĺžka 15 cm, kôli rezerve. Na kostre nebolo treba spraviť výrezy na kolieska ako sa pôvodne plánovalo, lebo sa nakoniec navrhli, že budú zospodu viď obrázok pod textom. Priemer koliesok sme určili na 2 cm a vnútorný otvor, pre nasunutie na podvozok, sme nastavili na 5 mm.<br />
<br />
'''Nedokončená lokomotíva'''<br />
[[Súbor:NedokoncenyVlak.jpg]]<br />
<br />
Na obrázku je taktiež vidno, že na prvý krát zlyhala funkčnosť tlačiarne a náš subjekt vytlačil len do polovice. Preto sme museli dať tlačiť ešte hornú časť celej lokomotívy. <br />
<br />
Následne sme dotlačené veci prilepili. Potom prišlo na rad vkladanie elektrických komponentov na podvozok. Na obrázku môžeme vidiet schému zapojenia.<br />
<br />
'''Schéma zapojenia'''<br />
[[Súbor:ZapojenieElVlak.png]]<br />
<br />
Požili sa vyššie opísané komponenty, ich umiestnenie a spôsob pripojenia je zobrazený na obrázku nižšie.<br />
<br />
'''Spôsob zapojenia<br />
[[Súbor:InstalaciaVlak.jpg]]<br />
<br />
Na spodnej časti podvozku sa vyrezala diera za účelom umiestnenia vypínača, tak aby sa dal vypínať a zapínať zvonka.<br />
<br />
'''Spínač na ovládanie ledky'''<br />
[[Súbor:SpinacVlaku.jpg]]<br />
<br />
=== Výsledok ===<br />
<br />
Výsledný stav lokomotívy môžme vidieť na obrázkoch.<br />
<br />
'''Náhlad zpredu'''<br />
[[Súbor:VlakSvieti2.jpg]]<br />
<br />
S výsledkom sme spokojní aj napriek komplikáciam v procese výroby.<br />
<br />
<br />
'''Zdrojové kódy'''<br />
<br />
Telo vlaku: [[Médiá:Vlak.stl]]<br />
<br />
Podvozok: [[Médiá:PODVOZEKopraveny_(1).stl|bono]]<br />
<br />
Koleso: [[Médiá:Koleso.stl]]<br />
<br />
[[Category:DTV2018]]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Vlak.stl&diff=9420Súbor:Vlak.stl2018-05-29T21:10:55Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Koleso.stl&diff=9419Súbor:Koleso.stl2018-05-29T21:10:15Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Dokovacia_stanica&diff=9418Dokovacia stanica2018-05-29T21:09:11Z<p>DVPS: /* Výsledok */</p>
<hr />
<div>{|<br />
|Autori: || '''Andrej Mondočko''' <br />
|-<br />
|Študijný odbor: || Aplikovaná Informatika || 3. Bc. ('''2018''') <br />
|}<br />
<br />
__TOC__<br />
<br />
== Opis projektu ==<br />
<br />
Cieľom projektu bolo vytvoriť funkčnú dokovaciu stanicu pre telefón s určitými parametrami. Tento projekt som si zvolil kvôli tomu, že už dlhšie som rozmýšľal ako mám položený telefón počas nabíjania na okne, odkiaľ sa zošmykoval, nedali sa z neho vyčítať žiadne informácie a bolo to veľmi nepraktické<br />
Pri kreslení tohto produktu som si ho rozdelil na 3 časti: <br />
#Podstava, ktorá drží telefón aby sa neprevrátil<br />
#Opierka pre telefón<br />
#Podpera pre opierku<br />
Celý projekt je tvorený iba 3d tlačou, pričom pôvodne malo ísť o jeden celý kus, no nakoniec kvôli chybe v tlači bolo nutné všetky vyššie spomenuté komponenty vytlačiť zvlášť a zlepiť dokopy.<br />
<br />
<br />
<br />
<br />
<br />
Projekt bol tvorený v prostredí SketchUp ktorý mi prišiel ako jednoduchá voľba, pretože práca v ňom je jednoduchá a je skôr zameraná na estetický vzhľad daného produktu, zároveň aj keď je platený je možnosť 30 dňovej trial verzie, pričom som nebol nútený platiť za tento nástroj. Jednotlivé časti projektu:<br />
#Bolo nutné zvoliť si tvar a veľkosť podstavy vzhľadom na jednotlivý telefón, v spodnej časti som si spravil výrez, do ktorého sa vsunie kábel pre napájanie.<br />
#Opierka, pričom som musel zmerať telefón a podľa toho vymodelovať opierku, kde bolo potrebné spraviť držiak kde bude telefón a zároveň sa doň vsunie kábel s postrannými držiakmi, pre ochranu proti zošmyknutiu do strany<br />
#Podpera, aby som odstránil šancu na zlomenie podpery, ktorá mala byť z jedného kusu no nakoniec to bolo lepené.<br />
<br />
== Popis riešenia ==<br />
Ako prvé som začal modelovať podstavu zvolil som rozmery 14,5cm x 8cm, čo my prišlo primerane veľké vzhľadom na veľkosť telefónu s hrúbkou 1cm, pôvodne mala byť hrúbka menšia a to 0,5cm no kvôli výrezu pre napájací kábel s polomerom 0,5cm to nebolo možné a túto hrúbku som zväčšil. Nakoniec som len zaoblil hrany, aby to nebolo príliš hranaté.<br />
<br />
Ďaľej som modeloval opierku pre telefón s rozmermy 6,8x10cm čo mi prišlo dostatočné k veľkosti telefónu a zároveň som nechcel zbytočne plytvať materiálom. Pri celom modeli som sa snažil aby to bolo jednoduché, aby som nedával dôraz na príliš veľa detailov, ktoré by sa aj tak nakoniec stratili ale zároveň aby to vyzeralo dobre. Ďalej bolo potrebné kvôli bezpečnosti telefónu pridať postranné zábrany, aby telefón držal na mieste, ich vzialenosť je daná podľa šírky telefónu, v mojom prípade 6,8cm s rozdielom oproti telefónu 1mm na každen strane<br />
<br />
Nakoniec som už len doplnil už spomínanú podperu, aby som zaručil že sa výrobok neporuší, je to jednoduchý kváder s výrezom uprostred, čo je len taká dizajnová vsuvka.<br />
Toto je výsledok Modelovania:<br />
[[Súbor:Mondy1.gif|center|300px]]<br />
<br />
Preto som sa objednal na tlač a toto je fotka z nej:<br />
[[Súbor:Mondy2.jpg|center|300px]]<br />
<br />
No, Bohužial tlač sa nezdarila a toto bol výsledok:<br />
[[Súbor:Mondy3.jpg|center|300px]]<br />
<br />
Preto som sa rozhodol zrezať model podla jednej roviny a vytlačiť zvyšné komponenty zvlášť, keďže podstava bola neporušená a neskôr ich zlepiť.<br />
<br />
<br />
<br />
=== Výsledok ===<br />
Po zlepení som dostal takýto výsledok:<br />
[[Súbor:Mondy4.jpg|center|300px]]<br />
<br />
Dokovacia stanica počas nabíjania:<br />
[[Súbor:Mondy5.jpg|center|300px]]<br />
<br />
Pokial vás môj nápad zaujal, môžte si ho sťiahnuť tu. [[Médiá:DokovaciaStanica.stl]]<br />
[[Category:DTV2018]]</div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:DokovaciaStanica.stl&diff=9417Súbor:DokovaciaStanica.stl2018-05-29T21:08:45Z<p>DVPS: </p>
<hr />
<div></div>DVPShttps://senzor.robotika.sk/sensorwiki/index.php?title=Vlak&diff=9416Vlak2018-05-29T21:08:29Z<p>DVPS: </p>
<hr />
<div>{|<br />
|Autori: || '''Martin Martiška, Matej Lovász''' <br />
|-<br />
|Študijný odbor: || Aplikovaná informatika || 3. bc. ('''2018''') <br />
|}<br />
<br />
== Opis projektu ==<br />
<br />
Cieľom projektu bude vymodelovanie vlaku, a výsledok bude vyzerať ako lokomotíva, ktorá bude mať funkciu svietenia predným svetlom.<br />
Tento projekt sme si zvolili z dôvodu, že sme obaja veľký fanúšikovia vlakov a nikdy sme ako deti nemali možnosť hrať sa s hračkárskym vlakom, ktorý by vedel svietiť predným svetlom. V konečnej fáze bude vlak pozostávať z troch častí a tu sú:<br />
#kolesá<br />
#telo vlaku<br />
#led svetlo napájané batériou<br />
Kolesá a telo budú robené 3D tlačou. Pôvodne sme chceli ešte pridať okná, ktoré by sme vytvorili za pomoci rezania plexiskla. <br />
Telo vlaku sa počas prípravy rozdelilo na 3 časti. Pôvodne sa plánovalo rozdelenie len na dve ale samotné tlačenie určilo, že to budú 3 časti. Konkrétne sú to podvozok, trup rušňa a strecha s komínom.<br />
Svetlo bude možné manuálne zapínať/vypínať za pomoci vypínača, ktorý sa nachádza na spodnej časti podvozku vlaku.<br />
Celé telo vlaku je zhotovené z priehladného filamentu o hrúbke 2 mm kvoli svetelnému efektu z LED diódy. <br />
<br />
Projekt sme vytvárali v prostredí SketchUp a bol rozdelený na niekoľko častí:<br />
* Najskôr je treba určiť parametre lokomotívy, jej podvozku, kolies a svetla<br />
* Ďalej je treba navrhnúť a namodelovať lokomotívu<br />
* Prispôsobiť pre ňu podvozok a kolieska aby sa dali vytlačiť<br />
* Vyspecifikovat potrebny material <BR> vystupom bude zhmotneny napad a aj navod - krok za krokom pre reprodukciu produktu<br />
<br />
== Analýza ==<br />
<br />
Projekt sme sa rozhodli riešiť pomocou prostredia SketchUp. Projekt sme si rozdelili na 2 časti. V prvej časti navrhneme a vyrobíme telo vlaku a v druhej časti do vlaku prirobíme elektrické komponenty. <br><br />
Elektrické komponenty a ich parametre:<br />
#LED dióda - zelená farba<br />
#baterka - lítiová, 3V, model cr2430<br />
#odpor - 27Ω<br />
<br />
== Popis riešenia ==<br />
<br />
Najskôr sme určili za pomoci programu SketchUp parametre jednotlivých častí vlaku. Dĺžka tela lokomotívy bola nastavená na 15.6 cm a šírka 5.6 cm. <br />
<br />
Podvozok musel mať o niečo menšie rozmenry aby sa dal nasunúť do kostry tela zo spodu. <br />
<br />
'''Návrh podvozka'''<br />
[[Súbor:Podvoyek.PNG]]<br />
<br />
Keďže hrúbka stien kostri bola 2 mm, tak šírka podvozku bola 5 cm a dĺžka 15 cm, kôli rezerve. Na kostre nebolo treba spraviť výrezy na kolieska ako sa pôvodne plánovalo, lebo sa nakoniec navrhli, že budú zospodu viď obrázok pod textom. Priemer koliesok sme určili na 2 cm a vnútorný otvor, pre nasunutie na podvozok, sme nastavili na 5 mm.<br />
<br />
'''Nedokončená lokomotíva'''<br />
[[Súbor:NedokoncenyVlak.jpg]]<br />
<br />
Na obrázku je taktiež vidno, že na prvý krát zlyhala funkčnosť tlačiarne a náš subjekt vytlačil len do polovice. Preto sme museli dať tlačiť ešte hornú časť celej lokomotívy. <br />
<br />
Následne sme dotlačené veci prilepili. Potom prišlo na rad vkladanie elektrických komponentov na podvozok. Na obrázku môžeme vidiet schému zapojenia.<br />
<br />
'''Schéma zapojenia'''<br />
[[Súbor:ZapojenieElVlak.png]]<br />
<br />
Požili sa vyššie opísané komponenty, ich umiestnenie a spôsob pripojenia je zobrazený na obrázku nižšie.<br />
<br />
'''Spôsob zapojenia<br />
[[Súbor:InstalaciaVlak.jpg]]<br />
<br />
Na spodnej časti podvozku sa vyrezala diera za účelom umiestnenia vypínača, tak aby sa dal vypínať a zapínať zvonka.<br />
<br />
'''Spínač na ovládanie ledky'''<br />
[[Súbor:SpinacVlaku.jpg]]<br />
<br />
=== Výsledok ===<br />
<br />
Výsledný stav lokomotívy môžme vidieť na obrázkoch.<br />
<br />
'''Náhlad zpredu'''<br />
[[Súbor:VlakSvieti2.jpg]]<br />
<br />
S výsledkom sme spokojní aj napriek komplikáciam v procese výroby.<br />
<br />
<br />
'''Zdrojové kódy'''<br />
<br />
Telo vlaku: [[Médiá:PODVOZEKopraveny_(1).stl]]<br />
<br />
[[Category:DTV2018]]</div>DVPS