Rozblikání 8 Led pomocí 74HC595
Napsal: č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.: .
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.
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
Druhý kód už je trochu sofistikovanější:
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.
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ředem se omlouvám za případné technické nesrovnalosti. Takový návod člověk nepíše každý den.
Ať žije Malina!!
Pasťa
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.
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)
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
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á
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ředem se omlouvám za případné technické nesrovnalosti. Takový návod člověk nepíše každý den.
Ať žije Malina!!
Pasťa