Innehållsförteckning:

Rörelsensorerad LED: 8 steg
Rörelsensorerad LED: 8 steg

Video: Rörelsensorerad LED: 8 steg

Video: Rörelsensorerad LED: 8 steg
Video: VeraPLUS Плагины 2024, Juli
Anonim
Image
Image

Bakgrund:

Glömmer du någonsin att släcka en lampa innan du går till lektionen eller jobbet eller innan du går och lägger dig? De timmarna med lamporna tända när du inte använder dem kan verkligen öka i kostnad och energiförlust. Till exempel, enligt solarcity.com, om du låter lamporna vara tända hela natten i en vecka kan du lägga till $ 25 på din elräkning! För vårt CPE133 -projekt designar vi ett rörelsesensorljus som hjälper människor att spara energi i sina hem och använda sina lampor effektivt.

Vårt system i praktiken:

I praktiken tändes lamporna bara när en sensor detekterar rörelse i rummet. Därefter lyser lamporna under en viss tid, som cirka 30 minuter, och stängs sedan av automatiskt. Men låt oss säga att du bara passerade eller ville lämna rummet tidigt innan den inställda tiden var över. I dessa fall har vi installerat en knapp där du kan slå på eller stänga av lamporna manuellt. Observera att lamporna förblir tända i 30 minuter även när lamporna slås på manuellt eller automatiskt (om inte lamporna släcks manuellt).

Simulering ombord:

För att se att timern fungerar ändrade vi timern till 1 minut.

Material:

  • 1 Basys -bräda (du kan hitta en här från Digilent)
  • 1 PIR -rörelsesensor (du kan hitta en här på Amazon)
  • 1 brödbräda och kit (vi föreslår att du använder den här från Amazon)
  • Från satsen ovan

    • 1 LED
    • 3 hona till hanskabel
    • 6 bygel till hane

Steg 1: Timer

För att lysdioden ska vara tänd i 1 minut måste vi först skapa en timer. Basys 3 -kortet har en intern frekvens på 100MHz vilket gör 100 miljoner cykler lika med 1 sekund. Detta används sedan som en variabel som fungerar som ett maximalt antal för "t_cnt". T_cnt ökar med 1 när Basys 3 -kortet slutför en cykel. När den når 100 miljoner mark kommer den att återställas och en annan variabel, “sek”, kommer att öka med 1. Denna”sek” variabel representerar antalet passerade sekunder och när variabeln är lika med 60 har en hel minut gått.

Kopiera koden nedan till en vhdl -källfil som heter Timer.

enhet COUNT_8B är

port (ÅTERSTÄLL: i std_logic;

CLK: i std_logic; T: out std_logic: = '0');

avsluta COUNT_8B;

arkitektur my_count på COUNT_8B är

konstant max_count: heltal: = (100000000); --signal t_cnt: std_logic_vector (7 downto 0): = "00000000"; signal t_cnt: heltal: = (0); börja processen (CLK, RESET, t_cnt) variabel sec: heltal: = 0; börja om (stigande_kant (CLK)) sedan om (RESET = '1') sedan t_cnt <= (0); - rensa elsif (t_cnt = max_count) då- max_count är 100 miljoner vilket är lika med 1 sekund t_cnt <= (0); - Återställer intern klocka till 0 sek: = sek + 1; - Ökar vår "långsamma klocka" med 1 om (sek = 60) då- När den når 60 sekunder har den nått maxtiden sek: = 0; - Återställer "långsam klocka" till 0 T <= '1'; sluta om; annars t_cnt <= t_cnt + 1; - ökar den interna klockan T <= '0'; sluta om; sluta om; avsluta process; avsluta mitt_räkning;

Steg 2: Knappoptimering

LED
LED

Eftersom frekvensen i Basys -korten är så hög (cirka 100 MHz) när du trycker på för vad du tycker är kort tid till Basys -kortet skulle du trycka på den 100 000 gånger. Detta gör att ljuset snabbt flimrar mellan på och av -läget. Vi försökte optimera knappen genom att skapa ett tillståndsdiagram för att minska flimmer.

