Operácie

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


Fotky z fyzickej realizácie zapojenia:


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.


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 output 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);
}

Zdrojový kód aplikácie: meteo-nucleo.c


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

Po nahratí programu do nami realizovanej Meteostanice Nucleo si môžeme pozrieť hodnoty v Arduino IDE v v okne Serial monitoru.

Obr. 19: Hodnoty zobrazené v Arduino IDE Serial Monitor


Jednotlivé merané veličiny boli vykreslené v prostredí Matlab. Každá veličina je vykreslená samostatne kvôli rôznemu rozsahu osi y. 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.


Uložené dáta z ktorých boli vykreslené grafy: data.txt

Zdrojový kód (Matlab): grafy.m


Vízia komplexnej aplikácie Meteostanice

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ť?


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: Klik.


Čiže budeme potrebovať nainštalovať:

  • Samotný operačný systém Raspbian
  • Databázu (prípadne aj klienta)
  • Python a framework Flask (web framework)


Raspbian

Informácie ako nainštalovať operačný systém raspbian nájdeme na dokumentačných stránkach tu: Instaling operating system images


Databáza

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.


Inštalácia databázového servera na Raspebrry Pi:

sudo apt-get install mysql-server python-mysqldb

Zdroje:


Python a Flask

Python je vyšší programovací jazyk a Flask je mikro webový framevork napísaný v Pythone.


Inštalácia mikro web frameworku Flask:

sudo apt-get install python-pip
pip install flask


Inštalácia podpory pre websockety:

sudo pip install eventlet
sudo pip install flask-socketio


Zdroje:


Adresárová štruktúra flask aplikácie:

/meteo-nucleo
  ├── app.py
  ├── config.cfg
  ├── templates/
     ├── index.html
  └── static/
      └── style.css


  • app.py - samotná aplikácia napísaná vo Flask (pythone)
  • config.cfg - konfiguračný súbor pre databázu
  • index.html - html šablona webovej aplikácie
  • style.css - kaskádové štýly webovej aplikácie


Obsah súboru: app.py

from flask import Flask, render_template
import MySQLdb       
import ConfigParser

app = Flask(__name__)

config = ConfigParser.ConfigParser()
config.read('config.cfg')

# Configuration Database
myhost = config.get('mysqlDB', 'host')
myuser = config.get('mysqlDB', 'user')
mypasswd = config.get('mysqlDB', 'passwd')
mydb = config.get('mysqlDB', 'db')


# TODO: Source codes our application Meteo - Nucleo
# TODO: Read data from sensors HTS221 and LPS25HB
# TODO: Save data to Database
# TODO: Other codes
# ...


@app.route('/')
def index():
    return render_template('index.html', async_mode=socketio.async_mode)

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=80, debug=True)


Obsah súboru: config.cfg

[mysqlDB]
host = localhost
db = databaseName
user = userName
passwd = userPassword


Obsah súboru: templates/index.html

<!DOCTYPE HTML>
<html>
    <head>
        <title>Application Name</title>
        <!--
          ...
      -->
    </head>

    <body>
        <h1>Our Application Meteo- Nucleo</h1>
        <!-- 
          TODO: Display value from sensors
          TODO: Display progress of the measured values in the charts

          ...
      -->
    </body>
</html>

Zdroje:


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


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.


Literatúra

  • Datasheets k doske X-NUCLEO-IKS01A1: klik
  • Datasheets k HTS221: klik
  • Github repozitár k HTS221 klik
  • Datasheets k LPS25HB: klik
  • Github repozitár k LPS25HB klik
  • I2C zbernica klik
  • Vývojová doska Acrob klik
  • Datasheets k plošnej doske SparkFun FTDI Basic Breakout - 5V klik