Introduction to Robotics and Applications

ETE 475

Course Description:

        Introduction to the science and engineering of mechanical manipulation as the sub-discipline of robotics is founded on classical fields such as mechanics, control theory and computer engineering. Basic principles of robotics will be learned through a study of common industrial robot systems analysis and design.

Introduction:        1

Objective:        2

Technical Background:        2

Detailed Description:        3

Hardware:        3

Master:        3

Manipulator:        3

Workspace:        3

Interface to Manipulator:        3

Interface to Master:        3

Software:        4

Software controlling Master:        4

Software controlling Manipulator:        4

Code:        4

DH Parameters:        5

Test Results:        6

Conclusion:        6

Appendix:        6

References:        9


        ETE 475 is an introductory course on mechanical manipulation of robotics. The course involves and combines ideas from mechanics, control theory, and computer engineering.  Through this we will have fundamental knowledge of robotic devices and their applications. The project involves teleoperation of a self built robotic arm using the provided Novint Falcon device. We shall use the Falcon device connected to a laptop, connected to the slave robotic arm manipulator. This is the following block diagram:

The laptop PC will send/receive data so we will be able to implement haptic feedback with the Falcon device.  The project will require us to purchase the robotic arm. We found a robotic arm with usb interface on The robotic arm is called “OWI Robotic Arm Edge”, we found this product to be reasonably priced and fits all requirements of the slave device.


Build and implement a telerobotic system using the Falcon haptic device as a master and building a 3-degree of freedom “slave” manipulator.

Technical Background:

        In 1980, OWI Incorporated, was looking for a way to expand its consumer product lines and bring its extensive technology background to the educational community. RobotiKits™ and OWIKits® were developed to affordably introduce students to robotics technology.

Robotic Arm Edge: wrist motion of 120 degrees, an extensive elbow range of 300 degrees, base rotation of 270 degrees, base motion of 180 degrees, vertical reach of 15 inches, horizontal reach of 12.6 inches, and lifting capacity of 100g.

Novint Technologies, Inc. (NVNT) is the pioneer of 3D touch for consumer computing. Novint is developing a new category of products that add high-fidelity interactive three-dimensional touch to computing, beginning with our introduction of the award-winning Novint Falcon and continuing with our recent addition of the Novint XIO. The Novint Falcon is a first-of-a-kind game controller that lets you experience realistic 3D touch and force feedback when playing touch-enabled games. The Novint Xio is an exoskeleton that will revolutionize the gaming industry by adding haptic feedback to motion controls.

Squirrel is a high level imperative, object-oriented programming language, designed to be a lightweight scripting language that fits in the size, memory bandwidth, and real-time requirements of applications like video games.


Detailed Description:



                Novint Falcon Robotic Haptic Device manufactured by Novint


OWI Robotic Arm Edge manufactured by OWI. We chose this arm due to its affordability and simple construction.


With Robotic Arm Edge, The End Effector is a gripper that opens and closes, wrist motion of 120 degrees, an extensive elbow range of 300 degrees, base rotation of 270 degrees, base motion of 180 degrees, vertical reach of 15 inches, horizontal reach of 12.6 inches, and lifting capacity of 100g.


Interface to Manipulator:

                535 USB interface manufactured by OWI.

        Interface to Master:

                Built-in USB interface with Novint Falcon.


        Software controlling Master:

                Novint’s F-Gen Manager

        Software controlling Manipulator:

                535 USB interface.


        Idea behind the code was to implement the following design:

Whereas the Falcon’s handle passed a plane it would emulate a key press according to that plane. See code in Appendix.

DH Parameters:



























Test Results:

        Test 1 - Trial and Error was used in the making of the code using the Falcon to emulate keyboard keys.

        Test 2 - After the arm was assembled we used the packaged controller that basically turned on different motors.

        Test 3 - After getting the USB interface, we used the falcon to control the arm using the code and F-gen.

