Professional Documents
Culture Documents
www.nex-robotics.com
NEX Robotics
SPARK V
SOFTWARE MANUAL
www.nex-robotics.com
NEX Robotics
Version 1.12
November 06, 2010
Documentation author
Sachitanand Malewar, NEX Robotics Pvt. Ltd.
Vinod Desai, NEX Robotics Pvt. Ltd.
Credits:
All the team of NEX Robotics
www.nex-robotics.com
NEX Robotics
Notice
The contents of this manual are subject to change without notice. All efforts have been
made to ensure the accuracy of contents in this manual. However, should any errors be
detected, NEX Robotics welcomes your corrections. You can send us your queries /
suggestions at
info@nex-robotics.com
Content of this manual is released under the Creative Commence cc by-nc-sa license. For
legal information refer to: http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode
Recycling:
Almost all of the robot parts are recyclable. Please send the robot parts to the recycling
plant after its operational life. By recycling we can contribute to cleaner and healthier
environment for the future generations.
www.nex-robotics.com
NEX Robotics
Index
1.
Introduction
2.
3.
22
4.
32
5.
LCD Interfacing
42
6.
48
7.
Serial Communication
55
www.nex-robotics.com
NEX Robotics
1. Introduction
Spark V is a low cost robot designed for robotics hobbyists and enthusiasts. It is jointly
designed by NEX Robotics with Department of Computer Science and Engineering, IIT
Bombay. Spark V will help you get acquainted with the world of robotics and embedded
systems. Thanks to its innovative architecture and adoption of the Open Source
Philosophy in its software and hardware design, you will be able to create and contribute
to, complex applications that run on this platform, helping you acquire expertise as you
spend more time with them.
Spark V robot is based on ATMEGA16 microcontroller. It has 3 analog white line
sensors, 3 analog IR Proximity sensors, 3 directional light intensity sensors and Battery
voltage sensing. Robot has support for 3 MaxBotix EZ series ultrasonic range sensors. It
also has support for the servo mounted sensor pod which can be used to make 180
degrees scan for the map making. Robot can be powered by 6 AA size rechargeable
NiMH batteries. Robot has built-in Smart Battery Controller which charges the battery in
intelligent way and also monitors the battery charge level when robot is in operation.
Robot has onboard FT232 based true USB to serial TTL converter. Robot programming
is done using NEX Robotics Bootloader via USB port. There is no need to use external
programmer. Robot has 2x16 alphanumeric LCD, Lots of LED indicators and Buzzer etc.
for quick debugging. Robot has onboard socket for XBee wireless module for multi robot
and robot to PC communication. Robot has two low power 60 RPM DC geared motors
which are powered by L293D motor driver with the top speed of 66cm/second.
Note: You need to buy MaxBotix EZ series ultrasonic range sensors, XBee wireless
module and rechargeable NiMh Batteries separately.
NEX Robotics
www.nex-robotics.com
NEX Robotics
Operational Modes:
Standalone (Autonomous Control)
PC as master and robot as slave
Distributed (multi robot communication)
Communication:
USB Communication using FT232 USB to Serial Converter
Simplex infrared communication (From infrared remote to robot)
ZigBee (IEEE 802.15.4) (Wireless) (Robots to Robots and Robots to PCs )(Optional)
Dimensions:
Diameter: 15cm
Height: 7cm
Power:
6 AA size NiMH rechargeable batteries (Batteries not included)
Onboard Smart Battery Controller charges the battery in intelligent way and also
monitors the battery charge level when robot is in operation.
Locomotion:
Two 60 RPM DC geared motors and caster wheel as support
Built-in clutch protection for the motors from non continuous stalling of the wheel
Top Speed: 66cm/second
Optional Accessories:
Servo mounted Ultrasonic range sensor for 180 degree scan
Servo mounted directional light intensity sensor for 180 degree scan
Two position encoders
MaxBotix EZ series ultrasonic range sensors
XBee wireless module
Software Support:
GUI Based control, AVR studio, WINAVR
Microsoft robotics studio Visual Programming Language (will be launched shortly)
Requires:
AC adaptor with exact 12VDC with 1Amp. current rating for battery charging.
6 NiMH rechargeable batteries
www.nex-robotics.com
NEX Robotics
Pins
PB0 to PB3
PC0 to PC2
PC4 to PC7
PD6
PC3
Input / Output
Output
Recommended
Initial State
Logic 0
Output
Logic 0
Input
Output
Pulled up*
Logic 0
Table 2.1
Note:
* In the AVR microcontrollers while pin is used as input it can be pulled up internally by
using software enabled internal pull-up resistor. This internal pull-up as name indicates
pulls up the floating pin towards Vcc. This makes input pin less susceptible to noise.
www.nex-robotics.com
NEX Robotics
For pins configured as input, we can instruct the microcontroller to apply a pull up
register by writing logic 1 to the corresponding bit of the port driver register.
DDRA = 0x00; //set all 8 bits of PORTA as input
PORTA = 0xF0; //pull-up registers are connected on 4 MSB pins and 4 LSB pins are
floating
C. Port pins register (PINx)
Reading from the input bits of port is done by reading port pin register
x = PINA; //read all 8 pins of port A
DDRx
PORTx
I/O
Pull-up
Comments
0
0
1
1
0
1
0
1
Input
Input
Output
Output
No
Yes
No
No
floating input
Will source current if externally pulled low
Output Low (Sink)
Output High (source)
Table 2.2
Note:
X represents port name A, B, C, D
Tri-State is the floating pin condition.
For more details, refer to ATMEGA16 datasheet which is located in the
Datasheets folder in the documentation CD.
Example:
Make PORTA 0-3 bits as output and PORTA 4-7 bits input.
Add pull-up to pins PORTA 4 and PORTA 5.
Output of PORTA 0 and PORTA 2 = 1; PORT A 1 and PORT A 3 = 0;
Pin
DDRA
PORTA
Status
PA7
0 (i/p)
0
i/p
Floating
PA6
0 (i/p)
0
i/p
Floating
PA5
0 (i/p)
1 ()
i/p
Pull-up
PA4
0 (i/p)
1 ()
i/p
Pull-up
PA3
1 (o/p)
0
o/p
Low
PA2
1 (o/p)
1
o/p
High
PA1
1 (o/p)
0
o/p
Low
PA0
1 (o/p)
1
o/p
High
Table 2.3
{
unsigned char k;
DDRA = 0x0F; //Make PA4 to PA7 pins input and PA0 to PA3 pins output
PORTA = 0x35; //Make PA7, PA6 floating; PA5, PA4 pulled-up; PA3, PA1 logic 1;
PA3, PA1 //logic 0;
k = PINA; //Reads all the data from PORTA
while (1);
}
www.nex-robotics.com
10
NEX Robotics
All port pins have individually selectable pull-up resistors with a supply-voltage invariant
resistance. All I/O pins have protection diodes to both VCC and Ground as indicated in
Figure 2.1.
D. To disable pull-ups of all the ports we need to set Bit 2 of SFIOR to logic one.
Special Function I/O register SFIOR
Pin
Read/ Write
Initial Val
TSM
R/W
0
R
0
R
0
R
0
ACME
R/W
0
PUD
R/W
0
PSR0
R/W
0
PSR321
R/W
0
Table 2.4
Bit 2-PUD: Pull-Up Disable
When this bit is written to one, the pull-ups in all the I/O ports are disabled even if the
DDRxn and PORTxn Registers are configured to enable the pull-ups ({DDRxn,
PORTxn} = 0b01).
E. Toggling the Pin
Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of
DDRxn.
Note that the SBI instruction can be used to toggle one single bit in a port. Where x is
the port name and n is the bit number.
www.nex-robotics.com
11
NEX Robotics
Pin name
USED FOR
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(XCO/T0)PB0
(T1)PB1
(INT2/AIN0)PB2
(OC0/AIN1)PB3
(SS)PB4
(MOSI)PB5
(MISO)PB6
(SCK)PB7
RESET
VCC
GND
XTAL1
XTAL2
(RXD)PD0
(TXD)PD1
16
(INT0)PD2
17
18
19
(INT1)PD3
(OC1B)PD4
(OC1A)PD5
20
(ICP1)PD6
21
(OC2)PD7
22
23
24
25
26
27
28
PC0(SCL)
PC1(SDA)
PC2(TCK)
PC3(TMS)
PC4(TDO)
PC5(TDI)
PC6(TOSC1)
Input /
Output
Output
Output
Output
Output
Output
29
PC7(TOSC2)
30
AVCC
5V
--
31
AGND
Ground
--
32
33
34
35
36
37
AREF
PA7 (ADC7)
PA6(ADC6)
PA5(ADC5)
PA4(ADC4)
PA3(ADC3)
-Input*****
Input*****
Input*****
Input*****
Input*****
38
PA2(ADC2)
39
PA1(ADC1)
www.nex-robotics.com
Status
Output
Output
Output
Output
Output
Output
Input
Output
Default
--Default
Default
Input
Output
Input
Input
Output
Output
Output
Input*****
Input*****
12
NEX Robotics
40
PA0(ADC0)
Input*****
www.nex-robotics.com
13
NEX Robotics
}
void port_init (void)
{
buzzer_pin_config();
}
void buzzer_on (void)
{
unsigned char port_restore = 0;
port_restore = PINC;
port_restore = port_restore | 0x08;
PORTC = port_restore;
}
void buzzer_off (void)
{
unsigned char port_restore = 0;
port_restore = PINC;
port_restore = port_restore & 0xF7;
PORTC = port_restore;
}
void init_devices (void)
{
cli(); //Clears the global interrupts
port_init();
sei(); //Enables the global interrupts
}
//Main Function
int main(void)
{
init_devices();
while(1)
{
buzzer_on();
_delay_ms(1000);
buzzer_off();
_delay_ms(1000);
}
}
//delay
//delay
In this code, first three lines represent the header file declaration. The # include directive
is used for including header files in the existing code. The syntax for writing header file is
as follows: #include <avr/io.h>
This # include directive will add the already existing io.h header file stored in avr folder
under winavr folder. The same way other header files are also included in the main
program so that we can use various utilities defined in the header files.
In all the codes we will configure pins related to any particular module in the
xxxx_pin_config() functions. In this example code we have used the function
www.nex-robotics.com
14
NEX Robotics
www.nex-robotics.com
15
NEX Robotics
applied to IC L293Ds direction pins. Velocity control is done using pulse width
modulation (PWM) applied to Enable pins of L293D IC.
Microcontroller pin connections
Microcontroller Pin
PD5 (OCR1AL)
PD4 (OCR1BL)
PB0
PB1
PB2
PB3
Function
Pulse width modulation for the left motor (velocity control)
Pulse width modulation for the right motor (velocity control)
Left motor direction control
Left motor direction control
Right motor direction control
Right motor direction control
Direction
FORWARD
REVERSE
RIGHT
(Left wheel forward, Right
wheel backward)
LEFT
(Left wheel backward,
Right wheel forward,)
SOFT RIGHT
(Left wheel forward,, Right
wheel stop)
SOFT LEFT
(Left wheel stop, Right
wheel forward,)
SOFT RIGHT 2
(Left wheel stop, Right
wheel backward)
SOFT LEFT 2
(Left wheel backward,
Right wheel stop)
HARD STOP
SOFT STOP
(Free running stop)
L1
(Red)
(I/P)
PB0
L2
(Red)
(I/P)
PB1
PL
(Yel.)
(I/P)
PD3
R1
(Red)
(I/P)
PB2
R2
(Red)
(I/P)
PB3
PR
(Yel.)
(I/P)
PD4
0
1
1
0
1
1
1
0
0
1
1
1
Direction
Output
(Red / Yel.)
Left
Right
Motor
Motor
Yellow Yellow
Red
Red
Yellow
Red
Red
Yellow
Yellow
Off
Off
Yellow
Off
Red
Red
Off
Off
Off
Off
Off
www.nex-robotics.com
16
NEX Robotics
LEFT
BWD (LB)
PB0
LEFT
FWD(LF)
PB1
RIGHT
FWD(RF)
PB2
RIGHT
BWD(RB)
PB3
FORWARD
REVERSE
HARD STOP
PWM
PD5 for left motor
PD4 for right
motor
As per velocity
requirement
As per velocity
requirement
As per velocity
requirement
As per velocity
requirement
As per velocity
requirement
As per velocity
requirement
As per velocity
requirement
As per velocity
requirement
As per velocity
requirement
0
17
NEX Robotics
2.6 Functions used by the robot for configuring various ports of the
ATMEGA16 microcontroller
2.6.1 Buzzer
Buzzer is connected to the PORTC 3 pin of the microcontroller.
Buzzer is turned on of logic 1 is applied at the PORTC 3 pin. For more information on
the hardware refer to section 3.13 in the hardware manual.
2.6.1.1 buzzer_pin_config()
PORTC 3 pin is configured as output with the initial state set at logic 0 to keep the
buzzer off.
void buzzer_pin_config (void)
{
DDRC = DDRC | 0x08;
PORTC = PORTC & 0xF7;
}
2.6.1.2 buzzer_on()
Turns on the buzzer by setting PORTC 3 pin to logic 1.
www.nex-robotics.com
18
NEX Robotics
2.6.1.3 buzzer_off()
Turns off the buzzer by setting PORTC 3 pin to logic 0.
void buzzer_off (void)
{
unsigned char port_restore = 0;
port_restore = PINC;
port_restore = port_restore & 0xF7;
PORTC = port_restore;
}
2.6.4.2 motion_set()
Used for setting appropriate logic values for controlling robots direction. It is called
by other functions to set robots direction.
void motion_set (unsigned char Direction)
{
unsigned char PortBRestore = 0;
Direction &= 0x0F;
PortBRestore = PORTB;
PortBRestore &= 0xF0;
PortBRestore |= Direction;
PORTB = PortBRestore;
}
19
NEX Robotics
www.nex-robotics.com
20
NEX Robotics
2.6.4.2 right_encoder_pin_config()
//Function to configure INT0 (PORTD 2) pin as input for the right position encoder
void right_encoder_pin_config (void)
{
DDRD = DDRD & 0xFB; //Set the direction of the PORTD 2 pin as input
PORTD = PORTD | 0x04; //Enable internal pull-up for PORTD 2 pin
}
Note: To get data from the position encoders interrupts are used which are covered in the chapter 3.
2.6.5 lcd_port_config()
void lcd_port_config (void)
{
DDRC = DDRC | 0xF7; //all the LCD pin's direction set as output
PORTC = PORTC & 0x80; // all the LCD pins are set to logic 0 except PORTC 7
}
2.6.6 adc_pin_config()
void adc_pin_config (void)
{
DDRA = 0x00; //set PORTA direction as input
PORTA = 0x00; //sett PORTA pins floating
}
www.nex-robotics.com
21
NEX Robotics
7
R/W
0
6
0
R/W
0
5
R/W
0
4
R/W
0
3
ISC11
R/W
0
2
ISC10
R/W
0
1
ISC01
R/W
0
0
ISC00
R/W
0
www.nex-robotics.com
22
NEX Robotics
INT1 pin that activate the interrupt are defined in Table 3.1. The value on the INT1 pin is
sampled before detecting edges. If edge or toggle interrupt is selected, pulses that last
longer than one clock period will generate an interrupt. Shorter pulses are not guaranteed
to generate an interrupt. If low level interrupt is selected, the low level must be held until
the completion of the currently executing instruction to generate an interrupt.
ISC11 ISC100 Description
0
0
The low level of INT1 generates an interrupt request.
0
1
Any edge of INT1 generates asynchronously an interrupt
request.
1
0
The falling edge of INT1 generates asynchronously an
interrupt request.
1
1
The rising edge of INT1 generates asynchronously an
interrupt request.
Table 3.1: Interrupt 1 Sense Control
Bit 1, 0 ISC01, ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0
The External Interrupt 0 is activated by the external pin INT0 if the SREG I-flag and the
corresponding interrupt mask are set. The level and edges on the external INT0 pin that
activate the interrupt are defined in Table 3.2. The value on the INT0 pin is sampled
before detecting edges. If edge or toggle interrupt is selected, pulses that last longer than
one clock period will generate an interrupt. Shorter pulses are not guaranteed to generate
an interrupt. If low level interrupt is selected, the low level must be held until the
completion of the currently executing instruction to generate an interrupt.
ISC01 ISC00 Description
0
0
The low level of INT0 generates an interrupt request.
0
1
Any edge of INT0 generates asynchronously an interrupt
request.
1
0
The falling edge of INT0 generates asynchronously an
interrupt request.
1
1
The rising edge of INT0 generates asynchronously an
interrupt request.
Table 3.2: Interrupt 0 Sense Control
3.1.1.2 MCUCSR MCU Control and Status Register
Bit
Read
Write
Initial
Value
7
/ R/W
0
6
ISC2
R/W
5
R/W
4
R/W
3
R/W
2
R/W
1
R/W
0
R/W
www.nex-robotics.com
23
NEX Robotics
The Asynchronous External Interrupt 2 is activated by the external pin INT2 if the SREG
I-bit and the corresponding interrupt mask in GICR are set. If ISC2 is written to zero, a
falling edge on INT2 activates the interrupt. If ISC2 is written to one, a rising edge on
INT2 activates the interrupt. Edges on INT2 are registered asynchronously. Pulses on
INT2 wider than the minimum pulse width given in Table 3.3 will generate an interrupt.
Shorter pulses are not guaranteed to generate an interrupt. When changing the ISC2 bit,
an interrupt can occur. Therefore, it is recommended to first disable INT2 by clearing its
Interrupt Enable bit in the GICR Register. Then, the ISC2 bit can be changed. Finally, the
INT2 Interrupt Flag should be cleared by writing a logical one to its Interrupt Flag bit
(INTF2) in the GIFR Register before the interrupt is re-enabled.
Symbol
tINT
Parameter
Condition Min Typ Max
Minimum Pulse width for
50
asynchronous external interrupt
Table 3.3: Asynchronous External Interrupt Characteristics
Unit
ns
7
INT1
/ R/W
0
6
INT0
R/W
5
INT2
R/W
4
R/W
3
R/W
2
R/W
1
R/W
0
R/W
24
NEX Robotics
Control and Status Register (MCUCSR) defines whether the External Interrupt is
activated on rising or falling edge of the INT2 pin. Activity on the pin will cause an
interrupt request even if INT2 is configured as an output. The corresponding interrupt of
External Interrupt Request 2 is executed from the INT2 Interrupt Vector.
3.1.1.4 GIFR General Interrupt Flag Register
7
6
5
4
Bit
INTF1 INTF0 INTF2 Read
/ R/W
R/W
R/W
R/W
Write
Initial
0
0
0
0
Value
R/W
R/W
R/W
R/W
www.nex-robotics.com
25
NEX Robotics
//Function to configure INT0 (PORTD 2) pin as input for the right position encoder
void right_encoder_pin_config (void)
{
DDRD = DDRD & 0xFB; //Set the direction of the PORTD 2 pin as input
PORTD = PORTD | 0x04; //Enable internal pull-up for PORTD 2 pin
}
www.nex-robotics.com
26
NEX Robotics
www.nex-robotics.com
27
NEX Robotics
Case 2: Robot is turning with one wheel rotating clockwise while other wheel is
rotating anti clockwise. Center of rotation is in the center of line passing through
wheel axel and both wheels are rotating in opposite direction (encoder resolution is
in degrees)
Distance between Wheels = 11.6cm
Radius of Circle formed in 3600 rotation of Robot = Distance between Wheels / 2
= 5.8 cm
0
Distance Covered by Robot in 360 Rotation = Circumference of Circle traced
= 2 x 5.8 x 3.14
= 36.4 cm or 364mm
0
Number of wheel rotations in 360 rotation of robot
= Circumference of Traced Circle / Circumference of Wheel
= 364 / 219.80
= 1.65
0
Total pulses in 360 Rotation of Robot
= Number of slots on the encoder disc / Number of wheel rotations of in 3600 rotation
of robot
= 17 x 1.65
= 28.05 (approximately 28)
Position Encoder Resolution in Degrees = 360 / 28
= 12.85 degrees per count
Case 3: Robot is turning with one wheel stationary while other wheel is rotating
clockwise or anti clockwise. Center of rotation is center of the stationary wheel
(encoder resolution is in degrees)
In this case only one wheel is rotating and other wheel is stationary so robot will
complete its 3600 rotation with stationary wheel as its center.
Radius of Circle formed in 3600 rotation of Robot = Distance between Wheels
= 11.6 cm
0
Distance Covered by Robot in 360 Rotation = Circumference of Circle traced
= 2 x 11.6 x 3.14
= 72.848 cm or 728 mm
Number of wheel rotations of in 3600 rotation of robot
= Circumference of Traced Circle / Circumference of Wheel
= 728 / 219.80
= 3.312
0
Total pulses in 360 Rotation of Robot
= Number of slots on the encoder disc / Number of wheel rotations of in 3600 rotation
of robot
= 17 x 3.312
= 56.304 (approximately 56)
Position Encoder Resolution in Degrees = 360 /56
= 6.42 degrees per count
www.nex-robotics.com
28
NEX Robotics
3.2.3.2 Function for moving robot forward and back by specific distance
//Function used for moving robot forward by specified distance
void linear_distance_mm(unsigned int DistanceInMM)
{
float ReqdShaftCount = 0;
unsigned long int ReqdShaftCountInt = 0;
ReqdShaftCount = DistanceInMM / 12.92; // division by resolution to get shaft count
ReqdShaftCountInt = (unsigned long int) ReqdShaftCount;
ShaftCountRight = 0;
while(1)
{
if(ShaftCountRight > ReqdShaftCountInt)
{
break;
www.nex-robotics.com
29
NEX Robotics
}
}
stop(); //Stop robot
}
3.2.3.3 Forward in mm
void forward_mm(unsigned int DistanceInMM)
{
forward();
linear_distance_mm(DistanceInMM);
}
3.2.3.4 Backward in mm
void back_mm(unsigned int DistanceInMM)
{
back();
linear_distance_mm(DistanceInMM);
}
www.nex-robotics.com
30
NEX Robotics
www.nex-robotics.com
31
NEX Robotics
Velocity control Timer 1 is used to generate PWM for robots velocity control.
Servo motor control.
Event scheduling Timer1 with timer overflow interrupt is used for event
scheduling.
In the SPARK V ATMEGA16 robot Timer 1 is used to generate PWM for robot velocity
control. All other timers are free and can be used for other purposes.
Note: Theory content of this chapter is based on the ATMEGA16 datasheet which is
located in the datasheet folder in the documentation CD.
General features of the 8 bit timers 0 and 2
Two Independent Output Compare Units
Double Buffered Output Compare Registers
Clear Timer on Compare Match (Auto Reload)
Glitch Free, Phase Correct Pulse Width Modulator (PWM)
Variable PWM Period
Frequency Generator
Three Independent Interrupt Sources (TOV0, OCF0, TOV2, OCF2)
General features of the 16 bit timers 1
True 16-bit Design (i.e., Allows 16-bit PWM)
Three independent Output Compare Units
Double Buffered Output Compare Registers
One Input Capture Unit
Input Capture Noise Canceller
Clear Timer on Compare Match (Auto Reload)
Glitch-free, Phase Correct Pulse Width Modulator (PWM)
Variable PWM Period
Frequency Generator
External Event Counter
independent interrupt sources (TOV1, OCF1A, OCF1B, OCF1C, ICF1)
www.nex-robotics.com
32
NEX Robotics
www.nex-robotics.com
33
NEX Robotics
7
COM1A1
R/W
0
6
COM1A0
R/W
0
5
COM1B1
R/W
0
4
COM1B0
R/W
0
3
FOC1A
R/W
0
2
FOC1B
R/W
0
1
WGM11
R/W
0
0
WGM10
R/W
0
COMnA0
COMnB0
0
1
Description
Normal port operation, OC1A, OC1B disconnected
WGM13:0 = 15: Toggle OC1A on Compare Match, OCnB disconnected
(normal port operation).
Clear OCnA/OCnB on compare match, set OCnA/OCnB at BOTTOM
(non-inverting mode).
Set OCnA/OCnB on compare match, clear OCnA/OCnB at BOTTOM
(inverting mode).
Table 4.1: COMnX1:0 bit functionality when the WGM13:0 bits are set to fast
PWM mode.
Bit 1:0 WGM11:0: Waveform Generation Mode
Combined with the WGM13:2 bits found in the TCCRnB Register, these bits control the
counting sequence of the counter, the source for maximum (TOP) counter value, and
what type of waveform generation to be used, see Table 5.3. Modes of operation
supported by the Timer/Counter unit are: Normal mode (counter), Clear Timer on
Compare match (CTC) mode, and three types of Pulse Width Modulation (PWM) modes.
www.nex-robotics.com
34
NEX Robotics
For more information on the different modes, refer Modes of Operation on page 94 of
the ATMEGA16 datasheet.
4.2.2 TCCR1B Timer/Counter Control Register B
Bit
Read / Write
Initial Value
7
ICNC1
R/W
0
6
ICES1
R/W
0
5
R
0
4
WGM13
R/W
0
3
WGM12
R/W
0
2
CS12
R/W
0
1
CS11
R/W
0
0
CS10
R/W
0
CS11
0
0
1
1
0
0
1
1
CS10
0
1
0
1
0
1
0
1
Description
No clock source. (Timer/Counter stopped)
clkI/O/1 (No prescaling)
clkI/O/8 (From prescaler)
clkI/O/64 (From prescaler)
clkI/O/256 (From prescaler)
clkI/O/1024 (From prescaler)
External clock source on T1 pin. Clock on falling edge
External clock source on T1 pin. Clock on rising edge
www.nex-robotics.com
35
NEX Robotics
7
-
Read / Write
Initial Value
6
-
5
TICIE1
R/W
0
4
OCIE1A
R/W
0
3
OCIE1B
R/W
0
2
TOIE1
R/W
0
1
-
0
-
36
NEX Robotics
7
R
0
6
R
0
5
ICF1
R/W
0
4
OCF1A
R
0
3
OCF1B
R/W
0
2
TOV1
R/W
0
1
R/W
0
0
R/W
0
www.nex-robotics.com
37
NEX Robotics
Function
Pulse width modulation for the left motor (velocity control)
Pulse width modulation for the right motor (velocity control)
Left motor direction control
Left motor direction control
Right motor direction control
Right motor direction control
www.nex-robotics.com
38
NEX Robotics
www.nex-robotics.com
39
NEX Robotics
Table 4.2: 8 bit PWM fast frequency for different prescale options
4.3.4 Function for timer 1 initialization
void init_devices (void) //use this function to initialize all devices
{
cli(); //disable all interrupts
timer1_init();
sei(); //re-enable interrupts
}
cli(); disables all the interrupts and sei(); enables all the interrupts.
www.nex-robotics.com
40
NEX Robotics
It is very important that all the devices should be configured after disabling all the
interrupts. All the peripherals of the microcontroller will be configured inside
init_devices() function.
4.3.5 Functions for PWM output pin configuration and robots velocity control
4.3.5.1 Functions for PWM output pin configuration (called inside the port_init()
function)
void motion_pin_config (void)
{
DDRB = DDRB | 0x0F; //set direction of the PORTB 3 to PORTB 0 pins as output
PORTB = PORTB & 0xF0; // set initial value of the PORTB 3 to PORTB 0 pins to logic 0
DDRD = DDRD | 0x30; //Setting PD5 and PD4 pins as output for PWM generation
PORTD = PORTD | 0x30; //PD5 and PD4 pins are for velocity control using PWM
}
This function takes velocity for left motor and right motor as input parameter and assigns
them to output compare register OCR1A and OCR1B. Channel A is used for left motor
and channel B is used for right motor. Since we are using PWM in 8 bit resolution we
only load lower byte of the OCR1A and OCR1B registers.
4.3.6 Application example for robot velocity control
Located in the folder Experiments \ 5_Velocity_Control_using_PWM folder in the
documentation CD.
This experiment demonstrates robot velocity control using PWM.
Concepts covered: Use of timer to generate PWM for velocity control
There are two components to the motion control:
1. Direction control using pins PORTB0 to PORTB3
2. Velocity control by PWM on pins PD5 and PD4 using OC1A and OC1B of timer 1.
Connections: Refer to table 4.4 for connection details.
Note:
1. Make sure that in the configuration options following settings are done for proper
operation of the code
Microcontroller: atmega16
Frequency: 7372800
Optimization: -O0
(For more information read section: Selecting proper optimization options below
figure 4.22 in the software manual)
www.nex-robotics.com
41
NEX Robotics
5. LCD Interfacing
To interface LCD with the microcontroller requires 3 control signals and 8 data lines.
This is known as 8 bit interfacing mode which requires total 11 I/O lines. To save number
of I/Os required for LCD interfacing we can use 3 control signals with 4 data lines. This
is known as 4 bit interfacing mode and it requires 7 I/O lines. We are using 4 bit
interfacing mode to reduce number of I/O lines. In this mode higher nibble and lower
nibble of commands/data set needs to be sent separately. Figure 5.1 shows LCD
interfacing in 4 bit mode. The three control lines are referred to as EN, RS, and RW.
LCD PINS
VCC
GND
RS (Control line)
R/W (Control line)
EN (Control Line)
D4 to D7 (Data lines)
LED+, LED-
Description
Supply voltage (5V).
Ground
Register Select
READ /WRITE
Enable
Bidirectional Data Bus
Backlight control
www.nex-robotics.com
42
NEX Robotics
The RW line is the "Read/Write" control line and it is connected to PC1. When RW is
low (0), the information on the data bus is being written to the LCD. When RW is high
(1), the program is effectively querying (or reading from) the LCD.
The data bus is bidirectional, 4 bit wide and is connected to PC4 to PC7 of the
microcontroller. The MSB bit (DB7) of data bus is also used as a Busy flag. When the
Busy flag is 1, the LCD is in internal operation mode, and the next instruction will not be
accepted. When RS = 0 and R/W = 1, the Busy flag is output on DB7. The next
instruction must be written after ensuring that the busy flag is 0.
We are using LCD in 4-bit mode, in 4-bit mode the data is sent in nibbles with higher
nibble sent first followed by the lower nibble. Initialization of LCD in 4-bit mode is done
only after setting the LCD for 4-bit mode. LCD reset sequence include following steps.
1. Wait for about 20ms.
2. Send the first value 0x30.
3. Wait for about 10ms.
4. Send the second value 0x30.
5. Wait for about 1ms.
6. Send the third value 0x30.
7. Wait for about 1ms.
8. Send 0x20 for selecting 4-bit mode.
9. Wait for 1ms.
Before we can display any data on the LCD we need to initialize the LCD for proper
operation. The first instruction we send must tell the LCD that we will be communicating
with it using 4-bit data bus. Remember that the RS line must be low if we are sending a
command to the LCD. In the second and third instruction we clear and reset the display of
the LCD. The fourth instruction sets the display and cursor ON. In fifth instruction we
place the cursor at the start. Check the lcd_init( ) function to see how all this is put in
code.
The function lcd_reset() and lcd_init completes the initialization of LCD in 4-bit mode.
Now following steps are followed to send the command/data in 4-bit mode.
1. Mask lower 4-bits.
2. Send command/data to the LCD port.
3. Send enable signal to EN pin.
4. Mask higher 4-bits.
5. Shift bits left by 4 positions (to bring lower bits to upper bits position).
6. Send command/data to the LCD port.
7. Send enable signal to EN pin.
The function lcd_wr_command() and lcd_wr_char() are for sending the command and
data respectively to the LCD.
www.nex-robotics.com
43
NEX Robotics
For using the busy flag (polling method) the LCD is read in the similar way, i.e. nibble by
nibble, here we are not using the polling method and instead we are providing the
necessary delay between the commands.
After the initialization of LCD in 4-bit mode is complete, then for sending the data in
nibbles there is no need of providing any delay between two nibbles of same byte, the
most significant nibble (higher 4-bits) is sent first, immediately followed by the least
significant nibble (lower 4-bits).
www.nex-robotics.com
44
NEX Robotics
_delay_ms(1);
cbit(lcd_port,RS);
cbit(lcd_port,RW);
lcd_port = 0x30;
sbit(lcd_port,EN);
_delay_ms(5);
cbit(lcd_port,EN);
_delay_ms(1);
cbit(lcd_port,RS);
cbit(lcd_port,RW);
lcd_port = 0x30;
sbit(lcd_port,EN);
_delay_ms(5);
cbit(lcd_port,EN);
_delay_ms(1);
cbit(lcd_port,RS);
cbit(lcd_port,RW);
lcd_port = 0x20;
sbit(lcd_port,EN);
_delay_ms(5);
cbit(lcd_port,EN);
www.nex-robotics.com
cbit(lcd_port,EN);
cmd = cmd & 0x0F;
cmd = cmd<<4;
lcd_port &= 0x0F;
lcd_port |= cmd;
cbit(lcd_port,RS);
cbit(lcd_port,RW);
sbit(lcd_port,EN);
_delay_ms(5);
cbit(lcd_port,EN);
}
45
NEX Robotics
5.1.8 Function to print any input value up to the desired digit on LCD
// Function to print any input value up to the
desired digit on LCD
void lcd_print (char row, char coloumn, unsigned
int value, int digits)
{
unsigned char flag=0;
if(row==0||coloumn==0)
{
www.nex-robotics.com
lcd_home();
}
else
{
lcd_cursor(row,coloumn);
}
if(digits==5 || flag==1)
{
46
NEX Robotics
million=value/10000+48;
lcd_wr_char(million);
flag=1;
}
if(digits==4 || flag==1)
{
temp = value/1000;
thousand = temp%10 + 48;
lcd_wr_char(thousand);
flag=1;
}
if(digits==3 || flag==1)
{
temp = value/100;
hundred = temp%10 + 48;
lcd_wr_char(hundred);
flag=1;
}
www.nex-robotics.com
47
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
48
7
ADEN
R/W
0
6
ADSC
R/W
0
5
ADATE
R/W
0
4
ADIF
R/W
0
3
ADIE
R/W
0
2
ADPS2
R/W
0
1
ADPS1
R/W
0
0
ADPS0
R/W
0
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
49
ADPS2
0
0
0
0
1
1
1
1
ADPS1
0
0
1
1
0
0
1
1
ADPS0
0
1
0
1
0
1
0
1
Division Factor
2
2
4
8
16
32
64
128
7
REFS1
R/W
0
6
REFS0
R/W
0
5
ADLAR
R/W
0
4
MUX4
R/W
0
3
MUX3
R/W
0
2
MUX2
R/W
0
1
MUX1
R/W
0
0
MUX0
R/W
0
REFS0
0
1
0
1
ADC pin
000000
PA0/ADC0
000001
PA1/ADC1
000010
PA2/ADC2
Pin function
ADC input for Left IR proximity analog sensor
(or Left Ultrasonic Range Sensor)
ADC input for Centre IR proximity analog sensor
(or Centre Ultrasonic Range Sensor)
ADC input for Right IR proximity analog sensor
(or Right Ultrasonic Range Sensor)
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
Pin status
Input (Floating)
Input (Floating)
Input (Floating)
50
PA3/ADC3
PA4/ADC4
PA5(ADC5)
PA6/(ADC6)
PA7(ADC7)
Input (Floating)
Input (Floating)
Input (Floating)
Input (Floating)
Input (Floating)
7
ACD
R/W
0
6
ACBG
R/W
0
5
ACO
R
0
4
ACI
R/W
0
3
ACIE
R/W
0
2
ACIC
R/W
0
1
ACIS1
R/W
0
0
ACIS0
R/W
0
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
51
comparator trigger the Timer/Counter1 Input Capture interrupt, the ICIE1 bit in the Timer
Interrupt Mask Register (TIMSK1) must be set.
Bits 1, 0 ACIS1, ACIS0: Analog Comparator Interrupt Mode Select
These bits determine which comparator events that trigger the Analog Comparator interrupt. The
different settings are shown in Table 6.4.
ACIS1
0
0
1
1
ACIS0
0
1
0
1
Interrupt mode
Comparator Interrupt on Output Toggle
Reserved
Comparator Interrupt on Falling Output Edge
Comparator Interrupt on Rising Output Edge
0
R
15
0
R
14
0
R
13
0
R
12
0
R
11
0
R
10
ADC2
2
R
0
0
R
9
ADC9
ADC1
1
R
0
0
R
8
ADC8
ADC0
0
R
0
ADC7
7
R
0
ADC6
6
R
0
ADC5
5
R
0
ADC4
4
R
0
ADC3
3
R
0
0
R
13
ADC7
0
R
12
ADC6
0
R
11
ADC5
0
R
10
ADC4
0
R
9
ADC3
0
R
8
ADC2
5
R
0
4
R
0
3
R
0
2
R
0
1
R
0
0
R
0
0
R
15
ADC9
ADC1
7
R
0
0
R
14
ADC8
ADC0
6
R
0
When an ADC conversion is complete, the result is found in these two registers. If differential
channels are used, the result is presented in twos complement form. When ADCL is read, the
ADC Data Register is not updated until ADCH is read. Consequently, if the result is left adjusted
and no more than 8-bit precision (7 bit + sign bit for differential input channels) is required, it is
sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH. The ADLAR bit in
ADMUX and the MUXn bits in ADMUX affect the way the result is read from the registers. If
ADLAR is set, the result is left adjusted. If ADLAR is cleared (default), the result is right
adjusted.
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
52
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
53
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
54
7. Serial Communication
Serial Communication using USART
The SPARK V can communicate with other robots / devices serially using either wired link or
wireless module. Serial communication is done in asynchronous mode. In the asynchronous
mode, the common clock signal is not required at both the transmitter and receiver for data
synchronization.
SPARKV Robot Support following two mode of serial communication
1. USB Communication using onboard FT232 USB to serial converter.
2. ZigBee Wireless Communication with ZigBee wireless module is installed on ZigBee
holders.
ATMEGA16 have single USART port available for serial communication. Serial port of the
ATMEGA16 can be switched between USB port and Xbee wireless module using jumper setting
connector J5. Please refer the chapter 8 in Hardware manual for more details about USB/ ZigBee
communication interfacing and connection details.
7
RXC
R
0
6
TXC
R/W
0
5
UDRE
R
0
4
FE
R
0
3
DOR
R
0
2
UPE
R
0
1
U2X
R/W
0
0
MPCM
R/W
0
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
55
Register Empty interrupt (see description of the UDRIE bit). UDRE is set after a reset to indicate
that the Transmitter is ready.
Bit 4 FE: Frame Error
This bit is set if the next character in the receive buffer had a Frame Error when received. I.E.,
when the first stop bit of the next character in the receive buffer is zero. This bit is valid until the
receive buffer (UDR) is read. The FE bit is zero when the stop bit of received data is one.
Always set this bit to zero when writing to UCSRA.
Bit 3 DOR: Data OverRun
This bit is set if a Data OverRun condition is detected. A Data OverRun occurs when the receive
buffer is full (two characters), it is a new character waiting in the Receive Shift Register, and a
new start bit is detected. This bit is valid until the receive buffer (UDR) is read. Always set this
bit to zero when writing to UCSRA.
Bit 2 UPE: USART Parity Error
This bit is set if the next character in the receive buffer had a Parity Error when received and the
Parity Checking was enabled at that point (UPM1 = 1). This bit is valid until the receive buffer
(UDR) is read. Always set this bit to zero when writing to UCSRA.
Bit 1 U2X: Double the USART Transmission Speed
This bit only has effect for the asynchronous operation. Write this bit to zero when using
synchronous operation. Writing this bit to one will reduce the divisor of the baud rate divider
from 16 to 8 effectively doubling the transfer rate for asynchronous communication.
Bit 0 MPCM: Multi-processor Communication Mode
This bit enables the Multi-processor Communication mode. When the MPCM bit is written to
one, all the incoming frames received by the USART Receiver that do not contain address
information will be ignored. The Transmitter is unaffected by the MPCM setting. For more
detailed information see Multi-processor Communication Mode on page 154 of the
ATMEGA16 datasheet.
7.1.2 UCSRB USART Control and Status Register B
Bit
Read / Write
Initial Value
7
RXCIE
R/W
0
6
TXCIE
R/W
0
5
UDRIE
R/W
0
4
RXEN
R/W
0
3
TXEN
R/W
0
2
UCSZ2
R/W
0
1
RXB8
R
0
0
TXB8
R/W
0
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
56
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
57
7
URSEL
R/W
0
6
UMSEL
R/W
0
5
UPM1
R/W
0
4
UPM0
R/W
0
3
USBS
R/W
0
2
UCSZ1
R/W
0
1
UCSZ0
R/W
0
0
UCP0L
R/W
0
The UCSRC Register shares the same I/O location as the UBRRH Register. See the Accessing
UBRRH/ UCSRC Register on page 155 in Atmega16 datasheet which describes how to access
this register.
Bits 7 URSEL: Register Select
These bits selects between the UCSRC or UBRRH Registers. It is read as one when Reading
UCSRC. The URSEL must be one when writing to UCSRC.
Bits 6 UMSEL: USART Mode Select
These bits select the mode of operation of the USART as shown in Table 7.1.
UMSEL
0
1
Mode
Asynchronous USART
Synchronous USART
UPM0
0
1
0
1
Parity mode
Disabled
Reserved
Enabled, Even Parity
Enabled, Odd Parity
Stop Bit(s)
1-bit
2-bit
UCSZ1
0
0
1
1
UCSZ0
0
1
0
1
Character size
5-bit
6-bit
7-bit
8-bit
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
58
0
0
1
1
0
1
0
1
Reserved
Reserved
Reserved
9-bit
0
1
0
R
15
UBRR7
7
R/W
0
0
R
14
UBRR6
6
R/W
0
0
R
13
UBRR5
5
R/W
0
0
R
12
UBRR4
4
R/W
0
0
R/W
11
UBRR11
UBRR3
3
R/W
0
0
R/W
10
UBRR10
UBRR2
2
R/W
0
0
R/W
9
UBRR9
UBRR1
1
R/W
0
0
R/W
8
UBRR8
UBRR0
0
R/W
0
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
59
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
60
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
61
NEX Robotics Pvt. Ltd. and ERTS Lab IIT Bombay, INDIA
62