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.)

 

var quads_screen_width = document.body.clientWidth;
if ( quads_screen_width >= 1140 ) {
/* desktop monitors */
document.write('');
(adsbygoogle = window.adsbygoogle || []).push({});
}if ( quads_screen_width >= 1024  && quads_screen_width < 1140 ) {
/* tablet landscape */
document.write('');
(adsbygoogle = window.adsbygoogle || []).push({});
}if ( quads_screen_width >= 768  && quads_screen_width < 1024 ) {
/* tablet portrait */
document.write('');
(adsbygoogle = window.adsbygoogle || []).push({});
}if ( quads_screen_width < 768 ) {
/* phone */
document.write('');
(adsbygoogle = window.adsbygoogle || []).push({});
}
 
 
 
 
 
 
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]

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

Bir Cevap Yazın

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