NEXYS4 DDR Ultrasonik Mesafe Ölçümü

Bu yazımızda piyasada HC SR04 olarak bilinen ultrasonik sensörü kullanarak ölçtüğümüz mesafe NEXYS4 DDR fpga kartımızın üzerindeki 7 segment üzerinde gösterilecektir.

♣ Sensörün datasheetindeki bilgileri inceleyecek olursak,

► Ölçüm aralığı 2-400cm

► Ölçüm hassasiyeti 3mm

► Trigger pini için tetikleme sinyali min 10 us olmalı

► Mesafe ölçme işlemi için de 8 tane 40kHz sinyal gönderiyor

♣ Pin yapısına göz atacak olursak;

hcsr04

VCC = +5V  DC

Trig = Sensörün tetikleme kısmı

Echo = Sensörün alıcı kısmı

GND = Topraklama

♣ Çalışma Mantığı

Ölçümün başlaması için Trigger pini minimum 10 us tetiklenmelidir böylece sensörden  40 kHZ’de 8  ses dalgası dışarıya iletilir ve yansıması beklenir. Hc-sr04 alıcıdan ses dalgasını aldığında Echo pini 0V dan 5V a geçer ve mesafeyle orantılı bir süre bekler. Echo pinindeki genişlik ölçülerek mesafe hesaplanmış olur.
ss

Datasheet incelendiğinde  klasik  2x = v * t  formülü katsayıları verilmiştir.

Cm cinsinden mesafe = Zaman / 58

İnç cinsinden mesafe = Zaman / 148

Cm için /58 katsayısının nereden geldiğine göz atalım.

Ses hızı formülünde,  sıfır santigrat derecede havadaki ses hızı =331 (metre / saniye) ve havanın o an ki sıcaklığı =T (santigrat) olmak üzere

ss1

bağıntısından hesaplanır.

T = 20 derece için hesap yapılırsa cm cinsinden mesafe = Zaman / 58 olarak bulunur.Bu hesaplamaya göre kodlarımızı yazabiliriz.