D-flip-flops kommer att hålla varje tillstånd och sedan kommer vi att specificera tillståndsövergångarna i processuttalandet.

Kopiera koden nedan till en vhdl -källfil som heter Button.

bibliotek IEEE; använd IEEE. STD_LOGIC_1164. ALL;

enhetsknappen är

Port (btn: i STD_LOGIC; clk: i STD_LOGIC; E: ut STD_LOGIC); slutknapp;

arkitektur Beteende av knappen är

typ state_type är (PRESSED, NP); signal PS, NS: state_type: = NP;

Börja

seq_proc: process (NS, clk) börjar om (rising_edge (clk)) sedan PS <= NS; sluta om; avsluta processen seq_proc;

ns_proc: process (btn, PS)

startfall PS är när NP => if (btn = '1') då NS <= TRYCKT; E <= '1'; annars NS <= NP; E om (btn = '0') då NS <= NP; E <= '0'; annars NS <= TRYCKT; E <= '0'; sluta om; slutfall; avsluta processen ns_proc;

slut Beteende;

Steg 3: LED

Lysdioden har två tillstånd: AV (eller IDLE) och ON. Som sagt tidigare lagras tillstånden i en d-flip-flop. Lampan tänds om sensorn upptäcker rörelse (S = 1) eller när en knapp trycks in (E = 1). Lysdioden släcks automatiskt om timern når 1 minut (T = 1) eller manuellt när du trycker på en knapp (E = 1).

Kopiera koden nedan till en vhdl -källfil med namnet LED.

enhet motion_sensored_light är Port (S: i STD_LOGIC; - sesnor; Port JA10/Pin G3 E: i STD_LOGIC; - extern knapp för manuell funktion; Mittenknapp T: i STD_LOGIC; - när timern når maxtid; Från timer -LED: ut STD_LOGIC; - ljus TRST: ut STD_LOGIC; - återställer timer clk: i STD_LOGIC); - clk för flip flop som håller tillstånden slutet motion_sensored_light;

arkitektur Beteende för rörelse_sensorerat_ljus är

typ state_type är (ST0, ST1); --ST0 = tomgång, ST1 = LED HÖG

signal PS, NS: state_type: = ST0; - NUVARANDE STAT OCH NÄSTA STAT, börjar med ST0 IDLE

Börja

- processblock av flip flop- uppdaterar tillstånd på stigande kant av klocka seq_proc: process (NS, clk) börjar- d flip flop som håller tillstånd if (rising_edge (clk)) då PS <= NS; sluta om; avsluta processen seq_proc;

ns_proc: process (S, E, T, PS)

startfall PS är när ST0 => LED <= '0'; - utgångar för tomgång TRST <= '1'; om (S = '0' ELLER E = '1') då - ingångar för övergång från st0 till st1 NS <= ST1; annars NS LED <= '1'; - utgångar för på tillstånd TRST <= '0'; om (E = '1' ELLER T = '1') sedan - ingångar till för att övergå från st1 till st0 NS <= ST0; annars NS <= ST1; sluta om; slutfall; avsluta processen ns_proc;

slut Beteende;

Steg 4: Toppfil

Nu ska vi portmappa alla våra andra filer till en.

Kopiera koden nedan till en vhdl -källfil med namnet Top_File.

bibliotek IEEE; använd IEEE. STD_LOGIC_1164. ALL;

enhet Top_File är

Port (S: i STD_LOGIC: = '1'; - sesnor; Port JA10/Pin G3 btn: i STD_LOGIC: = '0'; - extern knapp för manuell funktion; Mittenknapps LED: ut STD_LOGIC; - lätt klocka: i STD_LOGIC); - clk för flip-flop som håller tillståndsänden Top_File;

arkitektur Beteende för Top_File är

komponenten COUNT_8B är

