Raspberry Pi
57) Raspberry Pi - Jednokanálový A/D převodník
MCP3021
Pokud potřebujete pomocí Raspberry Pi měřit napětí, ale řešení,
které jsem popisoval v článku 18 se vám zdá drahé, nebo zbytečně
složité, můžete zkusit měřit napětí s levnějším A/D převodníkem
MCP3021
Tento převodník komunikuje přes sběrnici I2C a je
možné ho napájet pomocí 3,3V.
Toto napětí zároveň slouží jako referenční napětí, takže převádí
napětí 0V až 3,3V na hodnotu 0 až 1024. Rozlišení je tedy asi 3mV na
jedno číslo.
Při napájení 3,3V není třeba používat převodník
napěťových úrovní na I2C sběrnici a čidlo je možné připojit
k RasPi přímo.
Pokud potřebujete měřit vyšší napětí, než 3,3V,
není to žádný problém.
Pomocí obyčejného odporového děliče napětí si můžete vstupní
rozsah třeba 10x zvýšit.
Zároveň s tím si ale 10x snížíte rozlišení (na 30mV na číslo).
Kalkulačku pro výpočet odporového děliče napětí můžete
najít třeba tady:
http://popular.fbmi.cvut.cz/elektrotechnika/Stranky/Odporovy-delic.aspx
Nebo si ten dělič spočítejte ručně:
http://cs.wikipedia.org/wiki/Dělič_napětí
Schéma připojení:
Převodník se vyrábí v několika variantách, které se
liší I2C adresou.
I2C adresa je napevno nastavená mezi 0x48 až 0x4F a není možné
ji měnit.
Pokud si nejste jistí, jaký typ používáte, stačí po připojení čidla
použít příkaz :
Adresa čidla se objeví v tabulce:
Program pro měření pak vypadá takhle jednoduše:
(Samozřejmě je třeba mít nainstalovanou podporu I2C pro
Python)
#!/usr/bin/python
# -*- encoding: utf-8 -*-
# upravena verze z 25.5.2015
import time
import smbus
bus = smbus.SMBus(1) # novejsi varianta RasPi (512MB)
addr = 0x49 # i2c adresa prevodniku
# Napeti ve voltech pri maximalnim cisle z A/D prevodniku (1023)
maxnap = 3.3 # bez delice napeti meri prevodnik hodnotu 0 az 3,3V
while True:
data = bus.read_i2c_block_data(addr,0)
digit = (data[1] + (256 * data[0]))>>2 # platna data jsou jen na bitech B2 az B11
# proto se musi vysledek posunout o 2 bity vpravo
napeti = round(maxnap * digit / 1023 , 3) # hodnota napeti je zaokrouhlena na 3 des. mista
print "aktualni hodnota AD prevodniku je:" + str(digit) + " \t ... to je: " + str(napeti) + " V."
time.sleep(0.5)
|
Výstup z programu v terminálu:
EDIT 25.5.2015
V původním programu byla drobná chyba, takže to vypadalo, že převodník
převádí napětí na 12-bitovou hodnotu (0 až 4095).
Ve skutečnosti ale nejnižší dva bity neobsahují platnou informaci o
měřeném napětí, takže zanášely do měření náhodnou chybu v řádu
jednotek mV.
Upravený program tyto dva bity osekává.
|