Uživatelské nástroje

Nástroje pro tento web


education:arduino

Toto je starší verze dokumentu!


Podpora pro projekty s Arduinem

Základní informace o Arduinu

používáme moduly Arduino Nano (které jsou fyzicky větší než Arduino Mini Pro)

http://arduino.cc
http://arduino.cc/en/Main/Boards
http://arduino.cc/en/Main/ArduinoBoardUno
http://arduino.cc/en/Main/ArduinoBoardNano

vývojové prostředí je k dipozici na adrese https://www.arduino.cc/en/Main/Software

Moduly původem z Číny používají USB-UART převodník CH340G, ovladač pro Windows lze stáhnout zde (verze 3.6.2021.12), případně na stránkách výrobce převodníku http://www.wch-ic.com/downloads/CH341SER_ZIP.html (anglická jazyková mutace stránek) a http://www.wch.cn/downloads/CH341SER_ZIP.html (čínská jazyková mutace; pozn. 02/2022 verze ovladače na čínských stránkách nemusí být vždy stejná jako na anglických, aktuálně je nejnovější verze pouze na čínských stránkách)

Oživení a ověření základní funkčnosti

Blikání LED

Seriová komunikace

Knihovny a příklady použití pro jednotlivé moduly

seznam dostupných modulů https://docs.google.com/spreadsheets/d/1eXgFiZbOv-FYLSS8f-wMkrtQ7ab7YqBjkbKZQvYHOg0/edit?usp=sharing
pozn.: pro zobrazení obsahu je třeba přihlášení přístupovými údaji ČVUT

BMP280

  • Senzor barometrického tlaku a teploty
  • Komunikace přes I2C, nebo SPI
  • Napájení 1.8 - 3.6V

Adafruit_BMP280_Library
Data sheet

BMP280 ARDUINO ESP32
I2C SDA A4 GPIO21
SCL A5 GPIO22
SPI SCL 13 GPIO18
SDO 12 GPIO19
SDA 11 GPIO23
CSB LIBOVOLNÝ

Knihovna obsahuje:
readTemperature(); - Čtení teploty [°C]
readPressure(); - Čtení naměřeného tlaku [Pa]
readAltitude(seaLevelhPa); - Výpočet nadmořské výšky. seaLevelhPa je aktuální tlak přepočtený na hladinu moře (0mnm). Lze ho zjistit z předpovědi počasí.
seaLevelForAltitude(altitude, atmospheric); - Přepočet tlaku na hladinu moře. altitude je nadmořská výška ve které byla hodnota tlaku naměřena [m]. atmospheric je naměřená hodnota tlaku určená k přepočtu [hPa]
waterBoilingPoint(pressure); - Výpočet přesné teploty varu vody[°C]. pressure je tlak podle kterého bude vypočten bod varu

Funkcí setSampling(); lze nastavit chování senzoru.1)

MODE OVERSAMPLING FILTERING STANDBY
MODE_NORMAL SAMPLING_NONE FILTER_OFF STANDBY_MS_1
MODE_FORCED SAMPLING_X1FILTER_X2 STANDBY_MS_63
MODE_SLEEP SAMPLING_X2FILTER_X4 STANDBY_MS_125
MODE_SOFT_RESET_CODE SAMPLING_X4 FILTER_X8 STANDBY_MS_250
SAMPLING_X8 FILTER_X16 STANDBY_MS_500
SAMPLING_X16 STANDBY_MS_1000
STANDBY_MS_2000
STANDBY_MS_4000
BMP280.ino
#include <Adafruit_BMP280.h> // Kód je psaný pro verzi knihovny 2.6.6
 
/* Vlastní nastavení SPI */
#define BMP_SCK 13   // SCL
#define BMP_MISO 12  // SDO
#define BMP_MOSI 11  // SDA
#define BMP_CS 10    // CSE
 
Adafruit_BMP280 bmp;  // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);  //vlasní SPI
 
