Rozblikání 8 Led pomocí 74HC595

Odpovědět
Uživatelský avatar
pasta
Příspěvky: 50
Registrován: čtv 07. led 2021 9:21:18
Dal poděkování: 1 poděkování
Dostal poděkování: 3 poděkování

Rozblikání 8 Led pomocí 74HC595

Příspěvek od pasta » čtv 07. led 2021 14:09:04

Ahoj světe!
Ježíšek mi přinesl RPI 4B, tak jsem se pustil do objevování. Měl jsem již doma nějaké součástky a po prvním blikání ledkou a po prvních skriptech v Pythonu jsem se odhodlal zjistit na co jsou všechny ty šváby. Jako první přišel na řadu posuvný registr 74HC595. Wau, stačí mi jen 3piny na ovládání 8 Led. Vycházel jsem návodu viz.:

Kód: Vybrat vše

https://arduino8.webnode.cz/news/lekce-12-posuvny-registr-74hc595/
.
Je tam vše celkem srozumitelně popsáno. První zapojení tohoto bastlu bylo přes tlačítka, kde jsem si ověřil zda tomu rozumím.

Rozuměl, jenže jsem zjistil, že 74HC595 je čip velice citlivý a rychlý, a ne vždy mu je jasné kdy vlastně příjímá 1 a kdy 0.
Také jsem chtěl na GPIO použít piny, bez speciální funkce (GPIO 21,20,16 - ty poslední vedle sebe), proto na vstupech čipu bylo nutné použít 10k (pull-up?) rezistory, aby logiku lépe chápal. U ledek jsem zvolil 330R. Chtěl jsem napájet Malinovejma 3.3 voltama (pin1 a kterákoli GND), které pro funkčnost bohatě stačí. Tak a teď už jen napsat program.
Obrázek
Vzhledem k tomu, že jsem na internetu nenašel žádný pro mě smysluplný skript, tak jsem se rozhodl napsat svůj. Po dvou dnech bádání a laborování jsem se dobral k uspokojivému cíli. Program sice není úplně odladěný, funkční však ano. Třeba to někomu zachrání 2 dny. Třeba si ho i dopíše (kdyžtak dejte echo jak to jde, případně pošlete ten váš)

První kod umí pouze posouvat vámi nastavenou sekvenci

Kód: Vybrat vše

import RPi.GPIO as GPIO
from time import sleep
srclk=21 #označení ovládacích pinů=posouvá registr
rclk=20  #označení ovládacích pinů=zobrazí výstup registru
ser=16   #označení ovládacích pinů=serial data

GPIO.setmode(GPIO.BCM)


x1 = [1, 1, 0, 0, 1, 1, 0, 0] #tady se nastaví sekvence ledek


while 1:
    for x in x1:
       s=x
       print(s)
    
    
       GPIO.setup(srclk, GPIO.OUT)
       GPIO.setup(rclk, GPIO.OUT)
       GPIO.setup(ser, GPIO.OUT)
       GPIO.output(rclk, False)
       sleep(0.1)
       GPIO.output(ser, s)
       sleep(0.1)
       GPIO.output(srclk, True)
       sleep(0.1)
       GPIO.output(srclk, False)
       sleep(0.1)
       GPIO.output(ser, False)
       sleep(0.1)
       GPIO.output(rclk, True)
       
Druhý kód už je trochu sofistikovanější:

Kód: Vybrat vše

import RPi.GPIO as GPIO
from time import sleep

th = "ledtheme2.py" #soubor, ze kterého se načítají animace viz kód níže
d = input("Speed:") #požadavek na vstup klávesnice pro rychlost sleep
                               #čim nižší hodnota, tím rychlejšá animace. Stačí zadat celá čísla, vše je děleno 1000 proměnná d
print("Speed: " + d)




exec(compile(source=open(th).read(), filename=th, mode='exec')) #načtení animačního souboru z proměnné th


GPIO.setmode(GPIO.BCM) 
krok=21                #
potv=20                #Tady je označení pinu do proměnných
ser=16                 #
i=0                    #počítadlo kroků v jednom kroku animace

d=float(d)/1000     

GPIO.setmode(GPIO.BCM)




pkroku = len(pokr)     #zjištění délky počtu kroků animace viz doprovoodný soubor ledtheme2.py
delka = len(x1)          #zjištění délky jedoho kroku měl by mít 8bitů, pokud máme jeden 74HC595

