iRobot COMMAND MODULE User manual

iRobot®Command Module
OWNERS MANUAL
www.irobot.com

2
iRobot Command Module Owner’s Manual
Important Safety Instructions
GENERAL SAFETY INSTRUCTIONS
• Read all safety and operating instructions before
operating iRobot Command Module.
• Retain the safety and operating instructions for
future reference.
• Follow all operating and use instructions.
• Refer all non-routine servicing to iRobot.
COMMAND MODULE USE RESTRICTIONS
• The Command Module is for indoor use only.
• Do not sit or stand on this device.
• Keep the switch in the off position, otherwise the Create
robot battery will drain when iRobot Command Module
is on.
• Do not pour or spray water onto iRobot Command Module.
• Do not expose iRobot Command Module to
anything hazardous, or anything that is burning
or smoking.
• iRobot Create has built-in safety sensors to keep it
from falling down stairs and bumping hard into walls.
iRobot is not responsible for any product issues that
may arise if you disable those sensors using the
Command Module.
• Never handle the Command Module with wet hands.
• Only experienced users should attempt to design
and build their own circuitr y.
ePort SAFETY INSTRUCTIONS
The maximum voltage available on the ePort is 21V, so
the ePort pins will not shock you if they contact your skin.
However, the ePort can supply over 20 watts of electrical
power. In the event of an electrical fault, this can generate
enough heat to burn you or star t a fire in the event of an
electrical fault. Only experienced users should attempt to
design and build their own circuitr y.Prebuilt ePort modules
are available from a supplier listed in the Appendix A and
are suitable for users who lack the experience to design
their own circuitr y.
• Always use care when wiring custom circuitry to an ePort.
• Never run your iRobot Create unattended.
• Always fully test your new designs under close supervision.
• Always remove the batter y from Create or remove the
ePort add-on circuitry from Create before handling it.
• Never touch the circuitry with the power turned on.
• Enclose your add-on circuitry so it is not inadvertently
shorted during operation.
• The Vcc and Vpwr supplies are protected by a
self-resetting fuse within Create. If you exceed the
current ratings, power Create off for 30 seconds
to reset the fuse.

3
iRobot Command Module Owner’s Manual
Introduction ...........................................................................................5
1.1 Anatomy.........................................................................................5
1.2 Over view ........................................................................................5
1.3 Example applications ......................................................................5
2. Getting Started ..................................................................................6
2.1 Plugging in the Command Module ....................................................6
2.2 Running the preinstalled “drive” demo program ................................6
2.3 Installing the development tools ......................................................7
2.4 Installing the USB serial port ...........................................................8
3. Your First Project ...............................................................................10
3.1 Developing for the Command Module ...............................................10
3.2 Setting up a new project..................................................................10
3.3 Compiling your project.....................................................................11
3.4 Downloading your project over the USB link ......................................12
3.5 Testing the “input” example program................................................13
3.6 Creating your own project ................................................................14
4. Software Reference ............................................................................15
4.1 Declaring and using variables and registers on the ATMega168 .........15
4.2 I/O Pin Basics ................................................................................15
4.3 The Command Module’s connectors ................................................15
4.4 The Digital I/O control registers .......................................................16
4.5 DDRx: Setting the direction of a pin..................................................16
4.6 PORTx: Setting pullups on an input pin .............................................16
4.7 PORTx: Setting the state of an output pin .........................................16
4.8 PINx: Reading the state of an input or output pin ..............................16
4.9 Using bitwise operators to selectively change bit values ....................17
Table of Contents

4
iRobot Command Module Owner’s Manual
4.10 Command Module Internal Pins .....................................................17
4.11 Adding a button and LED to the input example program ...................18
4.12 Taking an analog measurement using the ADC................................18
4.13 Using an analog measurement in the light example program............19
4.14 Using a timer................................................................................20
4.15 Debouncing a Button Input ............................................................21
4.16 Setting up and using the serial port ...............................................22
4.17 Using the USB Port for Serial Debugging ........................................23
4.18 Powering Create ...........................................................................23
4.19 Putting the Command Module to Sleep...........................................24
5. Open Interface Reference ...................................................................25
5.1 Starting the Open Interface .............................................................25
5.2 Changing the baud rate ...................................................................25
5.3 Controlling Create’s LEDs................................................................26
5.4 Composing and playing songs..........................................................26
5.5 Moving Create ................................................................................27
5.6 Controlling Create’s low-side power drivers .......................................27
5.7 Sending an Infrared Character .........................................................28
5.8 Reading Create’s sensors ...............................................................28
6.Microcontroller reference.....................................................................29
7. Bootloader reference ..........................................................................30
8. Hardware reference ............................................................................31
8.1 ePort Pinouts .................................................................................31
8.2 ePort I/O connections.....................................................................31
8.3 ePort connection types and interfacing.............................................32
8.4 ePort electrical specifications ..........................................................33
8.5 ePort safety and cautions................................................................33
8.6 Component Suppliers......................................................................34