void setup() {
  Serial.begin(9600);
  Serial.println("\nBMP280 test");
  //Wire.begin(SDA, SCL); // Vlastní nastavení I2C
  //bool status = bmp.begin(); // použití výchozí I2C adresy (0x77)
  bool status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);  // návratová hodnota určuje jestli senzor komunikuje
 
  if (!status) {
    Serial.println(F("Nepodarilo se navazat komunikaci se senzorem. Zkontrolujte zapojeni, "
                     "nebo pouzijte jinou I2C adresu senzoru. (radek 17) "));
    while (1) delay(10);
  }
 
  /* Výchozí nastavení podle datasheetu */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}
 
void loop() {
  float teplota = bmp.readTemperature();                                 // načtení teploty
  float tlak = bmp.readPressure() / 100.0;                               // načtení tlaku, převod z Pa na hPa
  float tlak_hl_more = bmp.seaLevelForAltitude(250 /*n. výška*/, tlak);  // přepočet tlaku na hladinu moře
  float vyska = bmp.readAltitude(1013.25 /*tlak 0mnm*/);                 // měření nadmořské výšky
  float bod_varu = bmp.waterBoilingPoint(tlak);                          // výpočet bodu varu
 
  Serial.println("\nTeplota\t\tTlak\t\tTlak 0 mnm\tVyska\t\tBod varu");
  Serial.print(teplota);      Serial.print(" °C\t");
  Serial.print(tlak);         Serial.print(" hPa\t");
  Serial.print(tlak_hl_more); Serial.print(" hPa\t");
  Serial.print(vyska);        Serial.print(" mnm\t");
  Serial.print(bod_varu);     Serial.println(" °C");
 
  delay(2000);
}

VL53L0X

  • Time-of-Flight senzor vzdálenosti
  • Měření IR laserem 1. třídy
  • Komunikace přes I2C
  • Programovatelný digitální výstup GPIO1
  • XSHUT shutdown pin pro řízení spotřeby a reset senzoru
  • Napájení 2.6 - 3.5V
  • Měření až do 2m

Adafruit_VL53L0X
Data sheet
Dokumentace API

VL53L0X ARDUINO ESP32
I2C SDA A4 GPIO21
SCL A5 GPIO22
Volitelné2) XSHUT LIBOVOLNÝ
GPIO1 LIBOVOLNÝ

Senzoru lze přidělit vlastní I2C adresu. To umožňuje používání více těchto senzorů na jedné I2C sběrnici.

3 režimy měření:
  1. Jednotlivé - Po naměření jedné hodnoty přejde do SW standby
  2. Stálé - Po dokončení jednoho měření se spustí další
  3. Stálé s časováním - Stálé měření v nastaveném intervalu
4 profily:

Knihovna obsahuje:
begin(i2c_addr, debug, TwoWire, vl_config); - i2c_addr - nová adresa, debug - true/false, TwoWire - &Wire, vl_config - profily
getSingleRangingMeasurement(pRangingMeasurementData, debug); - pRangingMeasurementData - proměnná pro uložení dat, debug - true/false
RangeStatus - stav [uint8_t]
RangeMilliMeter - vzdálenost [mm]

VL53L0X.ino
#include "Adafruit_VL53L0X.h" // Kód je psaný pro verzi knihovny 1.2.2
 
Adafruit_VL53L0X lox = Adafruit_VL53L0X();
 
void setup() {
  Serial.begin(9600);
  Serial.println("\nVL53L0X test");
 
  if (!lox.begin(0x30, false, &Wire, Adafruit_VL53L0X::VL53L0X_SENSE_DEFAULT)) {
    Serial.println(F("Chyba komunikace s VL53L0X"));
    while (1) ;
  }
}
 
void loop() {
  VL53L0X_RangingMeasurementData_t measure;
 
  lox.getSingleRangingMeasurement(&measure, false);  // 'true' pro výpis ladících dat (debug)
 
  switch (measure.RangeStatus) { // Vyhodnocení stavu
    case 0: Serial.print("Valid\t"); break;
    case 1: Serial.print("Sigma fail"); break;
    case 2: Serial.print("Signal fail"); break;
    case 3: Serial.print("Min Range Fail"); break;
    case 4: Serial.print("Phase Fail"); break;
    case 5: Serial.print("HardWare Fail"); break;
    case 255: Serial.print("None\t"); break;
  }
  Serial.print("\t");
  Serial.print(measure.RangeMilliMeter);  Serial.println(" mm");
 
  delay(500);
}

