Micro-Controller 8051 based Obstacle Avoider Robot

17
MICRO-CONTROLLER BASED INTELLIGENT OBSTACLE AVOIDER ROBOT AND DISPLAY OF BLINKING LED’S AND BUZZER Class Project Report Subject: Advanced Microcontroller and microprocessor systems Submitted To: Dr. Veena Sharma, EED NIT-H Submitted By: Mirza Abdul Waris Beigh, Roll No: 10289 Department of Electrical Engineering National Institute Of Technology, Hamirpur

description

Complete program code and the diagram of this project.

Transcript of Micro-Controller 8051 based Obstacle Avoider Robot

MICRO-CONTROLLER BASED

INTELLIGENT OBSTACLE

AVOIDER ROBOT

AND DISPLAY OF BLINKING

LED’S AND BUZZER

Class Project Report Subject: Advanced Microcontroller and microprocessor systems

Submitted To:

Dr. Veena Sharma, EED NIT-H

Submitted By:

Mirza Abdul Waris Beigh, Roll No: 10289

Department of Electrical Engineering

National Institute Of Technology, Hamirpur

CONTENTS:-

Introduction

Basic Principle

Logic Followed

Block Diagram

Components used

89V51RD2 Kit by Provotech

IR Sensors –3

USB-Serial Programmer By SILABS

2 line LCD Display.

Program Code Used

A view of the Robot

SENSOR B

Introduction:

The design and implementation of obstacle avoider robot using

8051 Microcontroller is being done. It is programmed to avoid

running into obstacles and detects the presence of different objects

around it and modifies the motion of the motors appropriately.

The objects are sensed by the IR (Infra Red) sensors. The

microcontroller controls two DC motors of robot to navigate.

Basic Principle: The basic principle involved in this is it captures the obstacle presence

with IR sensors mounted at the three sides of the robot. When the sensor

senses an object, analog signal is given to the op-amp to produce 0s and

1s which are then fed to the microcontroller, then the microcontroller

decides the next move according to the program. Microcontroller and

driver circuit are used for the control of motors.

SENSOR A SENSOR C

Logic Followed:

Sensor A Sensor B Sensor C Action

0 0 0 FORWARD

0 0 1 LEFT

0 1 0 RIGHT_DIFF

0 1 1 LEFT_DIFF

1 0 0 RIGHT

1 0 1 FORWARD

1 1 0 RIGHT_DIFF

1 1 1 BACK

Kit Used:

Mechanical parts: Chassis

Castor Wheel

L-Clamp

Motor

Wheel

Input and Output devices Battery Source

Sensor

Driver IC

Microcontroller unit

USB-Serial programmer

Source: An ideal voltage source is a voltage source that maintains the same

voltage across the source's terminals no matter what current is drawn

from the terminals of the source or what current flows into the terminals.

DC source: Direct current (DC) is the unidirectional flow of electric charge. Direct

current is produced by sources such as batteries, solar cells, and

commutator-type electric machines of the dynamo type, etc.

Sensor IR reflective sensors have one emitter (IR LED) and one receiver

(Phototransistor or photo diode. If we have white surface it reflects the

light and it will sensed by the receiver, similarly if we have black surface

it absorbs the light and receiver can not sense light.

Photo diode has property that if IR light fall on it its electrical resistance

comes down (i.e. it comes down from 150kΩ to 10kΩ if no noise

present).

Sample Calculation: Say Receiver has resistance

Rs=150kΩ without light (on black surface)

Rs=10kΩ with light (on white surface)

The voltage that goes to comparator Without light: (on black surface)

Vp=(Rs÷(Rs+R))Vcc=150÷(150+10))*5=4.6875V

With light: (on white surface)

Vp=(Rs÷(Rs+R))Vcc=10÷(10+10))*5=2.5000V

Thus we get variation of voltage that is sensed by comparator IC

(LM324).

This gives logical high or low according to input.

Comparator Comparator is a device which compares two input voltages and gives

output high/low. In circuit diagram it is normally represented by a

triangle having- Inverting (negative) Input (-),Non Inverting (positive)

Input(+), Vcc, Ground, Output.

Use of comparator in IR sensor

As above we see that two inputs are required for comparator. One input is

from photo-receiver (like photo-diode), other is generated by us using

potentiometer. The second voltage is also called as reference voltage for