5
iRobot Command Module Owner’s Manual
1Introduction
1.1 Anatomy LED 1
LED 2
Top Left ePort USB Indicator
USB
Hold Down Screws
Soft Button
Reset
Top Center ePort
Power LED
Power Switch
Cargo Bay ePort Top Right ePort
iRobot Create Connector
(under the Command Module)
1.2 Overview
The iRobot Command Module works with iRobot Create,
giving you a way to write your own programs in C or C++
to control Create and to add custom hardware to expand
Create’s capabilities without tethering the robot to a PC.
The Command Module plugs into Create’s Cargo Bay
Connector, and it has four expansion ports that provide
additional inputs and outputs for your custom hardware.
Three of the connectors are on the top surface, spaced
to provide easy attachment points for an array of sensors,
and one connector is on the back for easy access from the
cargo bay.
The Command Module is powered by an Atmel AVR
ATMega168 microcontroller which can be reprogrammed
by downloading programs from your Windows XP computer
with the included USB cable. Your programs can use the
iRobot Open Interface serial protocol to control Create’s
motors, lights, and speaker, and read its sensors. At the
same time, the microcontroller can directly interface with
your own custom hardware through its I/O connections.
Start with one of the example programs and expand and
change it to add your own functionality. Updates and more
information are available at www.irobot.com/create.
This manual assumes intermediate knowledge of the C or
C++ programming languages, including bitwise operators.
If you don’t know either of these languages, pick up a book
on C from a library or bookstore. You can also find a lot of
good reference materials and tutorials online by searching
for “C language” in an internet search engine.
The manual also assumes a basic familiarity with
microcontrollers, including I/O pins, registers, and
interrupts, as well as experience with compilers and
interactive development environments (IDEs).
For more information on how to use the Command Module’s
software capabilities, please see the Software Reference
chapter and the Open Interface reference guide found at
www.irobot.com/create.
1.3 Example applications
Whether you are a hacker, educator, or robotics hobbyist,
the Command Module opens many exciting possibilities.
The applications are limited only by your imagination:
• Teach robotics and programming at high schools or
universities. iRobot Create is a robust, affordable
robotic platform that enables students to each have
their own robot.
• Add new sensors and carry out your own robotics
experiments.
• Create a low-cost swarm of robots to investigate
collective behavior.
• Have fun with robot “art” exhibits, song and dances or
other entertaining behaviors.
• Add a camera and internet connection to create a low
cost sentry robot.

6
iRobot Command Module Owner’s Manual
2.1 Plugging in the iRobot Command Module
Turn off Create.
Plug the Command Module into the Create’s Cargo Bay
Connector as shown in Figure 1. Make sure it is firmly
seated.
Command
Module
Cargo Bay
Connector
iRobot Create
Create Figure 1 Inserting the Command Module into Create connector
Tighten the two hold-down screws on either end of the
Command Module with a Phillips head screwdriver, as
shown in Figure 2.
Command Module
Hold-Down Screws
Command Module
iRobot Create
Philips-head
Screwdriver
Create Figure 2 Securing the Command Module with the hold-down screws
2.2 Running the preinstalled “drive” demo program
The Command Module comes pre-installed with a demo
program to let you know that everything is working.
Turn on Create and wait two seconds until Create’s Power
LED stops flashing, which indicates that Create is now
running its main code.
Press the “reset” button on the Command Module and
listen for a series of fast beeps. The LEDs on the Command
Module and Create will blink slowly.
Place Create on the ground and press the black “soft”
button on the Command Module. The robot will play
another song and then start driving around and flashing
its LEDs in sequence, beeping and turning when it bumps
into something. To stop the robot, press the “soft” button
again or pick the robot up.
Troubleshooting:
• After turning on Create, always wait until Create’s Power
LED stops flashing rapidly before starting a Command
Module program.
• Make sure the Command Module is securely seated.
• Make sure that your iRobot Create has a full set of
charged batteries (see Create documentation for more
information on batteries).
• Disconnect the USB cable from the Command Module.
• Ensure that Create’s serial cable is not connected to its
Mini-DIN connector.
2Getting Started

7
iRobot Command Module Owner’s Manual
2.3 Installing the development tools
The development tools provided on the included CD-ROM
allow you to create your own Command Module programs.
The Command Module uses the WinAVR set of open-source
development tools to let you write your own programs in
the C or C++ languages. The development tools include
an editor, compiler, and a downloader for loading your
program onto the Command Module. For more information
on WinAVR, please check the project website at
http://winavr.sourceforge.net
To install WinAVR on your Windows XP computer, perform the
steps below. If you have a previous version of WinAVR installed
on your computer, please uninstall it before proceeding.
NOTE: WinAVR places its access paths at the front
of Window’s PATH environment variable. This can cause
conflicts with application that use executables or dlls
that are also in WinAVR (e.g. make.exe; tclsh84.dll).To
fix this, after installing, move WinAVR’s paths to the end
of the PATH environment variable. Open Settings>Control
Panel>System, click on Advanced, click on Environment
Variables, Select Path under System Variables, click on
Edit, move C:\WinAVR\utils\bin and C:\WinAVR\bin
to the end of the list (after a semicolon), and click OK
3 times. On one occasion, installing WinAVR wiped out
the installer’s entire path. For safety, copy the value of
your path variable to a spare text file in case you need to
restore it later.
1. Insert the Command Module product CD into your
computer. Start the WinAVR installation program
(WinAVR-20060421-install.exe) by double-clicking on it.
2. Select your language.
3. Click through the rest of the install screens, accepting
the defaults.
4. The last screen says that WinAVR has been installed
on your computer. The installation is now complete.
Click Finish.