MPU-9250

  • Tříosý gyroskop, akcelerometr, magnetometr
  • 16-bit ADC pro každou měřenou veličinu
  • Komunikace přes I2C, nebo SPI
  • Napájení 2.4 - 3.6V
  • Nastavitelné rozsahy pro maximální přesnost
  • WOM4) režim pro nižší spotřebu

invensense-imu
Podrobná dokumentace knihovny
Data sheet

MPU9250 ARDUINO ESP32
I2C SDA A4 GPIO21
SCL A5 GPIO22
SPI SCL 13 GPIO18
AD0 12 GPIO19
SDA 11 GPIO23
NCS LIBOVOLNÝ
Volitelné5) INT LIBOVOLNÝ
FSYNC LIBOVOLNÝ

I2C adresa senzoru se nastavuje logickou úrovní na pinu AD0. To umožňuje používání 2 těchto senzorů na jedné I2C sběrnici.

Funkce:

WOM
EnableWom(threshold_mg, wom_rate);
V režimu WOM senzor vyhodnocuje data z akcelerometru v nastavených intervalech6). Když pohyb přesáhne nastavenou mez7), na pinu INT se objeví logická 1.

Data Ready Interrupt
EnableDrdyInt();
Druhé využití INT pinu je signalizace nových dat

Nastavení
ConfigSrd(srd); - Sample Rate Divider umožňuje nastavit rychlost vzorkování
ConfigAccelRange(range); ConfigGyroRange(range); - Tyto funkce umožňují nastavení rozsahu
ConfigDlpfBandwidth(dlpf); - Funkce umožňuje nastavení digitální dolní propusti (Digital Low Pass Filter)

4 rozsahy:
Gyroskop Akcelerometr Magnetometr
±250 °/s ±2 g ±4800 µT
±500 °/s ±4 g
±1000 °/s ±8 g
±2000 °/s ±16 g
MPU-9250.ino
#include "mpu9250.h"  // Kód je psaný pro verzi knihovny 6.0.3
 
bfs::Mpu9250 imu;
 
void SensorInterrupt() {
  Serial.println("Pohyb");
}
 
void setup() {
  Serial.begin(115200);
  Serial.println("\nMPU9250 test");
 
  Wire.begin();                                    // nastavení I2C: Wire.begin(SDA, SCL);
  Wire.setClock(400000);                           // rychlost I2C komunikace (400kHz)
  imu.Config(&Wire, bfs::Mpu9250::I2C_ADDR_PRIM);  // I2C, adresa: |AD0=LOW I2C_ADDR_PRIM| |AD0=HIGH I2C_ADDR_SEC|
  //imu.Config(&SPI, 5); // SPI bus, CS pin
 
  if (!imu.Begin()) {  // spuštění komunikace se senzorem
    Serial.println("CHYBA komunikace se senzorem");
    while (1) {}
  }
 
  // práh 40mg, rychlost dat z akcelerometru 15.63Hz
  //imu.EnableWom(40, bfs::Mpu9250::WOM_RATE_15_63HZ);  // Wake on motion
  //pinMode(2, INPUT); // INT pin sentoru na pinu 2 Arduina/ESP32
  //attachInterrupt(2, SensorInterrupt, RISING);
 
  if (!imu.ConfigSrd(19)) Serial.println("CHYBA nastavovani SRD");  // rychlost vzorkovani[Hz] = 1000/(srd + 1)
  if (!imu.ConfigAccelRange(bfs::Mpu9250::ACCEL_RANGE_4G)) Serial.println("CHYBA nastavovani rozsahu akcelerometru");
  if (!imu.ConfigGyroRange(bfs::Mpu9250::GYRO_RANGE_1000DPS)) Serial.println("CHYBA nastavovani rozsahu gyroskopu");
  if (!imu.ConfigDlpfBandwidth(bfs::Mpu9250::DLPF_BANDWIDTH_20HZ)) Serial.println("CHYBA nastavovani DLPF");
 
  PrintSRD();
  PrintAccelRange();
  PrintGyroRange();
  PrintDlpfBbandwidth();
  delay(5000);
}
 