port (RESET: in std_logic: = '0'; CLK: in std_logic; T: out std_logic: = '0'); slutkomponent; komponent motion_sensored_light är Port (S: i STD_LOGIC; - sesnor; Port JA10/Pin G3 E: i STD_LOGIC; - extern knapp för manuell funktion; Mittknapp T: i STD_LOGIC; - när timern når maxtid; Från timer -LED: ut STD_LOGIC; - ljus TRST: ut STD_LOGIC; - återställer timer clk: i STD_LOGIC); - clk för flip-flop som håller tillståndsändkomponenten; komponentknappen är Port (btn: i STD_LOGIC; clk: i STD_LOGIC; E: out STD_LOGIC); slutkomponent; signal t_reached_c: std_logic; - signal r_time_c: std_logic; - signal knapp_c: std_logic;

Börja

timer: COUNT_8B portkarta (RESET => r_time_c, CLK => CLK, T => t_reached_c); motion_sensor: motion_sensored_light port map (S => S, E => button_c, T => t_reached_c, LED => LED, TRST => r_time_c, clk => clk); button_controller: knappportkarta (btn => btn, clk => clk, E => button_c); slut Beteende;

Steg 5: Begränsningsfil

Nu måste vi definiera var våra in- och utgångar kommer att vara på tavlan.

Kopiera koden nedan till en vhdl -begränsningsfil med namnet Begränsningar.

## Denna fil är en allmän.xdc för Basys3 rev B -kortet ## För att använda den i ett projekt: ## - avmarkera raderna som motsvarar använda stift ## - byt namn på de använda portarna (i varje rad, efter get_ports) enligt till signalnamnen på översta nivån i projektet

## Klocksignal

set_property PACKAGE_PIN W5 [get_ports clk] set_property IOSTANDARD LVCMOS33 [get_ports clk] create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk] ## Switches #set_property PACKAGE_PIN V17 [17] set_property IOSTANDARD LVCMOS33 [get_ports {sw [0]}] #set_property PACKAGE_PIN V16 [get_ports {sw [1]}] #set_property IOSTANDARD LVCMOS33 [get_ports {sw [1]}] #set_property PACKAGE_PIN W16 [get_port] #set_property IOSTANDARD LVCMOS33 [get_ports {sw [2]}] #set_property PACKAGE_PIN W17 [get_ports {sw [3]}] #set_property IOSTANDARD LVCMOS33 [get_ports {sw [3]}] #set_property PACKAGE_PIN W15 [4]}] #set_property IOSTANDARD LVCMOS33 [get_ports {sw [4]}] #set_property PACKAGE_PIN V15 [get_ports {sw [5]}] #set_property IOSTANDARD LVCMOS33 [get_ports {sw [5]}] #set_property PACKAGE_PIN W14

## lysdioder

#set_property PACKAGE_PIN U16 [get_ports {led [0]}] #set_property IOSTANDARD LVCMOS33 [get_ports {led [0]}] #set_property PACKAGE_PIN E19 [get_ports {led [1]}] #set_property IOSTANDARD LVCMOS33 [get_port] }] #set_property PACKAGE_PIN U19 [get_ports {led [2]}] #set_property IOSTANDARD LVCMOS33 [get_ports {led [2]}] #set_property PACKAGE_PIN V19 [get_ports {led [3]}] #set_property IOSTANDARD LVCMOS33 [3]}] #set_property PACKAGE_PIN W18 [get_ports {led [4]}] #set_property IOSTANDARD LVCMOS33 [get_ports {led [4]}] #set_property PACKAGE_PIN U15 [get_ports {led [5]}] #set_property IOSTANDARD LVCMOS33 led [5]}] #set_property PACKAGE_PIN U14 [get_ports {led [6]}] #set_property IOSTANDARD LVCMOS33 [get_ports {led [6]}] #set_property PACKAGE_PIN V14 [get_ports {led [7]}] #set_property IOSTANDARD LVCM get_ports {led [7]}] #set_property PACKAGE_PIN V13 [get_ports {led [8]}] #set_property IOSTANDARD LVCMOS33 [get_ports {led [8]}] #set_property PACKAGE_PIN V3 [get_ports {led [9]}] #set_property IOSTANDARD LVCMOS33 [get_ports {led [9]}] #set_property PACKAGE_PIN W3 [get_ports {led [10]}] #set_property IOSTANDARD LVCMOS33 [get_ports {led [10]}] #set_property PACKAGE_PIN U3

