Arduino ako I2C A/D prevodník

Projekt od našeho čtenáře Jakuba J. - Arduino ako I2C A/D prevodník:

Samotné Arduino obsahuje 8 kanálový 10 bitový (0-1023) A/D prevodník. Problém nastáva, keď potrebujeme merať viac analógových veličín. Môžeme použiť 16 kanálový analógový multiplexer CD74HC4067, ale tento potrebuje celkom 1 analógový a 4 digitálne piny na Arduine, čo môže byť problém.

K Arduinu tiež môžeme pripojiť neobmedzené množstvo zariadení cez zbernicu I2C. Ako prevodníky môžeme použiť aj 4 kanálový A/D prevodník pre I2C PCF8591, ktorý má ale relatívne nízke rozlíšenie – 8 bitov (0-255), čo môže byť v niektorých prípadoch nepoužiteľné.

Preto sa naskytá toto zaujímavé úsporné riešenie: Ako A/D prevodník použijeme ďalšie Arduino (napríklad malé Nano), komunikujúce s hlavným cez I2C. Po prepojení cez I2C nám zostane ešte 6 voľných analógových pinov, a všetky digitálne. V prípade takéhoto zapojenia môžeme používať až 3 multiplexery CD74HC4067 na každom ďalšom Arduine, čo rozširuje počet analógových pinov až na 48 pre každé ďalšie Arduino.

Zapojenie je jednoduché, obe Arduiná pripojíme k napájaniu, a navzájom prepojíme piny GND, A4 a A5 (pre I2C komunikáciu).

V programoch nie je použitý multiplexer, iba fotorezistor na pine A0.

V programe pre hlavné Arduino – master budeme posielať Arduinu Nano čísla vstupov, z ktorých nám má poslať hodnotu.

//master
#include <Wire.h>

const int pin = A0;

void setup() {
  Wire.begin(); //spustenie komunikacie I2C
  Serial.begin(9600);
}

void loop() {
  Wire.beginTransmission(4); //spustenie prenosu so zariadenim 4
  Wire.write(pin); //odoslanie cisla pinu, z ktoreho chceme citat
  delay(10);
  int x = Wire.read();
  Serial.print("Namerana analogova hodnota: ");
  Serial.println(x);
  Wire.endTransmission(); //ukoncenie prenosu
  delay(5000);
}

V programe pre Arduio slave najprv určíme adresu, pod ktorou bude komunikovať a potom už len čaká na číslo pinu, z ktorého hodnotu má poslať späť.

//prevodnik - slave
#include <Wire.h>

void setup() {
  Wire.begin(4); //spustenie I2C komunikacie ako zariadenie 4
}

void loop() {
  Wire.onReceive(prijate); //pri prijate
}

void prijate(int howMany) {
  while (1 < Wire.available()) { //citanie dat
    int pin = Wire.read(); //prijatie cisla analogoveho pinu
    int x = analogRead(pin); //precitanie hodnoty
    Wire.write(x); //poslanie analogovej hodnoty
  }
}

Knižnica Wire.h je obsiahnutá v Arduino IDE.

Další podobné články

Test ESC a BLDC motoru

Cílem tohoto Arduino projektu je testování a kalibrace obousměrného regulátoru otáček (ESC) pomocí PWM signálu. Program simuluje sekvenci pohybů: dopředu, neutrální pozici a reverzní chod, což umožňuje ověřit správnou funkci ESC včetně přepínání směru otáčení motoru.

Laserový alarm

Cílem tohoto projektu je vytvořit jednoduchý, ale funkční bezpečnostní systém, který detekuje narušení prostoru pomocí vysílače (laserového paprsku) a přijímače (fotorezistoru). Jakmile je paprsek přerušen, Arduino to vyhodnotí jako narušení a spustí alarm – například zvukový signál pomocí piezo bzučáku.