Operácie

Meteostanica s Nucleo Board: Rozdiel medzi revíziami

Z SensorWiki

(Algoritmus a program)
(Algoritmus a program)
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'''
 +
  
 
Na obrázku (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu.  
 
Na obrázku (Obr. 18) môžeme vidieť vývojový diagram programu, ktorý popisuje jednotlivé stavy počas behu nášho programu.  

Verzia zo dňa a času 18:01, 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.

X-Nucleo-IKS01A1.jpg

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.


AcrobBoard.jpg

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.

Basic Breakout 5V.jpg

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

I2C-vysiela-primac.png

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.

I2c-prenos bitov.png

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

I2c-startstop bit.png

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.


I2C-ACK.png

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.

Puzdro-hts221.PNG

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):

HTS221-color.PNG

Obr. 9: Schéma zapojenia HTS221


Rozloženie pinov senzora:

HTS221-pin connection.png

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.

I2C address - HTS221.png

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.

Pyzdro-LPS25HB.PNG

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):

LPS25HB-color.PNG

Obr. 13: Schéma zapojenia LPS25HB


Rozloženie pinov senzora:

LPS25HB-pin conection.PNG

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.


I2C address - LPS25HB.png

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.


LPS25HB-vyppocet tlaku.png

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


Diagram zapojenia-iks01A1 to acrob.png

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:

Diagram meteo-nucleo.jpg

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.

Untitled1.jpg Untitled2.jpg Untitled.jpg

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.