Operácie

Meteostanica s Nucleo Board: Rozdiel medzi revíziami

Zo stránky SensorWiki

DVPS (diskusia | príspevky)
DVPS (diskusia | príspevky)
Riadok 238: Riadok 238:


[[Súbor:Diagram_meteo-nucleo.jpg]]
[[Súbor:Diagram_meteo-nucleo.jpg]]
:'''Obr. 18: Vývojový diagram aplikácie'''
::'''Obr. 18: Vývojový diagram aplikácie'''





Verzia z 18:06, 29. máj 2018


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 (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.