that sensor.

LM358 The LM358 is a great, easy-to-use dual-channel opamp. LM358

applications include transducer amplifiers, DC gain blocks and all the

conventional opamp circuits.

Driver IC: L293D is a dual H-bridge motor driver integrated circuit (IC). Motor

drivers act as current amplifiers since they take a low-current control

signal and provide a higher-current signal. This higher current signal is

used to drive the motors. L293D contains two inbuilt H-bridge driver

circuits. In its common mode of operation, two DC motors can be driven

simultaneously, both in forward and reverse direction. The motor

operations of two motors can be controlled by input

logic at pins 2 & 7 and 10 & 15. Input logic 00 or 11 will stop the

corresponding motor. Logic 01 and 10 will rotate it in clockwise and

anticlockwise directions, respectively.

Enable pins 1 and 9 (corresponding to the two motors) must be high for

motors to start operating. When an enable input is high, the associated

driver gets enabled. Similarly, when the enable input is low, that driver is

disabled, and their outputs are off and in the high-impedance state.

Microcontroller: Microcontroller acts as the Brain of robot, which generates desired output

for corresponding inputs. In present days, there are several companies

that manufacture microcontrollers, for example ATMEL, Microchip,

Intel, Motorola, Philips etc. We are using P89V51RD2 microcontroller in

our robot. It is a PHILIPS product.

The NXP (founded by Philips) P89V51RD2 DIP is a 40MHz, 5 Volt

8051-based Microcontroller with 32 I/O lines is an extremely popular

8051 family of microcontroller available in standard 40-pin DIP package.

The microcontroller comes with an on-chip boot loader which makes it

easy to program using the USB-serial Programmer.

LCD Display:

LCD display is used to display different strings while program is running

and information regarding buttons to be pressed.

Decription Of Micro-controller board used

Keil uvision:

Keil C51 is the industry-standard tool chain for all 8051-compatible

devices, it supports classic 8051, Dallas 390, NXP MX, extended 8051

variants, and C251 devices. The µVision IDE/Debugger integrates

complete device simulation, interfaces too many target debug adapters,

and provides various monitor debug solutions.

Usb-Serial Programmer:

The programmer used is designed by SILABS and is very easy to use. We

just need to connect the USB cable to a PC and using Flash Magic we can

easily burn the program into the micro controller.

C Program Written:

#include<stdio.h>

#include<reg51.h>

#include"LCD.h"

sbit p1=P2^0;

sbit p2=P2^1;

sbit p3=P2^2;

sbit LED1=P3^0; //LED DEFINITIONS

sbit LED2=P3^1;

sbit LED3=P3^4;

sbit LED4=P3^5;

sbit SW1=P3^2; //SWITCH DEFINITIONS

sbit SW2=P3^3;

sbit SW3=P3^6; //SWITCHES ARE ACTIVE LOW (WHEN PRESSED

GIVE LOGIC LOW AT PIN)

sbit SW4=P3^7;

sbit BUZZER=P0^7;

// MOTOR PORT = PORT1

#define FORWARD 0x55

#define BACK 0XAA

#define LEFT 0x44

#define RIGHT 0x11

#define LEFT_DIFF 0x66

#define RIGHT_DIFF 0x99

#define STOP 0x00

void dot(void)

{

BUZZER=0; // TURN ON THE BUZZER

delay_ms(100); //WAIT

BUZZER=1; //TURN OFF THE BUZZER

delay_ms(100); //WAIT

}

void dash(void)

{

BUZZER=0;

delay_ms(300);

BUZZER=1;

delay_ms(90);

}

void main(void)