8
iRobot Command Module Owner’s Manual
2.4 Installing the USB serial port
To install the drivers for the USB serial port, connect your
Command Module to your PC using the provided USB cable
as shown in Figure 3.
Create Figure 3 Connecting the Command Module to your computer’s USB port
The Command Module should be automatically detected
and the New Hardware Wizard window will pop up.
Select Yes to allow Windows to connect to Windows Update
to find the driver.
Select the Install the software automatically option
It should install the driver and return without errors saying
that the hardware is installed and ready to use.
If the wizard says that it is unable to find the software,
quit the wizard and open the Command Module product
CD. Install the drivers manually by double-clicking on
CDM_Setup_32.exe (if you have 32-bit Windows XP) or
CDM_Setup_64.exe (if you have 64-bit Windows XP).
USB Port on PC
Included USB Cable
USB Port on
Command Module Command Module
iRobot Create

9
iRobot Command Module Owner’s Manual
The New Hardware Wizard window will then pop up a
second time, showing that it has found a USB Serial Port.
Repeat the above procedure, again selecting the Install the
software automatically option. Once the driver installation
has completed, click the Finish button and proceed to the
next step.
Next, find the COM port number which was assigned to
the Command Module.
On your PC, go to Start->Settings->Control Panel->System.
Go to the Hardware tab and click the Device Manager
button.
Scroll down and expand the Ports (COM & LPT) category by
clicking on the + sign.
Double click on the USB Serial Port line to launch the
properties window.
Select the Port Settings tab and then click on the
Advanced button.
Change the COM Port Number to COM9 or another unused
port between COM1 and COM9 using the pull-down menu.
Using a high port number will reduce the chances that the
port setting will interfere with other hardware that you may
install on your computer in the future. All of the example
programs assume that you are using COM9. If you use a
COM port other than COM9, you will need to update the
example program’s makefile before you download to the
Command Module. The installation is now complete.

10
iRobot Command Module Owner’s Manual
3Your First Project
The example programs are a good place to start using the
Command Module. The program that came preprogrammed
on your Command Module is called drive and its source
code is in the “Sample Projects” directory on the Command
Module Product CD. This chapter will guide you through
compiling and downloading one of the other example programs
named input, and will then give you directions for creating
your own project. The input example program is designed
to demonstrate how to use all of the Command Module’s
input and output capabilities using buttons and LEDs.
3.1 Developing for the Command Module
The Command Module is built around an Atmel AVR
ATMega168 microcontroller. All of the programs that you
write and load onto the Command Module are run on this 8-bit
processor. For more information on the microcontroller,
please see the microcontroller reference section in chapter
7 and the microcontroller spec sheet on the Product CD.
The Command Module uses the WinAVR suite of open
source development tools to compile and download your
C or C++ programs. The WinAVR tools include the GNU
GCC compiler, avrdude downloader, and the Programmers
Notepad IDE.
The WinAVR installer installs a lot of useful documentation
in the C:\WinAVR\doc directory. In the avr-libc sub-directory
you’ll find the avr-libc user’s manual, which has information
on many functions designed for AVR microcontrollers which
you can use in your programs. Another good resource for
developing with AVR microcontrollers and using WinAVR in
particular is the avrfreaks website at http://www.avr freaks.
net. One of the best sources of information on the website
is the forum, where you can find answers to most of your
development questions. Be sure to search the forum
before posting your own question because most common
questions have already been answered already.
3.2 Setting up a new project
In this example, you will set up a new project for the input
example program. The steps are similar for any new project
you create.
1. Get the source files. Make a new directory on your
computer and name it “input.” Copy the files input.c,
oi.h, and makefile from the examples/input directory
on the Command Module CD to this directory. The file
input.c is the main C source code file, oi.h is the Open
Interface header file, and makefile contains instructions
for Programmers Notepad on how to compile and
download the project.
2. Start Programmers Notepad using the desktop shortcut.
If you don’t have the shortcut, find Programmers Notepad
directly at C:\WinAVR\pn\pn.exe (if you used the
default installation directory)
3. Create a new project. In Programmers Notepad, go to
File->New and click on Project.

11
iRobot Command Module Owner’s Manual
4. Click on the … button to select the project directory
where you saved the project code (in step 1). Fill in a
name for your new project (such as “input”), and click
the OK button.
5. Addfilestoyourproject. Yournewprojectshouldnowshow
up in the upper left-hand window of Programmers Notepad.
Right click on the name of the project under New Project
Group and select the Add Files option.
In the dialog box that opens, find your “input” project
directory, select the file input.c, and click the Open
button to add it to your project. The file you just added
will now show up beneath the project name.
Repeat these steps to also add oi.h and makefile to
your project.
3.3 Compiling your project
In Programmers Notepad, double-click on one of the source
files that you added to open it.
Click on Tools->[WinAVR] Make All. Text will appear in
the output window at the bottom of Programmers Notepad
showing the results of your compilation.
This output window will also list any errors and the line
numbers where they occur in your files. You should not get
any errors with the provided example programs, but errors
may occur as you develop your own code. If there are any
errors, fix them and compile again.
You can edit your text files in Programmers Notepad (see
the File menu), or you can use any other text editor to
change your files and just use Programmers Notepad to
compile and download your projects.