(*Başka bir sıcaklık değeri için de hesaplayabilirsiniz.)

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity sonar is
Port ( CLK : in STD_LOGIC;
TRIGGER : out STD_LOGIC;
ECHO : in STD_LOGIC;
SEG_SEC : out STD_LOGIC_VECTOR (7 downto 0);
SEGMENTS : out STD_LOGIC_VECTOR (6 downto 0));
end sonar;
architecture Behavioral of sonar is
signal count : unsigned(16 downto 0) := (others => '0');
signal santimetre : unsigned(15 downto 0) := (others => '0');
signal santimetre_birler : unsigned(3 downto 0) := (others => '0');
signal santimetre_onlar : unsigned(3 downto 0) := (others => '0');
signal out_birler : unsigned(3 downto 0) := (others => '0');
signal out_onlar : unsigned(3 downto 0) := (others => '0');
signal digit : unsigned(3 downto 0) := (others => '0');
signal echo_son_deger : std_logic := '0';
signal echo_senkron : std_logic := '0';
signal echo_not_senkron : std_logic := '0';
signal bekleme : std_logic := '0';
signal segment_sayac : unsigned(15 downto 0) := (others => '0');
begin
decode: process(digit)
begin
case digit is
when "0001" => SEGMENTS <= "1111001";
when "0010" => SEGMENTS <= "0100100";
when "0011" => SEGMENTS <= "0110000";
when "0100" => SEGMENTS <= "0011001";
when "0101" => SEGMENTS <= "0010010";
when "0110" => SEGMENTS <= "0000010";
when "0111" => SEGMENTS <= "1111000";
when "1000" => SEGMENTS <= "0000000";
when "1001" => SEGMENTS <= "0010000";
when "1010" => SEGMENTS <= "0001000";
when "1011" => SEGMENTS <= "0000011";
when "1100" => SEGMENTS <= "1000110";
when "1101" => SEGMENTS <= "0100001";
when "1110" => SEGMENTS <= "0000110";
when "1111" => SEGMENTS <= "0001110";
when others => SEGMENTS <= "1000000";
end case;
end process;
seven_seg: process(CLK)
begin
if rising_edge(CLK) then
if segment_sayac(segment_sayac'high) = '1' then
digit <= out_birler;
SEG_SEC <= "11111110";
else
digit <= out_onlar;
SEG_SEC <= "11111101";
end if;
segment_sayac <= segment_sayac +1;
end if;
end process;
process(CLK)
begin
if rising_edge(CLK) then
if bekleme = '0' then
if count = 1000 then -- 10us tetikleme
TRIGGER <= '0';
bekleme <= '1';
count <= (others => '0');
else
TRIGGER <= '1';
count <= count+1;
end if;
elsif echo_son_deger = '0' and echo_senkron = '1' then
count <= (others => '0');
santimetre <= (others => '0');
santimetre_birler <= (others => '0');
santimetre_onlar <= (others => '0');
elsif echo_son_deger = '1' and echo_senkron = '0' then
out_birler <= santimetre_birler;
out_onlar <= santimetre_onlar;
elsif count = 5799 then --5800-1
if santimetre_birler = 9 then
santimetre_birler <= (others => '0');
santimetre_onlar <= santimetre_onlar + 1;
else
santimetre_birler <= santimetre_birler + 1;
end if;
santimetre <= santimetre + 1;
count <= (others => '0');
if santimetre = 3448 then
bekleme <= '0';
end if;
else
count <= count + 1;
end if;
echo_son_deger <= echo_senkron;
echo_senkron <= echo_not_senkron;
echo_not_senkron <= ECHO;
end if;
end process;
end Behavioral;

 

## Clock signal
set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK}];
##7 segment display
set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { SEGMENTS[0] }]; #IO_L24N_T3_A00_D16_14 Sch=ca
set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { SEGMENTS[1] }]; #IO_25_14 Sch=cb
set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { SEGMENTS[2] }]; #IO_25_15 Sch=cc
set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { SEGMENTS[3] }]; #IO_L17P_T2_A26_15 Sch=cd
set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { SEGMENTS[4] }]; #IO_L13P_T2_MRCC_14 Sch=ce
set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { SEGMENTS[5] }]; #IO_L19P_T3_A10_D26_14 Sch=cf
set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { SEGMENTS[6] }]; #IO_L4P_T0_D04_14 Sch=cg
#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { DP }]; #IO_L19N_T3_A21_VREF_15 Sch=dp
set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { SEG_SEC[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0]
set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { SEG_SEC[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1]
set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { SEG_SEC[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2]
set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { SEG_SEC[3] }]; #IO_L19P_T3_A22_15 Sch=an[3]
set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { SEG_SEC[4] }]; #IO_L8N_T1_D12_14 Sch=an[4]
set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { SEG_SEC[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5]
set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { SEG_SEC[6] }]; #IO_L23P_T3_35 Sch=an[6]
set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { SEG_SEC[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7]
##Pmod Header JA
set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { TRIGGER }]; #IO_L20N_T3_A19_15 Sch=ja[1]
set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ECHO }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2]

 

Aşağıdaki linkten faydalanılmıştır.

 

https://www.pantechsolutions.net/fpga-projects/fpga-implementation-of-distance-measurement-with-ultrasonic-sensor

https://www.pantechsolutions.net/fpga-projects/fpga-implementation-of-distance-measurement-with-ultrasonic-sensor

Yorum

  1. By nurdan

    Cevapla

  2. By güven ümit

    Cevapla

    • By Oğuzhan Gültekin

      Cevapla

  3. By muhammet canbulut

    Cevapla

    • By alicavuslu

      Cevapla

      • By Muhammet Canbulut

        Cevapla

        • By Oğuzhan Gültekin

          Cevapla

  4. By new

    Cevapla

  5. By TheProfessor

    Cevapla

    • By alicavuslu

      Cevapla

    • By Oğuzhan Gültekin

      Cevapla

      • By TheProfessor

        Cevapla

  6. By TheProfessor

    Cevapla

  7. By griezzy

    Cevapla

    • By Oğuzhan Gültekin

      Cevapla

  8. By griezzy

    Cevapla

  9. By fatihhh

    Cevapla

    • By Oğuzhan Gültekin

      Cevapla

  10. By kdr

    Cevapla

    • By Oğuzhan Gültekin

      Cevapla

      • By kdr

        Cevapla

        • By Oğuzhan Gültekin

          Cevapla

          • By kdr

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.