Test 4 - Getting the mouse to be locked as the Falcon arm moved.


        We created a master/slave system using a Novint Falcon as the master to control a robotic arm, which is the slave for our system. The Falcon device was connected to a computer and the computer was connected to the Robotic arm using a USB interface. In our system, the Falcon device sends and receives signals to the computer and the computer sends signals to the arm’s control system, which controls the DC motors causing the arm to move. Many tests were made in order to get the desired slave movement outcomes, such as moving objects with the robotic arm being controlled by the Flacon device. As a future work and designs would be to add a feedback system to know where the arm would be during the testing or in the field. Another feature would be to add sensors to the grabbing mechanism to sense the shape of the object to find the right angle to hold it.


// Code.nut

gLastX <- 0;

gLastY <- 0;

gLastZ <- 0;

gSendR <- inputsender(KEY_R);

gSendK <- inputsender(KEY_K);

gSendF <- inputsender(KEY_F);

gSendI <- inputsender(KEY_I);

gSendU <- inputsender(KEY_U);

gSendJ <- inputsender(KEY_J);

gSendE <- inputsender(KEY_E);

gSendD <- inputsender(KEY_D);

gSendW <- inputsender(KEY_W);

gSendS <- inputsender(KEY_S);

// creating Falcon effect stack for the control box

gControlBoxStack <- effectstack("control", 1.0);

//gControlBoxEffectID <- registereffect("ControlBox");

gControlBox <- null;        // variable to store the control box in

function HapticsInitialize( registryConfigHandle )


// launch the control box

        gControlBox = controlbox(effectparameters("_DefaultControlBox", gControlBoxStack), gControlBoxStack);

        if (gControlBox != null)





function HapticsActivated( deviceHandle )








function HapticsThink( deviceHandle )


if (devicewasbuttonjustpressed(deviceHandle, FALCON_LOGO))




        else if (devicewasbuttonjustreleased(deviceHandle, FALCON_LOGO))




if (devicewasbuttonjustpressed(deviceHandle, FALCON_LIGHTNING))




        else if (devicewasbuttonjustreleased(deviceHandle, FALCON_LIGHTNING))




if (devicewasbuttonjustpressed(deviceHandle, FALCON_TRIANGLE))




        else if (devicewasbuttonjustreleased(deviceHandle, FALCON_TRIANGLE))




if (devicewasbuttonjustpressed(deviceHandle, FALCON_PLUS))




        else if (devicewasbuttonjustreleased(deviceHandle, FALCON_PLUS))




 local currentX = deviceaxis(deviceHandle, 0)*2000;   // 0 = X axis (left/right)

 local currentY = deviceaxis(deviceHandle, 1)*2000;   // 1 = Y axis (up/down)

 local currentZ = deviceaxis(deviceHandle, 2)*2000;   // 2 = Z axis (in/out)



   print("  ");



   // Just crossed left edge

   if (gLastX > -50 && currentX <= -50)




   else if (gLastX <= -50 && currentX > -50) //uncrossed left edge





   // Just crossed right edge

   if (gLastX < 50 && currentX >= 50)



   else if (gLastX >= 50 && currentX < 50) //uncrossed right edge





   // Just crossed top edge

   if (gLastY < 50 && currentY >= 50)



   else if (gLastY >= 50 && currentY < 50) //uncrossed top edge





   // Just crossed bottom edge

   if (gLastY > -50 && currentY <= -50)



   else if (gLastY <= -50 && currentY > -50) //uncrossed bottom edge




                // Just crossed frontal plane

   if (gLastZ < 30 && currentZ >= 30)



   else if (gLastZ >= 30 && currentZ < 30) //uncrossed top edge




                // Just crossed back plane

   if (gLastZ > -80 && currentZ <= -80)



   else if (gLastZ <= -80 && currentZ > -80) //uncrossed top edge




   gLastX = currentX;

   gLastY = currentY;

   gLastZ = currentZ;


function HapticsDeactivated( deviceHandle )





 devicedisconnectstack(deviceHandle, gControlBoxStack);


function HapticsShutdown(  )