b=0                           #počítadlo kroků celé animace 
while 1:
    q=pokr[0+b]          #Přepínač na další krok animace
    for x in q:              #Přepínač na další bit v kroku
       s=x                    #Zjištění hodnoty bitu v 1kroku
       
       GPIO.setup(potv, GPIO.OUT) #
       GPIO.setup(krok, GPIO.OUT) #   nastavení pinů pro výstup
       GPIO.setup(ser, GPIO.OUT)  #
                              
       GPIO.output(potv, False)   # Vypne potvrzovací-zobrazovací impuls
       sleep(d)                   
       GPIO.output(ser, s)        #   Zapíše Hodnotu 1bitu v kroku
       sleep(d)                
       GPIO.output(krok, True)    #   posune registr
       sleep(d)                 
       GPIO.output(krok, False)   #   vypne posouvání
       sleep(d)                  
       GPIO.output(ser, False)    #   vypne zápis 
       sleep(d)               
      
       i+=1                                 #přidá krok do počítadla kroků v sekvenci
                                               #smyčka běží dokud nedojde na konec jjednoho kroku animace
       if i==delka:                      #pokud dorazí na konec sekvence zabrazí hodnoty v registru
           GPIO.setup(potv, GPIO.OUT)
           GPIO.output(potv, True)     #dá impuls zobrazení registru celého registru
           b+=1                                   #posune počítadlo na další krok animace
           i=0                                      #resetuje počítadlo bitů sekvence
           sleep(d)
           
           if b == pkroku:                    #pokud je je hodnota počítadla kroků rovna
                                                     #počtu kroků,
                                                     #resetuje počítadlo kroků a animace jede odznova
               b=0
              
 
A takhle vypadá doprovodný animační soubor - těch si můžete udělat víc. Kroky mají vždy 8bitů, protože 74HC595 má stejně jen 8 výstupů.
Nezapomeňte v horním skriptu přejmenovat podle souboru proměnnou th a mít soubor uložen ve stejné složce.

Kód: Vybrat vše


x1 = [1, 0, 0, 0, 0, 0, 0, 0]     #jednotlivé kroky zapsány v 8 bitech
x2 = [1, 1, 0, 0, 0, 0, 0, 0]
x3 = [1, 0, 0, 0, 0, 0, 0, 0]
x4 = [1, 1, 1, 0, 0, 0, 0, 0]
x5 = [1, 1, 0, 0, 0, 0, 0, 0]
x6 = [1, 1, 1, 1, 0, 0, 0, 0]
x7 = [1, 1, 0, 0, 0, 0, 0, 0]
x8 = [1, 1, 1, 1, 1, 0, 0, 0]
x9 = [1, 1, 1, 0, 0, 0, 0, 0]
x10 = [1, 1, 1, 1, 1, 1, 0, 0]
x11 = [1, 1, 1, 1, 0, 0, 0, 0]
x12 = [1, 1, 1, 1, 1, 1, 1, 0]
x13 = [1, 1, 1, 0, 0, 0, 0, 0]
x14 = [1, 1, 1, 1, 1, 1, 1, 1]
x15 = [1, 1, 1, 0, 0, 0, 0, 0]
pokr = [x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15] #v tomto poli musí být zapsány všechny kroky které chcete v animaci použít, počet je libovolný a 
                                                                                                 #program s tím počítá
Tak to je za mě vše. Ozkoušeno pouze v Thony python na Rpi 4B v Raspbianu.
Těším se na ohlasy, na negativní ohlasy a hlavně na vylepšené kódy. Pokud kod použijete pro svou aplikaci dejte mi alespoň vědět. Určitě by zvládla i jiné věci než jen svítit LEDkama :-P. Předem se omlouvám za případné technické nesrovnalosti. Takový návod člověk nepíše každý den.

Ať žije Malina!!

Pasťa
BigSandy
Příspěvky: 196
Registrován: úte 13. srp 2019 8:07:32
Dal poděkování: 1 poděkování
Dostal poděkování: 12 poděkování

Re: Rozblikání 8 Led pomocí 74HC595

Příspěvek od BigSandy » čtv 21. led 2021 10:16:35

Abych řek pravdu, tak pokud nejde o penize, tak raději mam expandery.
Uživatelský avatar
pasta
Příspěvky: 50
Registrován: čtv 07. led 2021 9:21:18
Dal poděkování: 1 poděkování
Dostal poděkování: 3 poděkování

Re: Rozblikání 8 Led pomocí 74HC595

Příspěvek od pasta » ned 28. lis 2021 10:12:26

To chápu. :)
Odpovědět