void loop() {
  PrintData();
  delay(500);
}
 
void PrintSRD() {
  uint8_t srd = imu.srd();
  Serial.print("SRD: "); 
  Serial.print(srd);
  Serial.print(" -> ");
  Serial.print(1000.0 / (srd + 1));
  Serial.println("Hz");
}
 
void PrintAccelRange() {
  Serial.print("Rozsah akcelerometru: +-");
  switch (imu.accel_range()) {
    case 0x00: Serial.println("2g"); break;
    case 0x08: Serial.println("4g"); break;
    case 0x10: Serial.println("8g"); break;
    case 0x18: Serial.println("16g"); break;
  };
}
 
void PrintGyroRange() {
  Serial.print("Rozsah gyroskopu: +-");
  switch (imu.gyro_range()) {
    case 0x00: Serial.println("250°/s"); break;
    case 0x08: Serial.println("500°/s"); break;
    case 0x10: Serial.println("1000°/s"); break;
    case 0x18: Serial.println("2000°/s"); break;
  }
}
 
void PrintDlpfBbandwidth() {
  Serial.print("Sirka pasma DLPF: ");
  switch (imu.dlpf_bandwidth()) {
    case 0x01: Serial.println("184Hz"); break;
    case 0x02: Serial.println("92Hz"); break;
    case 0x03: Serial.println("41Hz"); break;
    case 0x04: Serial.println("20Hz"); break;
    case 0x05: Serial.println("10Hz"); break;
    case 0x06: Serial.println("5Hz"); break;
  };
}
 
void PrintData() {
  if (imu.Read()) {
    Serial.println("\nimu\tmag\tacc X\tacc Y\tacc Z\tgyr X\tgyr Y\t gyr Z\tmag X\tmag Y\tmag Z\ttemp");
    Serial.print(imu.new_imu_data());   Serial.print("\t");
    Serial.print(imu.new_mag_data());   Serial.print("\t");
    Serial.print(imu.accel_x_mps2());   Serial.print("\t");
    Serial.print(imu.accel_y_mps2());   Serial.print("\t");
    Serial.print(imu.accel_z_mps2());   Serial.print("\t");
    Serial.print(imu.gyro_x_radps());   Serial.print("\t");
    Serial.print(imu.gyro_y_radps());   Serial.print("\t");
    Serial.print(imu.gyro_z_radps());   Serial.print("\t");
    Serial.print(imu.mag_x_ut());       Serial.print("\t");
    Serial.print(imu.mag_y_ut());       Serial.print("\t");
    Serial.print(imu.mag_z_ut());       Serial.print("\t");
    Serial.println(imu.die_temp_c());
  }
}

HTU21D(F)

  • Senzor teploty a vlhkosti
  • Komunikace přes I2C
  • Napájení 1.5 - 3.6V
  • Nastavitelné rozlišení
  • Vestavěné vyhřívání pro diagnostiku
  • Snímání napájecího napětí
  • Nastavitelné rozlišení

SparkFun_HTU21D_Breakout_Arduino_Library
Data sheet

HTU21D ARDUINO ESP32
I2C SDA A4 GPIO21
SCL A5 GPIO22

Výrobce doporučuje senzor po každém spuštění restartovat. Aktuální verze knihovny tuto funkci nenabízí, nicméně definuje příkaz SOFT_RESET. Následující kus kódu lze pro tento účel používat.

Wire.beginTransmission(HTU21D_ADDRESS);
Wire.write(SOFT_RESET);
Wire.endTransmission();

Knihovna obsahuje:
begin(&wirePort); - wirePort - I2C sběrnice
readTemperature(); - vrátí naměřenou teplotu [°C] jako float
readHumidity(); - vrátí naměřenou vlhkost [%] jako float
setResolution(resBits); - Slouží k nastavení rozlišení pro teplotu a vlhkost
writeUserRegister(val); - Slouží pro nastavení senzoru, val - 8 bitů nastavení
readUserRegister(); - Slouží pro přečtení nastavení senzoru

