Raspberry Pi

31) PCA9532 - Expander pro řízení LED

Dostal se mi do ruky zajímavý obvod, který by se mohl někomu hodit k rozšíření funkcí zařízení, která jsou ovládána přes RasPi.
Ten obvod má označení PCA9532 a má podobnou funkci jako expander MCP23017, o kterém jsem psal minulých článcích.
I tento obvod se řídí pomocí I2C sběrnice, takže nezabírá žádné další GPIO vstupy. Adresa I2C je nastavitelná pomocí 3 adresovacích vstupů. Rozsah nastavitelných adres je od 0x60 (všechny vstupy jsou v "0") do 0x67 (všechny adresovací vstupy v "1")

Ovládání tohoto obvodu je sice trochu složitější, ale má jednu funkci, která tomu obyčejnému MCP23017 chybí - pomocí PCA9532 je možné ovládat jas LED diod, nebo nastavovat různé druhy blikání.
Ovládání se provádí pomocí dvou parametrů pro dva vnitřní generátory - délka periody a střída (poměr času, kdy LEDka svítí a kdy je zhaslá). Takže stačí poslat do obvodu několik čísel, ledky začnou blikat a dál už není třeba se o nic starat. 


K expanderu je možné připojit až 16 LEDek. Každá z nich se může nastavit do jednoho ze 4 stavů:

1) trvalé zhasnutí - (odpojení výstupu)
2) trvalé svícení - (na výstup se posílá "0")
3) nastavení blikání podle parametrů generátoru 0
4) nastavení blikání podle parametrů generátoru 1

Pokud nevyužijete všechny LED výstupy, můžete na ty zbylé připojit tlačítka a provozovat je ve vstupním režimu.

Drobná nevýhoda tohoto obvodu je v tom, že není možné pro každou ledku nastavit vlastní režim blikání (jasu). K dispozici jsou pouze dva nastavitelné generátory.
Pokud byste potřebovali řídit blikání (jas) pro každou LEDku zvlášť, byl by pro vás asi lepší obvod PCU9655 (nemám to ale ověřené).

 

Pro ukázku jsem si připravil takovéto schéma:

Tady je demonstrační program::

#!/usr/bin/env python


import smbus
import time


def spustfunkci(funkce): # spusteni vybrane funkce

  if (funkce == 1):    # rozsvitit prvni LEDku (cervenou)
     bus.write_byte_data(addr,0x06,0x01)    


  if (funkce == 2):    # rozsvitit druhou LEDku (zelenou)
     bus.write_byte_data(addr,0x06,0x04)    


  if (funkce == 3):    # rozsvitit treti LEDku (modrou)
     bus.write_byte_data(addr,0x06,0x10)    


  if (funkce == 4):    # rozsvitit ctvrtou LEDku (zlutou)
     bus.write_byte_data(addr,0x06,0x40)    


  if (funkce == 5):    # zhasnout vsechny LEDky
     bus.write_byte_data(addr,0x06,0x00)    


  if (funkce == 6):    # rozsvitit vsechny LEDky
     bus.write_byte_data(addr,0x06,0x55)    


  if (funkce == 7):    # pomalu rozblikat zelenou LED
     bus.write_byte_data(addr,0x02,0x97) # generator 0 = frekvence 1Hz    
     bus.write_byte_data(addr,0x03,0x80) # generator 0 = strida 50%    
     bus.write_byte_data(addr,0x06,0x08) # druha LED na generator 0   


  if (funkce == 8):    # rychle rozblikat zlutou LED
     bus.write_byte_data(addr,0x04,0x25) # generator 1 = frekvence 4Hz    
     bus.write_byte_data(addr,0x05,0x80) # generator 1 = strida 50%    
     bus.write_byte_data(addr,0x06,0xC0) # ctvrta LED na generator 1 


  if (funkce == 9):    # rychle blikat zelenou LED a zaroven pomalu blikat zlutou LED
     bus.write_byte_data(addr,0x02,0x97) # generator 0 = frekvence 1Hz    
     bus.write_byte_data(addr,0x03,0x80) # generator 0 = strida 50%    
     bus.write_byte_data(addr,0x04,0x25) # generator 1 = frekvence 4Hz    
     bus.write_byte_data(addr,0x05,0x80) # generator 1 = strida 50%    
     bus.write_byte_data(addr,0x06,0x8C) # ctvrta LED na generator 0 a druha LED na generator 1   
 

  if (funkce == 10):   # zrychlovani blikani zelene LED
     bus.write_byte_data(addr,0x02,0xFF) # generator 0 = frekvence asi 0.6Hz    
     bus.write_byte_data(addr,0x03,0x80) # generator 0 = strida 50%    
     bus.write_byte_data(addr,0x06,0x08) # druha LED na generator 0   
     for i in range(255,0,-1):
        bus.write_byte_data(addr,0x02,i) # zmena frekvence generatoru 0
        time.sleep(0.05)
     time.sleep(1)
     bus.write_byte_data(addr,0x06,0x00) # nakonec LEDku zhasnout


  if (funkce == 11):   # kratke impulzy zlute LED
     bus.write_byte_data(addr,0x04,0x97) # generator 1 = frekvence 1Hz    
     bus.write_byte_data(addr,0x05,0x05) # generator 1 = strida 2%    
     bus.write_byte_data(addr,0x06,0xC0) # ctvrta LED na generator 1 


  if (funkce == 12):   # kratke zhasinaci impulzy zlute LED
     bus.write_byte_data(addr,0x04,0x97) # generator 1 = frekvence 1Hz    
     bus.write_byte_data(addr,0x05,0xF2) # generator 1 = strida 95%    
     bus.write_byte_data(addr,0x06,0xC0) # ctvrta LED na generator 1 


  if (funkce == 13):   # postupne rozsveceni a zhasinani modre LED
     bus.write_byte_data(addr,0x02,0x00) # generator 0 = frekvence 152Hz    
     bus.write_byte_data(addr,0x03,0x00) # generator 0 = strida 0% (zhasnuto)    
     bus.write_byte_data(addr,0x06,0x20) # treti LED na generator 0

     for i in range(0,256,4):  # rozsvecovani
        bus.write_byte_data(addr,0x03,i) # zmena stridy generatoru 0
        time.sleep(0.1)
     time.sleep(1)

     for i in range(255,0,-4): # zhasinani
        bus.write_byte_data(addr,0x03,i) # zmena stridy generatoru 0
        time.sleep(0.1)
     time.sleep(1)

     bus.write_byte_data(addr,0x06,0x00) # nakonec LEDku zhasnout uplne

 
  if (funkce == 14):   # postupny barevny prechod zelena -> cervena a zpet
     bus.write_byte_data(addr,0x02,0x00) # generator 0 = frekvence 152Hz    
     bus.write_byte_data(addr,0x03,0xFF) # generator 0 = strida 100% (rozsviceno)    
     bus.write_byte_data(addr,0x04,0x00) # generator 1 = frekvence 152Hz    
     bus.write_byte_data(addr,0x05,0x00) # generator 1 = strida 0% (zhasnuto)    
     bus.write_byte_data(addr,0x06,0x0B) # druha LED na generator 0 a prvni LED na generator 1

     for i in range(0,256,2):   # zelena -> cervena
        bus.write_byte_data(addr,0x03,255-i) # zmena stridy generatoru 0
        bus.write_byte_data(addr,0x05,i)     # zmena stridy generatoru 1
        time.sleep(0.05)

     time.sleep(5)

     for i in range(255,0,-2):  # cervena -> zelena
        bus.write_byte_data(addr,0x03,255-i) # zmena stridy generatoru 0
        bus.write_byte_data(addr,0x05,i)     # zmena stridy generatoru 1
        time.sleep(0.05)
     time.sleep(5)

     bus.write_byte_data(addr,0x06,0x00) # nakonec obe LEDky zhasnout




