You have no items in your shopping cart.

Subtotal: 0.00

Abstract

A robotic arm is a type normally programmable mechanical arm, which can be used to pick and place various objects in the industries from one place to another place. It may be the sum total of the mechanism or may be part of a more complex robot. The parts of these manipulators or arms are interconnected through articulated joints that allow both a rotational movement. The FPGA based project is implemented using Spartan3an Project Kit and Robotic ARM kit.

Demonstration Video

 

Tool required

Software:

  • Xilinx ISE 11.1i

Language:

  • VHDL

Hardware:



Block Diagram :





Introduction:

The Robotic arm has 6 movement:

  • DC Motor in Rotating base
  • DC motor in the shoulder
  • DC motor in the elbow
  • Two DC motors in the doll, one to move up and down and one for left and right rotation. And a sixth DC motor at the object pickup area.

Interfacing DC Motor with Spartan3an Project Kit

The Spartan3an Project Kitwith external DC motor interfacing, indicated as in Figure. 5V DC Motor speed has controlled through PWM signal. Motor can run both clockwise/counter clockwise, Motor speed controlled by varying duty cycle signal through program.

Driver IC L293D









A direct current (DC) motor is another widely used device that translates electrical pulses into mechanical movement. In the DC motor we have only + and – leads. Connecting them to a DC voltage source moves the motor in one direction. By reversing the polarity, the DC motor will move in the opposite direction. One can easily experiment with the DC motor. For example, small fans used in many motherboards to cool the CPU are run by DC motors. By connecting their leads to the + and – voltage source, the DC motor moves. While a stepper motor moves in steps of 1 to 15 degrees, the DC motor moves continuously. In a stepper motor, if we know the starting position we can easily count the number of steps the motor has moved and calculate the final position of the motor. This is not possible in a DC motor.

Robotic ARM Kit interfacing with Spartan3an Project Kit





Robotic ARM Controll

 

Robotic ARM Controller

 

Robotic ARM Controller

 

Robotic ARM Controller

 

Robotic ARM Controller

 

Robotic ARM Controller

 

Robotic ARM Controller

 

Robotic ARM Controller

 

Robotic ARM Controller

 

Robotic ARM Controller

 

Robotic ARM Controller

Source Code

VHDL Code for Robotic ARM Interfacing using Spartan3an Project Kit

library IEEE;
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL;
   
entity robotic_arm is 
port ( clk 	: in std_logic;        
pb 	: in std_logic_vector(1 downto 0);
sw 	: in std_logic_vector(2 downto 0);                         
                         
output1 : out std_logic;                         
output2 : out std_logic;
output3 : out std_logic;                         
output4 : out std_logic;
output5 : out std_logic;                         
output6 : out std_logic;
output7 : out std_logic;                         
output8 : out std_logic;
output9 : out std_logic;                         
output10 : out std_logic); 
end robotic_arm;   

architecture Behavioral of robotic_arm is  
begin 
process(clk) 
variable i : integer := 0; 
begin 
if clk'event and clk = '1' then 
if sw = "000" then
if pb = "10" then 
	if i <= 1005000 then 
	i := i + 1;  
	output1 <= '0'; 
	output2 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output1 <= '1'; 
	output2 <= '0'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
elsif pb = "01" then 
	if i <= 1005000 then 
	i := i + 1;  
	output1 <= '0'; 
	output2 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output1 <= '0'; 
	output2 <= '1'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
	
else
	output1 <= '0'; 
	output2 <= '0';
end if; 

elsif sw = "001" then
if pb = "10" then 
	if i <= 1005000 then 
	i := i + 1;  
	output3 <= '0'; 
	output4 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output3 <= '1'; 
	output4 <= '0'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
elsif pb = "01" then 
	if i <= 1005000 then 
	i := i + 1;  
	output3 <= '0'; 
	output4 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output3 <= '0'; 
	output4 <= '1'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
	
else
	output3 <= '0'; 
	output4 <= '0';
end if; 

elsif sw = "010" then
if pb = "10" then 
	if i <= 1005000 then 
	i := i + 1;  
	output5 <= '0'; 
	output6 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output5 <= '1'; 
	output6 <= '0'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
elsif pb = "01" then 
	if i <= 1005000 then 
	i := i + 1;  
	output5 <= '0'; 
	output6 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output5 <= '0'; 
	output6 <= '1'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
	
else
	output5 <= '0'; 
	output6 <= '0';
end if; 

elsif sw = "011" then
if pb = "10" then 
	if i <= 1005000 then 
	i := i + 1;  
	output7 <= '0'; 
	output8 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output7 <= '1'; 
	output8 <= '0'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
elsif pb = "01" then 
	if i <= 1005000 then 
	i := i + 1;  
	output7 <= '0'; 
	output8 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output7 <= '0'; 
	output8 <= '1'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
	