První a poslední bit určuje nastavení rozlišení. Bit 6 indikuje napájecí napětí menší něž 2.25V (End of Battery). Bitem číslo 2 se zapíná nebo vypíná vestavěné vyhřívání. Pokud se senzor zahřeje, měl by měřit vyšší teplotu a nižší vlhkost. Díky tomu lze automaticky ověřit funkčnost senzoru. Více informací je v datasheetu na straně 13.

ROZLIŠENÍ
Teplota Vlhkost
14b 12b
12b 8b
13b 10b
11b 11b
HTU21D.ino
#include <Wire.h>
#include "SparkFunHTU21D.h" // Kód je psaný pro verzi knihovny 1.1.3
 
HTU21D htu;
 
void setup() {
  Serial.begin(9600);
  Serial.println("\nHTU21D test");
  htu.begin(); // Spuštění komunikace se senzorem
  htuReset();  // Knihovna tuto funkci neobsahuje
  printInfo();
  /* Zápis do registru: vypnutí OTP, změna rozlišení na 8bitů pro vlhkost a 12bitů pro teplotu */
  htu.writeUserRegister(USER_REGISTER_DISABLE_OTP_RELOAD | USER_REGISTER_RESOLUTION_RH8_TEMP12);
}
 
void loop() {
  printInfo();
  delay(1000);
}
 
void htuReset() {
  Wire.beginTransmission(HTU21D_ADDRESS);
  Wire.write(SOFT_RESET);
  Wire.endTransmission();
}
 
void printInfo() {
  float temp = htu.readTemperature();       // Měření teploty
  float humd = htu.readHumidity();          // Měření vlhkosti
  uint8_t userReg = htu.readUserRegister(); // Načtení registru
 
  Serial.println("\n\nteplota\t\tvlhkost\t\tbattery\t\theater\t\tOTP reload\trozliseni\tregistr");
  Serial.print(temp); Serial.print("°C\t\t");
  Serial.print(humd); Serial.print("%\t\t");
  Serial.print(userReg & USER_REGISTER_END_OF_BATTERY ? "low" : "ok");  Serial.print("\t\t");
  Serial.print(userReg & USER_REGISTER_HEATER_ENABLED ? "on" : "off");  Serial.print("\t\t");
  Serial.print(userReg & USER_REGISTER_DISABLE_OTP_RELOAD  ? "disable" : "enable"); Serial.print("\t\t");
  switch (userReg & USER_REGISTER_RESOLUTION_MASK) { // rozlišení [teplota + vlhkost]
    case USER_REGISTER_RESOLUTION_RH12_TEMP14: Serial.print("14 + 12\t\t"); break;
    case USER_REGISTER_RESOLUTION_RH8_TEMP12: Serial.print("12 +  8\t\t"); break;
    case USER_REGISTER_RESOLUTION_RH10_TEMP13: Serial.print("13 + 10\t\t"); break;
    case USER_REGISTER_RESOLUTION_RH11_TEMP11: Serial.print("11 + 11\t\t"); break;
  }
  for(int i = 7; i >= 0; i--) Serial.print(bitRead(userReg, i)); // Výpis registru
}

Digitální teploměr DS18B20

Dallas Temperature Control Library http://www.milesburton.com/?title=Dallas_Temperature_Control_Library
praktické poznámky k OneWire sběrnici http://playground.arduino.cc/Learning/OneWire

příklady použití
nano_ds18b20.zip

Čidlo vlhkosti a teploty DHT11

podpora pro sensory DHT11 http://playground.arduino.cc/Main/DHT11Lib
poznámky k čidlům DHTxx http://playground.arduino.cc/Main/DHTLib

příklady použití
nano_dht.zip

Čidlo úrovně osvětlení BH1750

pozn.: modul označen GY-30
popis použití modulu BH1750 (s knihovnou BH1750) http://blog.venca-x.cz/arduino-mereni-svetelne-intenzity-s-bh1750/
popis použití modulu BH1750 (bez knihovny) http://blog.simtronyx.de/en/measurement-of-illuminance-with-a-bh1750fvi-breakout-board-gy-30-and-an-arduino-uno/

příklady použití
nano_bh1750.zip

