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

Arduino ako I2C A/D prevodník

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.

FB gp tw

Další podobné články