The
thrill, glory, excitement, adrenaline rush, late nights,
sore eyes, cuts, bruises, frozen gray matter, growling
stomach, goose bumps, debugging, coding-recoding, learning-relearning,
yelling, shouting...........this is what micromouse
does to you. I experienced it all. It really gets on
to you. I know I sound like a complete fanatic, but
that’s just me.
I
have been working on and off on this project for the
last two years. With one failure already under my belt,
this one was going to be my last ditch effort. Remember
the time when you want to pee real hard and there’s
no toilet in sight and then you wait n wait but cant
hold it back no more and then you decide to let it go
on a side walk? ever experienced that magical moment?
That’s exactly what happened to me. Our mouse
didn’t make it to the center of the maze, but
did manage to fetch us a third prize for our efforts.
The story goes something like this...
Not
exactly a story, rather a documentation filled with
experimentations and learning experiences that you might
find useful. It begins with an anatomy.
Chassis
The prototype chassis consisted of nothing
more than two motors held together by nylon ties and
the breadboard simply mounted on top of it. It was ideal
for testing out small motor driving routines. After
the motors were finalized, I decided to build the final
chassis. It was built using a combination of aluminum
sheet and mechano base plate. The end result was very
robust and flexible.
The
Motors
The selection of motors was the most time
consuming part of the whole project. I worked on different
motors for months, trying to figure out an ideal torque
to weight ratio. I am lucky to live in Mumbai, the home
to the Lamington road. A place where you can find almost
anything and everything related to electronics. Stepper
motors are available in plenty over here but most of
them are ex-stock or come out of old electronic gadgets.
Nonetheless they are more than sufficient for our needs.
While
choosing a stepper motor for a micromouse, one must
keep a few things in mind. First, you need to look for
motors with low voltages and higher current ratings.
Secondly look for a Nema17 size motors, it means that
they should have a width x height of 1.7 x 1.7 inches.
This holds true for unipolar as well as bipolar motors.
After
a 3 month long search, I narrowed down on a lovely pair
of unipolar motors, although not an ideal choice, they
were pretty close. Rated at 4.5Volts 450mA, these babies
were just begging to be over-driven.
Bombay Electronics
Servo
Electronics
Our
motors from Servo
At
lamington road, there are two popular places where you
can hunt for your dream motors, Servo Electronics and
Bombay Electronics, Servo being the leader in variety.
Wheels
We have a beautiful lathe machine in our
college workshop. And the operator is an experienced
perfectionist. So the wheels turned out to be a cake
walk. The end result is yours to see. They were fabricated
out of solid aluminum, a bit on the expensive side,
Rs.150 each.
Recently
there has been a craze to wear friendship bands all
across Mumbai. The day I saw one guy wearing it, I knew
I had found a ‘perfect’ match for my wheels.
I mean, these bands are awesome, you simply can’t
find a better ‘tyre’. They are available
in all sorts of colours and cost about Rs.15 to 25 each,
now beat that!
Power
Supply
Our micromouse was driven by a pack of 10
AAA Ni-Cd (600mAh) cells. Maybe this was one of the
first mistakes we made. We should have chosen AA size
Ni-Mh cells or maybe lithium-ions. Our batteries simply
drained out in a matter of minutes.
But
on the other hand I was using a MAX727 switch mode regulator
with a peak efficiency of 90%. It proved to be a far
better option than a 7805.
The
Brain
I have always felt at home while using PIC
microcontrollers. PIC 18F452 is a very powerful chip
and is supported by Microchip’s C18 C compiler.
So there were no second thoughts when it came to choosing
the brain. Micromouse demands a lot of processing power,
a good onboard ADC and lot of multiprocessing tasks
(good set of timers), this PIC has got it all. Although
there is no free running ADC mode, the actual conversion
time is really small, somewhere around 13us.
Many
of the mice that I see here in India are based around
ATMEL microcontrollers. I never used them myself, so
can’t talk more on that. But after reading a few
encouraging posts on local forums, I have begun to think
that maybe I should give atmels a try, maybe in my forthcoming
projects? For now, PICs rock!
18F452
fact sheet:
Flash
Memory
32k
RAM
1.5k
EEPROM
256bytes
Max
clock frequency
40Mhz
(10x4)
PWM
channels
2
10
bit ADC channels
8
Timers
4
I2C,SPI,USART,PSP
yes
In
Circuit Serial Programming (ICSP)
yes
Sensors
I decided to use side-looking sensors to
measure the distance from the wall and to detect their
absence/presence. Compared to the top-down looking arrangement,
the side-looking arrangement is harder to implement,
but on the brighter side, it makes the whole design
compact >> higher speeds.
I
knew that the sensors were going to be the most critical
of all the systems in this micromouse. The whole fate
of the project relied on them. There are three popular
methods of distance measurement, use of readymade distance
measuring modules (Sharp’s GP2D120), use of IR
led-phototransistor pair or using visible red led-phototransistor
pair. (ultrasonics can also be used, but are severely
limited by their slow sampling rates) Sharp’s
modules are expensive and using visible red LEDs required
modulation, so I eventually settled down on using IR
led-phototransistor pair.
There
are a variety of sensors available in the local market
today, choosing the right one is a daunting task. I
located a dealer here in Mumbai, who solely deals in
IR sensors; on his recommendation I bought 4 sensor
pairs for Rs.20 each. The ultra bright IR LED was enclosed
in a clear 3mm plastic package while the phototransistor
was enclosed in a 3mm darkened plastic (to filter out
the visible light)
I
used a simple circuit arrangement as shown below. Static
breadboard testing results were encouraging and they
gave a range of about 1cm to 9cm, which was just about
enough.
To
test the circuit, I connected the sensor output to one
of the ADC pins of 18F452 which followed a code that
subtracted the ambient light value from the readings
and dumped the result on a 2-line LCD.
Everything
was going smoothly, until that unfortunate but inevitable
moment. ADCs are very sensitive to even the slightest
of voltage fluctuations. Now imagine placing them on
two electromagnetically active, current sucking monsters,
‘the stepper motors’. I had a very hard
time dealing with this notorious couple. I tried spraying
capacitors all around them, but no significant improvements
were in sight. With the competition day at my door-step,
I had no option but to move on. The only logical solution
was to use two separate batteries, one for the electronics
and the other for the motors. (Just good enough)
I
wondered how the Japanese or the Singaporeans managed
everything with a single battery. I guess it’s
all about designing a good PCB (placing the digital
and analog grounds miles away from each other). Ok,
so I didn’t get it right the first time, but hey,
there’s always a next time, right?
The
final sensor arrangement looks something like this:
LCD
LCD is an extremely handy debugging tool.
Microchip’s C18 compiler has inbuilt LCD libraries;
you have to be a fool not to use them. I built a pluggable
module out of a 16x2 LCD that has a contrast-setting
pot and a backlight switch soldered on to the back.
I
used the LCD for two main purposes:
I wrote a small routine that displayed all the sensor
readings continuously/triggered, on the LCD. So that
I could observe and note the readings as I manually
moved the mouse through the maze.
A
second routine allowed me to set the number of steps
required to travel a distance of one cell, or turn by
90/180 degrees. Using three switches (to increment,
decrement and select the number of steps}, I was able
to accurately determine and set newer values on the
mouse itself, instead of re-programming the chip all
the time.
Heres
a sample code for the ADC routines:
void
read_sidesensors(void)
{
siderightled=0; //
initially both IR LEDs are turned off
sideleftled=0;
//Read
side right sensor value//
SetChanADC( ADC_CH0 );
ConvertADC( ); //
Start conversion
while( BusyADC ( ) );
//
Wait for completion of ADC
ambientright = ReadADC(
); //
Read ambient value with LED OFF
siderightled=1; //
turn on the IR LED
Delay10TCYx( 6 );
// wait for LED to glow fully
ConvertADC( ); //
Start conversion
while( BusyADC( ) ); //
Wait for completion of ADC
rightirvalue=ReadADC(
); //
Read value with LED turned ON
siderightled=0; //
turn off the LED
rightvalue=rightirvalue-ambientright;
// calculate the 'clean' value
//Read side left sensor value//
SetChanADC( ADC_CH1 );
ConvertADC(); // Start
conversion
while( BusyADC( ) ); //
Wait for completion of ADC
ambientleft = ReadADC(
); //
Read ambient value with LED OFF
sideleftled=1; //
turn on the IR LED
Delay10TCYx( 6 ); //
wait for LED to glow fully
ConvertADC( ); //
Start conversion
while( BusyADC( ) ); //
Wait for completion of ADC
leftirvalue=ReadADC( );
//
Read value with LED turned ON
sideleftled=0;
// turn off the LED
CloseADC( );
leftvalue=leftirvalue-ambientleft;
// calculate the 'clean' value
//Calculate
their difference//
difference = rightvalue-leftvalue;
return;
}
//Displays
the ADC result on to the LCD display//
void display_sidesensors(void)
{
OpenXLCD( FOUR_BIT &
LINES_5X7 ); //configure
LCD
while( BusyXLCD() );
putrsXLCD("Side: ");
while( BusyXLCD( ) );
itoa(leftvalue,string1
);
//converts the ADC int value into a string
putsXLCD(string1); //Display
the left ADC value on the LCD
while( BusyXLCD( ) );
putrsXLCD(" ");
while( BusyXLCD( ) );
itoa(rightvalue,string2
); //converts
the ADC int value into a string
putsXLCD(string2); //Display
the right ADC value on the LCD
while( BusyXLCD( ) );
return;
}
Motor Drivers
To get the maximum performance out of any
stepper motors, you need to overdrive them, that is,
increasing the supply voltage while limiting the current
to the rated levels. To overdrive my motors, I supplied
a voltage of 12 volts (rating was 4.5Volts) and limited
the current to the rated 0.45Amps. Current chopping
is an ideal way to do this. I had used UCN5804 uni-polar
driver chip, from Allegro Micro, in my earlier failed
attempt of building a micromouse. These chips have an
inbuilt translator and driver but no current chopping
facility. So I turned my attention in search of some
fancy current chopping chips. A quick search revealed
SLA7832 as an ideal candidate.It seemed that this chip
had got it all, except for the translator. After a long
frustrating search at lamington road, I finally managed
to locate a shop which had box full of such chips. (Bought
two of them for Rs.200 each)
These
chips are very difficult to test (“difficult”—
a complete understatement). They are not meant for bread-boarding
at all, so I had to make an adapter for them. After
hours and days of testing, I simply couldn’t get
them working. I tried every possible circuit arrangement,
but no result. I seriously believe that I was duped.
At Rs.200 per chip, they must have been the duplicators
delight.
So
after the “pain in the a**” realization,
I returned to my left-overs, the UCN5804s. With no current
chopping at hands, I had to follow the old school method
of using resistors to limit the current. Calculations
revealed that I would need somewhere around 10ohms rated
at 5watts!
The Software
Life has been good to me ever since I switched
over to C from assembly. Coding felt just like a cool
breeze through my hair. But coding for micromouse on
the other hand, turned out to be turbulent. Extreme,
I love that.
I
soon realized how unpolished my coding skills were,
I guess, being an electronics engineer, the college
never really encouraged programming at higher levels.
So I had to turn to my friend, Sachin, a programming
wizard. After long evenings talking over Gtalk (he lived
1329 Kms away in Chennai), Sachin soon came up with
an elegantly written maze solving micromouse simulator
that ran on Linux. Visit his
site to know more about it.
I still had to manage the major chunk of the software
that dealt with multitasking of motor driving routines,
ADC conversions, mapping, turns, etc.
The algorithm goes something like this:
Initialization
A timer is initialized that ticks at regular intervals.(changing
the tick time period changes the speed of the motors)
At each tick, an interrupt routine is executed.
The interrupt routine consists of several sub-routines
that take care of:
Generating steps for the stepper motors
{
Generate 20us pulse for
right and left stepper motors.
If required skip a step
of the particular motor to align the robot.
Count the number of steps
(distance traveled) and call mapping function after
reaching the center of each cell.
}
Reading
the sensors
{
Read the sensors one at
a time with the IR led kept off (ambient light)
Read the sensors one at
a time with the IR led kept on
Subtract the two readings
to get a clean (almost clean) distance value.
Calculate the difference
between right and left sensor
{
If mouse
is too close to the right wall then skip a step for
left motor
If mouse
is too close to the left wall then skip a step for right
motor
Else
no skipping
}
}
Mapping
and storing the wall information
{
Note: this part of the
code still remains undeveloped; on the day of the competition
we simply followed a depth
first search algorithm. I wanted to utilize Sachin’s
simulator code but the time was against me.
}
Right
and Left turns
180 degree turns
LCD routines to display ADC values
The
algorithm is very crude. It has desperation written
all over it. But that is exactly what happens in a 'compressed'
learning phase. I know I got miles to cover before I
make it to the center.
[click
to enlarge]
Thanks to: Sachin Surendran: for the constant encouragement,
healthy criticisms and the wonderful micromouse
simulator. (also for his promise to fund this project
someday)
Akshay
Joshi: My team mate, for all the equipments
that he provided/bought and the early morning phone
calls.
Ronak
Vasa: My other team mate, for the brainstorming
coding sessions and for his ‘precious’ PIC
microcontrollers.
Mr.
Narkar: our college workshop incharge, for
fabricating the beautiful pair of wheels.
Google:
for the wonderful Gtalk.
Ashish
Bhat: for proving that a world class micromouse
can indeed be built using locally available (sometimes
imported) components. His site can be found here.
And
to the IIT Techfest
team for pulling off awesome technical festivals, year
after year.
Conclusion:
You can never really explain the excitement
of building robots. Micromouse is way up in this category.
If there’s anything that I would like to tell
you, it’s this: “If you wish to build a
micromouse, start right now!”