#set_property PACKAGE_PIN V7 [get_ports dp]

#set_property IOSTANDARD LVCMOS33 [get_ports dp]

#set_property PACKAGE_PIN U2 [get_ports {an [0]}]

#set_property IOSTANDARD LVCMOS33 [get_ports {an [0]}] #set_property PACKAGE_PIN U4 [get_ports {an [1]}] #set_property IOSTANDARD LVCMOS33 [get_ports {en [1]}] #set_property PACKAGE_PIN V4 [get_port] }] #set_property IOSTANDARD LVCMOS33 [get_ports {an [2]}] #set_property PACKAGE_PIN W4 [get_ports {an [3]}] #set_property IOSTANDARD LVCMOS33 [get_ports {an [3]}]

## Knappar

set_property PACKAGE_PIN U18 [get_ports btn] set_property IOSTANDARD LVCMOS33 [get_ports btn] #set_property PACKAGE_PIN T18 [get_ports btnU] #set_property IOSTANDARD LVCMOS33 [get_ports btnU] #set_property PACKAGE_PIN W19 [get_ports btnL] #set_property IOSTANDARD LVCMOS33 [get_ports btnL] #set_property PACKAGE_PIN T17 [get_ports btnR] #set_property IOSTANDARD LVCMOS33 [get_ports btnR] #set_property PACKAGE_PIN U17 [get_ports btnD] #set_property IOSTANDARD LVCMOS33 [get_ports btnD]

## Pmod Header JA

## Sch name = JA1 #set_property PACKAGE_PIN J1 [get_ports {JA [0]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JA [0]}] ## Sch name = JA2 #set_property PACKAGE_PIN L2 [get_ports {JA [1]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JA [1]}] ## Sch name = JA3 #set_property PACKAGE_PIN J2 [get_ports {JA [2]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JA [2]}] ## Sch -namn = JA4 #set_property PACKAGE_PIN G2 [get_ports {JA [3]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JA [3]}] ## Sch name = JA7 #set_property PACKAGE_PIN H1 [get_ports {JA [4]}] #AND_pro LVCMOS33 [get_ports {JA [4]}] ## Sch name = JA8 set_property PACKAGE_PIN K2 [get_ports LED] set_property IOSTANDARD LVCMOS33 [get_ports LED] ## Sch name = JA9 #set_property PACKAGE_PIN H2 [get_ports {JA] [6] set_property IOSTANDARD LVCMOS33 [get_ports {JA [6]}] ## Sch name = JA10 set_property PACKAGE_PIN G3 [get_ports S] set_property IOSTANDARD LVCMOS33 [get_ports S]

## Pmod Header JB

## Sch name = JB1 #set_property PACKAGE_PIN A14 [get_ports {JB [0]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JB [0]}] ## Sch name = JB2 #set_property PACKAGE_PIN A16 [get_ports {JB [1]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JB [1]}] ## Sch name = JB3 #set_property PACKAGE_PIN B15 [get_ports {JB [2]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JB [2]}] ## Sch -namn = JB4 #set_property PACKAGE_PIN B16 [get_ports {JB [3]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JB [3]}] ## Sch name = JB7 #set_property PACKAGE_PIN A15 [get_ports {JB [4]}] #AND_pro LVCMOS33 [get_ports {JB [4]}] ## Sch name = JB8 #set_property PACKAGE_PIN A17 [get_ports {JB [5]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JB [5]}] ## Sch name = JB9 #set_property PACKAGE_PIN C15 [get_ports {JB [6]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JB [6]}] ## Sch name = JB10 #set_property PACKAGE_PIN C16 [get_ports {JB [7]}] #set_property IOSTANDARD LVCM JB [7]}]

