Share tugas kuliah.. :)
BAGIAN-BAGIAN ELEVATOR
1. Panel Bagian Dalam Elevator
Panel bagian dalam elevator memiliki
tombol untuk menuju ke lantai yang akan dituju dan tombol buka pintu untuk
menahan pintu tetap terbuka bila diperlukan pada saat elevator dalam keadaan
berhenti. Gambar 1. berikut ilustrasi panel bagian dalam elevator:
Gambar 1. Ilustrasi Panel Bagian Dalam
Elevator Lima Lantai
2. Panel Bagian Luar Elevator pada
Setiap Lantai Gedung
Panel bagian luar elevator pada setiap
lantai gedung memilik tombol untuk request masuk ke elevator, sehingga
penumpang bisa memanggil (request) elevator dan masuk elevator. Ilustrasi panel
bagian luar pada setiap lantai dapat dilihat pada Gambar 2. berikut:
Gambar 2. Ilustrasi Panel Bagian Luar
Elevator pada Setiap Lantai Gedung
3. Indikator
Posisi Elevator
Elevator juga dilengkapi indikator
posisi elevator (bisa berupa seven segment atau perangkat display lain),
sehingga posisi elevator bisa diketahui ada pada lantai berapa dan apakah
sedang naik atau turun. Gambar 3. berikut mengilustrasikan indikator posisi
elevator:
Gambar 3. Ilustrasi Indikator Posisi Elevator
STATE DIAGRAM ELEVATOR (ILUSTRASI)
Pada Gambar 4. berikut
mengilustrasikan state diagram cara kerja dari elevator lima lantai. Elevator
ini bergerak berdasarkan perintah atau request baik dari dalam elevator maupun
dari luar elevator (pada setiap lantai). Kemudian elevator akan membandingkan
posisi elevator (saat ini) dengan lantai yang akan dituju sesuai request,
sehingga elevator akan bisa menentukan arah geraknya (naik atau turun).
Gambar 4. Ilustrasi State Diagram
Elevator Lima Lantai
DESIGN TINA
Berikut
adalah penerapan design pada simulator TINA:
Gambar 6. Simulasi Design Elevator
Menggunakan Software TINA
VIDEO SIMULASI
SOURCE CODE
Source code dicompile dengan program Quartus. Berikut
source code VHDL dari state diagram elevator lima lantai:
--Bismillah
--Coba Elevator
--Originally Designed by: Muhammad Nurul Puji (muhammadpuji.its@gmail.com)
--Coba Elevator
--Originally Designed by: Muhammad Nurul Puji (muhammadpuji.its@gmail.com)
--Student of University of Indonesia (UI)
library ieee;
use ieee.std_logic_1164.all;
entity cobaelevator is
port (clk : in std_logic; --untuk maintenance (tombol stop)
manual_bukapintu : in std_logic; --dari dalam (atau luar (diseri dgn luar atau diseri dengan sensor)) elevator (hanya pada saat berhenti)
in1, in2, in3, in4, in5 : in std_logic; --dari dalam elevator (untuk tujuan mau kelantai berapa?)
in1naik, in2naik, in3naik, in4naik, in5naik : in std_logic; --dari masing-masing lantai (diluar elevator)
in1turun, in2turun, in3turun, in4turun, in5turun : in std_logic; --dari masing-masing lantai (diluar elevator)
a1, a2, a3, a4, a5, a6, a7: out std_logic; --untuk menunjukkan posisi elevator melalui seven segmen
motornaik, motorturun, tutuppintu: out std_logic; --untuk mekanik motor dan pintu
bukapintu: out std_logic); --harusnya pake buffer tapi di Tina tdk bisa (jadi untuk simulasi tetap pake out). Buffer digunakan sbg buffer supaya bisa di read and write (untuk cek apa masih terbuka)
end cobaelevator;
architecture behavior of cobaelevator is
constant timetutuppintu: integer := 3; --untuk tutup pintu otomatis
constant timepintuselesaimenutup: integer :=2; --waktu pintu untuk selesai menutup
constant time_nx_state: integer := 4; --waktu yg dibutuhkan untuk naik satu lantai
signal permintaan : std_logic_vector (0 to 4) :="00000";
signal arahelevator : integer range 0 to 2 :=0;
signal signalmotornaik : std_logic :='0';
signal signalmotorturun : std_logic :='0';
signal signalnaikturunpenumpang : std_logic:='0';
signal signalstatus : std_logic:='1';
type status is (lantai1, lantai2, lantai3, lantai4, lantai5); --penentuan signal dari masing-masing posisi lantai
signal pr_state, nx_state: status;
begin
utama: process (clk, manual_bukapintu, in1, in2, in3, in4, in5, in1naik, in2naik, in3naik, in4naik, in5naik, in1turun, in2turun, in3turun, in4turun, in5turun)
variable digit1 : std_logic_vector (6 downto 0); ----------untuk Seven Segment------
variable count: integer range 0 to (time_nx_state + timetutuppintu + timepintuselesaimenutup);
variable bufferbukapintu: std_logic; --harusnya menggunakan buffer untuk bukapintu, tapi di Tina tdk bisa. Jadi menggunakan variable ini
------------Variable ini untuk Arah Elevator---------------------
variable posisi : integer range 0 to 4;
variable tempnaik, tempturun : integer range -4 to 4 :=0; --karena ada kemungkinan bernilai negatif (tetapi yg dipake cuma positif)
variable temp : integer range 1 to 2 :=1;
------------End Variable Arah Elevator---------------------------
begin
if (clk'event and clk='1') then
------------------Cek Permintaan----------------
permintaan(0)<= permintaan(0) or in1 or in1naik or in1turun;
permintaan(1)<= permintaan(1) or in2 or in2naik or in2turun;
permintaan(2)<= permintaan(2) or in3 or in3naik or in3turun;
permintaan(3)<= permintaan(3) or in4 or in4naik or in4turun;
permintaan(4)<= permintaan(4) or in5 or in5naik or in5turun;
------------Begin Arah Elevator-----------------------
case pr_state is
when lantai1 => posisi :=0;
when lantai2 => posisi :=1;
when lantai3 => posisi :=2;
when lantai4 => posisi :=3;
when lantai5 => posisi :=4;
end case;
for i in 1 to 4 loop -- i harus dalam range konstanta
if permintaan(i)= '1' then
tempnaik:=i-posisi;
else null;
end if;
end loop;
for i in 3 downto 0 loop -- i harus dalam range konstanta
if permintaan(i)= '1' then
tempturun:=posisi-i;
else null;
end if;
end loop;
if tempnaik=0 and tempturun=0 then --saat posisi lantai sama dengan permintaan
arahelevator<=0;
elsif temp=1 then
arahelevator <= 1; --naik
if tempnaik < 1 then
temp :=2 ;
else null;
end if;
elsif temp= 2 then --turun
arahelevator <= 2;
if tempturun <1 then
temp:=1;
else null;
end if;
else null;
end if;
--------------End Arah Elevator------------------------------
-----------------Bagian Utama------------------------------
count:=count + 1;
if (manual_bukapintu='1' and signalmotornaik = '0' and signalmotorturun = '0') then --untuk menahan pintu tetap terbuka saat elevator berhenti
bukapintu<='1';
bufferbukapintu:='1';
tutuppintu <= '0';
count:=0;
elsif (signalnaikturunpenumpang='1') then
if (count < timetutuppintu) then
motornaik<=signalmotornaik;
motorturun<=signalmotorturun;
bukapintu <= '1';
bufferbukapintu:='1';
tutuppintu <= '0';
elsif (count < (timetutuppintu + timepintuselesaimenutup) ) then
bukapintu<='0';
bufferbukapintu:='0';
tutuppintu<='1';
else
tutuppintu <='0';
pr_state<=nx_state;
if signalstatus='1' then
signalstatus<='0';
else
signalstatus<='1';
end if;
count:=0;
end if;
else --jika tidak ada naik turun penumpang maka lift tdk berhenti
if (count < timepintuselesaimenutup) then --untuk mengatasi kondisi setelah manual_bukapintu. karena akan lari ke sini, sehingga harus ditutup pintunya
if (bufferbukapintu = '1') then
bukapintu <= '0';
bufferbukapintu:='0';
tutuppintu <= '1';
else
count:=timepintuselesaimenutup;
end if;
elsif (count < timepintuselesaimenutup + time_nx_state) then
tutuppintu <= '0';
motornaik<=signalmotornaik;
motorturun<=signalmotorturun;
else
pr_state<=nx_state;
if signalstatus='1' then
signalstatus<='0';
else
signalstatus<='1';
end if;
count:=0;
end if;
end if;
-------------Begin Display Seven Segment--------------
case pr_state is
when lantai1 =>
digit1 := "1111001";
if permintaan(0)='1' then ----------bila lantai sdh sama dengan yang diminta maka permintaan pada lantai tsb di nol kan
permintaan(0)<='0';
else null;
end if;
when lantai2 =>
digit1 := "0100100";
if permintaan(1)='1' then
permintaan(1)<='0';
else null;
end if;
when lantai3 =>
digit1 := "0110000";
if permintaan(2)='1' then
permintaan(2)<='0';
else null;
end if;
when lantai4 =>
digit1 := "0011001";
if permintaan(3)='1' then
permintaan(3)<='0';
else null;
end if;
when lantai5 =>
digit1 := "0010010";
if permintaan(4)='1' then
permintaan(4)<='0';
else null;
end if;
when others => null;
end case;
a1<=digit1(0);
a2<=digit1(1);
a3<=digit1(2);
a4<=digit1(3);
a5<=digit1(4);
a6<=digit1(5);
a7<=digit1(6);
-------------------End Display Seven Segment------------------
end if;
end process utama;
step: process (pr_state, signalstatus)
begin
--------------Begin Penentuan Perubahan State----------------
case pr_state is
when lantai1 =>
if (permintaan(0)='1') then --berhenti dan buka pintu hanya apabila ada permintaan pada lantai tsb
nx_state <= pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
signalnaikturunpenumpang<='1';
else
signalnaikturunpenumpang<='0';
if arahelevator=1 then --1 berarti naik
nx_state<=lantai2;
signalmotornaik <= '1';
signalmotorturun <= '0';
else
nx_state<=pr_state; --lantai 1 hanya bisa naik atau diam
signalmotornaik <= '0';
signalmotorturun <= '0';
end if;
end if;
when lantai2 =>
if (permintaan(1)='1') then
nx_state <= pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
signalnaikturunpenumpang<='1';
else
signalnaikturunpenumpang<='0';
if arahelevator=1 then --1 berarti naik
nx_state<=lantai3;
signalmotornaik <= '1';
signalmotorturun <= '0';
elsif arahelevator=2 then --2 berarti turun
nx_state<=lantai1;
signalmotornaik <= '0';
signalmotorturun <= '1';
else
nx_state<=pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
end if;
end if;
when lantai3 =>
if (permintaan(2)='1') then --berhenti dan buka pintu hanya apabila ada permintaan pada lantai tsb
nx_state <= pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
signalnaikturunpenumpang<='1';
else
signalnaikturunpenumpang<='0';
if arahelevator=1 then --1 berarti naik
nx_state<=lantai4;
signalmotornaik <= '1';
signalmotorturun <= '0';
elsif arahelevator=2 then --2 berarti turun
nx_state<=lantai2;
signalmotornaik <= '0';
signalmotorturun <= '1';
else
nx_state<=pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
end if;
end if;
when lantai4 =>
if (permintaan(3)='1') then --berhenti dan buka pintu hanya apabila ada permintaan pada lantai tsb
nx_state <= pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
signalnaikturunpenumpang<='1';
else
signalnaikturunpenumpang<='0';
if arahelevator=1 then --1 berarti naik
nx_state<=lantai5;
signalmotornaik <= '1';
signalmotorturun <= '0';
elsif arahelevator=2 then --2 berarti turun
nx_state<=lantai3;
signalmotornaik <= '0';
signalmotorturun <= '1';
else
nx_state<=pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
end if;
end if;
when lantai5 =>
if (permintaan(4)='1') then --berhenti dan buka pintu hanya apabila ada permintaan pada lantai tsb
nx_state <= pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
signalnaikturunpenumpang<='1';
else
signalnaikturunpenumpang<='0';
if arahelevator=2 then --2 berarti turun
nx_state<=lantai4;
signalmotornaik <= '0';
signalmotorturun <= '1';
else
nx_state<=pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
end if;
end if;
end case;
--------------------------End Penentuan Perubahan State-----------------------
end process step;
end behavior;
--Alhamdulillah :)
library ieee;
use ieee.std_logic_1164.all;
entity cobaelevator is
port (clk : in std_logic; --untuk maintenance (tombol stop)
manual_bukapintu : in std_logic; --dari dalam (atau luar (diseri dgn luar atau diseri dengan sensor)) elevator (hanya pada saat berhenti)
in1, in2, in3, in4, in5 : in std_logic; --dari dalam elevator (untuk tujuan mau kelantai berapa?)
in1naik, in2naik, in3naik, in4naik, in5naik : in std_logic; --dari masing-masing lantai (diluar elevator)
in1turun, in2turun, in3turun, in4turun, in5turun : in std_logic; --dari masing-masing lantai (diluar elevator)
a1, a2, a3, a4, a5, a6, a7: out std_logic; --untuk menunjukkan posisi elevator melalui seven segmen
motornaik, motorturun, tutuppintu: out std_logic; --untuk mekanik motor dan pintu
bukapintu: out std_logic); --harusnya pake buffer tapi di Tina tdk bisa (jadi untuk simulasi tetap pake out). Buffer digunakan sbg buffer supaya bisa di read and write (untuk cek apa masih terbuka)
end cobaelevator;
architecture behavior of cobaelevator is
constant timetutuppintu: integer := 3; --untuk tutup pintu otomatis
constant timepintuselesaimenutup: integer :=2; --waktu pintu untuk selesai menutup
constant time_nx_state: integer := 4; --waktu yg dibutuhkan untuk naik satu lantai
signal permintaan : std_logic_vector (0 to 4) :="00000";
signal arahelevator : integer range 0 to 2 :=0;
signal signalmotornaik : std_logic :='0';
signal signalmotorturun : std_logic :='0';
signal signalnaikturunpenumpang : std_logic:='0';
signal signalstatus : std_logic:='1';
type status is (lantai1, lantai2, lantai3, lantai4, lantai5); --penentuan signal dari masing-masing posisi lantai
signal pr_state, nx_state: status;
begin
utama: process (clk, manual_bukapintu, in1, in2, in3, in4, in5, in1naik, in2naik, in3naik, in4naik, in5naik, in1turun, in2turun, in3turun, in4turun, in5turun)
variable digit1 : std_logic_vector (6 downto 0); ----------untuk Seven Segment------
variable count: integer range 0 to (time_nx_state + timetutuppintu + timepintuselesaimenutup);
variable bufferbukapintu: std_logic; --harusnya menggunakan buffer untuk bukapintu, tapi di Tina tdk bisa. Jadi menggunakan variable ini
------------Variable ini untuk Arah Elevator---------------------
variable posisi : integer range 0 to 4;
variable tempnaik, tempturun : integer range -4 to 4 :=0; --karena ada kemungkinan bernilai negatif (tetapi yg dipake cuma positif)
variable temp : integer range 1 to 2 :=1;
------------End Variable Arah Elevator---------------------------
begin
if (clk'event and clk='1') then
------------------Cek Permintaan----------------
permintaan(0)<= permintaan(0) or in1 or in1naik or in1turun;
permintaan(1)<= permintaan(1) or in2 or in2naik or in2turun;
permintaan(2)<= permintaan(2) or in3 or in3naik or in3turun;
permintaan(3)<= permintaan(3) or in4 or in4naik or in4turun;
permintaan(4)<= permintaan(4) or in5 or in5naik or in5turun;
------------Begin Arah Elevator-----------------------
case pr_state is
when lantai1 => posisi :=0;
when lantai2 => posisi :=1;
when lantai3 => posisi :=2;
when lantai4 => posisi :=3;
when lantai5 => posisi :=4;
end case;
for i in 1 to 4 loop -- i harus dalam range konstanta
if permintaan(i)= '1' then
tempnaik:=i-posisi;
else null;
end if;
end loop;
for i in 3 downto 0 loop -- i harus dalam range konstanta
if permintaan(i)= '1' then
tempturun:=posisi-i;
else null;
end if;
end loop;
if tempnaik=0 and tempturun=0 then --saat posisi lantai sama dengan permintaan
arahelevator<=0;
elsif temp=1 then
arahelevator <= 1; --naik
if tempnaik < 1 then
temp :=2 ;
else null;
end if;
elsif temp= 2 then --turun
arahelevator <= 2;
if tempturun <1 then
temp:=1;
else null;
end if;
else null;
end if;
--------------End Arah Elevator------------------------------
-----------------Bagian Utama------------------------------
count:=count + 1;
if (manual_bukapintu='1' and signalmotornaik = '0' and signalmotorturun = '0') then --untuk menahan pintu tetap terbuka saat elevator berhenti
bukapintu<='1';
bufferbukapintu:='1';
tutuppintu <= '0';
count:=0;
elsif (signalnaikturunpenumpang='1') then
if (count < timetutuppintu) then
motornaik<=signalmotornaik;
motorturun<=signalmotorturun;
bukapintu <= '1';
bufferbukapintu:='1';
tutuppintu <= '0';
elsif (count < (timetutuppintu + timepintuselesaimenutup) ) then
bukapintu<='0';
bufferbukapintu:='0';
tutuppintu<='1';
else
tutuppintu <='0';
pr_state<=nx_state;
if signalstatus='1' then
signalstatus<='0';
else
signalstatus<='1';
end if;
count:=0;
end if;
else --jika tidak ada naik turun penumpang maka lift tdk berhenti
if (count < timepintuselesaimenutup) then --untuk mengatasi kondisi setelah manual_bukapintu. karena akan lari ke sini, sehingga harus ditutup pintunya
if (bufferbukapintu = '1') then
bukapintu <= '0';
bufferbukapintu:='0';
tutuppintu <= '1';
else
count:=timepintuselesaimenutup;
end if;
elsif (count < timepintuselesaimenutup + time_nx_state) then
tutuppintu <= '0';
motornaik<=signalmotornaik;
motorturun<=signalmotorturun;
else
pr_state<=nx_state;
if signalstatus='1' then
signalstatus<='0';
else
signalstatus<='1';
end if;
count:=0;
end if;
end if;
-------------Begin Display Seven Segment--------------
case pr_state is
when lantai1 =>
digit1 := "1111001";
if permintaan(0)='1' then ----------bila lantai sdh sama dengan yang diminta maka permintaan pada lantai tsb di nol kan
permintaan(0)<='0';
else null;
end if;
when lantai2 =>
digit1 := "0100100";
if permintaan(1)='1' then
permintaan(1)<='0';
else null;
end if;
when lantai3 =>
digit1 := "0110000";
if permintaan(2)='1' then
permintaan(2)<='0';
else null;
end if;
when lantai4 =>
digit1 := "0011001";
if permintaan(3)='1' then
permintaan(3)<='0';
else null;
end if;
when lantai5 =>
digit1 := "0010010";
if permintaan(4)='1' then
permintaan(4)<='0';
else null;
end if;
when others => null;
end case;
a1<=digit1(0);
a2<=digit1(1);
a3<=digit1(2);
a4<=digit1(3);
a5<=digit1(4);
a6<=digit1(5);
a7<=digit1(6);
-------------------End Display Seven Segment------------------
end if;
end process utama;
step: process (pr_state, signalstatus)
begin
--------------Begin Penentuan Perubahan State----------------
case pr_state is
when lantai1 =>
if (permintaan(0)='1') then --berhenti dan buka pintu hanya apabila ada permintaan pada lantai tsb
nx_state <= pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
signalnaikturunpenumpang<='1';
else
signalnaikturunpenumpang<='0';
if arahelevator=1 then --1 berarti naik
nx_state<=lantai2;
signalmotornaik <= '1';
signalmotorturun <= '0';
else
nx_state<=pr_state; --lantai 1 hanya bisa naik atau diam
signalmotornaik <= '0';
signalmotorturun <= '0';
end if;
end if;
when lantai2 =>
if (permintaan(1)='1') then
nx_state <= pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
signalnaikturunpenumpang<='1';
else
signalnaikturunpenumpang<='0';
if arahelevator=1 then --1 berarti naik
nx_state<=lantai3;
signalmotornaik <= '1';
signalmotorturun <= '0';
elsif arahelevator=2 then --2 berarti turun
nx_state<=lantai1;
signalmotornaik <= '0';
signalmotorturun <= '1';
else
nx_state<=pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
end if;
end if;
when lantai3 =>
if (permintaan(2)='1') then --berhenti dan buka pintu hanya apabila ada permintaan pada lantai tsb
nx_state <= pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
signalnaikturunpenumpang<='1';
else
signalnaikturunpenumpang<='0';
if arahelevator=1 then --1 berarti naik
nx_state<=lantai4;
signalmotornaik <= '1';
signalmotorturun <= '0';
elsif arahelevator=2 then --2 berarti turun
nx_state<=lantai2;
signalmotornaik <= '0';
signalmotorturun <= '1';
else
nx_state<=pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
end if;
end if;
when lantai4 =>
if (permintaan(3)='1') then --berhenti dan buka pintu hanya apabila ada permintaan pada lantai tsb
nx_state <= pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
signalnaikturunpenumpang<='1';
else
signalnaikturunpenumpang<='0';
if arahelevator=1 then --1 berarti naik
nx_state<=lantai5;
signalmotornaik <= '1';
signalmotorturun <= '0';
elsif arahelevator=2 then --2 berarti turun
nx_state<=lantai3;
signalmotornaik <= '0';
signalmotorturun <= '1';
else
nx_state<=pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
end if;
end if;
when lantai5 =>
if (permintaan(4)='1') then --berhenti dan buka pintu hanya apabila ada permintaan pada lantai tsb
nx_state <= pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
signalnaikturunpenumpang<='1';
else
signalnaikturunpenumpang<='0';
if arahelevator=2 then --2 berarti turun
nx_state<=lantai4;
signalmotornaik <= '0';
signalmotorturun <= '1';
else
nx_state<=pr_state;
signalmotornaik <= '0';
signalmotorturun <= '0';
end if;
end if;
end case;
--------------------------End Penentuan Perubahan State-----------------------
end process step;
end behavior;
--Alhamdulillah :)
Tidak ada komentar:
Posting Komentar
Selamat berinovasi :D Salam berbagi..