19장. 원격 조정 로봇 설계 김용애 1조 김정은 이동한 이재흔
목 차 설계 개요 VHDL 코드 작성 시뮬레이션 결과 파형 핀 할당
설계 개요 원격 조정이란? 원격 조정 로봇 조립 RF-MAIN FPGA 보드 리모콘 송신기 모터부 사용자로부터 멀리 떨어진 곳에 있는 대상을 조정한다는 뜻. 즉, 3-Key 송신기에서 key를 누르면 직진, 후진, 또는 좌회전, 우회전 주행. 원격 조정 로봇 조립 리모콘 송신기 FPGA 보드 RF-MAIN 모터부
설계 개요 원격 조정 로봇 VHDL 코드 작성 개념도 양쪽 모터 무선 통신 차등 속도 제어기 (17장) (15장) 모터 속도 송신기 Key 수신 데이터 무선 통신 제어기 (17장) LED 표시 데이터 모터 속도 결정 process (18장) 스위치 입력 양쪽 모터 차등 속도 (15장) 좌, 우 모터 구동 신호 mtl_speed mtr_speed
VHDL – 입출력 선언 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity rc_ro_vhdl is Port ( RSTB : in STD_LOGIC; // 시스템 Reset 신호 CLK_4M : in STD_LOGIC; // 4MHz 클럭 신호 RF_DATA : in STD_LOGIC_VECTOR (2 downto 0); // 무선 통신 송신기 MTL_A : out STD_LOGIC; // 좌 모터 출력신호 MTL_B : out STD_LOGIC; MTL_nA : out STD_LOGIC; MTL_nB : out STD_LOGIC; MTR_A : out STD_LOGIC; // 우 모터 출력신호 MTR_B : out STD_LOGIC; MTR_nA : out STD_LOGIC; MTR_nB : out STD_LOGIC); end rc_ro_vhdl;
VHDL – 변수 선언 architecture Behavioral of rc_ro_vhdl is signal forward : std_logic; // ‘1’이면 전진, ‘0’이면 후진 signal mtl_speed : std_logic_vector (1 downto 0); signal mtr_speed : std_logic_vector (1 downto 0); signal speed_l : integer range 0 to 25000; signal speed_r : integer range 0 to 25000; signal motor_lcnt : integer range 0 to 25000; signal phase_lclk : std_logic; signal motor_rcnt : integer range 0 to 25000; signal phase_rclk : std_logic; signal phase_lcnt : std_logic_vector (1 downto 0); // 4개의 (좌)스텝 구분을 위한 신호 signal phase_lout : std_logic_vector (3 downto 0); // 좌 스텝 모터의 출력 신호 묶음 signal phase_rcnt : std_logic_vector (1 downto 0); // 4개의 (우)스텝 구분을 위한 신호 signal phase_rout : std_logic_vector (3 downto 0); // 우 스텝 모터의 출력 신호 묶음 begin
VHDL – 송신기 모듈 조작 실습시 “01”과 “10” 의 속도는 배제 --===== RF data에 따른 좌,우 모터 속도값 결정 ================= process (RF_DATA) begin forward <= '1'; case RF_DATA is when "100" => mtl_speed <= "11"; mtr_speed <= "11"; -- 빠른 직진 when "001" => mtl_speed <= "11"; mtr_speed <= "11"; forward <= '0'; -- 빠른 후진 when "110" => mtl_speed <= "11"; mtr_speed <= "00"; -- 빠른 우회전 when "011" => mtl_speed <= "00"; mtr_speed <= "11"; -- 빠른 좌회전 when others => mtl_speed <= "00"; mtr_speed <= "00"; -- 정지 end case; end process; 실습시 “01”과 “10” 의 속도는 배제
VHDL – 송신기 모듈 조작 forward <= ‘0’; 3 2 1 Key 조작 RF_DATA ( 2:0 ) 로봇 동작 3번 누름 “100” 전진 1번 누름 “001” 후진 2, 3번 동시 누름 “110” 우회전 1, 2번 동시 누름 “011” 좌회전 그 외 “000” 등 정지 1 2 3 3-Key 리모콘 송신기 forward <= ‘0’;
VHDL – 좌 모터 속도결정 --===== 속도값에 따른 좌,우모터 속도결정 ======================= process (mtl_speed) variable for_sim : std_logic; begin for_sim := '0'; -- 1 : 시뮬레이션시 0 : 정상동작시 if for_sim = '0' then case mtl_speed is when "00" => speed_l <= 0; -- 0 Hz when "01" => speed_l <= 19999; -- 100 Hz when "10" => speed_l <= 9999; -- 200 Hz when "11" => speed_l <= 6249; -- 320 Hz when others => speed_l <= 6249; end case;
VHDL – 좌 모터 속도결정 우 모터 동일 else -- 시뮬레이션 시 case mtl_speed is when "00" => speed_l <= 0; when "01" => speed_l <= 8; when "10" => speed_l <= 4; when "11" => speed_l <= 2; when others => speed_l <= 2; end case; end if; end process; 우 모터 동일
VHDL – 좌 모터 속도분주기 우 모터 동일 process (RSTB, speed_l, CLK_4M, motor_lcnt) begin if RSTB = '0' or speed_l = 0 then motor_lcnt <= 0; phase_lclk <= '0'; elsif rising_edge (CLK_4M) then if (motor_lcnt >= speed_l) then phase_lclk <= not phase_lclk; else motor_lcnt <= motor_lcnt + 1; end if; end process; 우 모터 동일
VHDL – 좌 모터 phase_output process (RSTB, phase_lclk, phase_lcnt) begin if RSTB = '0' then phase_lcnt <= (others => '0'); elsif rising_edge (phase_lclk) then phase_lcnt <= phase_lcnt + 1; end if; end process;
VHDL – 좌 모터 phase_output process (RSTB, phase_lcnt) begin if RSTB = '0' then phase_lout <= (others => '0'); else case phase_lcnt is when "00" => phase_lout <= "1000"; when "01" => phase_lout <= "0100"; when "10" => phase_lout <= "0010"; when "11" => phase_lout <= "0001"; when others => phase_lout <= "0000"; end case; end if; end process;
VHDL – 우 모터 phase_output process (RSTB, phase_rclk, phase_rcnt) begin if RSTB = '0' then phase_rcnt <= (others => '0'); elsif rising_edge (phase_rclk) then phase_rcnt <= phase_rcnt + 1; end if; end process;
VHDL – 우 모터 phase_output process (RSTB, phase_rcnt) begin if RSTB = '0' then phase_rout <= (others => '0'); else case phase_rcnt is when "00" => phase_rout <= "0001"; when "01" => phase_rout <= "0010"; when "10" => phase_rout <= "0100"; when "11" => phase_rout <= "1000"; when others => phase_rout <= "0000"; end case; end if; end process;
VHDL – phase_output 스텝 모터를 조립할 때 서로 반대 방향이 되게 조립. phase_lcnt phase_lout 00 1000 01 0100 10 0010 11 0001 phase_rcnt phase_rout 00 0001 01 0010 10 0100 11 1000 스텝 모터를 조립할 때 서로 반대 방향이 되게 조립. 한 쪽의 회전 방향을 반대로 해야만 함. 두 개의 모터가 동시에 같은 방향으로 회전하게 되어 진행 가능.
VHDL – 모터 회전 --======================================================= MTL_A <= phase_lout(0) when forward = '1' else phase_lout(3); MTL_B <= phase_lout(1) when forward = '1' else phase_lout(2); MTL_nA <= phase_lout(2) when forward = '1' else phase_lout(1); MTL_nB <= phase_lout(3) when forward = '1' else phase_lout(0); MTR_A <= phase_rout(0) when forward = '1' else phase_rout(3); MTR_B <= phase_rout(1) when forward = '1' else phase_rout(2); MTR_nA <= phase_rout(2) when forward = '1' else phase_rout(1); MTR_nB <= phase_rout(3) when forward = '1' else phase_rout(0); end Behavioral;
병행처리문 조건적 병행처리문 VHDL – 모터 회전 감지신호 list, begin, process 등을 없앤 간결한 문장표현. 순서에 무관하게 동시에 수행. 조건적 병행처리문 signal_name <= a when 조건 else b; when의 조건이 ‘참’이면 a를 signal에 대입. ‘거짓’일 경우 b를 대입하라는 수행.
VHDL – 좌 모터 회전 phase_lcnt phase_lout 00 1000 01 0100 10 0010 11 0001 MTL_A <= phase_lout(0) when forward = '1' else phase_lout(3); MTL_B <= phase_lout(1) when forward = '1' else phase_lout(2); MTL_nA <= phase_lout(2) when forward = '1' else phase_lout(1); MTL_nB <= phase_lout(3) when forward = '1' else phase_lout(0); phase_lcnt phase_lout 00 1000 01 0100 10 0010 11 0001
VHDL – 우 모터 회전 phase_rcnt phase_rout 00 0001 01 0010 10 0100 11 1000 MTR_A <= phase_rout(0) when forward = '1' else phase_rout(3); MTR_B <= phase_rout(1) when forward = '1' else phase_rout(2); MTR_nA <= phase_rout(2) when forward = '1' else phase_rout(1); MTR_nB <= phase_rout(3) when forward = '1' else phase_rout(0); phase_rcnt phase_rout 00 0001 01 0010 10 0100 11 1000
시뮬레이션 결과 파형
핀 할당 입 력 신호이름 키트이름 핀 번호 CLK_4M FPGA_clock P79 RSTB Reset pin P205 입 력 신호이름 키트이름 핀 번호 CLK_4M FPGA_clock P79 RSTB Reset pin P205 RF_DATA(0) P40 RF_DATA(1) P42 RF_DATA(2) p43 출 력 신호이름 키트이름 핀 번호 MTL_A P128 MTL_B P130 MTL_nA P131 MTL_nB P132 MTR_A P133 MTR_B P135 MTR_nA P137 MTR_nB P138
Thank You !