12
iRobot Command Module Owner’s Manual
When your compilation is successful, the size of your
compiled file in bytes will be listed toward the bottom of
output window on the line labeled .text (outlined in the
picture above - your statistics may be slightly different). The
maximum size program that fits in the Command Module’s
flash memory is 14336 bytes (7168 words). The top 1024
words of the flash memory are taken up by the bootloader
and can’t be used.
When your compilation is successful, it creates a hex file
(input.hex in this case) in your project directory that you
can load into the Command Module.
Sometimes, when developing your own code, the compilation
may not work even though you think it should. To make
sure that no intermediate files generated by the compiler
are causing a problem, click on Tools->[WinAVR] Make
Clean, and then try compiling again.
3.4 Downloading your project over the USB link
The next step is to download your compiled hex file into the
Command Module. Before downloading, check that:
• The Command Module is turned on.
• You have pressed RESET on the Command Module to
force it to run its bootloader.
• There is a full set of charged batteries in Create.
• Create is turned on and its Power LED has stopped
flashing.
• Create’s serial cable is not plugged in.
• The Command Module is securely seated on Create
cargo bay connector.
• The Command Module is connected to your computer
with the supplied USB cable and you have installed the
USB serial port drivers as described in 2.4.
• The COM port of your Command Module matches the
COM port listed in the makefile. The example programs
assume you are using COM9. If you installed your
Command Module on a different port number, update
your makefile. Open the makefile in a text editor and
search for where the variable AVRDUDE_PORT is set (on
line 204 in the input project makefile). Change the value
from COM9 to your desired port number, for example:
AVRDUDE_PORT = com4 # programmer connected to
serial device
TIP: If avrdude says “cannot find the file specified”, check
that you have the correct COM number, and check all
connections.
TIP: If avrdude says “not in sync: resp=0x00”, press reset
before downloading.
Always press Reset on the Command Module before
downloading.

13
iRobot Command Module Owner’s Manual
Press the RESET button on the Command Module with the
USB cable attached to start the bootloader.
In Programmers Notepad click on Tools-> [WinAVR] Program.
This starts the downloading program “avrdude”. It
communicates with the Command Module’s bootloader to
erase the Command Module’s flash memory and then write
in your new program. This process can take up to a couple
of minutes for a large program.
Avrdude outputs its status in the debug window as it erases
the memory and then writes and verifies your new program.
On successful completion, you will see text similar to
the following toward the bottom of the text in the debug
window:
avrdude: verifying ...
avrdude: 2118 bytes of ash veried
avrdude done. Thank you.
If it doesn’t successfully program, and you get an error
message similar to the ones listed below, follow the
suggestions that follow to fix the problem and try again.
avrdude -p ATMega168 -P com9 -c stk500
-U ash:w:input.hex
avrdude: ser_open(): can’t open device “com9”:
The system cannot nd the le specied.
• Make sure Create has a full set of charged batteries.
• Make sure that the Command Module is securely seated
in Create.
• Make sure that the USB cable is firmly plugged into both
the Command Module and your computer.
• Make sure that the COM number of the Command Module
matches the com number listed in your makefile.
• Make sure that you installed the USB serial port for your
Command Module as described in chapter 2.
• Make sure that no other device is using the COM number
in the makefile.
avrdude -p ATMega168 -P com9 -c stk500
-U ash:w:input.hex
avrdude: stk500_getsync(): not in sync: resp=0x00
• Make sure Create has a full set of charged batteries.
• Make sure that the Command Module is securely seated
in Create.
• Make sure that the USB cable is firmly plugged into both
the Command Module and your computer.
• Press the reset button on the Command Module, being
sure not to press the soft button at the same time.
avrdude -p ATMega168 -P com9 -c stk500
-U ash:w:input.hex
…but then nothing happens.
• Make sure that the USB cable is firmly plugged into both
the Command Module and your computer.
• Press the reset button on the Command Module, being
sure not to press the soft button at the same time.
3.5 Testing the “input” example program
Remove the USB cable from the Command Module. Make
sure Create’s serial cable is not plugged in. Press the
red Reset Button on the Command Module to start your
program.
When the input program starts, two LEDs should flash
slowly, one on the Command Module and one on Create
itself.
Press the Play button on Create. It will play a song and light
the Advance LED on Create solid while the song is playing.
Press the soft button on the Command Module. Create
plays a different song and the LED on the Command Module
stays lit while it’s playing.
There are three different input/output methods you can use
in your programs, two of which you’ve just seen. First, you
can read the state of Create’s buttons and other sensors
and set the state of its LEDs and motors using the Open
Interface serial protocol. Next, you can interact with the
Command Module’s built-in hardware by reading the state
of the soft button or controlling LED 1 and LED 2 on the
Command Module. Finally, you can add your own hardware
for input and output. The next chapter will walk you through
adding another button and LED to one of the Command
Module’s input/output (I/O) ports and interacting with
them with the input program.
A note on starting programs. Normally, if the USB cable
is inserted in the Command Module when you press the
reset button, the Command Module runs its bootloader
and does not start your program. To run your program
without first removing the USB cable, press and hold down
the programmable button on the Command Module as you
press the reset button.
TIP: To run your program with the USB cable attached,
hold down the soft button while pressing the reset button.

