Arduino Booklet
Arduino Booklet
Arduino Booklet
BE
TA
Ve
r
sio
n
arduino
Thanks
The Arduino team is composed of:
Massimo Banzi, David Cuartielles, Tom Igoe, David Mellis and Gianluca Martino.
The Arduino team would like to thank the following people and institutions for the
support in making this booklet:
Aliadi Cortelletti for typesetting the booklet.
Barbara Ghella, Stefano Mirti, Claudio Moderini.
Interaction Design Lab, Milano
Domus Academy, Milano
Interaction Design Institute, Milano
Malm University, Faculty of Art, Culture and Communication (K3)
arduino
Index
Introduction 4
/ what is interaction design ? 5
/ what is physical computing ? 5
Introduction
Arduino is an open-source physical computing platform based on a simple i/o board
and a development environment that implements the Processing language. Arduino
can be used to develop stand-alone interactive objects or can be connected to software
on your computer (e.g. Flash, Processing, Max/MSP). The boards can be assembled by
hand or purchased preassembled; the open-source IDE can be downloaded for free.
Arduino is dierent from other platforms that can be found on the market because
of these features:
The Arduino Project was developed out of an educational environment and is
therefore great for newcomers to get things working quickly.
It is a Multi Platform environment; it can run on Windows, Macintosh and Linux.
It is Based on the Processing programming IDE
It is programmed via a USB cable not a serial port. This is useful because many
modern computers dont have serial ports anymore.
It is Open Source hardware and software - If you wish you can download the circuit
diagram, buy all the components, and make your own, without paying anything to the
makers of Arduino.
The hardware is cheap. The USB board cost about EUR 20 and replacing a burnt out
chip on the board is easy and costs no more than EUR 5. So you can aord to make
mistakes.
There is an active community of users so there is plenty of people who can help you.
What does this all mean? Were going to discover it this through this booklet that is
designed to help designers and artistis to understand what benets they can get from
learning how to use the Arduino platform and adopting its philosophy.
/ tinkering
/ patching
Robert Moog built his analogue synthesizers in a modular fashion and the musician
could try endless combination by Patching together dierent modules with cables.
This made the synthesizer look like an old telephone switch but, combined with the
numerous knobs, was the perfect platform for tinkering with sound and innovating
music. This technique has been translated into the world of software by programs like
Max or Pure Data.
9
/ circuit bending
/ keyboard hacks
Taking apart a keyboard reveals a very simple (and cheap) device. The Heart of it is
this small board. By replacing the keyboard matrix with sensors we can implement
new ways to interact with software. This is a key hardware component to learn about
when starting in Physical Computing.
11
/ we love junk
One of the best ways to quickly get to results is to nd a great source of technology
junk and use it to quickly (and cheaply) get to prototype an experience. Accumulate
junk and go through it before starting to build something from scratch.
12
/ hacking toys
Toys are a fantastic source of cheap technology to hack and reuse. The best
interpretation of this way of working comes from Husman Haque and Adam
Somlai-Fisher that, with their Lowtech sensors and actuators project, have perfectly
described this technique.
13
/ collaboration
Collaboration between users is one of they key points in the Arduino world, through
the forum people from dierent parts of the world hel each other while learning about
the platform. The Arduino team encourages people to collaborate also at a local level
by helpig them to seutp users groups in every city they visit.
14
This is a picture of the Arduino board. At the beginning you might be a bit confused
with all those connectors. Here is an explanation of what every element of the board
does:
14 Digital IO (pins 0 - 13,) can be inputs or outputs as set in software.
6 Analogue In (pins 0 - 5) are dedicated analogue input pins. These take analogue
values (i.e. voltage readings) and convert them into a number between 0 and 1023.
3 Analogue Out (pins 9, 10, 11) these are actually 3 of the digital pins that can be
reassigned to do analogue output.
The board can be powered from your USB port or from the power socket. This setting
can be changed with the jumper marked SV1 in the diagram. If the jumper is closest
to the USB plug then the board is powered from there. If the jumper is on the 2 pins
closest to the DC connector then it is powered from there.
15
then a piece of code that makes the board look like a serial port.
Once the drivers are installed we can launch the development environment and start
using Arduino.
Using the development environment
After the application has come up you will see a window like this one
[PIC screenshot of the Tools / Serial Port menu showing the list of ports]
Windows:
On Windows the process is a bit complicated at the beginning.
Opening the device manger from:
Start menu -> Control Panel -> System.. -> Hardware -> Device Manager
Look for the device in the list under Ports (COM & LPT).
Arduino will come up as an USB Serial Port and will have a name like COM4.
[PIC screenshot of the device manager showing arduino]
Note: For some reasons on some windows machine the COM port has a number
greater than 9 and this creates some problems when Arduino is trying to communicate
with it. Check in the Arduino troubleshooting section of the website how to x that.
Then in the IDE, select the appropriate port from the
Tools / Serial Port menu.
Now the Arduino development environment can talk to the Arduino board and
program it.
18
Lets see how we would go about translating a simple behaviour into a piece of
program.
A simple programme can always be mocked up as sentence, for example:
When it is very dark I want the light to go on and the motor to start turning slowly
We could then rewrite this into pseudo code (something that looks more like a
program but its still human language):
If light level is less than 50 then
Turn Light on
Turn motor on slow
Loop again
We quickly realise that we need two types of programming structures: loops and
conditional statements.
A loop is necessary to allow the processor to continually read the states of its inputs as
well as to update the states of its outputs. Conditional statements will be used to check
for certain conditions and change the course of the program depending on them.
So the basic Arduino program looks like this:
// This is a comment
// variable declaration
int x;
void init() {
// put code here
}
void loop () {
// put code here
}
20
At the beginning of the program we declare variables, areas of memory used to store
data. Then the void init() function is used to setup the program (dene which pins on
the processor are inputs and which one are outputs etc)
The last function, void loop(), will then be executed indenitely until you turn the
Arduino board o. So this is where we want all our conditional logic to be stored. It is
the real program and where we can control the ow of the program.
The text beginning with // is a comment, its very useful for you to remind yourself
what your code does when you re-open it after a while or for other people
Variables
One special thing about programming is that every time you want to store some value
you need to use a variable that you have to declare. That is, tell the computer what
kind of value to expect. There are a few basic data types that a computer can expect
that we will go through here:
int an integer is a whole number i.e. 1,2,3,5 etc.
byte an integer number between 0 and 255, this is useful if you need to save memory
because it uses only 1 byte of memory. (Remember that the arduino board has
only 1024 bytes of RAM)
For most of the programming you will be doing, these data types will be all you need,
to go into more detail, see: [URL of arduino reference]
Flow control
If [condition] Then
In Arduino, an if statement looks like this:
if(expression)
{
statement;
statement;
}
a equals b
a is not equal to b
a is greater than b
a is less than b
a is less than or equals to b
a is greater than or equals to b
21
(N.B. do not confuse == with the assignment operator = that actually changes the
value of the variable to the left of it, this can be very dangerous!)
Statements can be anything you like (including more conditional statements).
For loops
for (i=1; i <= 8; i++)
{
statement;
}
A for loop is a way to execute a certain piece of code for a very specic amount of
times. In the example shown statement is executed 8 times with i going from 1 to
8.
Note In Arduino you dont need to initialise the local variable i. However in java-based
languages like Processing you add int in front of the rst instance of i.
Delays
delay(100) //
The delay() function is useful for embedded programming to slow down the rate at
which the processor updates. This is used to make thing happens at a certain rate, for
example if we want to blink and led every second, after we turn it on we can place
a delay(1000) which will make the processor sit there and do nothing for a second
(1000 milliseconds)
Delay is also useful in debugging and general ow control.
22
/ blinking an LED
This program is the rst code to run to test that your Arduino board is working and
congured correctly. Type the following text into your Arduino editor.
Now that the code is in your IDE we need to verify it and upload it to the board.
Press the Verify button and if everything is correct youll see the message Done
compiling appear at the bottom of the program text.
At this point we can upload it into the board: press the reset button on the Arduino
board, this forces the board to stop what its doing and listen for instructions coming
from the USB port. Now we have about 6 or 7 seconds to press the Upload to I/O
Board button. this sends the current program to the board that will store it in its
memory and eventually run it. You will see a few messages appear in the black area
at the bottom of the window, these are messages that make it easier to understand
if the process has completed correctly. There are 2 LEDs marked RX and TX on
the board, they ash every time a byte is sent or received by the board. During the
download process they keep ickering, if this doesnt happen it means there is some
communication problem or you havent selected the right port in the Tools / Serial
Port menu.
/* Blinking LED
* -----------*
* turns on and off an LED connected to pin 13
*
*/
int ledPin = 13;
void setup()
{
pinMode(ledPin, OUTPUT);
// LED connected to
// digital pin 13
}
void loop()
{
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
//
//
//
//
23
turns
waits
turns
waits
the
for
the
for
LED on
a second
LED off
a second
Assuming that program has been uploaded correctly connect an LED to the pins 13
and GND on the board like you see in the illustration.
24
/ what is electricity
If you have ever done any plumbing at home, electronics wont be a problem for you
to understand. Jokes aside, in order to understand how electricity and electric circuits
work the best way is to build a mental model called the water analogy. Lets take a
simple device like a portable fan,
if you take it apart you will see that it contains a small battery a couple of wires going
to an electric motor and one of the wires is interrupted by a switch. Now makes sure
you have a new battery tted in the device and activate the switch; the motor will start
to spin providing the necessary refreshment. How does this work? Well imagine that
the battery is a water pump and the switch is a tap while the motor is one of those
wheels you see in watermills, when you open the tap water will ow from the pump
and push the wheel into motion.
Now in this simple hydraulic system two parameters are important: the pressure of the
water (this is given from how powerful is the pump) and the amount of water that will
ow in the pipes (this depends from the size of the pipes and the resistance that the
wheel will oppose to the stream of water hitting it).
25
You quickly understand that if you want the wheel to spin faster you need to increase
the size of the pipes (but this works only up to a point) and increase the pressure that
the pump can achieve. Increasing the size of the pipes allows more ow of water to go
through them, eectively by making them bigger we have reduced the resistance they
oppose to the ow of water. This works until a certain point where the wheel wont
spin any faster because the pressure of the water is not strong enough and this is when
we need the pump to be stronger.
This can go on until the point when the wheel falls apart because the water ow is
too strong and destroys it. Another thing you will notice is that as the wheel spins the
axle will heat up a little bit, this is because no matter how good is the way we have
mounted the wheel the attrition between the axle and the holes it is mounted in will
generate heat. This is important to understand that in a system like this not all the
energy you pump into the system will be converted into movement, some will be lost
in a number of ineciencies and will generally show up as heat emanating from some
parts of the system.
So what are the important parts of the system as we described it before? The pressure
produced by the pump is one, the resistance that the pipes and wheel oppose to the
ow of water and the actual ow of water (lets say that this is represented by the
number of litres of water that ow in one second) are the others.
Without going into much details electricity works a bit like water, you have a kind of
pump (any source of electricity like a battery or a wall plug) pushes electric charges
(imagine them like drops of electricity) down pipes represented by the wires where
some devices are able to use them to produce heat (your grandmas thermal blanket)
26
light (your bedrooms lamp) sound (your stereo) movement (your fan) and much
more.
So when you read on a battery 9V you can imagine the Voltage of the battery like the
water pressure that can be potentially produced by this little pump. This is measured
in Volts from Alessandro Volta, the inventor of the rst battery.
The ow of water has got and electric equivalent called current that is measured
in Amperes from Andre Marie Ampere. Finally the resistance opposed to the ow of
current by any means it travels through is called, yes you guessed right, resistance and
its measured in Ohms from the German physicist Ohm.
Mr ohm is also responsible for coming up with the most important law in electricity
and the only formula you will really need to remember.
He was able to demonstrate that in a circuit the Voltage, the Current and the
Resistance are all related to each other and in particular that the resistance opposed by
the circuits determines the amount of current that will ow through it give a certain
supply voltage.
Its very intuitive if you think about it: Take a 9V battery and plug it into a simple
circuit while measuring current, you will nd that the more resistors you add to the
circuit the less current will travel through it. Going back to the water owing in pipes,
given a certain pump if I place a tap (which we can assimilate to a variable resistor in
electricity) the more I close the tap, increasing resistance to water ow, less water will
ow through the pipes. Mr Ohm summarised his law into this formulas:
R (resistance) = V (voltage) / I (current)
V=R*I
I=V/R
This is the only rule that you really have to memorise and learn to use, because in most
of your work this will be the only one you will really need.
27
/ the breadboard
The process of getting a circuit to work is largely based on making lots of changes
to it until it behaves properly; its a very fast iterative process that could be seen as
the electronic equivalent to sketching. The design evolves in your hands as you try
dierent combinations. In order to achieve the best results you want to use a system
that will allow you to change the connections between components in the fastest, most
practical and non-destructive way.
This requirement clearly rules out soldering, its a time consuming procedure that puts
every component under stress every time you heat them up and cool them down.
The answer to our problems comes from a very practical device called Solder-less
Breadboard.
As you can see from the picture its a small plastic board full of holes, each one of
them contains a spring-loaded contact. You can push a components leg into one of
the hole and it will establish an electrical connection with all the other holes in the
same vertical column of holes. Each hole is at a distance of 2.54 mm distance from
the others, since most of the components have their legs, known to techies as pins,
are spaced at that standard distance therefore chips with multiple legs will t nicely.
Not all the contacts on a breadboard are created equal, there are some dierences: the
topmost and bottom row (coloured in red and blue and aptly marked with + and -) are
28
connected horizontally and are used to carry the power across the board so that when
we need power or ground we can provide it very quickly with a short jumper (this is
not a sweater or a funny insect but a short piece of wire used to connect two points
in the circuits) The last this you need to know about breadboards is the in the middle
there is a large gap that is as wide as the size of a small chip. This shows that the each
vertical line of holes is interrupted in the middle so that when you plug a chip you
wont short circuit pins that are on the two sides of the chip, clever eh?
29
/ reading a pushbutton
Now were going to see how Arduino is able to receive input from the external world.
This is done with the digitalRead() function which, given the number of a pin, will tell
you if there is a voltage applied to it. If the voltage is 2.5 or more volts, digitalRead()
will return HIGH while if there is no voltage it will return LOW.
This code checks the state of the digital pin and turn on the LED if the button is
pressed. Very simple and will get you started very quickly, just build the circuit you see
in the next page.
/* Blink LED when the button is pressed
* -----------------------*/
int ledPin = 13; // choose the pin for the LED
int inPin = 7;
// choose the input pin
// (for a pushbutton)
int val = 0;
// variable for reading the pin status
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(inPin, INPUT);
}
void loop(){
val = digitalRead(inPin);
LOW);
go OFF
HIGH);
LOW);
30
31
32
This is an LDR or light dependent resistor, this means that in darkness its resistance
is quite high while when you shine some light at it the resistance quickly drops and it
becomes a reasonably good conductor of electricity. Now plug the LDR in place of the
push-button, you will notice that if you cover or uncover it with your hands the LED
turns on and o. Youve just built your rst sensor driven LED.
33
/ analogue inputs
As we have seen in the previous section Arduino is able to detect if there is a voltage
applied to one of its pins and report it trough the digitalRead function. This is ne in
a lot of applications but the light sensor that we have used before its also able to tell us
not just if there is light or not, its also able to tell us how much light there is. This is
the dierence between an on/o sensor (simply telling us if something is there or not)
and an analogue sensor whose value continuously changes. In order to read this type
of sensors we need a dierent type of pin. In the lower-right part of Arduino youll see
6 pins marked Analog In, these are special pins that not only can tell us if there is
a voltage applied to them or not but also it value. By using the analogRead function
we can read the voltage applied to one of the pins. This function returns a number
between 0 and 1023 representing voltages between 0 and 5 volts. For example if there
is a voltage of 2.5 volts applied to pin 0 writing analogRead(0) will return 512 etc etc.
If you now build the circuit that you see in the illustration by using a 10k or 4.7k
resistor and you run the piece of code you nd here youll see the led blinking at a rate
thats dependent on the amount of light that hits the sensor.
34
void setup() {
pinMode(ledPin, OUTPUT);
}
// ledPin is as an OUTPUT
void loop() {
val = analogRead(sensorPin); //
//
digitalWrite(ledPin, HIGH); //
delay(val);
//
//
digitalWrite(ledPin, LOW);
//
delay(val);
//
//
}
35
This is a simple device whose resistance changes with temperature. In the circuit we
have shown you changes in resistance become changes in voltage that can be measured
by Arduino.
Be aware that there isnt a direct connection between the value you read the actual
temperature measured. If you need an exact reading you should read the numbers that
come out of the analogue pin while measuring with a real thermometer. You could
put these numbers side by side in a table and work out a way to gure out what is the
relationship between the values.
Up until now we have just used an LED as an output device but how do we read
the actual values that Arduino is reading from the sensor? Certainly we cant make
the board blink the values in morse code. For this type of issues we can use Serial
Communication that is described in the next chapter.
36
/ serial communication
We have seen at the beginning of the booklet that Arduino has an USB connection
that is used by the IDE to upload code into the processor.
The good news is that this connection can also be used by the programmes we write in
Arduino to send data back to the computer or receive commands from it.
For this purpose we are going to use the Serial object. This object contains all the code
we need to send and receive data.
Were now going to use the last circuit we have built using the the the thermistor and
send the values read back to the computer.
37
void setup() {
Serial.begin(9600);
}
void loop() {
val = analogRead(sensorPin);
//
//
//
//
Serial.println(val);
delay(100);
}
Now that we have the program running you should press the Serial Monitor button
on the Arduino IDE and youll see the numbers lining up in the bottom part of the
window. Now any software that can read from the serial port can talk to Arduino.
38
39
Take the rst LED blink example we have seen and now change the numbers in the
delay function until you dont see the LED blinking any more. You will see that the
LED seems to be dimmed at 50% of its normal brightness. Now change the numbers
so that the time the LED is on is of the time its o. Run the program and youll see
the brightness is roughly 25%.
This technique is called Pulse Width Modulation, a fancy name to say that if you blink
the LED fast enough you dont see it blink any more but you can change its brightness
by changing the ration between the on time and the o time. Here is a small diagram
showing how this works.
This technique also works with other devices than the LED. For example you can
change the speed of motor in the same exact way.
While experimenting you will see that blinking the LED by hand is a bit inconvenient
because as soon as you want to read a sensor or send data on the serial port the LED
will icker. Luckily enough the processor used by the Arduino board has a piece of
hardware that can very eciently blink 3 LEDs while your program does something
else. This is implemented by pins 9, 10 and 11 that can be controlled by the
analogWrite() instruction.
For example writing analogWrite(9,128) will set to 50% the brightness of an LED
connected to pin 9. Why 128? because analogWrite expects a number between 0 and
255 as a parameter where 255 means 100%.
Having 3 channels is very good because if you buy red, green and blue LEDs you can
might their light and make light of any colour you like!
40
41
/ complex sensors
We dene complex sensors the one that produce a type of information that requires
a bit more than a digitalRead() or an analogRead() to be used. These usually are
small circuits that have already a small microcontroller inside that pre processes the
information.
In the illustration you can see an Ultrasonic Ranger, an Infrared Ranger and an
Accelerometre. You can nd examples on how to use them on our website in the
Tutorials section.
42
/ talking to software
In this section we will show you how to use the data sent by an Arduino board
through the USB port to a piece of software running in your computer.
Virtual Etch a Sketch Arduino Code
This project requires 2 varible resistors that we are using to control the X and Y axis
respectively. The important thing here is how send out the data by prefacing it using
the letters A or B for the two sensors. This method can be used to send the data from
many dierent sensors.
void setup() {
beginSerial(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
val = analogRead(potPin);
val2 = analogRead(potPin2);
sensor
printString(A);
printInteger(val); // Example identier for the sensor
serialWrite(10);
printString(B);
printInteger(val2); // Example identier for the sensor
serialWrite(10);
43
// fat
44
void draw()
{
ll(0,2); // use black with alpha 2
rectMode(CORNER);
rect(0,0,width,height);
}
// Clear the value of buff
buff = ;
}
45