else
	output7 <= '0'; 
	output8 <= '0';
end if; 

elsif sw = "100" then
if pb = "10" then 
	if i <= 1005000 then 
	i := i + 1;  
	output9 <= '0'; 
	output10 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output9 <= '1'; 
	output10 <= '0'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
elsif pb = "01" then 
	if i <= 1005000 then 
	i := i + 1;  
	output9 <= '0'; 
	output10 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output9 <= '0'; 
	output10 <= '1'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
	
else
	output9 <= '0'; 
	output10 <= '0';
end if; 

end if; 

end if; 
end process; 
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL;
   
entity robotic_arm is 
port ( clk 	: in std_logic;        
pb 	: in std_logic_vector(1 downto 0);
sw 	: in std_logic_vector(2 downto 0);                         
                         
output1 : out std_logic;                         
output2 : out std_logic;
output3 : out std_logic;                         
output4 : out std_logic;
output5 : out std_logic;                         
output6 : out std_logic;
output7 : out std_logic;                         
output8 : out std_logic;
output9 : out std_logic;                         
output10 : out std_logic); 
end robotic_arm;   

architecture Behavioral of robotic_arm is  
begin 
process(clk) 
variable i : integer := 0; 
begin 
if clk'event and clk = '1' then 
if sw = "000" then
if pb = "10" then 
	if i <= 1005000 then 
	i := i + 1;  
	output1 <= '0'; 
	output2 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output1 <= '1'; 
	output2 <= '0'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
elsif pb = "01" then 
	if i <= 1005000 then 
	i := i + 1;  
	output1 <= '0'; 
	output2 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output1 <= '0'; 
	output2 <= '1'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
	
else
	output1 <= '0'; 
	output2 <= '0';
end if; 

elsif sw = "001" then
if pb = "10" then 
	if i <= 1005000 then 
	i := i + 1;  
	output3 <= '0'; 
	output4 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output3 <= '1'; 
	output4 <= '0'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
elsif pb = "01" then 
	if i <= 1005000 then 
	i := i + 1;  
	output3 <= '0'; 
	output4 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output3 <= '0'; 
	output4 <= '1'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
	
else
	output3 <= '0'; 
	output4 <= '0';
end if; 

elsif sw = "010" then
if pb = "10" then 
	if i <= 1005000 then 
	i := i + 1;  
	output5 <= '0'; 
	output6 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output5 <= '1'; 
	output6 <= '0'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
elsif pb = "01" then 
	if i <= 1005000 then 
	i := i + 1;  
	output5 <= '0'; 
	output6 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output5 <= '0'; 
	output6 <= '1'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
	
else
	output5 <= '0'; 
	output6 <= '0';
end if; 

elsif sw = "011" then
if pb = "10" then 
	if i <= 1005000 then 
	i := i + 1;  
	output7 <= '0'; 
	output8 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output7 <= '1'; 
	output8 <= '0'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
elsif pb = "01" then 
	if i <= 1005000 then 
	i := i + 1;  
	output7 <= '0'; 
	output8 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output7 <= '0'; 
	output8 <= '1'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
	
else
	output7 <= '0'; 
	output8 <= '0';
end if; 

elsif sw = "100" then
if pb = "10" then 
	if i <= 1005000 then 
	i := i + 1;  
	output9 <= '0'; 
	output10 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output9 <= '1'; 
	output10 <= '0'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
elsif pb = "01" then 
	if i <= 1005000 then 
	i := i + 1;  
	output9 <= '0'; 
	output10 <= '0'; 
	elsif i > 1005000 and i < 1550000 then 
	i := i + 1; 
	output9 <= '0'; 
	output10 <= '1'; 
	elsif i = 1550000 then 
	i := 0; 
	end if; 
	
else
	output9 <= '0'; 
	output10 <= '0';
end if; 

end if; 

end if; 
end process; 
end Behavioral; 

User Constraint file for Robotic ARM VHDL Code

NET "pb[1]" LOC = P43;

NET "pb[0]" LOC = P44;

NET "clk" LOC = P127;

NET "sw[0]" LOC = P33;

NET "sw[1]" LOC = P35;

NET "sw[2]" LOC = P45;

NET "output1" LOC = P51;

NET "output2" LOC = P54;

NET "output3" LOC = P55;

NET "output4" LOC = P57;

NET "output5" LOC = P58;

NET "output6" LOC = P59;

NET "output7" LOC = P62;

NET "output8" LOC = P63;

NET "output9" LOC = P64;

NET "output10" LOC = P67;

Conclusion

The Spartan3an Project Kit based Robotic ARM Control was successfully performed and the object was pick and Placed using FPGA Control.