14
iRobot Command Module Owner’s Manual
3.6 Creating your own project
The easiest way to start a project is to copy one of the
example programs and modify it for your own application.
For instance, the framework for sending commands and
reading sensors provided by the drive example can be
useful for most applications. To create your own project
based on the drive example, perform the following steps:
1. Copy drive.c, oi.h, and makefile from the drive example
directory over to your new project directory.
2. In the new directory, rename drive.c to the desired name
for your new program, such as myapp.c
3. Edit the makefile to reflect the new name of your
application. Specifically, you need to change the value
of TARGET to the name of your new application. On line
59 of the drive makefile, you’ll see the line:
TARGET = drive
Change this to the new name of your application.
For instance:
TARGET = myapp
Next, change the behavior of the program to suit your new
application by changing the C code. In drive.c, the behavior
of Create is defined in the main function. Refer to chapters
5 and 6 for examples of the different functionality that you
can add. When you’re ready with your code, repeat all of
the steps in this chapter to set up a project and to compile,
download, and test your program.
3.6.0 The example programs
By looking at the source code of the example programs,
you can get a sense for the kind of code you can write for
the Command Module. Below is a brief description of the
three example programs.
3.6.1 Drive
The drive example program comes preprogrammed into the
Command Module. It demonstrates the basic capabilities
of the Command Module and the iRobot Create Open
Interface by driving around, reacting to sensors, and
using various inputs and outputs. It makes a series of
rising beeps when it is first powered to let you know the
Command Module is alive and blinks Create’s LEDs (note
that the program makes Create’s power LED orange). Then,
if you place Create on the floor and press the Command
Module’s soft button it starts driving on the floor, backing
up and turning when it runs into something with its bumper,
and blinking all LEDs in a pattern. To stop the program,
press the button again or simply pick it up.
The code provides useful function to initialize the Command
Module and iRobot Create, continuously read Create’s
sensor values, drive Create, turn on Create, and change the
baud rate. You can add capabilities to the main function of
the program using the software examples in chapter 5.
3.6.2 Input
The input example program illustrates the three types
of input and output that you can use with the Command
Module. You can interact with hardware on iRobot Create
through the Open Interface, use the built-in Command
Module hardware, and add your own hardware to the
Command Module’s connectors.
This simple program flashes three LEDs, one on each type
of output, and waits for button presses on each type of
input. If it gets a button press, it lights the associated LED
and plays a song.
Add your own button and LED, as described in chapter 4,
and try using all three types of input and output.
3.6.3 Light
The light example program demonstrates a possible
application for the Command Module and iRobot Create. It
searches your house for lights which are left on and plays
an alarm when it finds a light so that you can turn it off. The
program has all of Create’s and Command Module’s LEDs
turned on (note that Create’s power LED will be orange) so
that it’s easy to find in the dark.
Start it up in a relatively dark room by pressing the soft
button. It will sample the light level when it starts and will
set off its alarm when it detects a significantly brighter
room.
To detect the light level, the program uses a CDS light
sensor which you need to add to the Command Module’s
top center ePort, as described in section 4.12. It measures
the light level from the sensor using one of the Command
Module’s analog input pins.

15
iRobot Command Module Owner’s Manual
4Software Reference
This chapter gives code examples and explanations of how
to control some of the Command Module’s hardware. For
full details on the ATMega168’s registers and features,
please see the ATMeta168 datasheet, included on the
product CD.
4.1 Declaring and using variables and registers on
the ATMega168
The processor in the Command Module is an Atmel
ATMega168 8-bit microcontroller. All of the operations
on the processor are carried out with 8-bit registers (as
opposed to the 32-bit registers in most home computers).
For efficiency, use 8-bit variables and calculations wherever
possible, only using 16-bit variables wherever their greater
range is really necessary.
Do not use floating point numbers or division in your
Command Module code. The ATMega168 doesn’t have
hardware to handle floating point numbers or divide
operations. If you use these, your compiled code gets big
very fast. Instead, use integers, and use right shifts (>>)
instead of divides.
The example programs use explicit type notation so that
you can easily tell the size of a variable. This notation is
recommended for all of your own code. The example code
declares variables with the following types:
uint8_t variable_a; /* unsigned 8-bit variable */
int8_t variable_b; /* signed 8-bit variable */
uint16_t variable_c; /* unsigned 16-bit variable */
int16_t variable_d; /* signed 16-bit variable */
To use these variable types, include the stdlib.h file at the
beginning of your program:
#include <stdlib.h>
The microcontroller’s built-in registers (e.g. DDRB, PORTC,
PIND referenced below) are all declared in header files
which are installed with WinAVR. Include the following line
at the beginning of your program:
#include <avr/io.h>
This header also declares the bit value for all named bits in
the ATMega168 datasheet. So, you can use lines like the
following in your code:
UCSR0B |= (1 << RXEN0); /* Set the RXEN0 bit in
UCSR0B */
To make it even more convenient, you can use the bit value
macro _BV as shown below:
UCSR0B |= _BV(RXEN0);
4.2 I/O Pin Basics
The Command Module gives you direct access to the
Atmel ATMega168 microcontroller’s input/output (I/O)
pins, so you can add any control signals, sensor drivers, or
communication protocols necessary to interface with your
external hardware.
The following sections explain how to use the I/O pins and
then gives an example of adding an extra button and LED to
the input example program. Another section explains how
to use an analog input to measure the voltage of a light
sensor using the light example program.
The Command Module provides digital input and output
pins, as well as analog input pins. The Command Module
uses 5V logic and a 5V reference for the analog inputs.
Full technical details on the Command Module’s Atmel
ATMega168’s I/O pins and registers can be found in the
microprocessor reference manual, included on the CD.
4.3 The Command Module’s connectors
The microcontroller’s I/O pins are connected to the
Command Module’s four ePorts. There are three ports on
the top and one on the side facing the cargo bay. The top
three connectors are positioned so that you can attach
sensors on the right, left, and center and compare their
values to steer the robot.
TIP: If you attach a light sensor to the analog input of
each top connector, you can program iRobot Create to
follow a flashlight by turning toward the sensor that
receives the most light.
The Cargo Bay ePort has extra I/O lines for Create’s Low
Side Drivers, which you can use to run motors without
any additional hardware. For a complete list of all of the
Command Module’s I/O and connectors, refer to the
Hardware reference section in chapter 9.
Some of the I/O pins are connected to the Create CargoBay
Connector, located on the underside of the Command
Module.

