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