Chytrá WiFi zásuvka Sonoff S26
Chytrá domácnost umožňuje ovládat elektrické spotřebiče na dálku. A přesně to umožní zásuvka Sonoff S26.
Již dříve jsem napsal návod, který se věnoval základnímu zprovoznění FPGA kitu Cyclone II s programátorem USB blaster, který najdete zde. V tomto návodu navazuji na předchozí ukázku blikání LED diodami, kdy jsem si připravil 2 způsoby, jak pracovat s tlačítkem připojeným na vstup.
Pro začátek se podíváme na zapojení. Pro něj je potřeba zapojit tlačítko s pull-up odporem podobným způsobem, jako jste to už zajisté viděli v Arduino návodech. Zapojíme tedy jeden pin tlačítka na GND a druhý přes odpor na VCC. A následně vyvedeme bod mezi odporem a tlačítkem na libovolný volný datový pin FPGA, kdy já jsem zvolil pin 4.
První jednoduchý ukázkový kód pracuje zjednodušeně tak, že přiřadíme vstupní pin tlačítka na LED diodu. Tím dosáhneme toho, že vždy jedna LED dioda svítí a druhá ne, protože je do ní nahraná negovaná (tedy opačná) hodnota.
-- Prace s tlacitkem -- navody.dratek.cz -- pripojeni potrebnych knihoven library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; -- vytvoreni entity s porty entity pouziti_tlacitka is port ( clk : in std_logic; tlac : in std_logic; led1 : out std_logic; led2 : out std_logic; led3 : out std_logic ); end pouziti_tlacitka; -- vytvoreni architektury pro entitu architecture rtl of pouziti_tlacitka is -- hlavni blok begin -- prirazeni pinu tlacitka přímo na LED diody led1 <= tlac; led2 <= not tlac; end rtl;
Po nahrání tohoto programu do FPGA pomocí vývojového prostředí Quartus II je zapotřebí ještě provést namapování vstupního pinu tlačítka. To provedeme opětovným zavoláním příslušného nástroje, kdy stačí otevřít nabídku „Assignments-Pin Planner“. V tomto nástroji následně uvidíte nepřiřazený pin pro „tlac“, kdy já jsem přiřadil zmíněný PIN_4.
Když nyní provedete kompilaci a nahrání programu do FPGA, můžete si vyzkoušet, že každé stisknutí provede zmíněné rozsvícení LED diod v opačném pořadí.
V běžné praxi ale musíme s tlačítky pracovat trochu složitějším způsobem, abychom vyřešili problematiku zákmitů (anglicky debounce). Pro ten existuje několik řešení, kdy já jsem vybral jedno poměrně dobře čitelné a udělal s ním ukázku čítače pro 3 bity.
Druhý ukázkový kód tedy kromě stejných portů obsahuje také více proměnných, kde si můžete všimnout, že v mém případě je kýžená filtrace zákmitů nastavena na 1 sekundu. Celý program je detailně okomentovaný přímo v kódu.
-- Prace s tlacitkem -- navody.dratek.cz -- pripojeni potrebnych knihoven library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; -- vytvoreni entity s porty entity pouziti_tlacitka is port ( clk : in std_logic; tlac : in std_logic; led1 : out std_logic; led2 : out std_logic; led3 : out std_logic ); end pouziti_tlacitka; -- vytvoreni architektury pro entitu architecture rtl of pouziti_tlacitka is -- zadani rychlosti vstupnich hodin (50 MHz) constant CLK_FREKVENCE : integer := 50_000_000; -- zadani delky v milisekundach constant DELKA_USTALENI : integer := 1000; -- velikost prepinace constant VELIKOST_CITACE : integer := CLK_FREKVENCE/1000*DELKA_USTALENI; -- aktivni hrana pri sepnuti tlacitka constant TLAC_AKTIV : std_logic := '0'; -- promenna citace signal CITAC : integer := 0; -- vytvoreni typu s 2 stavy type state_type is (stav0,stav1); -- promenna pro ulozeni aktualniho stavu signal AKT_STAV : state_type := stav0; -- promenna pro definici prepinace signal PREPINAC : std_logic; -- promenna pro ulozeni stavu LED jako integeru pro citani signal STAV_LED_INT : integer range 0 to 7; -- promenna pro ulozeni stavu LED jako vektoru bitu pro prirazeni na LED signal STAV_LED : std_logic_vector(2 downto 0); -- hlavni blok begin -- process citlivy na zmenu hodin clk process(clk) begin -- detekce nabezne hrany hodin if(rising_edge(clk)) then -- stavovy automat case (AKT_STAV) is -- stav0 je vychozi a cekame v nem na aktivaci tlacitka when stav0 => -- pri aktivaci tlacitka prechazime do stav1 if(tlac = TLAC_AKTIV) then AKT_STAV <= stav1; else AKT_STAV <= stav0; --wait until button is pressed. end if; -- prirazeni nuly do prepinace pro jeho reset PREPINAC <= '0'; -- stav1 resi citani citace a nastaveni prepinace when stav1 => -- pri dosazeni nastavene maximalni hodnoty citace -- aktivujeme prepinac pri zmacknutem tlacitku if(CITAC = VELIKOST_CITACE) then CITAC <= 0; if(tlac = TLAC_AKTIV) then PREPINAC <= '1'; end if; AKT_STAV <= stav0; -- jinak pricteme pouze jednicku do citace else CITAC <= CITAC + 1; end if; end case; end if; end process; -- proces citlivy na zmenu prepinace process(PREPINAC) begin -- pri nabezne hrani prepinace pricteme jednicku do stavu LED if(rising_edge(PREPINAC)) then STAV_LED_INT <= STAV_LED_INT + 1; end if; end process; -- priradime hodnotu stavu LED v integer promenne do bitoveho vektoru stav_led <= std_logic_vector(to_unsigned(STAV_LED_INT, stav_led'length)); -- prirazeni jednotlivych bitu promenne stav_led na piny s LED diodami led1 <= not stav_led(0); led2 <= not stav_led(1); led3 <= not stav_led(2); end rtl;
Po nahrání druhého programu si můžete vyzkoušet, že když budete držet tlačítko méně než 1 sekundu, nic se nestane. Pokud ale dosáhnete času 1 sekundy a více, tak s každým dosažením tohoto času se přičte jednička do čítače, jehož hodnota se promítne v binárním kódu na 3 vestavěné LED diody.
Tento návod pro FPGA kit Cyclone II byl věnován ukázce dvojí práce se vstupními signály, kdy jsem na vstup připojil jednoduché tlačítko. Ve složitější variantě byla předvedena jedna z technik odstranění zákmitů, kdy můžete tzv. debounce řešit i jinými způsoby, protože také záleží, co má být výsledkem – jestli krátký impulz na výstupu jako v tomto případě či trvalé přepnutí výstupu a podobně.
Zmíněný kit můžete koupit zde:
https://dratek.cz/arduino/1508-fpga-ep2c5t144-cycloneii-vyvojovy-kit-altera-usb-blaster-jtag-programator.html
Chytrá domácnost umožňuje ovládat elektrické spotřebiče na dálku. A přesně to umožní zásuvka Sonoff S26.
e-Paper displeje už jsou dostupné i pro bastlení za rozumné ceny a pro jejich ovládání se hodí tento Driver.