16
iRobot Command Module Owner’s Manual
4.4 The Digital I/O control registers
The Command Module’s ATMega168 microcontroller has
three I/O ports, labeled B, C, and D. Each of these ports
contains 8 pins, numbered 0 to 7. The Command Module’s
ePorts expose pins B 0-3 and C 0-5. See the Hardware
Reference in chapter 8 for a table of which microcontroller
pins are connected to which ePort pins.
The digital I/O pins on each port are controlled and
accessed by three built-in registers per port. You need to
set the value of some of these registers before using the
I/O pins. The registers are predefined as 8-bit variables in
the <avr/io.h> header file which is installed with WINAVR.
The I/O registers are summarized in the table below and
more information on setting their values is included in the
sections that follow.
DDRB Port B direction register. Bit values: 0 = input, 1 = output.
DDRC Port C direction register. Bit values: 0 = input, 1 = output.
DDRD Port D direction register. Bit values: 0 = input, 1 = output.
PORTB Port B data register. Output bit values: 0 = low, 1 = high.
Input bit values: 0 = pull-up disabled, 1 = pull-up enabled.
PORTC Port C data register. Output bit values: 0 = low, 1 = high.
Input bit values: 0 = pull-up disabled, 1 = pull-up enabled.
PORTD Port D data register. Output bit values: 0 = low, 1 = high.
Input bit values: 0 = pull-up disabled, 1 = pull-up enabled.
PINB Port B input register. Bit values: 0 = pin is low,
1 = pin is high.
PINC Port C input register. Bit values: 0 = pin is low,
1 = pin is high.
PIND
Port D input register. Bit values: 0 = pin is low,
1 = pin is high.
4.5 DDRx: Setting the direction of a pin
Register: DDRx
0 = input
1 = output
The DDRx registers (substitute B, C, or D for the x) control
the direction of the eight pins in a port. If the bit associated
with the pin is set to a 0, then that pin is an input (for
example, a sensor or button); if it’s a 1, then it’s an output
(for example, a motor or LED). These registers must be set
before using the PORTx and PINx registers.
Example: Set pins C0 – C2 as inputs and C3 – C7 as outputs:
DDRC = 0xF8;
The hexadecimal (hex) value 0xF8 = 11111000 in binary,
so the most significant 5 pins (C3 – C7) become outputs.
4.6 PORTx: Setting pullups on an input pin
Register: PORTx
0 = pull-up disabled
1 = pull-up enabled
DDRD = 0x01; // enable pull-up on pin B0 only
For an input pin, a bit value of 1 in the PORTx register
enables a pull-up on that pin; a bit value of 0 disables the
pull-up. If the pin is an input with the pull-up enabled, it is
guaranteed to be in the high state if it is not being driven
low by external hardware. If the pull-up is not enabled
on an input pin and it is not being driven, then the pin is
considered to be floating and you can’t depend on it being
in a specific state.
4.7 PORTx: Setting the state of an output pin
Register: PORTx
0 = low (0 volts)
1 = high (5 volts)
DDRB = 0x10; // set pin B4 (already an output)
to high
The PORTx register sets the state of an output pin, either
high or low. If the pin’s bit is set as a 0, then that pin will be
low (0 volts); if it’s a 0, then it will be high (5 volts).
Note that when a pin is an output, the PORTx register
specifies its state, but when it is an input, the PORTx
register specifies whether its pull-up in enabled.
To change the state of one pin at a time while leaving
the other states undisturbed, use C’s bitwise operators.
Section 4.9 below gives examples of this.
4.8 PINx: Reading the state of an
input or output pin
Register: PINx
0 = low (0 volts)
1 = high (5 volts)
The PINx registers are used to read the state of the pins,
either high or low. If a pin is low, the associated bit in the
register will read as a 0; if it is high, it will read as a 1.
You can read the state of a pin whether it is an input or an
output.

17
iRobot Command Module Owner’s Manual
4.9 Using bitwise operators to selectively
change bit values
The C bitwise operators, bitwise-or (|=), bitwise-and (&=),
and bitwise-exclusive-or (^=), as well as the not operator
(~) should be used to change the value of one bit at a time
with these registers. Some examples are below.
The following code sets pin B2 as an output:
DDRB |= 0x04;
This sets the value of bit 2 to be 1, but doesn’t affect the
other bits in DDRB. The following code sets pin D7 as an input:
DDRD &= ~0x80;
This sets bit 7 in DDRB to be a 0 without affecting the other bits.
Once you’ve set pin B2 as an output, the following code
sets its state to high:
PORTB |= 0x04;
The following code sets pin B2 low:
PORTB &= ~0x04;
If you just want to flip the state of the pin (low to high or
high to low), you can use the bitwise-exclusive-or operator.
The following code flips the state of pin B2:
PORTB ^= 0x04;
To check whether a pin is high or low, read the PINx register
and then use the bitwise-and operator to check only the
associated bit. The following code branches your code
according to the state of pin D7:
if(PIND & 0x80) {
/* if D7 is high, run this code */
}
else {
/* otherwise, if D7 is low, run this code */
}
If D7 was connected to a button, you could use this code to
perform different actions depending on whether the button
was being pushed.
4.10 Command Module Internal Pins
The Command Module’s ePorts only expose pins B0-B3
and C0-C5. See the Hardware Reference in chapter 9 for
the details and locations of these pins on the ports. The
remaining pins are reserved for the Command Module’s
own hardware and the Create Cargo Bay Connector on the
underside of the Command Module:
Pin Description Direction
PB4 Serial port select. 1 = connect serial I/O to USB
port. a0 = connect serial I/O to Create
Output
PB5 Create Power Detect. High if Create is on. Input
PD0 Serial Rx Input
PD1 Serial Tx Output
PD2 Create Device Detect Input. Change Create’s baud
rate to 19200 by toggling this pin 3 times with 200
ms pulses (or use the Baud command - see the
Open Interface documentation)
Output
PD3 USB Detect Input
PD4 Command Module Soft Button Input
PD5 Command Module LED 1 Output
PD6 Command Module LED 2 Output
PD7 Create Power Toggle. Turn Create on or off with a
low-to-high transition.
Output
For these pins, only use the direction stated in the table
above. The remaining pins (B6-7, C6-7) are for Command
Module internal use only. Their direction is set in hardware
and cannot be changed with software.