# start programu

bus = smbus.SMBus(1)  # novejsi varianta RasPi (512MB)
#bus = smbus.SMBus(0) # starsi varianta RasPi (256MB)
addr=0x60             # nastavená adresa pomoci adresovacich vstupu

# definice polozek v menu (textovy popis funkci)
textfunkce={}

textfunkce[1] = "rozsvitit prvni LEDku (cervenou)"
textfunkce[2] = "rozsvitit druhou LEDku (zelenou)"
textfunkce[3] = "rozsvitit treti LEDku (modrou)"
textfunkce[4] = "rozsvitit ctvrtou LEDku (zlutou)"
textfunkce[5] = "zhasnout vsechny LEDky"
textfunkce[6] = "rozsvitit vsechny LEDky"
textfunkce[7] = "pomalu rozblikat zelenou LED"
textfunkce[8] = "rychle rozblikat zlutou LED"
textfunkce[9] = "rychle blikat zelenou LED a zaroven pomalu blikat zlutou LED"
textfunkce[10] = "zrychlovani blikani zelene LED"
textfunkce[11] = "kratke impulzy zlute LED"
textfunkce[12] = "kratke zhasinaci impulzy zlute LED"
textfunkce[13] = "postupne rozsveceni a zhasinani modre LED"
textfunkce[14] = "postupny barevny prechod zelena -> cervena a zpet"


bus.write_byte_data(addr,0x06,0x00) # zacina se se zhasnutymi LEDkami


funkce=1
print textfunkce[funkce]

minulaklavesa = 0 # osetreni klaves - dalsi polozka v menu lze vybrat az po uvolneni klavesy

while True:
  vstupy = bus.read_byte_data(0x60,0x01) # cteni stavu dvou tlacitek na vyvodech LED14 a LED15

  if ((vstupy & 0x80) == 0 and minulaklavesa == 0): # prepinani na dalsi polozku v menu
     minulaklavesa = 1
     funkce = funkce + 1
     if (funkce > 14): funkce = 1
     print textfunkce[funkce]

  if ((vstupy & 0x40) == 0 and minulaklavesa == 0):  # spousteni vybrane funkce
     minulaklavesa = 1
     spustfunkci(funkce)

  if ((vstupy & 0xC0) == 192):  # dalsi funkce lze vybrat az po uvolneni obou tlacitek
     minulaklavesa = 0 


  time.sleep(0.1)

A video s ukázkou práce předchozího programu:

Odkaz na YouTube

 

 

 

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 16.2.2013