Meteostanica s Nucleo Board
Zo stránky SensorWiki
Balogh: * výborne opísané senzory, tak som si to predstavoval * výstup vlastne neviem aký by z toho mal byť * dokumentácia je zrejme nedokončená
Autori: | Kamila Vavríková, Martin Herceg | |
Študijný odbor: | Aplikovaná mechatronika a elektromobilita | 1. Ing. (2018) |
Zadanie
Využitím dosky X. MEMS Inertial Nucleo board zostavte Meteostanicu, ktorá bude merať teplotu vzduchu, vlhkosť vzduchu a atmosferický tlak.
Úlohy
- Nájdite si k senzorom datasheet
- Nájdite si schémy zapojenia dosky
- Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke
- Napíšte základný demonštračný program využívajúci vaše funkcie
- Vymyslite a demonštrujte vhodnú aplikáciu
Komponenty
Na vypracovanie sme použili nasledujúce komponenty:
- 1 x Vývojovú dosku X-NUCLEO-IKS01A1
- 1 x Vývojová doska Acrob
- 1 x Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin
- 1 x Mini USB kábel
- Prepojovacie kábliky
- Software - Arduino IDE
Doska X-NUCLEO-IKS01A1
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.
- Obr. 1: Vývojová doska X-Nucleo-IKS01A1
Zoznam senzorov, ktoré sa nachádzajú na doske:
- LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)
- LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)
- LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer
- HTS221: capacitive digital relative humidity and temperature
Vývojová doska Acrob (Arduino Compatible Robot)
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.
- Obr. 2: Vývojová doska Acrob
Technické parametre vývojovej dosky nájdete tu: Klik
Basic Breakout 5V (Sparkfun DEV-09716) USB mini to serial 6pin
Jedná sa o plošnú dosku, ktorá obsahuje čip, ktorý umožňuje prevod USB na UART rozhranie.
- Obr. 3: Basic Breakout 5V
Technické parametre nájdete tu: klik
Analýza
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.
Zbernica I2C
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.
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č.
- Obr. 4: Zapojenie liniek
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.
- Obr. 5: Prenos bitu po zbernici I2C
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).
- Obr. 6: START a STOP bit pri I2C zbernici
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.
- Obr. 7: Potvrdzovací ACK bit pri zbernici I2C
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.
Viac informácií o I2C zbernici je možné nájsť napr. na:
Senzor HTS221
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.
- Obr. 8: Púzdro senzora HTS221
Parametre:
- Napájacie napätie: 1,7 až 3,6 V
- Prevádzková teplota: -40 až +120 °C
- Rozsah merania vlhkosti: 0 až 100%
- Presnosť merania teploty: ±0,5 °C, 15 až +40°C
- Presnosť merania vlhkosti: ±3.5% rH, 20 až 80% rH
Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):
- Obr. 9: Schéma zapojenia HTS221
Rozloženie pinov senzora:
- Obr. 10: Rozloženie pinov HTS221
Komunikácia pomocou I2C zbernice:
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.
- Obr. 11: Skladanie bitov pri I2C komunikácii - HTS221
Ú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).
Senzor LPS25HB*
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.
- Obr. 12: Púzdro senzora LPS25HB
Parametre:
- Napájacie napätie: 1,7 až 3,6 V
- Prevádzková teplota: -30 až +105 °C
- Rozsah merania tlaku: 260 až 1260 hPa
- Presnosť merania tlaku: ±1 hPa, 0 až +80°C
Schéma zapojenia senzora (na vývojovej doske X-NUCLEO-IKS01A1):
- Obr. 13: Schéma zapojenia LPS25HB
Rozloženie pinov senzora:
- Obr. 14: Rozloženie pinov LPS25HB
Komunikácia pomocou I2C zbernice:
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).
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.
Na obrázku (Obr. 15) môžeme vydieť, ako sa skladá vzor bitov na čítanie / zápis.
- Obr. 15: Skladanie bitov pri I2C komunikácii - LPS25HB
Ú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).
Interpretovanie údajov o tlaku:
Údaje o tlaku sú uložené v 3 registroch:
- PRESS_OUT_H (2Ah)
- PRESS_OUT_L (29h)
- PRESS_OUT_XL (28h)
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.
- Obr. 16: Výpočet hodnoty tlaku - LPS25HB
Riešenie
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.
- Obr. 17: Znázornenie zapojenia HW komponentov
Algoritmus a program
Program pre aplikáciu Meteostanice sme napísali v programovacom prostredí Arduino IDE. Program využíva knižnice pre obsluhu senzorov HTS221 a LPS25HB.
Zdrojový súbor aplikácie: meteo-nucleo.c
Vývojový diagram programu:
- Obr. 18: Vývojový diagram aplikácie
Na obrázku vyššie (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu.
Zdrojový kód aplikácie:
/**
* Source code: Arduino IDE
*/
// Includes libraries for HTS221 and LPS25HB sensors.
#include <HTS221Sensor.h>
#include <LPS25HBSensor.h>
// Includes library for I2C communicate
#include <Wire.h>
// Defining symbolic constants
#define DEV_I2C Wire
#define SerialPort Serial
// Components
HTS221Sensor *HumTemp;
LPS25HBSensor *PressTemp;
void setup()
{
// Initialize serial for output.
SerialPort.begin(115200);
// Initialize I2C bus.
DEV_I2C.begin();
// Initlialize components.
HumTemp = new HTS221Sensor (&DEV_I2C);
HumTemp->Enable();
PressTemp = new LPS25HBSensor(&DEV_I2C);
PressTemp->Enable();
// Prints text to the serial port
SerialPort.print("| SEMESTRÁLNY PROJEKT - METEOSTANICA |");
SerialPort.print("\n");
SerialPort.print("| ----------------------------------- |");
SerialPort.print("\n");
}
void loop()
{
// Read humidity and temperature.
float humidity, temperature;
HumTemp->GetHumidity(&humidity);
HumTemp->GetTemperature(&temperature);
// Read pressure.
float pressure, temperature2;
PressTemp->GetPressure(&pressure);
PressTemp->GetTemperature(&temperature2);
// // Prints otput data to the serial port
SerialPort.print(" Vlhkost vzduchu : ");
SerialPort.print(humidity, 2);
SerialPort.print(" [%] ");
SerialPort.print("\n");
SerialPort.print(" Teplota vzduchu : ");
SerialPort.print(temperature, 2);
SerialPort.print(" [C] ");
SerialPort.print("\n");
SerialPort.print(" Atmosfericky tlak : ");
SerialPort.print(pressure, 2);
SerialPort.print(" [hPa] ");
SerialPort.print("\n\n");
delay(5000);
}
Funkcie, ktoré vykonávajú prístup k hodnoám teploty vzduchu a vlhkosti vzduchu:
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.
/**
* @brief Read HTS221 output register, and calculate the temperature
* @param pfData the pointer to data output
* @retval HTS221_STATUS_OK in case of success, an error code otherwise
*/
HTS221StatusTypeDef HTS221Sensor::GetTemperature(float* pfData)
{
int16_t int16data = 0;
// Read data from HTS221.
if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )
{
return HTS221_STATUS_ERROR;
}
*pfData = ( float )int16data / 10.0f;
return HTS221_STATUS_OK;
}
/**
* @brief Read HTS221 output register, and calculate the humidity
* @param pfData the pointer to data output
* @retval HTS221_STATUS_OK in case of success, an error code otherwise
*/
HTS221StatusTypeDef HTS221Sensor::GetHumidity(float* pfData)
{
uint16_t uint16data = 0;
// Read data from HTS221.
if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )
{
return HTS221_STATUS_ERROR;
}
*pfData = ( float )uint16data / 10.0f;
return HTS221_STATUS_OK;
}
Github link: stm32duino / HTS221
Funkcia, ktorá vykonáva prístup k hodnote atmosferického tlaku:
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.
/**
* @brief Read LPS25HB output register, and calculate the pressure in mbar
* @param pfData the pressure value in mbar
* @retval LPS25HB_STATUS_OK in case of success, an error code otherwise
*/
LPS25HBStatusTypeDef LPS25HBSensor::GetPressure(float* pfData)
{
int32_t int32data = 0;
// Read data from LPS25HB.
if ( LPS25HB_Get_Pressure( (void *)this, &int32data ) == LPS25HB_ERROR )
{
return LPS25HB_STATUS_ERROR;
}
*pfData = ( float )int32data / 100.0f;
return LPS25HB_STATUS_OK;
}
Github link: stm32duino / LPS25HB
Overenie
Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y.
Zdrojový kód (Matlab): ZadanieGrafy.m
Vízia komplexnej aplikácie
V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje, ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:
- popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
- obrázok zapojenia vývodov použitej súčiastky
- odkaz na katalógový list
- priebehy dôležitých signálov
- este jedna polozka
Literatúra
- Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.