18
iRobot Command Module Owner’s Manual
4.11 Adding a button and LED to the input
example program
In chapter 3, you saw that the input example program
looks for button presses on Create and on the Command
Module and plays a song and lights an LED when a button
is pressed. The program is also looking for button presses
on a top center ePort input pin and setting an ePort output
pin to drive an LED.
Buy a standard pushbutton and an LED from one of the
sources listed in Appendix A. Solder them onto a male DB-9
connector as shown in Figure 4. The button is connected to
pin 3 (B1) and pin 5 (GND), and the LED is connected to pin
2 (C1) and pin 4 (5V), with the flat side toward pin 2 and the
longer lead connected to pin 4. This makes the LED active
low (lit when low).
Button
Longer leg of LED Flat side of LED
LED
Pin 4 (5 VDC)
Pin 3 (B1) Pin 2 (C1)
Back side of male
DB9 connector
Create Figure 4 Button and LED assembly for the input example program
Plug this assembly into the top center ePort. Install the
Command Module in Create. Reload the input example
program onto the Command Module if necessary and
restart it by removing the USB cable and pressing the
Command Module’s reset button. You should notice three
LEDs flashing, including the one on the assembly you just
installed. If you press the button on your assembly, the input
program will light the LED solid and play a third song.
4.12 Taking an analog measurement
using the ADC
The I/O pins on PORTC of the Command Module can be
used to take analog measurements with the processor’s
10-bit Analog-to-Digital converter (ADC). For full details on
the ADC, see the “Analog to Digital Converter” section of
the processor datasheet, included on the Product CD.
The 10-bit ADC uses a 5V reference, so the result of an
analog measurement on the Command Module is an
unsigned 10-bit number with a value from 0 to 1023,
representing input voltages from 0 V to 5 V. For instance,
an input voltage of 1 V gives you an ADC reading of 205
according to the formula:
ADC reading = Vin * 1024 / Vref = 1 V * 1024 / 5V = 205
To take an analog measurement, you need to set up the
ADC, start the measurement, and then store the result
when it is done. Each of these operations uses registers
which are predefined in the WINAVR environment in the
<avr/io.h> header.
1. Set up the ADC. The following code uses predefined
registers to set the processor up to take analog
measurements on pins C4 and C5 (located on pin1 of
the Cargo Bay and top center ePorts respectively):
DDRC &= ~0xC30;/* set C4, C5 as inputs */
DIDR0 |= 0x30; /* disable digital input on C4, C5 */
PRR &= ~0x01; /* disable ADC power reduction */
ADCSRA = 0x87; /* enable ADC, prescale = 128 */
ADMUX = 0x40; /* set voltage reference */
The first line above sets up pins C4 and C5 as inputs. The
second line disables the digital inputs on these pins to
save power when you only want to use them as analog
inputs. The third line turns off a power-saving feature that
can’t be used when using the ADC. The fourth line enables
the ADC and sets the ADC prescaler to a value of 128 in
order to slow down the clock that controls the ADC so that it
functions properly while still allowing the main processor to
run at a faster frequency. The last line sets up the voltage
reference to be the internal processor pin AVcc, which is 5V
in the Command Module.
The next step is to set up some variables to store the result
of the measurements. The following code declares two
16-bit variables (needed to store the 10-bit ADC results):
uint16_t meas_c4;
uint16_t meas_c5;