{

unsigned char sqnc;

P2=0xFF; //INTIALISE PORT 2 AS INPUT PORT FOR Sensors

P1=0x00; //INTIALISE PORT 1 AS OUTPUT PORT FOR MOTOR

LCD_INIT();

delay_ms(100);

LCD_CMD(0X01);

LCD_STRING("Welcome");

delay_ms(2000);

LCD_CMD(0x80);

LCD_STRING("SW1 SW2 SW3");

LCD_CMD(0xC0);

LCD_STRING("LED BUZ Wall-Avoid");

while(1)

{

if (SW1==0) //IF SWITCH1 IS PRESSED EXECUTE

RUNNING LED PROGRAM

{

LCD_CMD(0x01);

LCD_CMD(0x80);

LCD_STRING("Running LED Disp");

while(1)

{

for(sqnc=0;sqnc<=5;sqnc++)

{

LED1=0;LED2=1;LED3=1;LED4=1;

delay_ms(100);

LED1=1;LED2=0;LED3=1;LED4=1;

delay_ms(100);

LED1=1;LED2=1;LED3=0;LED4=1;

delay_ms(100);

LED1=1;LED2=1;LED3=1;LED4=0;

delay_ms(100);

}

for(sqnc=0;sqnc<=5;sqnc++)

{

LED1=1;LED2=1;LED3=1;LED4=0;

delay_ms(100);

LED1=1;LED2=1;LED3=0;LED4=1;

delay_ms(100);

LED1=1;LED2=0;LED3=1;LED4=1;

delay_ms(100);

LED1=0;LED2=1;LED3=1;LED4=1;

delay_ms(100);

}

for(sqnc=0;sqnc<=5;sqnc++)

{

LED1=1;LED2=0;LED3=0;LED4=1;

delay_ms(100);

LED1=0;LED2=1;LED3=1;LED4=0;

delay_ms(100);

LED1=0;LED2=1;LED3=1;LED4=0;

delay_ms(100);

LED1=1;LED2=0;LED3=0;LED4=1;

delay_ms(100);

}

for(sqnc=0;sqnc<=5;sqnc++)

{

LED1=0;LED2=0;LED3=0;LED4=0;

delay_ms(100);

LED1=1;LED2=1;LED3=1;LED4=1;

delay_ms(100);

LED1=0;LED2=0;LED3=0;LED4=0;

delay_ms(100);

LED1=1;LED2=1;LED3=1;LED4=1;

delay_ms(100);

}

for(sqnc=0;sqnc<=3;sqnc++)

{

LED1=0;LED2=1;LED3=1;LED4=1;

delay_ms(200);

LED1=0;LED2=0;LED3=1;LED4=1;

delay_ms(200);

LED1=0;LED2=0;LED3=0;LED4=1;

delay_ms(200);

LED1=0;LED2=0;LED3=0;LED4=0;

delay_ms(200);

LED1=1;LED2=1;LED3=1;LED4=1;

delay_ms(200);

}

for(sqnc=0;sqnc<=3;sqnc++)

{

LED1=1;LED2=1;LED3=1;LED4=0;

delay_ms(200);

LED1=1;LED2=1;LED3=0;LED4=0;

delay_ms(200);

LED1=1;LED2=0;LED3=0;LED4=0;

delay_ms(200);

LED1=0;LED2=0;LED3=0;LED4=0;

delay_ms(200);

LED1=1;LED2=1;LED3=1;LED4=1;

delay_ms(200);

}

}

}

if (SW2==0) //IF SWITCH2 IS PRESSED EXECUTE BUZZER

PROGRAM

{

LCD_CMD(0x01);

LCD_CMD(0x80);

LCD_STRING("Buzzer");

while(1)

{

dot();dot();dot();dash();dash();dot();dot();dot();delay_ms(1

000);delay_ms(1000); //MORSE CODE SEQUENCE

}

}

if (SW3==0) //IF SWITCH3 IS PRESSED TEXECUTE

MOTOR PROGRAM

{

LCD_CMD(0x01);

LCD_CMD(0x80);

LCD_STRING("Wall Avoider");

while(1)

{

here: if (p1==0 && p2==0 && p3==0)

{

P1=FORWARD;

goto here0;

}

here0: if (p1==0 && p2==0 && p3==1)

{

P1=RIGHT;

goto here1;

}

here1: if (p1==0 && p2==1 && p3==0)

{

P1= LEFT_DIFF;

goto here2;

}

here2: if (p1==0 && p2==1 && p3==1)

{

P1= RIGHT_DIFF;

goto here3;

}

here3: if (p1==1 && p2==0 && p3==0)

{

P1= LEFT;

goto here4;

}

here4: if (p1==1 && p2==0 && p3==1)

{

P1= FORWARD;

goto here5;

}

here5: if (p1==1 && p2==1 && p3==0)

{

P1= LEFT_DIFF;

goto here6;

}

here6: if (p1==1 && p2==1 && p3==1)

{

P1= BACK;

goto here;

}

}

}

}

}