AD/DA převodník PCF8591 je rozšiřovací modul pro Arduino. Tento modul obsahuje obvod PCF8591, který má funkci čtyřkanálového analogově-digitálního (AD) převodníku a zároveň jednokanálového digitálně-analogového (DA) převodníku. Získáme tedy možnost měřit až čtyři vstupní analogová napětí a zároveň můžeme generovat jedno analogové výstupní napětí.
Hranice napětí pro měření i generování je spojená s napájecím napětím modulu, které je v rozsahu 2,5 až 6 Voltu. Co se týká rozlišení, tak AD i DA převodníky jsou osmibitové, pracují tedy s hodnotami 0 až 255. Modul samotný komunikuje s okolím pomocí sběrnice I2C.
Specialitou tohoto modulu je přítomnost několika součástek pro využití všech funkcí. Na modulu se totiž nachází termistor připojený na pin AIN1, fotorezistor připojený na pin AIN0 a trimr připojený na pin AIN3. Pokud bychom ale chtěli připojit vlastní zařízení, můžeme všechny tři součástky odpojit pomocí propojek na modulu, kdy propojka P4 odpovídá termistoru, P5 odpovídá fotorezistoru a P6 odpovídá trimru. Co se týká výstupu AOUT, tak ten je trvale zapojen na zelenou diodu na modulu.

AD/DA převodník PCF8591

Pro úspěšné propojení modulu PCF8591 a Arduino desky stačí zapojit celkem 4 vodiče. Propojíme SCL s pinem A5, SDA s pinem A4, GND se zemí Arduina a VCC s 5V Arduina. Pro piny SDA a SCL musíme vybrat vždy vyhrazené I2C piny na námi vybrané desce, u Arduino UNO jsou to právě piny A4 a A5.

Schéma zapojení AD/DA převodníku PCF8591

Pro úspěšné nahrání uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu PCF8591, návod, jak na to, je uveden zde. Ukázkový kód obsahuje na svém začátku připojení potřebné knihovny společně s nastavením adresy modulu. Ta může být měněna pomocí tří adresních pinů, které jsou ale bohužel na tomto modulu pevně připojeny na zem. Jako další krok provedeme inicializaci modulu z knihovny.
Podprogram setup obsahuje zahájení komunikace po sériové lince, po kterém následuje zahájení komunikace s modulem PCF8591.
V nekonečné smyčce se nachází ukázka dostupných funkcí. Jako první krok provedeme zápis digitální hodnoty 127 na výstupní port modulu. Pro kontrolu nastavených dat zavoláme podprogram, který obsahuje práci s načtením dat různými způsoby.
V podprogramu nacteniDat() v první kroku do vytvořené proměnné nahrajeme digitální data ze všech čtyř analogových vstupů. Protože se jedná o speciální proměnnou z knihovny, je v dalším kroku uvedena ukázka vytištění všech údajů po sériové lince. Jako další ukázka následuje načtení dat z jediného vstupu, kdy jsou za sebou uvedeny ukázky načtení digitální hodnoty, tak následně přímo napětí jako desetinného čísla. Všechny výsledky jsou vždy vypsány po sériové lince. Poté, co je ukončen podprogram po tisku dat, provedeme ve smyčce loop druhý zápis napětí na výstupní pin, přičemž v tomto případě je to zápis hodnoty napětí ve Voltech. A po tomto zápisu je opět zavolán podprogram nacteniDat(), který vypíše všechny data.

// AD a DA převodník PCF8591

// připojení potřebné knihovny
#include "PCF8591.h"
// nastavení adresy modulu
#define PCF8591_I2C_ADDRESS 0x48
// inicializace modulu PCF z knihovny
PCF8591 pcf8591(PCF8591_I2C_ADDRESS);

void setup() {
  // zahájení komunikace po sériové lince
  // rychlostí 9600 baud
  Serial.begin(9600);
  // zahájení komunikace s modulem PCF
  pcf8591.begin();
}
void loop() {
  // ukázka zápisu dat na analogový výstup,
  // hodnoty jsou 0-255
  pcf8591.analogWrite(127);
  Serial.println("Zapis hodnoty 127 na AOUT.");
  // zavolání podprogramu pro načtení dat
  nacteniDat();
  // ukázka zápisu napětí na analogový výstup
  pcf8591.voltageWrite(2.0);
  Serial.println("Zapis napeti 2V na AOUT.");
  // zavolání podprogramu pro načtení dat
  nacteniDat();
  // pauza před novým během
  delay(3000);
}
void nacteniDat() {
  // ukázka načtení všech analogových vstupů do proměnné
  PCF8591::AnalogInput allAnalogIn = pcf8591.analogReadAll();
  // vytištění načtených dat po sériové lince
  Serial.print("AIN0: ");
  Serial.print(allAnalogIn.ain0);
  Serial.print(", AIN1: ");
  Serial.print(allAnalogIn.ain1);
  Serial.print(", AIN2: ");
  Serial.print(allAnalogIn.ain2);
  Serial.print(", AIN3: ");
  Serial.println(allAnalogIn.ain3);

  // ukázka načtení jediného vstupu do proměnné
  int analogIn2 = pcf8591.analogRead(AIN2);
  // vytištění načtených dat po sériové lince
  Serial.print("AIN2: ");
  Serial.println(analogIn2);

  // ukázka načtení napětí z jediného vstupu do proměnné
  float napetiIn2 = pcf8591.voltageRead(AIN2);
  // vytištění načtených dat po sériové lince
  Serial.print("Napeti AIN2: ");
  Serial.println(napetiIn2);
  Serial.println();
}

Po nahrání ukázkového kódu do Arduino desky s připojeným modulem PCF8591 dostaneme například tento výsledek:

Zapis hodnoty 127 na AOUT.
AIN0: 216, AIN1: 255, AIN2: 125, AIN3: 136
AIN2: 125
Napeti AIN2: 2.29

Zapis napeti 2V na AOUT.
AIN0: 216, AIN1: 255, AIN2: 108, AIN3: 136
AIN2: 108
Napeti AIN2: 1.98

AD/DA převodník PCF8591 je zajímavý obvod, který nám umožňuje rozšířit možnosti práce s analogovými signály u Arduina. Nejenže nám přidá další čtyři analogové vstupy, ale také nám umožní generovat analogové napětí na svém výstupu. Oproti analogovým vstupům na desce Arduino UNO má ale hned dvě nevýhody. První nevýhodou je rozlišení, kdy AD převodníky na Arduino UNO mají rozlišení 10 bitů oproti 8 bitům na modulu PCF8591. Druhou nevýhodou je pak nepřesnost měření, kdy sám výrobce uvádí možnou chybu až 50 mV. Avšak u tohoto modulu může být také chyba způsobena pevně připojenou LED diodou, která využívá výstupní napětí.
Tento modul se hodí do projektů, kde chceme pracovat s analogovými signály, ať už na vstupu či výstupu. Můžeme tedy s ním vytvořit například Arduino voltmetr, generátor napětí a různých signálů.

 

Seznam použitých komponent:
https://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
https://dratek.cz/arduino/1335-pcf8591-ad-da-prevodnik-pro-arduino-1466290651.html

FB tw

Další podobné články