19
iRobot Command Module Owner’s Manual
2. Select the channel as C4 and take the first measurement:
ADMUX &= ~0x0F; /* clear the ADC channel */
ADMUX |= 0x04; /* set the ADC channel to C4 */
ADCSRA |= 0x40; /* start the ADC measurement */
while(ADCSRA & 0x40); /* wait until it’s done */
meas_c4 = ADC; /* save the result */
The low 4 bits of the ADMUX register let you select which
pin to read from (C0 – C7). So the first two lines of the
code clear the ADC channel and then set it to a value of
4 for pin C4. The third line sets bits 6 in ADCSRA, which
starts the ADC measurement. The while loop on the next
line waits until the measurement is complete by watching
the ADSC bit in the ADCSRA register, which goes to 0 when
the measurement is done. The 10-bit result is then stored
in a 16-bit variable on the last line. ADC is a predefined
16-bit register.
Now, to take a measurement on pin C5, repeat the process
with the channel set to 5:
ADMUX &= ~0x0F; /* clear the ADC channel */
ADMUX |= 0x05; /* set the ADC channel to C5 */
ADCSRA |= 0x40; /* start the measurement */
while(ADCSRA & 0x40); /* wait until it’s done */
meas_c5 = ADC; /* save the result */
The 10-bit analog voltage measurements from pins C4 and
C5 are now stored in the 16-bit variables and can be used
for any calculations or decisions in your program.
The ADC can also be set up to trigger an interrupt when
it is complete if you don’t want your program to have to
wait while taking the measurement. Please refer to the
ATMega168 datasheet and the avr-libc documentation for
more information on setting up an ADC interrupt.
4.13 Using an analog measurement in the
light example program
The light example program demonstrates a possible
application for the Command Module and iRobot Create.
With this program, Create searches your house looking
for lights that have been left on so that you can turn
them off.
Start it up in a dark room by pressing the soft button.
It takes a light measurement when it first starts (to calibrate
the sensor) and when it finds an area with significantly more
light, it stops and beeps so that you can locate it and turn
off the light.
The light example program uses the ADC to measure the
analog voltage from a CDS light sensor. When more light
hits the CDS sensor, you will measure a higher voltage
at the ADC input, and vice versa. The example program
then uses this information to search for and identify lights
left on.
To try the light example program, you need to make your
own light sensor. Buy a CDS light sensor, a 10 K resistor,
and a male DB-9 connector to allow you to easily plug the
sensor into the Command Module. Please see Appendix A
for several sources where you can buy these components.
Once you have the components, assemble them as shown
in Figure 5.
Pin 4 (5 VOC)
Pin 5 (Gnd) Pin 1 (C5)
CDS Light Sensor
10K Transistor
Create Figure 5 Light sensor assembly for the light example program

20
iRobot Command Module Owner’s Manual
Your light sensor is now ready to use. Insert it into the top
center ePort.
Now, create a new project, build the light example program,
and download it into the Command Module using the
process explained in chapter 3. Download the latest source
files from www.irobot.com/create.
Look through the code to see that the program takes one
ADC measurement when it first starts in order to set a
baseline light measurement. Then, it continuously measures
the light level in the main loop of the program while running
and compares the current value with the baseline. You
can set off the alarm early by shining a flashlight on the
light sensor. Try running the light example program and
changing some of the parameters to see how it changes
the behavior.
4.14 Using a timer
You can use timers to control Create’s motions, generate
signals, or time events. This section will show you how to
set up a countdown timer with 1 millisecond (ms) accuracy
using one of the ATMega168’s timer interrupts. This section
assumes basic familiarity with microprocessor interrupts.
The frequency of the processor in the command module is
18.432 MHz.
1. Set up an interrupt to occur once every millisecond.
Toward the beginning of your program, set up and enable
the timer1 interrupt with the following code:
TCCR1A = 0x00;
TCCR1B = 0x0C;
OCR1A = 71;
TIMSK1 = 0x02;
The first two lines of the code put the timer in a mode in
which it generates an interrupt and resets a counter when
the timer value reaches the value of OCR1A, and select
a prescaler value of 256, meaning that the timer runs at
1/256th the speed of the processor. The third line sets
the reset value of the timer. To generate an interrupt every
1ms, the interrupt frequency will be 1000 Hz. To calculate
the value for OCR1A, use the following formula:
OCR1A = (processor_frequency / (prescaler *
interrupt_frequency)) - 1
OCR1A = (18432000 / (256 * 1000)) - 1 = 71
The fourth line of the code enables the timer interrupt. See
the ATMega168 datasheet for more information on these
control registers.
2. Declare variables to store the current count of the timer
and also a flag variable to let you know when the time has
expired. The timer counter should be a 16-bit variable
to allow you to specify longer times (up to 65.535
seconds). You can use this variable to determine when
a certain number of interrupts have elapsed. Declare
the variables with the following code:
volatile uint16_t timer_cnt = 0;
volatile uint8_t timer_running = 0;
3. Define the actual interrupt handler function code. This
code will get called by the microcontroller once per
millisecond as specified by the timer registers above.
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
if(timer_running)
{
if(timer_cnt)
timer_cnt--;
else
timer_running = 0;
}
}
The first line declares that this is the handler function for
the timer1A compare interrupt in the form that the AVR
compiler expects. See the avr-libc documentation that came
with WinAVR for information on how to declare other types
of interrupt handlers. The body of the interrupt checks to
see if the timer is running, and if it is running it reduces the
timer counter by 1. When the timer counter has counted
down to 0, it sets the timer_running variable to false (0).
You can now put timed delays into your Command Module
programs. The following code allows you to do something
for 2 seconds and then stop:
timer_cnt = 2000;
timer_running = 1;
while(timer_running)
{
/* add code here to do something while you wait */
}
Other manuals for COMMAND MODULE
1
Table of contents
Popular Computer Hardware manuals by other brands

Dave Embedded Systems
Dave Embedded Systems ARM Cortex-A9 MPCore Hardware manual

Cary Audio Design
Cary Audio Design CAD-Black Box operating manual

National Instruments
National Instruments FieldPoint cFP-1808 quick start guide

DeLOCK
DeLOCK 90097 user manual

Lattice Semiconductor
Lattice Semiconductor CrossLink-NX ISP Demo quick start guide

Siemens
Siemens TC35i Terminal manual