Differential
Drive
AVR ATmega8
Based Line Follower
Easy to make
PID LFR Robot.
Differential drive is a drive system in which
both motion and steering can be done by two set of powered wheels. In
differential drive their is a LEFT wheel and RIGHT wheels. Both are powered. It
does not requires turning of front wheel for the steering like we steer car or
bikes. To turn the vehicle (or robo) the LEFT and RIGHT wheels are rotated at
"different" speeds. That's why its called differential drive. For
example If the RIGHT wheels rotates faster than the LEFT wheels then the robot
will turn towards LEFT.
For this robot we will use the following
rotation of wheel for the steering and straight motion.
|
Motion
|
LEFT Wheel
|
RIGHT Wheel
|
|
Forward
|
Counter Clockwise
|
Clockwise
|
|
Backward
|
Clockwise
|
Counter Clockwise
|
|
Rotate LEFT
|
Clockwise
|
Clockwise
|
|
Rotate RIGHT
|
Counter Clockwise
|
Counter Clockwise
|
|
|
|
|
So moving and steering the robot is just the
matter of controlling two DC motors.
Once you go through the articles you know how to
start a particular motor either in CW or CCW direction. HereMotorA will be the right motor and the MotorB will be the left
motor. So the following code snippets does the job.
Move Robo
Forward
MotorA(MOTOR_CW,255); //Right Motor Moves
Clockwise (CW) with Full Speed (255)
MotorB(MOTOR_CCW,255);
//Left Motor Moves Counter Clockwise (CCW) with Full Speed (255)
Move Robo
Backward
MotorA(MOTOR_CCW,255); //Right Motor Moves Counter
Clockwise (CCW) with Full Speed (255)
MotorB(MOTOR_CW,255);
//Left Motor Moves Clockwise (CW)
with Full Speed (255)
Rotate Robo
Left
MotorA(MOTOR_CW,255); //Right Motor Moves
Clockwise (CW) with Full Speed (255)
MotorB(MOTOR_CW,255);
//Left Motor Moves Clockwise (CW)
with Full Speed (255)
Rotate Robo
Right
MotorA(MOTOR_CCW,255); //Right Motor Moves Counter
Clockwise (CCW) with Full Speed (255)
MotorB(MOTOR_CCW,255);
//Left Motor Moves Counter
Clockwise (CCW) with Full Speed (255)
I have explained the code here so it does not create
confusion when the whole program (which is reasonably large)of the robot is
presented to you.
Sample Code #1
This code moves the robot forword for some time
(t) and then moves the robot backwords for same time (t).
/*********************************************************************
LFR Board Sample Programs
------------------------------------
Description :
Demonstrate forward and backward motion of robot.
**********************************************************************/
#include <avr/io.h>
#include <util/delay.h>
#include "lib/motor/motor.h"
//Simple Delay Function
void Wait();
void main()
{
//Initialize motor subsystem
MotorInit();
while(1)
{
//Move Robot Forward
MotorA(MOTOR_CW,255);
MotorB(MOTOR_CCW,255);
//Wait
Wait();
//Move Robot Backward
MotorA(MOTOR_CCW,255);
MotorB(MOTOR_CW,255);
//Wait
Wait();
}
}
void Wait()
{
uint8_t
i;
for(i=0;i<250;i++)
_delay_loop_2(0);
}
HEX File Ready to Burn
Sample Code #2
Turing demo. This will show you how to make left
and right turns. The robot rotates left from some time then rotates right for
sometime. This process is repeated as long as the robot is supplied with power.
/*********************************************************************
LFR Board Sample Programs
------------------------------------
Description : During demo. This will show you how to make left and right turns.
The
robot rotates left from some time then rotates right for sometime.
This
process is repeated as long as the robot is supplied with power.
**********************************************************************/
#include <avr/io.h>
#include <util/delay.h>
#include "lib/motor/motor.h"
//Simple Delay Function
void Wait();
void main()
{
//Initialize motor subsystem
MotorInit();
while(1)
{
//Turn Robot Right
MotorA(MOTOR_CW,255);
MotorB(MOTOR_CW,255);
//Wait
Wait();
//Turn Robot Left
MotorA(MOTOR_CCW,255);
MotorB(MOTOR_CCW,255);
//Wait
Wait();
}
}
void Wait()
{
uint8_t
i;
for(i=0;i<250;i++)
_delay_loop_2(0);
}
HEX File Ready to Burn
Sample Code #3
This will show you how to make your robot take
turn while moving forward. That means the robot will keep moving forward while
always taking a slow left turn. This will make robot go round in an anti-clock
wise circle.
This effect is achived my running the left wheel
slow in comparision to the right wheel.
/*********************************************************************
LFR Board Sample Programs
------------------------------------
Description : During demo. This will show you how to make your robot take
turn
while moving forward. That means the robot will keep
moving forward while always taking a slow left turn. This
will
make robot go round in an anti-clock wise circle.
**********************************************************************/
#include <avr/io.h>
#include <util/delay.h>
#include "lib/motor/motor.h"
void main()
{
//Initialize motor subsystem
MotorInit();
//Run the left motor (B) slow in comparison to right
motor.
//This will make the robot take left turn while moving
forward.
MotorA(MOTOR_CW,255);
MotorB(MOTOR_CCW,128);
}
Sample Code #4
Zig Zag motion demo.
/*********************************************************************
LFR Board Sample Programs
------------------------------------
Description :
Zig-Zag Motion demo
**********************************************************************/
#include <avr/io.h>
#include <util/delay.h>
#include "lib/motor/motor.h"
#include "lib/led/led.h"
void Wait();
void main()
{
//Initialize motor subsystem
MotorInit();
//Initialize LED subsystem
LEDInit();
LEDOn(1);
MotorA(MOTOR_CW,128);
MotorB(MOTOR_CCW,255);
Wait();
while(1)
{
LEDOn(5);
LEDOff(1);
MotorA(MOTOR_CW,255);
MotorB(MOTOR_CCW,128);
Wait();
Wait();
LEDOn(1);
LEDOff(5);
MotorA(MOTOR_CW,128);
MotorB(MOTOR_CCW,255);
Wait();
Wait();
}
}
void Wait()
{
uint8_t
i;
for(i=0;i<60;i++)
{
_delay_loop_2(0);
}
}
HEX File Ready to Burn
No comments:
Post a Comment