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 :

sudo i2cdetect -y 1

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

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 25.5.2015