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

» Více informací «

VL53L0X

  • Time-of-Flight senzor vzdálenosti
  • Komunikace přes I2C
  • Měření až do 2m

» Vice informací «

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
  • WOM2) 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é3) 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 intervalech4). Když pohyb přesáhne nastavenou mez5), 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)
Digital-Low-Pass-Filter
2)
Wake-On-Motion
3)
Není nutné zapojovat
4)
wom_rate
5)
threshold_mg
education/arduino.1685343139.txt.gz · Poslední úprava: 2023/08/18 12:36 (upraveno mimo DokuWiki)