## Pmod Header JC

## Sch name = JC1 #set_property PACKAGE_PIN K17 [get_ports {JC [0]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JC [0]}] ## Sch name = JC2 #set_property PACKAGE_PIN M18 [get_ports {JC [1]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JC [1]}] ## Sch name = JC3 #set_property PACKAGE_PIN N17 [get_ports {JC [2]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JC [2]}] ## Sch -namn = JC4 #set_property PACKAGE_PIN P18 [get_ports {JC [3]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JC [3]}] ## Sch name = JC7 #set_property PACKAGE_PIN L17 [get_ports {JC [4]}] #AND_pro LVCMOS33 [get_ports {JC [4]}] ## Sch name = JC8 #set_property PACKAGE_PIN M19 [get_ports {JC [5]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JC [5]}] ## Sch name = JC9 #set_property PACKAGE_PIN P17 [get_ports {JC [6]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JC [6]}] ## Sch name = JC10 #set_property PACKAGE_PIN R18 [get_ports {JC [7]}] #set_property IOSTANDARD LVCM JC [7]}]

## Pmod Header JXADC

## Sch name = XA1_P #set_property PACKAGE_PIN J3 [get_ports {JXADC [0]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JXADC [0]}] ## Sch name = XA2_P #set_property PACKAGE_PIN L3 [get_port] #set_property IOSTANDARD LVCMOS33 [get_ports {JXADC [1]}] ## Sch name = XA3_P #set_property PACKAGE_PIN M2 [get_ports {JXADC [2]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JXADC#] = XA4_P #set_property PACKAGE_PIN N2 [get_ports {JXADC [3]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JXADC [3]}] ## Sch name = XA1_N #set_property PACKAGE_PIN K3 [get_ports {J}] LVCMOS33 [get_ports {JXADC [4]}] ## Sch name = XA2_N #set_property PACKAGE_PIN M3 [get_ports {JXADC [5]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JXADC [5]}] ## Schset = XA3_N PACKAGE_PIN M1 [get_ports {JXADC [6]}] #set_property IOSTANDARD LVCMOS33 [get_ports {JXADC [6]}] ## Sch name = XA4_N #set_property PACKAGE_PIN N1 [get_ports {JXADC [7]}] #set_property [get_ports {JXADC [7]}]

## VGA -kontakt

#set_property PACKAGE_PIN G19 [get_ports {vgaRed [0]}] #set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed [0]}] #set_property PACKAGE_PIN H19 [get_ports {vgaRed [1]}] #set_property_OST_ARD_OS_ARD_OSGARDOSOS_OST_ARD_OSGA_OSGARDOOSED [1]} }] #set_property PACKAGE_PIN J19 [get_ports {vgaRed [2]}] #set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed [2]}] #set_property PACKAGE_PIN N19 [get_ports {vgaRed [3]}] #set_property [v3RED] 3]}] #set_property PACKAGE_PIN N18 [get_ports {vgaBlue [0]}] #set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue [0]}] #set_property PACKAGE_PIN L18 [get_ports {vgaBlue [1]}] set vgaBlue [1]}] #set_property PACKAGE_PIN K18 [get_ports {vgaBlue [2]}] #set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue [2]}] #set_property PACKAGE_PIN J18 [get_ports {vgaBluOST [v3Bluost] get_ports {vgaBlue [3]}] #set_property PACKAGE_PIN J17 [get_ports {vgaGreen [0]}] #set_property IOSTANDARD LVCMOS33 [get_p orts {vgaGreen [0]}] #set_property PACKAGE_PIN H17 [get_ports {vgaGreen [1]}] #set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen [1]}] #set_property PACKAGE_PIN G17 [get_ports {vgaGOST_ARD] LVCMOS33 [get_ports {vgaGreen [2]}] #set_property PACKAGE_PIN D17 [get_ports {vgaGreen [3]}] #set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen [3]}] #set_property PACKAGE_PIN P19_get_port_post_PORT_POS_PORT_POS_POST_PORT_POS_POST_PORT_POS_PARTS_pOS_POS_POS_POS_POS_POS_POS_POS Hsync] #set_property PACKAGE_PIN R19 [get_ports Vsync] #set_property IOSTANDARD LVCMOS33 [get_ports Vsync]