Čidlo atmosférického tlaku BMP180

pozn.: modul označen GY-68, kompatibilní s BMP085
základní popis modulu https://laborja.wordpress.com/venta/arduino/gy-68-pressure-sensor-bmp180/
knihovna Adafruit BMP085 https://github.com/adafruit/Adafruit_BMP085_Unified
knihovna Adafruit sensors https://github.com/adafruit/Adafruit_Sensor

příklady použití:
příklad sensorapi z knihovny Adafruit BMP085

RTC DS1307

LCD

knihovna LiquidCrystal https://www.arduino.cc/en/Reference/LiquidCrystal
API pro znakové displeje http://playground.arduino.cc/Code/LCDAPI
knihovny pro I2C displeje (rozcestník pro různé I2C čipy) http://playground.arduino.cc/Code/LCDi2c
podpora připojení displeje k Arduinu (rozcestník pro různé typy displejů) http://playground.arduino.cc/Code/LCD

další poznámky
http://www.instructables.com/id/I2C-LCD-Controller-the-easy-way/
http://www.geeetech.com/wiki/index.php/Serial_I2C_1602_16×2_Character_LCD_Module
https://arduino-info.wikispaces.com/LCD-Blue-I2C

příklady použití
nano_lcd_test.zip, pozn. displeje s modrým podsvícením mají adresu 0x27 (obvyklejší adresa i u jiných displejů), displeje se zeleným podsvícením mají adresu 0x3F (méně obvyklá adresa), viz https://forum.arduino.cc/index.php?topic=369998.0

SD Card

knihovna SD Library https://www.arduino.cc/en/Reference/SD
poznámky ke komunikaci s SD kartou https://www.arduino.cc/en/Reference/SDCardNotes

příklady použití
nano_sd_card.zip

Servo

"Digitalni potenciometr"- rotacni enkoder

TV výstup (kompozitní video)

Senzory plynů MQ

Senzory plynů řady MQ
(např. MQ3 - senzor koncentrace alkoholu, MQ9 - senzor koncentrance hořlavých plynů atd.)

příklady použití
gas_sensor_mq.zip

další informace
http://playground.arduino.cc/Main/MQGasSensors
https://www.mysensors.org/build/gas

Senzor osvětlení - Flying Fish

PIR Senzor

Převodníky úrovní

Přenos a záznam dat do PC

Arduino lze použít jako jednoduchý měřící systém k PC nebo tabletu. Na odkazu najdete program, který umožňuje číst, vizualizovat a ukládat data z Arduina. Je možné i řídít průběh měření. Komunikace s PC nebo tabletem probíhá přes USB kabel nebo BlueTooth.

Vývojové desky s WiFi rozhraním

Vývojové desky s procesorem ESP 8266 (např. desky Wemos D1 mini a NodeMCU)

instalace podpory desek s chipem ESP 8266 do Arduino IDE https://github.com/esp8266/Arduino

příklad použití
wemosd1mini_webserver.zip

Uvedený příklad použití vychází z příkladu zde. Odkazovaný příklad obsahuje kromě možnosti odesílat HTML stránku i možnost připojit se pomocí JSON a ukládat data Google scriptem do tabulky na Google Drive.

Vývojové desky s procesorem ESP-WROOM-32

instalace podpory desek s chipem ESP-WROOM-32 do Arduino IDE https://navody.arduino-shop.cz/navody-k-produktum/jednoducha-instalace-esp32-do-arduino-ide.html

pozn.: aktuální verze jádra jsou na adrese

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

původní adresu v konfiguraci Arduino IDE je potřeba přepsat, nikoli pouze doplnit novou

podpora pro práci s deskami s ESP 8266 a ESP 32

Další vzorové kódy

autor: Václav Langer
připraveno pro Workshop 2015, doposud neověřeno

arduino_examples.zip

1)
viz tabulka
2) , 5)
Není nutné zapojovat
3)
Digital-Low-Pass-Filter
4)
Wake-On-Motion
6)
wom_rate
7)
threshold_mg
education/arduino.1685103773.txt.gz · Poslední úprava: 2023/08/18 12:36 (upraveno mimo DokuWiki)