## USB-RS232-gränssnitt

#set_property PACKAGE_PIN B18 [get_ports RsRx] #set_property IOSTANDARD LVCMOS33 [get_ports RsRx] #set_property PACKAGE_PIN A18 [get_ports RsTx] #set_property IOSTANDARD LVCMOS33 [get_ports RsTx]

## USB HID (PS/2)

#set_property PACKAGE_PIN C17 [get_ports PS2Clk] #set_property IOSTANDARD LVCMOS33 [get_ports PS2Clk] #set_property PULLUP true [get_ports PS2Clk] #set_property PACKAGE_PIN BREAK [PS_PART] PS33DATOR] PS3DATOR_POS_PORT_POS_PORT_POS_PORT_POS_PORT_POSPORT_POS_PORT_POSPORT

## Quad SPI Flash

## Observera att CCLK_0 inte kan placeras i enheter i 7 -serien. Du kan komma åt den med ## STARTUPE2 primitiv. #set_property PACKAGE_PIN D18 [get_ports {QspiDB [0]}] #set_property IOSTANDARD LVCMOS33 [get_ports {QspiDB [0]}] #set_property PACKAGE_PIN D19 [get_ports {QspiDB [1]}] #set_property [LIST_SP_PORT] }] #set_property PACKAGE_PIN G18 [get_ports {QspiDB [2]}] #set_property IOSTANDARD LVCMOS33 [get_ports {QspiDB [2]}] #set_property PACKAGE_PIN F18 [get_ports {QspiDB [3]}] #set_pro_PART_PART_PORT_PORT_prop 3]}] #set_property PACKAGE_PIN K19 [get_ports QspiCSn] #set_property IOSTANDARD LVCMOS33 [get_ports QspiCSn]

Steg 6: Anslutning av PIR -rörelsesensorn

Anslutning av PIR -rörelsesensorn
Anslutning av PIR -rörelsesensorn
Anslutning av PIR -rörelsesensorn
Anslutning av PIR -rörelsesensorn

PIR -rörelsesensorn har tre stift: effekt, gnd respektive larm (se första bilden). Rörelsesensorn som föreslås i den här instruktionsboken kan anslutas direkt till brödbrädan. Men för sensorn vi använde var vi tvungna att klippa och ta bort trådarna och sedan lödda de exponerade ändarna för att förhindra att de sliter. På brödbrädan sätter du in en manlig till kvinnlig bygelkabel i serie med ström- och jordstiftet och sedan en manlig till manlig bygelkabel i serie med larmstiftet (se den andra bilden).

Steg 7: Anslut LED -lampan i brödbrädan

Anslutning av lysdioden i brödbrädan
Anslutning av lysdioden i brödbrädan
Anslutning av lysdioden i brödbrädan
Anslutning av lysdioden i brödbrädan

Anslut lysdioden till brödbrädan. Sätt i en svart han -till -hanskabel i serie med kort ledning på lysdioden. Koppla sedan in seriekopplingen i olika färgade han- till hankablar med LED: ns långa ledning.

Steg 8: Basys Board Connections

Basys Board Connections
Basys Board Connections

Anslut honändarna på PIR -rörelsesensorn till 5 volts spänningskällan på grundkortet. Anslut sedan den manliga LED -jordkabeln till sidoportens jord, sedan larmkabeln från PIR -rörelsesensorn och sedan LED -ingångskabeln (som på bilden).

Rekommenderad: