Arduino - Learning 1 200 PDF
Arduino - Learning 1 200 PDF
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Examples
See the foundations page for in-depth description of core concepts of the Arduino hardware and software; the hacking
page for information on extending and modifying the Arduino hardware and software; and the links page for other
documentation.
Simple programs that demonstrate the use of the Arduino These are more complex examples for using particular
board. These are included with the Arduino environment; to electronic components or accomplishing specific tasks. The
open them, click the Open button on the toolbar and look in code is included on the page.
the examples folder. (If you're looking for an older
example, check the Arduino 0007 tutorials page.) Miscellaneous
Complex Sensors
Analog I/O
Stepper Library
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Foundations
This page contains explanations of some of the elements of the Arduino hardware and software and the concepts behind
them. Page Discussion
Basics
Microcontrollers
Digital Pins: How the pins work and what it means for them to be configured as inputs or outputs.
Analog Input Pins: Details about the analog-to-digital conversion and other uses of the pins.
PWM: How the analogWrite() function simulates an analog output using pulse-width modulation.
Arduino Firmware
Bootloader: A small program pre-loaded on the Arduino board to allow uploading sketches.
Programming Technique
Port Manipulation: Manipulating ports directly for faster manipulation of multiple pins
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Links
Arduino examples, tutorials, and documentation elsewhere on the web.
Output
Input
Interaction
Storage
Communication
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Arduino Tutorials
Here you will find a growing number of examples and tutorials for accomplishing specific tasks or interfacing to other
hardware and software with Arduino. For instructions on getting the board and environment up and running, see the Arduino
guide.
Complex Sensors
Read an Accelerometer
Read an Ultrasonic Range Finder (ultrasound
sensor)
Reading the qprox qt401 linear touch sensor
Use two Arduino pins as a capacitive sensor
Sound
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Blink
In most programming languages, the first program you write prints "hello world" to the screen. Since an Arduino board
doesn't have a screen, we blink an LED instead.
The boards are designed to make it easy to blink an LED using digital pin 13. Some (like the Diecimila and LilyPad) have the
LED built-in to the board. On most others (like the Mini and BT), there is a 1 KB resistor on the pin, allowing you to connect
an LED directly. (To connect an LED to another digital pin, you should use an external resistor.)
LEDs have polarity, which means they will only light up if you orient the legs properly. The long leg is typically positive, and
should connect to pin 13. The short leg connects to GND; the bulb of the LED will also typically have a flat edge on this side.
If the LED doesn't light up, trying reversing the legs (you won't hurt the LED if you plug it in backwards for a short period of
time).
Circuit
Code
The example code is very simple, credits are to be found in the comments.
/* Blinking LED
* ------------
*
* turns on and off a light emitting diode(LED) connected to a digital
* pin, in intervals of 2 seconds. Ideally we use pin 13 on the Arduino
* board because it has a resistor attached to it, needing only an LED
*
* Created 1 June 2005
* copyleft 2005 DojoDave <http://www.0j0.org>
* http://arduino.berlios.de
*
* based on an orginal by H. Barragan for the Wiring i/o board
*/
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Code
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
// here is where you'd put code that needs to be running all the time.
// check to see if it's time to blink the LED; that is, is the difference
// between the current time and last time we blinked the LED bigger than
// the interval at which we want to blink the LED.
if (millis() - previousMillis > interval) {
previousMillis = millis(); // remember the last time we blinked the LED
digitalWrite(ledPin, value);
}
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Button
The pushbutton is a component that connects two points in a circuit when you press it. The example turns on an LED when
you press the button.
We connect three wires to the Arduino board. The first goes from one leg of the pushbutton through a pull-up resistor (here
2.2 KOhms) to the 5 volt supply. The second goes from the corresponding leg of the pushbutton to ground. The third
connects to a digital i/o pin (here pin 7) which reads the button's state.
When the pushbutton is open (unpressed) there is no connection between the two legs of the pushbutton, so the pin is
connected to 5 volts (through the pull-up resistor) and we read a HIGH. When the button is closed (pressed), it makes a
connection between its two legs, connecting the pin to ground, so that we read a LOW. (The pin is still connected to 5 volts,
but the resistor in-between them means that the pin is "closer" to ground.)
You can also wire this circuit the opposite way, with a pull-down resistor keeping the input LOW, and going HIGH when the
button is pressed. If so, the behavior of the sketch will be reversed, with the LED normally on and turning off when you press
the button.
If you disconnect the digital i/o pin from everything, the LED may blink erratically. This is because the input is "floating" -
that is, it will more-or-less randomly return either HIGH or LOW. That's why you need a pull-up or pull-down resister in the
circuit.
Circuit
Code
void setup() {
pinMode(ledPin, OUTPUT); // declare LED as output
pinMode(inPin, INPUT); // declare pushbutton as input
}
void loop(){
val = digitalRead(inPin); // read input value
if (val == HIGH) { // check if the input is HIGH (button released)
digitalWrite(ledPin, LOW); // turn LED OFF
} else {
digitalWrite(ledPin, HIGH); // turn LED ON
}
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Debounce
This example demonstrates the use of a pushbutton as a switch: each time you press the button, the LED (or whatever) is
turned on (if it's off) or off (if on). It also debounces the input, without which pressing the button once would appear to the
code as multiple presses. Makes use of the millis() function to keep track of the time when the button is pressed.
Circuit
Code
// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0; // the last time the output pin was toggled
long debounce = 200; // the debounce time, increase if the output flickers
void setup()
{
pinMode(inPin, INPUT);
pinMode(outPin, OUTPUT);
}
void loop()
{
reading = digitalRead(inPin);
// if we just pressed the button (i.e. the input went from LOW to HIGH),
// and we've waited long enough since the last press to ignore any noise...
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
// ... invert the output
if (state == HIGH)
state = LOW;
else
state = HIGH;
digitalWrite(outPin, state);
previous = reading;
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Loop
We also call this example "Knight Rider" in memory to a TV-series from the 80's where the famous David Hasselhoff had an
AI machine driving his Pontiac. The car had been augmented with plenty of LEDs in all possible sizes performing flashy
effects.
Thus we decided that in order to learn more about sequential programming and good programming techniques for the I/O
board, it would be interesting to use the Knight Rider as a metaphor.
This example makes use of 6 LEDs connected to the pins 2 - 7 on the board using 220 Ohm resistors. The first code example
will make the LEDs blink in a sequence, one by one using only digitalWrite(pinNum,HIGH/LOW) and delay(time). The
second example shows how to use a for(;;) construction to perform the very same thing, but in fewer lines. The third and
last example concentrates in the visual effect of turning the LEDs on/off in a more softer way.
Circuit
Code
int timer = 100; // The higher the number, the slower the timing.
int pins[] = { 2, 3, 4, 5, 6, 7 }; // an array of pin numbers
int num_pins = 6; // the number of pins (i.e. the length of the array)
void setup()
{
int i;
for (i = 0; i < num pins; i++) // the array elements are numbered from 0 to num pins - 1
pinMode(pins[i], OUTPUT); // set each pin as an output
}
void loop()
{
int i;
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Analog Input
A potentiometer is a simple knob that provides a variable resistance, which we can read into the Arduino board as an analog
value. In this example, that value controls the rate at which an LED blinks.
We connect three wires to the Arduino board. The first goes to ground from one of the outer pins of the potentiometer. The
second goes from 5 volts to the other outer pin of the potentiometer. The third goes from analog input 2 to the middle pin of
the potentiometer.
By turning the shaft of the potentiometer, we change the amount of resistence on either side of the wiper which is connected
to the center pin of the potentiometer. This changes the relative "closeness" of that pin to 5 volts and ground, giving us a
different analog input. When the shaft is turned all the way in one direction, there are 0 volts going to the pin, and we read
0. When the shaft is turned all the way in the other direction, there are 5 volts going to the pin and we read 1023. In
between, analogRead() returns a number between 0 and 1023 that is proportional to the amount of voltage being applied to
the pin.
Circuit
Code
/*
* AnalogInput
* by DojoDave <http://www.0j0.org>
*
* Turns on and off a light emitting diode(LED) connected to digital
* pin 13. The amount of time the LED will be on and off depends on
* the value obtained by analogRead(). In the easiest case we connect
* a potentiometer to analog pin 2.
*/
void setup() {
pinMode(ledPin, OUTPUT); // declare the ledPin as an OUTPUT
}
void loop() {
val = analogRead(potPin); // read the value from the sensor
digitalWrite(ledPin, HIGH); // turn the ledPin on
delay(val); // stop the program for some time
digitalWrite(ledPin, LOW); // turn the ledPin off
delay(val); // stop the program for some time
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Fading
Demonstrates the use of analog output (PWM) to fade an LED.
Circuit
Code
void setup()
{
// nothing for setup
}
void loop()
{
for(value = 0 ; value <= 255; value+=5) // fade in (from min to max)
{
analogWrite(ledpin, value); // sets the value (range from 0 to 255)
delay(30); // waits for 30 milli seconds to see the dimming effect
}
for(value = 255; value >=0; value-=5) // fade out (from max to min)
{
analogWrite(ledpin, value);
delay(30);
}
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Knock
Here we use a Piezo element to detect sound, what will allow us to use it as a knock sensor. We are taking advantage of the
processors capability to read analog signals through its ADC - analog to digital converter. These converters read a voltage
value and transform it into a value encoded digitally. In the case of the Arduino boards, we transform the voltage into a value
in the range 0..1024. 0 represents 0volts, while 1024 represents 5volts at the input of one of the six analog pins.
A Piezo is nothing but an electronic device that can both be used to play tones and to detect tones. In our example we are
plugging the Piezo on the analog input pin number 0, that supports the functionality of reading a value between 0 and 5volts,
and not just a plain HIGH or LOW.
The other thing to remember is that Piezos have polarity, commercial devices are usually having a red and a black wires
indicating how to plug it to the board. We connect the black one to ground and the red one to the input. We also have to
connect a resistor in the range of the Megaohms in parallel to the Piezo element; in the example we have plugged it directly
in the female connectors. Sometimes it is possible to acquire Piezo elements without a plastic housing, then they will just look
like a metallic disc and are easier to use as input sensors.
The code example will capture the knock and if it is stronger than a certain threshold, it will send the string "Knock!" back to
the computer over the serial port. In order to see this text you can use the Arduino serial monitor.
/* Knock Sensor
* by DojoDave <http://www.0j0.org>
*
* Program using a Piezo element as if it was a knock sensor.
*
* We have to basically listen to an analog pin and detect
* if the signal goes over a certain threshold. It writes
* "knock" to the serial port if the Threshold is crossed,
* and toggles the LED on pin 13.
*
* http://www.arduino.cc/en/Tutorial/Knock
*/
void setup() {
pinMode(ledPin, OUTPUT); // declare the ledPin as as OUTPUT
Serial.begin(9600); // use the serial port
}
void loop() {
val = analogRead(knockSensor); // read the sensor and store it in the variable "val"
if (val >= THRESHOLD) {
statePin = !statePin; // toggle the status of the ledPin (this trick doesn't use time cycles)
digitalWrite(ledPin, statePin); // turn the led on or off
Serial.println("Knock!"); // send the string "Knock!" back to the computer, followed by newline
delay(10); // short delay to avoid overloading the serial port
}
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Smoothing
Reads repeatedly from an analog input, calculating a running average and printing it to the computer. Demonstrates the use
of arrays.
Circuit
Code
// Define the number of samples to keep track of. The higher the number,
// the more the readings will be smoothed, but the slower the output will
// respond to the input. Using a #define rather than a normal variable lets
// use this value to determine the size of the readings array.
#define NUMREADINGS 10
int inputPin = 0;
void setup()
{
Serial.begin(9600); // initialize serial communication with computer
for (int i = 0; i < NUMREADINGS; i++)
readings[i] = 0; // initialize all the readings to 0
}
void loop()
{
total -= readings[index]; // subtract the last reading
readings[index] = analogRead(inputPin); // read from the sensor
total += readings[index]; // add the reading to the total
index = (index + 1); // advance to the next index
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
ASCII Table
Demonstrates the advanced serial printing functions by generating a table of characters and their ASCII values in decimal,
hexadecimal, octal, and binary.
Circuit
Code
// ASCII Table
// by Nicholas Zambetti <http://www.zambetti.com>
void setup()
{
Serial.begin(9600);
void loop()
{
Serial.print(number, BYTE); // prints value unaltered, first will be '!'
Output
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Dimmer
Demonstrates the sending data from the computer to the Arduino board, in this case to control the brightness of an LED. The
data is sent in individual bytes, each of which ranges from 0 to 255. Arduino reads these bytes and uses them to set the
brightness of the LED.
Circuit
Code
int ledPin = 9;
void setup()
{
// begin the serial communication
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop()
{
byte val;
Processing Code
import processing.serial.*;
Serial port;
void setup()
{
size(256, 150);
// Uses the first port in this list (number 0). Change this to
// select the port corresponding to your Arduino board. The last
// parameter (e.g. 9600) is the speed of the communication. It
// has to correspond to the value passed to Serial.begin() in your
// Arduino sketch.
port = new Serial(this, Serial.list()[0], 9600);
// If you know the name of the port used by the Arduino board, you
// can specify it directly like this.
//port = new Serial(this, "COM1", 9600);
}
void draw()
{
// draw a gradient from black to white
for (int i = 0; i < 256; i++) {
stroke(i);
line(i, 0, i, 150);
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Graph
A simple example of communication from the Arduino board to the computer: the value of an analog input is printed. We call
this "serial" communication because the connection appears to both the Arduino and the computer as an old-fashioned serial
port, even though it may actually use a USB cable.
You can use the Arduino serial monitor to view the sent data, or it can be read by Processing (see code below), Flash, PD,
Max/MSP, etc.
Circuit
Code
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println(analogRead(0));
delay(20);
}
Processing Code
// Graph
// by David A. Mellis
//
// Demonstrates reading data from the Arduino board by graphing the
// values received.
//
// based on Analog In
// by <a href="http://itp.jtnimoy.com">Josh Nimoy</a>.
import processing.serial.*;
Serial port;
String buff = "";
int NEWLINE = 10;
void setup()
{
size(512, 256);
// If you know the name of the port used by the Arduino board, you
// can specify it directly like this.
//port = new Serial(this, "COM1", 9600);
}
void draw()
{
background(53);
stroke(255);
// Shift over the existing values to make room for the new one.
for (int i = 0; i < 63; i++)
values[i] = values[i + 1];
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Physical Pixel
An example of using the Arduino board to receive data from the computer. In this case, the Arduino boards turns on an LED
when it receives the character 'H', and turns off the LED when it receives the character 'L'.
The data can be sent from the Arduino serial monitor, or another program like Processing (see code below), Flash (via a
serial-net proxy), PD, or Max/MSP.
Circuit
Code
void setup()
{
Serial.begin(9600);
pinMode(outputPin, OUTPUT);
}
void loop()
{
if (Serial.available()) {
val = Serial.read();
if (val == 'H') {
digitalWrite(outputPin, HIGH);
}
if (val == 'L') {
digitalWrite(outputPin, LOW);
}
}
}
Processing Code
// mouseover serial
// by BARRAGAN <http://people.interaction-ivrea.it/h.barragan>
import processing.serial.*;
Serial port;
void setup()
{
size(200, 200);
noStroke();
frameRate(10);
// Open the port that the Arduino board is connected to (in this case #0)
// Make sure to open the port at the same speed Arduino is using (9600bps)
port = new Serial(this, Serial.list()[0], 9600);
}
void draw()
{
background(#222222);
if(mouseOverRect()) // if mouse is over square
{
fill(#BBBBB0); // change color
port.write('H'); // send an 'H' to indicate mouse is over square
} else {
fill(#666660); // change color
port.write('L'); // send an 'L' otherwise
}
rect(50, 50, 100, 100); // draw square
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Circuit
Code
int redPin = 0;
int greenPin = 1;
int bluePin = 2;
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.print("R");
Serial.println(analogRead(redPin));
Serial.print("G");
Serial.println(analogRead(greenPin));
Serial.print("B");
Serial.println(analogRead(bluePin));
delay(100);
}
Processing Code
/**
* Color Mixer
* by David A. Mellis
*
* Created 2 December 2006
*
* based on Analog In
* by <a href="http://itp.jtnimoy.com">Josh Nimoy</a>.
*
* Created 8 February 2003
* Updated 2 April 2005
*/
import processing.serial.*;
Serial port;
void setup()
{
size(200, 200);
void draw()
{
while (port.available() > 0) {
serialEvent(port.read());
}
background(rval, gval, bval);
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
This sketch exploits the pullup resistors under software control. The idea is that an external 200K resistor to ground will
cause an input pin to report LOW when the internal (20K) pullup resistor is turned off. When the internal pullup resistor is
turned on however, it will overwhelm the external 200K resistor and the pin will report HIGH.
One downside of the scheme (there always has to be a downside doesn't there?) is that one can't tell if both buttons are
pushed at the same time. In this case the scheme just reports that sw2 is pushed. The job of the 10K series resistor,
incidentally, is to prevent a short circuit if a pesky user pushes both buttons at once. It can be omitted on a center-off slide
or toggle switch where the states are mutually exclusive.
/*
* Read_Two_Switches_On_One_Pin
* Read two pushbutton switches or one center-off toggle switch with one Arduino pin
* Paul Badger 2008
* From an idea in EDN (Electronic Design News)
*
* Exploits the pullup resistors available on each I/O and analog pin
* The idea is that the 200K resistor to ground will cause the input pin to report LOW when the
* (20K) pullup resistor is turned off, but when the pullup resistor is turned on,
* it will overwhelm the 200K resistor and the pin will report HIGH.
*
* Schematic Diagram ( can't belive I drew this funky ascii schematic )
*
*
* +5 V
* |
* \
* /
* \ 10K
* /
* \
* |
* / switch 1 or 1/2 of center-off toggle or slide switch
* /
* |
* digital pin ________+_____________/\/\/\____________ ground
* |
* | 200K to 1M (not critical)
* /
* / switch 2 or 1/2 of center-off toggle or slide switch
* |
* |
* _____
* ___ ground
* _
*
*/
#define swPin 2 // pin for input - note: no semicolon after #define
int stateA, stateB; // variables to store pin states
int sw1, sw2; // variables to represent switch states
void setup()
{
Serial.begin(9600);
}
void loop()
{
digitalWrite(swPin, LOW); // make sure the puillup resistors are off
stateA = digitalRead(swPin);
digitalWrite(swPin, HIGH); // turn on the puillup resistors
stateB = digitalRead(swPin);
Serial.print(sw1);
Serial.print(" "); // pad some spaces to format print output
Serial.println(sw2);
delay(100);
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Tilt Sensor
The tilt sensor is a component that can detect the tilting of an object. However it is only the equivalent to a pushbutton
activated through a different physical mechanism. This type of sensor is the environmental-friendly version of a mercury-
switch. It contains a metallic ball inside that will commute the two pins of the device from on to off and viceversa if the
sensor reaches a certain angle.
The code example is exactly as the one we would use for a pushbutton but substituting this one with the tilt sensor. We use
a pull-up resistor (thus use active-low to activate the pins) and connect the sensor to a digital input pin that we will read
when needed.
The prototyping board has been populated with a 1K resitor to make the pull-up and the sensor itself. We have chosen the
tilt sensor from Assemtech, which datasheet can be found here. The hardware was mounted and photographed by Anders
Gran, the software comes from the basic Arduino examples.
Circuit
Code
Use the Digital > Button example to read the tilt-sensor, but you'll need to make sure that the inputPin variable in the code
matches the digital pin you're using on the Arduino board.
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
As you know from the Interfacing a Joystick tutorial, the joystick gives a coordinate (x,y) back to arduino. As you can see
looking to the joystick is that the space in which he moves is a circle. This circle will be from now on our 'Pie' (see bottom
right of the first image).
The only thing we need now to understand is that we have divided our Pie in 8 pieces. To each piece will correspond an LED.
(See figure below). This way, when the joystick gives us a coordinate, it will necesarilly belong to one of the pies. Then, the
program always lights up the LED corresponding to the pie in which the joystick is.
Code
/* Controle_LEDcirle_with_joystik
* ------------
* This program controles a cirle of 8 LEDs through a joystick
*
* First it reads two analog pins that are connected
* to a joystick made of two potentiometers
*
* This input is interpreted as a coordinate (x,y)
*
* The program then calculates to which of the 8
* possible zones belogns the coordinate (x,y)
*
* Finally it ligths up the LED which is placed in the
* detected zone
*
* @authors: Cristina Hoffmann and Gustavo Jose Valera
* @hardware: Cristina Hofmann and Gustavo Jose Valera
* @context: Arduino Workshop at medialamadrid
*/
// Declaration of Variables
// function that calculates the slope of the line that passes through the points
// x1, y1 and x2, y2
int calculateSlope(int x1, int y1, int x2, int y2)
{
return ((y1-y2) / (x1-x2));
}
// function that calculates in which of the 8 possible zones is the coordinate x y, given the center cx,
cy
int calculateZone (int x, int y, int cx, int cy)
{
int alpha = calculateSlope(x,y, cx,cy); // slope of the segment betweent the point and the center
if (x > cx)
{
if (y > cy) // first cuadrant
{
if (alpha > 1) // The slope is > 1, thus higher part of the first quadrant
return 0;
else
return 1; // Otherwise the point is in the lower part of the first quadrant
}
else // second cuadrant
{
if (alpha > -1)
return 2;
else
return 3;
}
}
else
{
if (y < cy) // third cuadrant
{
if (alpha > 1)
return 4;
else
return 5;
}
else // fourth cuadrant
{
if (alpha > -1)
return 6;
else
return 7;
}
}
}
void loop() {
digitalWrite(ledVerde, HIGH); // flag to know we entered the loop, you can erase this if you want
// We calculate in which x
actualZone = calculateZone(coordX, coordY, centerX, centerY);
if (actualZone != previousZone)
digitalWrite (ledPins[previousZone], LOW);
// we print int the terminal, the cartesian value of the coordinate, and the zone where it belongs.
//This is not necesary for a standalone version
serialWrite('C');
serialWrite(32); // print space
printInteger(coordX);
serialWrite(32); // print space
printInteger(coordY);
serialWrite(10);
serialWrite(13);
serialWrite('Z');
serialWrite(32); // print space
printInteger(actualZone);
serialWrite(10);
serialWrite(13);
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
/*
* "Coffee-cup" Color Mixer:
* Code for mixing and reporting PWM-mediated color
* Assumes Arduino 0004 or higher, as it uses Serial.begin()-style communication
*
* Control 3 LEDs with 3 potentiometers
* If the LEDs are different colors, and are directed at diffusing surface (stuck in a
* a Ping-Pong ball, or placed in a paper coffee cup with a cut-out bottom and
* a white plastic lid), the colors will mix together.
*
* When you mix a color you like, stop adjusting the pots.
* The mix values that create that color will be reported via serial out.
*
* Standard colors for light mixing are Red, Green, and Blue, though you can mix
* with any three colors; Red + Blue + White would let you mix shades of red,
* blue, and purple (though no yellow, orange, green, or blue-green.)
*
* Put 220 Ohm resistors in line with pots, to prevent circuit from
* grounding out when the pots are at zero
*/
// Values
int aVal = 0; // Variables to store the input from the potentiometers
int bVal = 0;
int cVal = 0;
void setup()
{
pinMode(aOut, OUTPUT); // sets the digital pins as output
pinMode(bOut, OUTPUT);
pinMode(cOut, OUTPUT);
Serial.begin(9600); // Open serial communication for reporting
}
void loop()
{
i += 1; // Count loop
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Stopwatch
A sketch that demonstrates how to do two (or more) things at once by using millis().
/* StopWatch
* Paul Badger 2008
* Demonstrates using millis(), pullup resistors,
* making two things happen at once, printing fractions
*
* Physical setup: momentary switch connected to pin 4, other side connected to ground
* LED with series resistor between pin 13 and ground
*/
void setup()
{
Serial.begin(9600);
void loop()
{
// check for button press
buttonState = digitalRead(buttonPin); // read the button state and store
if (buttonState == LOW && lastButtonState == HIGH && blinking == false){ // check for a high to
low transition
// if true then found a new button press while clock is not running - start the clock
else if (buttonState == LOW && lastButtonState == HIGH && blinking == true){ // check for a high to
low transition
// if true then found a new button press while clock is running - stop the clock and report
// routine to report elapsed time - this breaks when delays are in single or double digits. Fix
this as a coding exercise.
else{
lastButtonState = buttonState; // store buttonState in lastButtonState, to
compare next time
}
if (blinking == true){
previousMillis = millis(); // remember the last time we blinked the LED
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
ADXL3xx Accelerometer
Reads an Analog Devices ADXL3xx series (e.g. ADXL320, ADXL321, ADXL322, ADXL330) accelerometer and communicates
the acceleration to the computer. The pins used are designed to be easily compatible with the breakout boards from
Sparkfun. The ADXL3xx outputs the acceleration on each axis as an analog voltage between 0 and 5 volts, which is read by
an analog input on the Arduino.
Circuit
An ADXL322 on a Sparkfun breakout board inserted into the analog input pins of an Arduino.
Arduino Pin None (unconnected) Analog Input 1 Analog Input 2 Analog Input 3 GND 5V
Code
void loop()
{
Serial.print(analogRead(xpin));
Serial.print(" ");
Serial.print(analogRead(ypin));
Serial.print(" ");
Serial.print(analogRead(zpin));
Serial.println();
delay(1000);
}
Data
Here are some accelerometer readings collected by the positioning the y-axis of an ADXL322 2g accelerometer at various
angles from ground. Values should be the same for the other axes, but will vary based on the sensitivity of the device. With
the axis horizontal (i.e. parallel to ground or 0°), the accelerometer reading should be around 512, but values at other angles
will be different for a different accelerometer (e.g. the ADXL302 5g one).
Angle -90 -80 -70 -60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90
Acceleration 662 660 654 642 628 610 589 563 537 510 485 455 433 408 390 374 363 357 355
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
The pins dedicated to measure acceleration can be connected directly to digital inputs to the Arduino board, while the the
temperature should be taken as an analog input. The acceleration pins send the signals back to the computer in the form of
pulses which width represents the acceleration.
The example shown here was mounted by Anders Gran, while the software was created by Marcos Yarza, who is Arduino's
accelerometer technology researcher, at the University of Zaragoza, Spain. The board is connected minimally, only the two
axis pins are plugged to the board, leaving the temperature pin open.
/* Accelerometer Sensor
* --------------------
*
* Reads an 2-D accelerometer
* attached to a couple of digital inputs and
* sends their values over the serial port; makes
* the monitor LED blink once sent
*
*
* http://www.0j0.org
* copyleft 2005 K3 - Malmo University - Sweden
* @author: Marcos Yarza
* @hardware: Marcos Yarza
* @project: SMEE - Experiential Vehicles
* @sponsor: Experiments in Art and Technology Sweden, 1:1 Scale
*/
int timer = 0;
int count = 0;
void setup() {
beginSerial(9600); // Sets the baud rate to 9600
pinMode(ledPin, OUTPUT);
pinMode(xaccPin, INPUT);
pinMode(yaccPin, INPUT);
}
/* (void) readAccelerometer
* procedure to read the sensor, calculate
* acceleration and represent the value
*/
void readAcceleration(int axe){
timer = 0;
count = 0;
value = digitalRead(axe);
while(value == HIGH) { // Loop until pin reads a low
value = digitalRead(axe);
}
while(value == LOW) { // Loop until pin reads a high
value = digitalRead(axe);
}
while(value == HIGH) { // Loop until pin reads a low and count
value = digitalRead(axe);
count = count + 1;
}
timer = count * 18; //calculate the teme in miliseconds
//operate sign
if (timer > 5000){
sign = '+';
}
if (timer < 5000){
sign = '-';
}
}
void loop() {
readAcceleration(xaccPin); //reads and represents acceleration X
readAcceleration(yaccPin); //reads and represents acceleration Y
digitalWrite(ledPin, HIGH);
delay(300);
digitalWrite(ledPin, LOW);
}
The following example is an adaptation of the previous one. Marcos Yarza added two 220Ohm resistors to the pins coming out
of the accelerometer. The board chosen for this small circuit is just a piece of prototyping board. Here the code is exactly the
same as before (changing the input pins to be 2 and 3), but the installation on the board allows to embed the whole circutry
in a much smaller housing.
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
The pin dedicated to make the readings has to be shifting configuration from input to output according to the PING
specification sheet. First we have to send a pulse that will make the sensor send an ultrasound tone and wait for an echo.
Once the tone is received back, the sensor will send a pulse over the same pin as earlier. The width of that pulse will
determine the distance to the object.
The example shown here was mounted by Marcus Hannerstig, while the software was created by David Cuartielles. The board
is connected as explained using only wires coming from an old computer.
/* Ultrasound Sensor
*------------------
*
* Reads values (00014-01199) from an ultrasound sensor (3m sensor)
* and writes the values to the serialport.
*
* http://www.xlab.se | http://www.0j0.org
* copyleft 2005 Mackie for XLAB | DojoDave for DojoCorp
*
*/
void setup() {
beginSerial(9600); // Sets the baud rate to 9600
pinMode(ledPin, OUTPUT); // Sets the digital pin as output
}
void loop() {
timecount = 0;
val = 0;
pinMode(ultraSoundSignal, OUTPUT); // Switch signalpin to output
/* Delay of program
* -------------------------------------------------------------------
*/
delay(100);
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
qt401 sensor
full tutorial coming soon
/* qt401 demo
* ------------
*
* the qt401 from qprox http://www.qprox.com is a linear capacitive sensor
* that is able to read the position of a finger touching the sensor
* the surface of the sensor is divided in 128 positions
* the pin qt401_prx detects when a hand is near the sensor while
* qt401_det determines when somebody is actually touching the sensor
* these can be left unconnected if you are short of pins
*
* read the datasheet to understand the parametres passed to initialise the sensor
*
* Created January 2006
* Massimo Banzi http://www.potemkin.org
*
* based on C code written by Nicholas Zambetti
*/
byte result;
void qt401_init() {
// define pin directions
pinMode(qt401_drd, INPUT);
pinMode(qt401_di, INPUT);
pinMode(qt401_ss, OUTPUT);
pinMode(qt401_clk, OUTPUT);
pinMode(qt401_do, OUTPUT);
pinMode(qt401_det, INPUT);
pinMode(qt401_prx, INPUT);
// initialise pins
digitalWrite(qt401_clk,HIGH);
digitalWrite(qt401_ss, HIGH);
}
//
// wait for the qt401 to be ready
//
void qt401_waitForReady(void)
{
while(!digitalRead(qt401_drd)){
continue;
}
}
//
// exchange a byte with the sensor
//
byte mask = 0;
byte data_in = 0;
while(0 < i) {
mask = 0x01 << --i; // generate bitmask for the appropriate bit MSB first
digitalWrite(qt401_do,HIGH); // send 1
}
else{
digitalWrite(qt401_do,LOW); // send 0
// lower clock pin, this tells the sensor to read the bit we just put out
digitalWrite(qt401_clk,LOW); // tick
delayMicroseconds(75);
digitalWrite(qt401_clk,HIGH); // tock
delayMicroseconds(20);
data_in |= mask;
return data_in;
}
void qt401_calibrate(void)
{
// calibrate
qt401_waitForReady();
qt401_transfer(0x01);
delay(600);
// calibrate ends
qt401_waitForReady();
qt401_transfer(0x02);
delay(600);
}
byte qt401_driftCompensate(void)
{
qt401_waitForReady();
return qt401_transfer(0x03);
}
byte qt401_readSensor(void)
{
qt401_waitForReady();
return qt401_transfer(0x00);
}
void setup() {
beginSerial(9600);
}
void loop() {
if(digitalRead(qt401_det)){
result = qt401_readSensor();
if(0x80 & result){
result = result & 0x7f;
printInteger(result);
printNewline();
}
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Play Melody
This example makes use of a Piezo Speaker in order to play melodies. We are taking advantage of the processors capability
to produde PWM signals in order to play music. There is more information about how PWM works written by David Cuartielles
here and even at K3's old course guide
A Piezo is nothing but an electronic device that can both be used to play tones and to detect tones. In our example we are
plugging the Piezo on the pin number 9, that supports the functionality of writing a PWM signal to it, and not just a plain
HIGH or LOW value.
The first example of the code will just send a square wave to the piezo, while the second one will make use of the PWM
functionality to control the volume through changing the Pulse Width.
The other thing to remember is that Piezos have polarity, commercial devices are usually having a red and a black wires
indicating how to plug it to the board. We connect the black one to ground and the red one to the output. Sometimes it is
possible to acquire Piezo elements without a plastic housing, then they will just look like a metallic disc.
/* Play Melody
* -----------
*
* Program to play a simple melody
*
* Tones are created by quickly pulsing a speaker on and off
* using PWM, to create signature frequencies.
*
* Each note has a frequency, created by varying the period of
* vibration, measured in microseconds. We'll use pulse-width
* modulation (PWM) to create that vibration.
// TONES ==========================================
// Start by defining the relationship between
// note, period, & frequency.
#define c 3830 // 261 Hz
#define d 3400 // 294 Hz
#define e 3038 // 329 Hz
#define f 2864 // 349 Hz
#define g 2550 // 392 Hz
#define a 2272 // 440 Hz
#define b 2028 // 493 Hz
#define C 1912 // 523 Hz
// Define a special note, 'R', to represent a rest
#define R 0
// SETUP ============================================
// Set up speaker on a PWM pin (digital 9, 10 or 11)
int speakerOut = 9;
// Do we want debugging on serial out? 1 for yes, 0 for no
int DEBUG = 1;
void setup() {
pinMode(speakerOut, OUTPUT);
if (DEBUG) {
Serial.begin(9600); // Set serial out if we want debugging
}
}
digitalWrite(speakerOut,HIGH);
delayMicroseconds(tone / 2);
// DOWN
digitalWrite(speakerOut, LOW);
delayMicroseconds(tone / 2);
playTone();
// A pause between notes...
delayMicroseconds(pause);
/*
* NOTES
* The program purports to hold a tone for 'duration' microseconds.
* Lies lies lies! It holds for at least 'duration' microseconds, _plus_
* any overhead created by incremeting elapsed_time (could be in excess of
* 3K microseconds) _plus_ overhead of looping and two digitalWrites()
*
* As a result, a tone of 'duration' plays much more slowly than a rest
* of 'duration.' rest_count creates a loop variable to bring 'rest' beats
* in line with 'tone' beats of the same length.
*
* rest_count will be affected by chip architecture and speed, as well as
* overhead from any program mods. Past behavior is no guarantee of future
* performance. Your mileage may vary. Light fuse and get away.
*
* This could use a number of enhancements:
* ADD code to let the programmer specify how many times the melody should
* loop before stopping
* ADD another octave
* MOVE tempo, pause, and rest_count to #define statements
* RE-WRITE to include volume, using analogWrite, as with the second program at
* http://www.arduino.cc/en/Tutorial/PlayMelody
* ADD code to make the tempo settable by pot or other input device
* ADD code to take tempo or volume settable by serial communication
* (Requires 0005 or higher.)
* ADD code to create a tone offset (higer or lower) through pot etc
* REPLACE random melody with opening bars to 'Smoke on the Water'
*/
/* Play Melody
* -----------
*
* Program to play melodies stored in an array, it requires to know
* about timing issues and about how to play tones.
*
* The calculation of the tones is made following the mathematical
* operation:
*
* timeHigh = 1/(2 * toneFrequency) = period / 2
*
* where the different tones are described as in the table:
*
* note frequency period PW (timeHigh)
* c 261 Hz 3830 1915
* d 294 Hz 3400 1700
* e 329 Hz 3038 1519
* f 349 Hz 2864 1432
* g 392 Hz 2550 1275
* a 440 Hz 2272 1136
* b 493 Hz 2028 1014
* C 523 Hz 1912 956
*
* (cleft) 2005 D. Cuartielles for K3
*/
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
analogWrite(speakerOut, 0);
for (count = 0; count < MAX_COUNT; count++) {
statePin = !statePin;
digitalWrite(ledPin, statePin);
for (count3 = 0; count3 <= (melody[count*2] - 48) * 30; count3++) {
for (count2=0;count2<8;count2++) {
if (names[count2] == melody[count*2 + 1]) {
analogWrite(speakerOut,500);
delayMicroseconds(tones[count2]);
analogWrite(speakerOut, 0);
delayMicroseconds(tones[count2]);
}
if (melody[count*2 + 1] == 'p') {
// make a pause of a certain size
analogWrite(speakerOut, 0);
delayMicroseconds(500);
}
}
}
}
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
LED Driver
This example makes use of an LED Driver in order to control an almost endless amount of LEDs with only 4 pins. We use the
4794 from Philips. There is more information about this microchip that you will find in its datasheet.
An LED Driver has a shift register embedded that will take data in serial format and transfer it to parallel. It is possible to
daisy chain this chip increasing the total amount of LEDs by 8 each time.
The code example you will see here is taking a value stored in the variable dato and showing it as a decoded binary number.
E.g. if dato is 1, only the first LED will light up; if dato is 255 all the LEDs will light up.
int data = 9;
int strob = 8;
int clock = 10;
int oe = 11;
int count = 0;
int dato = 0;
void setup()
{
beginSerial(9600);
pinMode(data, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(strob, OUTPUT);
pinMode(oe, OUTPUT);
}
void PulseClock(void) {
digitalWrite(clock, LOW);
delayMicroseconds(20);
digitalWrite(clock, HIGH);
delayMicroseconds(50);
digitalWrite(clock, LOW);
}
void loop()
{
dato = 5;
for (count = 0; count < 8; count++) {
digitalWrite(data, dato & 01);
//serialWrite((dato & 01) + 48);
dato>>=1;
if (count == 7){
digitalWrite(oe, LOW);
digitalWrite(strob, HIGH);
}
PulseClock();
digitalWrite(oe, HIGH);
}
delayMicroseconds(20);
digitalWrite(strob, LOW);
delay(100);
serialWrite(10);
serialWrite(13);
delay(100); // waits for a moment
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
LCD displays are most of the times driven using an industrial standard established by Hitachi. According to it there is a group
of pins dedicated to sending data and locations of that data on the screen, the user can choose to use 4 or 8 pins to send
data. On top of that three more pins are needed to synchronize the communication towards the display.
The backdrop of this example is that we are using almost all the available pins on Arduino board in order to drive the display,
but we have decided to show it this way for simplicity.
/* LCD Hola
* --------
*
* This is the first example in how to use an LCD screen
* configured with data transfers over 8 bits. The example
* uses all the digital pins on the Arduino board, but can
* easily display data on the display
*
* There are the following pins to be considered:
*
* - DI, RW, DB0..DB7, Enable (11 in total)
*
* the pinout for LCD displays is standard and there is plenty
* of documentation to be found on the internet.
*
* (cleft) 2005 DojoDave for K3
*
*/
int DI = 12;
int RW = 11;
int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};
int Enable = 2;
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Materials needed:
Solderless breadboard
Hookup wire
Arduino Microcontoller Module
Potentiometer
Liquid Crystal Display (LCD) with HD44780 chip interface
Light emitting Diode (LED) - optional, for debugging
For a basic explanation of how libraries work in Arduino read the library page. Download the LiquidCrystal library here. Unzip
the files and place the whole LiquidCrystal folder inside your arduino-0004\lib\targets\libraries folder. Start the Arduino
program and check to make sure LiquidCrystal is now available as an option in the Sketch menu under "Import Library".
Insert the LCD header into the breadboard and connect power and ground on the breadboard to power and ground from the
microcontroller. On the Arduino module, use the 5V and any of the ground connections.
Connect wires from the breadboard to the arduino input sockets. It is a lot of wires, so keep them as short and tidy as
possible. Look at the datasheet for your LCD board to figure out which pins are where. Make sure to take note of whether the
pin view is from the front or back side of the LCD board, you don't want to get your pins reversed!
Arduino LCD
2 Enable
3 Data Bit 0 (DB0)
4 (DB1)
5 (DB2)
6 (DB3)
7 (DB4)
8 (DB5)
9 (DB6)
10 (DB7)
11 Read/Write (RW)
12 Register Select (RS)
Connect a potentiometer a a voltage divider between 5V, Ground, and the contrast adjustment pin on your LCD.
Additionally you may want to connect an LED for debugging purposes between pin 13 and Ground.
First start by opening a new sketch in Arduino and saving it. Now go to the Sketch menu, scroll down to "import library", and
choose "LiquidCrystal". The phrase #include <LiquidCrystal.h> should pop up at the top of your sketch.
The first program we are going to try is simply for calibration and debugging. Copy the following code into your sketch,
compile and upload to the Arduino.
void setup(void){
lcd.init(); //initialize the LCD
digitalWrite(13,HIGH); //turn on an LED for debugging
}
void loop(void){
delay(1000); //repeat forever
}
If all went as planned both the LCD and the LED should turn on. Now you can use the potentiometer to adjust the contrast
on the LCD until you can clearly see a cursor at the beginning of the first line. If you turn the potentiometer too far in one
direction black blocks will appear. Too far in the other direction everything will fade from the display. There should be a small
spot in the middle where the cursor appears crisp and dark.
Now let's try something a little more interesting. Compile and upload the following code to the Arduino.
void setup(void){
lcd.init(); //initialize the LCD
digitalWrite(13,HIGH); //turn on an LED for debugging
}
void loop(void){
lcd.clear(); //clear the display
delay(1000); //delay 1000 ms to view change
lcd.print('a'); //send individual letters to the LCD
lcd.print('b');
lcd.print('c');
delay(1000);//delay 1000 ms to view change
} //repeat forever
This time you should see the letters a b and c appear and clear from the display in an endless loop.
This is all great fun, but who really wants to type out each letter of a message indivually? Enter the printIn() function. Simply
initialize a string, pass it to printIn(), and now we have ourselves a proper hello world program.
void setup(void){
lcd.init(); //initialize the LCD
digitalWrite(13,HIGH); //turn on an LED for debugging
}
void loop(void){
lcd.clear(); //clear the display
delay(1000); //delay 1000 ms to view change
lcd.printIn(string1); //send the string to the LCD
delay(1000); //delay 1000 ms to view change
} //repeat forever
Finally, you should know there is a lot of functionality in the HD44780 chip interface that is not drawn out into Arduino
functions. If you are feeling ambitious glance over the datasheet and try out some of the direct commands using the
commandWrite() function. For example, commandWrite(2) tells the board to move the cursor back to starting position. Here
is an example:
void setup(void){
lcd.init(); //initialize the LCD
digitalWrite(13,HIGH); //turn on an LED for debugging
}
void loop(void){
lcd.commandWrite(2); //bring the cursor to the starting position
delay(1000); //delay 1000 ms to view change
lcd.printIn(string1); //send the string to the LCD
delay(1000); //delay 1000 ms to view change
} //repeat forever
This code makes the cursor jump back and forth between the end of the message an the home position.
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
The first example is the basic code to make the motor spin in one direction. It is aiming those that have no knowledge in
how to control stepper motors. The second example is coded in a more complex way, but allows to make the motor spin at
different speeds, in both directions, and controlling both from a potentiometer.
The prototyping board has been populated with a 10K potentiomenter that we connect to an analog input, and a ULN2003A
driver. This chip has a bunch of transistors embedded in a single housing. It allows the connection of devices and
components that need much higher current than the ones that the ATMEGA8 from our Arduino board can offer.
/* Stepper Copal
* -------------
*
* Program to drive a stepper motor coming from a 5'25 disk drive
* according to the documentation I found, this stepper: "[...] motor
* made by Copal Electronics, with 1.8 degrees per step and 96 ohms
* per winding, with center taps brought out to separate leads [...]"
* [http://www.cs.uiowa.edu/~jones/step/example.html]
*
* It is a unipolar stepper motor with 5 wires:
*
* - red: power connector, I have it at 5V and works fine
* - orange and black: coil 1
* - brown and yellow: coil 2
*
* (cleft) 2005 DojoDave for K3
* http://www.0j0.org | http://arduino.berlios.de
*
* @author: David Cuartielles
* @date: 20 Oct. 2005
*/
int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;
int delayTime = 500;
void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
}
void loop() {
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(delayTime);
}
void setup() {
for (count = 0; count < 4; count++) {
pinMode(motorPins[count], OUTPUT);
}
}
void moveForward() {
if ((count2 == 0) || (count2 == 1)) {
count2 = 16;
}
count2>>=1;
for (count = 3; count >= 0; count--) {
digitalWrite(motorPins[count], count2>>count&0x01);
}
delay(delayTime);
}
void moveBackward() {
if ((count2 == 0) || (count2 == 1)) {
count2 = 16;
}
count2>>=1;
for (count = 3; count >= 0; count--) {
digitalWrite(motorPins[3 - count], count2>>count&0x01);
}
delay(delayTime);
}
void loop() {
val = analogRead(0);
if (val > 540) {
// move faster the higher the value from the potentiometer
delayTime = 2048 - 1024 * val / 512 + 1;
moveForward();
} else if (val < 480) {
// move faster the lower the value from the potentiometer
delayTime = 1024 * val / 512 + 1;
moveBackward();
} else {
delayTime = 1024;
}
}
References
In order to work out this example, we have been looking into quite a lot of documentation. The following links may be useful
for you to visit in order to understand the theory underlying behind stepper motors:
- information about the motor we are using - here
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
In this tutorial you will learn how to implement Asynchronous serial communication on the Arduino in software to
communicate with other serial devices. Using software serial allows you to create a serial connection on any of the digital i/o
pins on the Arduino. This should be used when multiple serial connections are necessary. If only one serial connection is
necessary the hardware serial port should be used. This is a general purpose software tutorial, NOT a specific device tutorial.
A tutorial on communicating with a computer is here. Device specific tutorials are on the Tutorial Page. For a good
explanation of serial communication see Wikipedia. The software serial connection can run at 4800 baud or 9600 baud
reliably.
Functions Available:
SWread(); Returns a byte long integer value from the software serial connection
Example:
byte RXval;
RXval = SWread();
SWprint(); Sends a byte long integer value out the software serial connection
Example:
Definitions Needed:
#define bit9600Delay 84
#define halfBit9600Delay 42
#define bit4800Delay 188
#define halfBit4800Delay 94
These definitions set the delays necessary for 9600 baud and 4800 baud software serial operation.
Materials needed:
Insert the device you want to communicate with in the breadboard. Connect ground on the breadboard to ground from the
microcontroller. If your device uses 5v power connect 5v from the microcontoller to 5v on the breadboard. Otherwise connect
power and ground from an alternate power source to the breadboard in the same fashion. Make any other connections
necessary for your device. Additionally you may want to connect an LED for debugging purposes between pin 13 and Ground.
Decide which pins you want to use for transmitting and receiving. In this example we will use pin 7 for transmitting and pin 6
for receiving, but any of the digital pins should work.
Now we will write the code to enable serial data communication. This program will simply wait for a character to arrive in the
serial recieving port and then spit it back out in uppercase out the transmit port. This is a good general purpose serial
debugging program and you should be able to extrapolate from this example to cover all your basic serial needs. We will walk
through the code in small sections.
#include <ctype.h>
#define bit9600Delay 84
#define halfBit9600Delay 42
#define bit4800Delay 188
#define halfBit4800Delay 94
Here we set up our pre-processor directives. Pre-processor directives are processed before the actual compilation begins.
They start with a "#" and do not end with semi-colons.
First we include the file ctype.h in our application. This gives us access to the toupper() function from the Character
Operations C library which we will use later in our main loop. This library is part of the Arduino install, so you don't need to
do anything other than type the #include line in order to use it. Next we establish our baudrate delay definitions. These are
pre-processor directives that define the delays for different baudrates. The #define bit9600Delay 84 line causes the
compiler to substitute the number 84 where ever it encounters the label "bit9600Delay". Pre-processor definitions are often
used for constants because they don't take up any program memory space on the chip.
byte rx = 6;
byte tx = 7;
byte SWval;
Here we set our transmit (tx) and recieve (rx) pins. Change the pin numbers to suit your application. We also allocate a
variable to store our recieved data in, SWval.
void setup() {
pinMode(rx,INPUT);
pinMode(tx,OUTPUT);
digitalWrite(tx,HIGH);
digitalWrite(13,HIGH); //turn on debugging LED
SWprint('h'); //debugging hello
SWprint('i');
SWprint(10); //carriage return
}
Here we initialize the lines, turn on our debugging LED and print a debugging message to confirm all is working as planned.
We can pass inidvidual characters or numbers to the SWprint function.
This is the SWprint function. First the transmit line is pulled low to signal a start bit. Then we itterate through a bit mask and
flip the output pin high or low 8 times for the 8 bits in the value to be transmitted. Finally we pull the line high again to
signal a stop bit. For each bit we transmit we hold the line high or low for the specified delay. In this example we are using
a 9600 baudrate. To use 4800 simply replace the variable bit9600Delay with bit4800Delay.
int SWread()
{
byte val = 0;
while (digitalRead(rx));
//wait for start bit
if (digitalRead(rx) == LOW) {
delayMicroseconds(halfBit9600Delay);
for (int offset = 0; offset < 8; offset++) {
delayMicroseconds(bit9600Delay);
val |= digitalRead(rx) << offset;
}
//wait for stop bit + extra
delayMicroseconds(bit9600Delay);
delayMicroseconds(bit9600Delay);
return val;
}
}
This is the SWread function. This will wait for a byte to arrive on the recieve pin and then return it to the allocated variable.
First we wait for the recieve line to be pulled low. We check after a half bit delay to make sure the line is still low and we
didn't just recieve line noise. Then we iterate through a bit mask and shift 1s or 0s into our output byte based on what we
recieve. Finally we allow a pause for the stop bit and then return the value.
void loop()
{
SWval = SWread();
SWprint(toupper(SWval));
}
Finally we implement our main program loop. In this program we simply wait for characters to arrive, change them to
uppercase and send them back. This is always a good program to run when you want to make sure a serial connection is
working properly.
For lots of fun serial devices check out the Sparkfun online catalog. They have lots of easy to use serial modules for GPS,
bluetooth, wi-fi, LCDs, etc.
For easy copy and pasting the full program text of this tutorial is below:
#include <ctype.h>
#define bit9600Delay 84
#define halfBit9600Delay 42
#define bit4800Delay 188
#define halfBit4800Delay 94
byte rx = 6;
byte tx = 7;
byte SWval;
void setup() {
pinMode(rx,INPUT);
pinMode(tx,OUTPUT);
digitalWrite(tx,HIGH);
digitalWrite(13,HIGH); //turn on debugging LED
SWprint('h'); //debugging hello
SWprint('i');
SWprint(10); //carriage return
}
int SWread()
{
byte val = 0;
while (digitalRead(rx));
//wait for start bit
if (digitalRead(rx) == LOW) {
delayMicroseconds(halfBit9600Delay);
for (int offset = 0; offset < 8; offset++) {
delayMicroseconds(bit9600Delay);
val |= digitalRead(rx) << offset;
}
//wait for stop bit + extra
delayMicroseconds(bit9600Delay);
delayMicroseconds(bit9600Delay);
return val;
}
}
void loop()
{
SWval = SWread();
SWprint(toupper(SWval));
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
RS-232
In this tutorial you will learn how to communicate with a computer using a MAX3323 single channel RS-232 driver/receiver
and a software serial connection on the Arduino. A general purpose software serial tutorial can be found here.
Materials needed:
Computer with a terminal program installed (ie. HyperTerminal or RealTerm on the PC, Zterm on Mac)
Serial-Breadboard cable
MAX3323 chip (or similar)
4 1uf capacitors
Solderless breadboard
Hookup wire
Arduino Microcontroller Module
Light emitting Diode (LED) - optional, for debugging
Insert the MAX3323 chip in the breadboard. Connect 5V power and ground from the breadboard to 5V power and ground
from the microcontroller. Connect pin 15 on the MAX233 chip to ground and pins 16 and 14 - 11 to 5V. If you are using an
LED connect it between pin 13 and ground.
+5v wires are red, GND wires are black
Connect a 1uF capacitor across pins 1 and 3, another across pins 4 and 5, another between pin 1 and ground, and the last
between pin 6 and ground. If you are using polarized capacitors make sure the negative pins connect to the negative sides
(pins 3 and 5 and ground).
Determine which Arduino pins you want to use for your transmit (TX) and recieve (RX) lines. In this tutorial we will be using
Arduino pin 6 for receiving and pin 7 for transmitting. Connect your TX pin (7) to MAX3323 pin 10 (T1IN). Connect your RX
pin (6) to MAX3323 pin 9 (R1OUT).
TX wire Green, RX wire Blue, +5v wires are red, GND wires are black
Cables
If you do not have one already, you need to make a cable to connect from the serial port (or USB-serial adapter) on your
computer and the breadboard. To do this, pick up a female DB9 connector from radioshack. Pick three different colors of wire,
one for TX, one for RX, and one for ground. Solder your TX wire to pin 2 of the DB9 connector, RX wire to pin 3 and Ground
to pin 5.
Connect pins 1 and 6 to pin 4 and pin 7 to pin 8. Heatshrink the wire connections to avoid accidental shorts.
Enclose the connector in a backshell to further protect the signal and enable easy unplugging from your serial port.
Connect the TX line from your computer to pin 8 (R1IN) on the MAX233 and the RX line to pin 7 (T1OUT). Connect the
ground line from your computer to ground on the breadboard.
TX wires Green, RX wires Blue, +5v wires are red, GND wires are black
#include <ctype.h>
#define bit9600Delay 84
#define halfBit9600Delay 42
#define bit4800Delay 188
#define halfBit4800Delay 94
byte rx = 6;
byte tx = 7;
byte SWval;
void setup() {
pinMode(rx,INPUT);
pinMode(tx,OUTPUT);
digitalWrite(tx,HIGH);
digitalWrite(13,HIGH); //turn on debugging LED
SWprint('h'); //debugging hello
SWprint('i');
SWprint(10); //carriage return
}
int SWread()
{
byte val = 0;
while (digitalRead(rx));
//wait for start bit
if (digitalRead(rx) == LOW) {
delayMicroseconds(halfBit9600Delay);
for (int offset = 0; offset < 8; offset++) {
delayMicroseconds(bit9600Delay);
val |= digitalRead(rx) << offset;
}
//wait for stop bit + extra
delayMicroseconds(bit9600Delay);
delayMicroseconds(bit9600Delay);
return val;
}
}
void loop()
{
SWval = SWread();
SWprint(toupper(SWval));
}
Open up your serial terminal program and set it to 9600 baud, 8 data bits, 1 stop bit, no parity, no hardware flow control.
Press the reset button on the arduino board. The word "hi" should appear in the terminal window followed by an advancement
to the next line. Here is a shot of what it should look like in Hyperterminal, the free pre-installed windows terminal
application.
Now, try typing a lowercase character into the terminal window. You should see the letter you typed return to you in
uppercase.
If this works, congratulations! Your serial connection is working as planned. You can now use your new serial/computer
connection to print debugging statements from your code, and to send commands to your microcontroller.
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Materials Needed:
With an SPI connection there is always one master device (usually a microcontroller) which controls the peripheral devices.
Typically there are three lines common to all the devices,
Master In Slave Out (MISO) - The Slave line for sending data to the master,
Master Out Slave In (MOSI) - The Master line for sending data to the peripherals,
Serial Clock (SCK) - The clock pulses which synchronize data transmission generated by the master, and
Slave Select pin - allocated on each device which the master can use to enable and disable specific devices and avoid
false transmissions due to line noise.
The difficult part about SPI is that the standard is loose and each device implements it a little differently. This means you
have to pay special attention to the datasheet when writing your interface code. Generally speaking there are three modes of
transmission numbered 0 - 3. These modes control whether data is shifted in and out on the rising or falling edge of the data
clock signal, and whether the clock is idle when high or low.
All SPI settings are determined by the Arduino SPI Control Register (SPCR). A register is just a byte of microcontroller
memory that can be read from or written to. Registers generally serve three purposes, control, data and status.
Control registers code control settings for various microcontroller functionalities. Usually each bit in a control register effects a
particular setting, such as speed or polarity.
Data registers simply hold bytes. For example, the SPI data register (SPDR) holds the byte which is about to be shifted out
the MOSI line, and the data which has just been shifted in the MISO line.
Status registers change their state based on various microcontroller conditions. For example, the seventh bit of the SPI status
register (SPSR) gets set to 1 when a value is shifted in or out of the SPI.
The SPI control register (SPCR) has 8 bits, each of which control a particular SPI setting.
SPCR
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |
This means that to write code for a new SPI device you need to note several things and set the SPCR accordingly:
Once you have your SPI Control Register set correctly you just need to figure out how long you need to pause between
instructions and you are ready to go. Now that you have a feel for how SPI works, let's take a look at the details of the
EEPROM chip.
The AT25HP512 is a 65,536 byte serial EEPROM. It supports SPI modes 0 and 3, runs at up to 10MHz at 5v and can run at
slower speeds down to 1.8v. It's memory is organized as 512 pages of 128 bytes each. It can only be written 128 bytes at a
time, but it can be read 1-128 bytes at a time. The device also offers various degerees of write protection and a hold pin,
but we won't be covering those in this tutorial.
The device is enabled by pulling the Chip Select (CS) pin low. Instructions are sent as 8 bit operational codes (opcodes) and
are shifted in on the rising edge of the data clock. It takes the EEPROM about 10 milliseconds to write a page (128 bytes) of
data, so a 10ms pause should follow each EEPROM write routine.
Connect EEPROM pin 1 to Arduino pin 10 (Slave Select - SS), EEPROM pin 2 to Arduino pin 12 (Master In Slave Out - MISO),
EEPROM pin 5 to Arduino pin 11 (Master Out Slave In - MOSI), and EEPROM pin 6 to Arduino pin 13 (Serial Clock - SCK).
SS wire is white, MISO wire is yellow, MOSI wire is blue, SCK wire is green
The first step is setting up our pre-processor directives. Pre-processor directives are processed before the actual compilation
begins. They start with a "#" and do not end with semi-colons.
We define the pins we will be using for our SPI connection, DATAOUT, DATAIN, SPICLOCK and SLAVESELECT. Then we define
our opcodes for the EEPROM. Opcodes are control commands:
//opcodes
#define WREN 6
#define WRDI 4
#define RDSR 5
#define WRSR 1
#define READ 3
#define WRITE 2
Here we allocate the global variables we will be using later in the program. Note char buffer [128];. this is a 128 byte
array we will be using to store the data for the EEPROM write:
byte eeprom_output_data;
byte eeprom_input_data=0;
byte clr;
int address=0;
//data buffer
char buffer [128];
First we initialize our serial connection, set our input and output pin modes and set the SLAVESELECT line high to start. This
deselects the device and avoids any false transmission messages due to line noise:
void setup()
{
Serial.begin(9600);
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK,OUTPUT);
pinMode(SLAVESELECT,OUTPUT);
digitalWrite(SLAVESELECT,HIGH); //disable device
Now we set the SPI Control register (SPCR) to the binary value 01010000. In the control register each bit sets a different
functionality. The eighth bit disables the SPI interrupt, the seventh bit enables the SPI, the sixth bit chooses transmission
with the most significant bit going first, the fifth bit puts the Arduino in Master mode, the fourth bit sets the data clock idle
when it is low, the third bit sets the SPI to sample data on the rising edge of the data clock, and the second and first bits
set the speed of the SPI to system speed / 4 (the fastest). After setting our control register up we read the SPI status
register (SPSR) and data register (SPDR) in to the junk clr variable to clear out any spurious data from past runs:
// SPCR = 01010000
//interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
//sample on leading edge of clk,system clock/4 rate (fastest)
SPCR = (1<<SPE)|(1<<MSTR);
clr=SPSR;
clr=SPDR;
delay(10);
Here we fill our data array with numbers and send a write enable instruction to the EEPROM. The EEPROM MUST be write
enabled before every write instruction. To send the instruction we pull the SLAVESELECT line low, enabling the device, and
then send the instruction using the spi_transfer function. Note that we use the WREN opcode we defined at the beginning of
the program. Finally we pull the SLAVESELECT line high again to release it:
Now we pull the SLAVESELECT line low to select the device again after a brief delay. We send a WRITE instruction to tell the
EEPROM we will be sending data to record into memory. We send the 16 bit address to begin writing at in two bytes, Most
Significant Bit first. Next we send our 128 bytes of data from our buffer array, one byte after another without pause. Finally
we set the SLAVESELECT pin high to release the device and pause to allow the EEPROM to write the data:
delay(10);
digitalWrite(SLAVESELECT,LOW);
spi_transfer(WRITE); //write instruction
address=0;
spi_transfer((char)(address>>8)); //send MSByte address first
spi_transfer((char)(address)); //send LSByte address
//write 128 bytes
for (int I=0;I<128;I++)
{
spi_transfer(buffer[I]); //write data byte
}
digitalWrite(SLAVESELECT,HIGH); //release chip
//wait for eeprom to finish writing
delay(3000);
We end the setup function by sending the word "hi" plus a line feed out the built in serial port for debugging purposes. This
way if our data comes out looking funny later on we can tell it isn't just the serial port acting up:
Serial.print('h',BYTE);
Serial.print('i',BYTE);
Serial.print('\n',BYTE);//debug
delay(1000);
}
In our main loop we just read one byte at a time from the EEPROM and print it out the serial port. We add a line feed and a
pause for readability. Each time through the loop we increment the eeprom address to read. When the address increments to
128 we turn it back to 0 because we have only filled 128 addresses in the EEPROM with data:
void loop()
{
eeprom_output_data = read_eeprom(address);
Serial.print(eeprom_output_data,DEC);
Serial.print('\n',BYTE);
address++;
delay(500); //pause for readability
}
The fill_buffer function simply fills our data array with numbers 0 - 127 for each index in the array. This function could easily
be changed to fill the array with data relevant to your application:
void fill_buffer()
{
for (int I=0;I<128;I++)
{
buffer[I]=I;
}
}
The spi_transfer function loads the output data into the data transmission register, thus starting the SPI transmission. It polls
a bit to the SPI Status register (SPSR) to detect when the transmission is complete using a bit mask, SPIF. An explanation of
bit masks can be found here. It then returns any data that has been shifted in to the data register by the EEPROM:
The read_eeprom function allows us to read data back out of the EEPROM. First we set the SLAVESELECT line low to enable
the device. Then we transmit a READ instruction, followed by the 16-bit address we wish to read from, Most Significant Bit
first. Next we send a dummy byte to the EEPROM for the purpose of shifting the data out. Finally we pull the SLAVESELECT
line high again to release the device after reading one byte, and return the data. If we wanted to read multiple bytes at a
time we could hold the SLAVESELECT line low while we repeated the data = spi_transfer(0xFF); up to 128 times for a full
page of data:
For easy copy and pasting the full program text of this tutorial is below:
//opcodes
#define WREN 6
#define WRDI 4
#define RDSR 5
#define WRSR 1
#define READ 3
#define WRITE 2
byte eeprom_output_data;
byte eeprom_input_data=0;
byte clr;
int address=0;
//data buffer
char buffer [128];
void fill_buffer()
{
for (int I=0;I<128;I++)
{
buffer[I]=I;
}
}
void setup()
{
Serial.begin(9600);
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK,OUTPUT);
pinMode(SLAVESELECT,OUTPUT);
digitalWrite(SLAVESELECT,HIGH); //disable device
// SPCR = 01010000
//interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
//sample on leading edge of clk,system clock/4 rate (fastest)
SPCR = (1<<SPE)|(1<<MSTR);
clr=SPSR;
clr=SPDR;
delay(10);
//fill buffer with data
fill_buffer();
//fill eeprom w/ buffer
digitalWrite(SLAVESELECT,LOW);
spi_transfer(WREN); //write enable
digitalWrite(SLAVESELECT,HIGH);
delay(10);
digitalWrite(SLAVESELECT,LOW);
spi_transfer(WRITE); //write instruction
address=0;
spi_transfer((char)(address>>8)); //send MSByte address first
spi_transfer((char)(address)); //send LSByte address
//write 128 bytes
for (int I=0;I<128;I++)
{
spi_transfer(buffer[I]); //write data byte
}
digitalWrite(SLAVESELECT,HIGH); //release chip
//wait for eeprom to finish writing
delay(3000);
Serial.print('h',BYTE);
Serial.print('i',BYTE);
Serial.print('\n',BYTE);//debug
delay(1000);
}
void loop()
{
eeprom_output_data = read_eeprom(address);
Serial.print(eeprom_output_data,DEC);
Serial.print('\n',BYTE);
address++;
if (address == 128)
address = 0;
delay(500); //pause for readability
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Materials Needed:
For example, in this tutorial we will be using each variable resistor as a voltage divider by pulling one side pin (pin B) high,
pulling another side pin (pin A) low and taking the variable voltage output of the center pin (Wiper).
The AD5206 is digitally controlled using SPI. The device is enabled by pulling the Chip Select (CS) pin low. Instructions are
sent as 11 bit operational codes (opcodes) with the three most significant bits (11-9) defining the address of which
potentiometer to adjust and the eight least significant bits (8-1) defining what value to set that potentiometer to from 0-255.
Data is shifted in Most Significant Bit (MSB) first on the rising edge of the data clock. The data clock is idle when low, and
the interface runs much faster than the Arduino, so we don't need to worry about pre-scaling to slow down the transmission.
Prepare the Breadboard
Insert the AD5206 chip into the breadboard. Connect 5V power and ground from the breadboard to 5V power and ground
from the microcontroller. Connect AD5206 pins 3, 6, 10, 13, 16, 21 and 24 to 5v and pins 1, 4, 9, 12, 15, 18, 19, and 22 to
ground. We are connecting all the A pins to ground and all of the B pins to 5v to create 6 voltage dividers.
Connect AD5206 pin 5 to Arduino pin 10 (Slave Select - SS), AD5206 pin 7 to Arduino pin 11 (Master Out Slave In - MOSI),
and AD5206 pin 8 to Arduino pin 13 (Serial Clock - SCK).
Finally, connect an LED between each Wiper pin (AD5206 pins 2, 11, 14, 17, 20 and 23) and ground so that the long pin of
the LED connects to the wiper and the short pin, or flat side of the LED connects to ground.
Program the Arduino
Now we will write the code to enable SPI control of the AD5206. This program will sequentially pulse each LED on and then
fade it out gradually. This is accomplished in the main loop of the program by individually changing the resistance of each
potentiometer from full off to full on over its full range of 255 steps.
We define the pins we will be using for our SPI connection, DATAOUT, DATAIN, SPICLOCK and SLAVESELECT. Although we
are not reading any data back out of the AD5206 in this program, pin 12 is attached to the builtin SPI so it is best not to
use it for other programming functions to avoid any possible errors:
Next we allocate variables to store resistance values and address values for the potentiometers:
byte pot=0;
byte resistance=0;
First we set our input and output pin modes and set the SLAVESELECT line high to start. This deselects the device and avoids
any false transmission messages due to line noise:
void setup()
{
byte clr;
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK,OUTPUT);
pinMode(SLAVESELECT,OUTPUT);
digitalWrite(SLAVESELECT,HIGH); //disable device
Now we set the SPI Control register (SPCR) to the binary value 01010000. In the control register each bit sets a different
functionality. The eighth bit disables the SPI interrupt, the seventh bit enables the SPI, the sixth bit chooses transmission
with the most significant bit going first, the fifth bit puts the Arduino in Master mode, the fourth bit sets the data clock idle
when it is low, the third bit sets the SPI to sample data on the rising edge of the data clock, and the second and first bits
set the speed of the SPI to system speed / 4 (the fastest). After setting our control register up we read the SPI status
register (SPSR) and data register (SPDR) in to the junk clr variable to clear out any spurious data from past runs:
SPCR = (1<<SPE)|(1<<MSTR);
clr=SPSR;
clr=SPDR;
delay(10);
We conclude the setup function by setting all the potentiometers to full on resistance states thereby turning the LEDs off:
for (i=0;i<6;i++)
{
write_pot(i,255);
}
}
In our main loop we iterate through each resistance value (0-255) for each potentiometer address (0-5). We pause for 10
milliseconds each iteration to make the steps visible. This causes the LEDs to sequentially flash on brightly and then fade out
slowly:
void loop()
{
write_pot(pot,resistance);
delay(10);
resistance++;
if (resistance==255)
{
pot++;
}
if (pot==6)
{
pot=0;
}
}
The spi_transfer function loads the output data into the data transmission register, thus starting the SPI transmission. It polls
a bit to the SPI Status register (SPSR) to detect when the transmission is complete using a bit mask, SPIF. An explanation of
bit masks can be found here. It then returns any data that has been shifted in to the data register by the EEPROM:
The write_pot function allows us to control the individual potentiometers. We set the SLAVESELECT line low to enable the
device. Then we transfer the address byte followed by the resistance value byte. Finally, we set the SLAVSELECT line high
again to release the chip and signal the end of our data transfer.
LED video
For easy copy and pasting the full program text of this tutorial is below:
void setup()
{
byte i;
byte clr;
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK,OUTPUT);
pinMode(SLAVESELECT,OUTPUT);
digitalWrite(SLAVESELECT,HIGH); //disable device
// SPCR = 01010000
//interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
//sample on leading edge of clk,system clock/4 (fastest)
SPCR = (1<<SPE)|(1<<MSTR);
clr=SPSR;
clr=SPDR;
delay(10);
for (i=0;i<6;i++)
{
write_pot(i,255);
}
}
void loop()
{
write_pot(pot,resistance);
delay(10);
resistance++;
if (resistance==255)
{
pot++;
}
if (pot==6)
{
pot=0;
}
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
How this all works is through something called “synchronous serial communication,” i.e. you can pulse one pin up and down
thereby communicating a data byte to the register bit by bit. It's by pulsing second pin, the clock pin, that you delineate
between bits. This is in contrast to using the “asynchronous serial communication” of the Serial.begin() function which relies
on the sender and the receiver to be set independently to an agreed upon specified data rate. Once the whole byte is
transmitted to the register the HIGH or LOW messages held in each bit get parceled out to each of the individual output pins.
This is the “parallel output” part, having all the pins do what you want them to do all at once.
The “serial output” part of this component comes from its extra pin which can pass the serial information received from the
microcontroller out again unchanged. This means you can transmit 16 bits in a row (2 bytes) and the first 8 will flow through
the first register into the second register and be expressed there. You can learn to do that from the second example.
“3 states” refers to the fact that you can set the output pins as either high, low or “high impedance.” Unlike the HIGH and
LOW states, you can’t set pins to their high impedance state individually. You can only set the whole chip together. This is a
pretty specialized thing to do -- Think of an LED array that might need to be controlled by completely different
microcontrollers depending on a specific mode setting built into your project. Neither example takes advantage of this feature
and you won’t usually need to worry about getting a chip that has it.
Here is a table explaining the pin-outs adapted from the Phillip's datasheet.
1. Turning it on
This set up makes all of the output pins active and addressable all the time. The one flaw of this set up is that you end up
with the lights turning on to their last state or something arbitrary every time you first power up the circuit before the
program starts to run. You can get around this by controlling the MR and OE pins from your Arduino board too, but this way
will work and leave you with more open pins.
2. Connect to Arduino
From now on those will be refered to as the dataPin, the clockPin and the latchPin respectively. Notice the 0.1µf capacitor on
the latchPin, if you have some flicker when the latch pin pulses you can use a capacitor to even it out.
3. Add 8 LEDs.
In this case you should connect the cathode (short pin) of each LED to a common ground, and the anode (long pin) of each
LED to its respective shift register output pin. Using the shift register to supply power like this is called sourcing current.
Some shift registers can't source current, they can only do what is called sinking current. If you have one of those it means
you will have to flip the direction of the LEDs, putting the anodes directly to power and the cathodes (ground pins) to the
shift register outputs. You should check the your specific datasheet if you aren’t using a 595 series chip. Don’t forget to add a
220-ohm resistor in series to protect the LEDs from being overloaded.
Circuit Diagram
The Code
Here are three code examples. The first is just some “hello world” code that simply outputs a byte value from 0 to 255. The
second program lights one LED at a time. The third cycles through an array.
The code is based on two pieces of information in the datasheet: the timing diagram and the logic table. The logic table is
what tells you that basically everything important happens on an up beat. When the clockPin goes from low to high, the shift
register reads the state of the data pin. As the data gets shifted in it is saved in an internal memory register. When the
latchPin goes from low to high the sent data gets moved from the shift registers aforementioned memory register into the
output pins, lighting the LEDs.
Example 2
In this example you’ll add a second shift register, doubling the number of output pins you have while still using the same
number of pins from the Arduino.
The Circuit
Starting from the previous example, you should put a second shift register on the board. It should have the same leads to
power and ground.
Two of these connections simply extend the same clock and latch signal from the Arduino to the second shift register (yellow
and green wires). The blue wire is going from the serial out pin (pin 9) of the first shift register to the serial data input (pin
14) of the second register.
3. Add a second set of LEDs.
In this case I added green ones so when reading the code it is clear which byte is going to which set of LEDs
Circuit Diagram
The Code
Here again are three code samples. If you are curious, you might want to try the samples from the first example with this
circuit set up just to see what happens.
data = dataArray[j];
becomes
dataRED = dataArrayRED[j];
dataGREEN = dataArrayGREEN[j];
and
becomes
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
X10 Library
This library enables you to send and receive X10 commands from an Arduino module. X10 is a synchronous serial protocol
that travels over AC power lines, sending a bit every time the AC power crosses zero volts. It's used in home automation.
You can find X10 controllers and devices at http://www.x10.com, http://www.smarthome.com, and more.
This library has been tested using the PL513 one-way X10 controller, and the TW523 two-way X10 controller. Both of these
are essentially X10 modems, converting the 5V output of the Arduino into AC signals on the zero crossing.
To connect an Arduino to one of these modules, get a phone cable with an RJ-11 connector, and cut one end off. Then wire
the pins as follows:
Download: X10.zip
To use, unzip it and copy the resulting folder, called TextString, into the lib/targets/libraries directory of your arduino
application folder. Then re-start the Arduino application.
When you restart, you'll see a few warning messages in the debugger pane at the bottom of the program. You can ignore
them.
x10(int strLength) - initialize an instance of the X10 library on two digital pins. e.g.
x10 myHouse = x10(9, 10); // initializes X10 on pins 9 (zero crossing pin) and 10 (data pin)
void write(byte houseCode, byte numberCode, int numRepeats) - Send an X10 message, e.g.
version(void) - get the library version. Since there will be more functions added, printing the version is a useful debugging
tool when you get an error from a given function. Perhaps you're using an earlier version that doesn't feature the version you
need! e.g.
There are a number of constants added to make X10 easier. They are as follows:
For a full explanation of X10 and these codes, see this technote
If anyone's interested in helping to develop this library further, please contact me at tom.igoe at gmail.com
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
EEPROM Clear
Sets all of the bytes of the EEPROM to 0.
Code
#include <EEPROM.h>
void setup()
{
// write a 0 to all 512 bytes of the EEPROM
for (int i = 0; i < 512; i++)
EEPROM.write(i, 0);
void loop()
{
}
See also
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
EEPROM Read
Reads the value of each byte of the EEPROM and prints it to the computer.
Code
#include <EEPROM.h>
void setup()
{
Serial.begin(9600);
}
void loop()
{
// read a byte from the current address of the EEPROM
value = EEPROM.read(address);
Serial.print(address);
Serial.print("\t");
Serial.print(value, DEC);
Serial.println();
delay(500);
}
See also
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
EEPROM Write
Stores values read from analog input 0 into the EEPROM. These values will stay in the EEPROM when the board is turned off
and may be retrieved later by another sketch.
Code
#include <EEPROM.h>
void setup()
{
}
void loop()
{
// need to divide by 4 because analog inputs range from
// 0 to 1023 and each byte of the EEPROM can only hold a
// value from 0 to 255.
int val = analogRead(0) / 4;
delay(100);
}
See also
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Motor Knob
Description
A stepper motor follows the turns of a potentiometer (or other sensor) on analog input 0. The unipolar or bipolar stepper is
controlled with pins 8, 9, 10, and 11, using one of the circuits on the linked pages.
Code
#include <Stepper.h>
void setup()
{
// set the speed of the motor to 30 RPMs
stepper.setSpeed(30);
}
void loop()
{
// get the sensor value
int val = analogRead(0);
See also
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Login to Arduino
Username:
Password:
Login
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Tutorial.HomePage History
Hide minor edits - Show changes to markup
Arduino Examples
to:
Examples
Restore
July 02, 2008, at 03:11 PM by David A. Mellis -
Changed lines 4-5 from:
See the foundations page for in-depth description of core concepts of the Arduino hardware and software, and the links
page for other documentation.
to:
See the foundations page for in-depth description of core concepts of the Arduino hardware and software; the hacking
page for information on extending and modifying the Arduino hardware and software; and the links page for other
documentation.
Restore
July 02, 2008, at 02:07 PM by David A. Mellis -
Added line 63:
Restore
May 21, 2008, at 09:44 PM by David A. Mellis -
Deleted lines 42-45:
Matrix Library
Restore
May 21, 2008, at 09:43 PM by David A. Mellis -
Added lines 43-46:
Matrix Library
Restore
May 21, 2008, at 09:36 PM by David A. Mellis -
Added lines 43-46:
Stepper Library
Restore
May 21, 2008, at 09:25 PM by David A. Mellis - adding EEPROM examples.
Added lines 37-42:
EEPROM Library
Restore
May 21, 2008, at 09:22 PM by David A. Mellis -
Changed line 15 from:
to:
Blink Without Delay: blinking an LED without using the delay() function.
Restore
April 29, 2008, at 06:55 PM by David A. Mellis - moving the resources to the links page.
Changed lines 2-5 from:
Arduino Tutorials
Here you will find a growing number of examples and tutorials for accomplishing specific tasks or interfacing to other
hardware and software with Arduino. For instructions on getting the board and environment up and running, see the Arduino
Getting Started.
to:
Arduino Examples
See the foundations page for in-depth description of core concepts of the Arduino hardware and software, and the links
page for other documentation.
(:if false:)
TimeSinceStart:
(:ifend:)
to:
(:cell width=50%:)
These are more complex examples for using particular electronic components or accomplishing specific tasks. The code is
included in the tutorial.
to:
These are more complex examples for using particular electronic components or accomplishing specific tasks. The code is
included on the page.
Stopwatch
Foundations
See the foundations page for explanations of the concepts involved in the Arduino hardware and software.
Tutorials
Tutorials created by the Arduino community. Hosted on the publicly-editable playground wiki.
Board Setup and Configuration: Information about the components and usage of Arduino hardware.
Interfacing With Hardware: Code, circuits, and instructions for using various electronic components with an Arduino board.
Output
Input
Interaction
Storage
Communication
Interfacing with Software: how to get an Arduino board talking to software running on the computer (e.g. Processing, PD,
Flash, Max/MSP).
Code Library and Tutorials: Arduino functions for performing specific tasks and other programming tutorials.
Arduino Booklet (pdf): an illustrated guide to the philosophy and practice of Arduino.
Learn electronics using Arduino: an introduction to programming, input / output, communication, etc. using Arduino. By
ladyada.
Spooky Arduino: Longer presentation-format documents introducing Arduino from a Halloween hacking class taught by
TodBot:
Bionic Arduino: another Arduino class from TodBot, this one focusing on physical sensing and making motion.
Restore
April 23, 2008, at 10:29 PM by David A. Mellis -
Changed line 6 from:
to:
Restore
April 22, 2008, at 05:59 PM by Paul Badger -
Changed line 39 from:
to:
(:if false:)
(:ifend:)
Restore
April 22, 2008, at 05:56 PM by Paul Badger -
Added lines 40-41:
TimeSinceStart:
Restore
April 18, 2008, at 07:22 AM by Paul Badger -
Added lines 36-39:
to:
Restore
April 08, 2008, at 08:23 PM by David A. Mellis -
Changed line 43 from:
to:
Restore
April 08, 2008, at 08:22 PM by David A. Mellis - moving TwoSwitchesOnePin to "other examples" since it's not (yet) in the
distribution.
Changed lines 18-19 from:
to:
Added line 43:
Restore
April 08, 2008, at 07:41 PM by Paul Badger -
Changed lines 18-19 from:
to:
Restore
March 09, 2008, at 07:20 PM by David A. Mellis -
Changed lines 73-78 from:
Bootloader: A small program pre-loaded on the Arduino board to allow uploading sketches.
to:
See the foundations page for explanations of the concepts involved in the Arduino hardware and software.
Restore
March 07, 2008, at 09:26 PM by Paul Badger -
Changed lines 73-75 from:
to:
Foundations has moved here
Restore
March 07, 2008, at 09:24 PM by Paul Badger -
Changed lines 74-107 from:
Digital Pins: How the pins work and what it means for them to be configured as inputs or outputs.
Analog Input Pins: Details about the analog-to-digital conversion and other uses of the pins.
Foundations
(:if false:)
PWM (Pulse-Width Modulation): The method used by analogWrite() to simulate an analog output with digital pins.
Communication?: An overview of the various ways in which an Arduino board can communicate with other devices
(serial, I2C, SPI, Midi, etc.)
Serial Communication?: How to send serial data from an Arduino board to a computer or other device (including via
the USB connection).
Numbers?: The various types of numbers available and how to use them.
Pointers?:
Debugging?: Figuring out what's wrong with your hardware or software and how to fix it.
(:ifend:)
to:
Restore
March 07, 2008, at 09:09 PM by Paul Badger -
Added lines 80-81:
Foundations
Restore
February 15, 2008, at 06:00 PM by David A. Mellis -
Changed lines 72-73 from:
Tutorials
to:
Foundations
More Tutorials
to:
Tutorials
Restore
February 13, 2008, at 10:42 PM by Paul Badger -
Changed lines 4-5 from:
Here you will find a growing number of examples and tutorials for accomplishing specific tasks or interfacing to other
hardware and software with Arduino. For instructions on getting the board and environment up and running, see the Arduino
guide.
to:
Here you will find a growing number of examples and tutorials for accomplishing specific tasks or interfacing to other
hardware and software with Arduino. For instructions on getting the board and environment up and running, see the Arduino
Getting Started.
Restore
February 13, 2008, at 10:06 PM by David A. Mellis -
Restore
February 13, 2008, at 09:58 PM by David A. Mellis -
Added lines 100-103:
Debugging?: Figuring out what's wrong with your hardware or software and how to fix it.
Restore
February 13, 2008, at 09:41 PM by David A. Mellis -
Added lines 90-99:
Numbers?: The various types of numbers available and how to use them.
Pointers?:
Restore
February 13, 2008, at 09:38 PM by David A. Mellis -
Changed lines 86-87 from:
Serial Communication?: How to send serial data from an Arduino board to a computer or other device.
to:
Serial Communication?: How to send serial data from an Arduino board to a computer or other device (including via
the USB connection).
Restore
February 13, 2008, at 09:36 PM by David A. Mellis -
Added lines 80-81:
(:if false:)
Communication?: An overview of the various ways in which an Arduino board can communicate with other devices
(serial, I2C, SPI, Midi, etc.)
Serial Communication?: How to send serial data from an Arduino board to a computer or other device.
(:ifend:)
Restore
February 13, 2008, at 09:31 PM by David A. Mellis -
Changed lines 80-81 from:
PWM (Pulse-Width Modulation): The method used by analogWrite() to simulate an analog output with digital pins.
to:
PWM (Pulse-Width Modulation): The method used by analogWrite() to simulate an analog output with digital pins.
Restore
February 13, 2008, at 09:30 PM by David A. Mellis -
Added lines 80-81:
PWM (Pulse-Width Modulation): The method used by analogWrite() to simulate an analog output with digital pins.
Restore
February 13, 2008, at 09:22 PM by David A. Mellis -
Added lines 80-81:
Bootloader: A small program pre-loaded on the Arduino board to allow uploading sketches.
Restore
February 13, 2008, at 09:12 PM by David A. Mellis -
Added lines 74-81:
Digital Pins: How the pins work and what it means for them to be configured as inputs or outputs.
Analog Input Pins: Details about the analog-to-digital conversion and other uses of the pins.
More Tutorials
Restore
January 11, 2008, at 11:31 AM by David A. Mellis - linking to board setup and configuration on the playground.
Added lines 76-77:
Board Setup and Configuration: Information about the components and usage of Arduino hardware.
Restore
December 19, 2007, at 11:54 PM by David A. Mellis - adding links to other pages: the tutorial parts of the playground,
ladyada's tutorials, todbot, etc.
Changed lines 36-42 from:
(:cell width=50%:)
Tutorials
These are more complex tutorials for using particular electronic components or accomplishing specific tasks. The code is
included in the tutorial.
to:
Other Examples
These are more complex examples for using particular electronic components or accomplishing specific tasks. The code is
included in the tutorial.
to:
(:cell width=50%:)
Tutorials
Tutorials created by the Arduino community. Hosted on the publicly-editable playground wiki.
Interfacing With Hardware: Code, circuits, and instructions for using various electronic components with an Arduino board.
Output
Input
Interaction
Storage
Communication
Interfacing with Software: how to get an Arduino board talking to software running on the computer (e.g. Processing, PD,
Flash, Max/MSP).
Code Library and Tutorials: Arduino functions for performing specific tasks and other programming tutorials.
Arduino Booklet (pdf): an illustrated guide to the philosophy and practice of Arduino.
Learn electronics using Arduino: an introduction to programming, input / output, communication, etc. using Arduino. By
ladyada.
Spooky Arduino: Longer presentation-format documents introducing Arduino from a Halloween hacking class taught by
TodBot:
Bionic Arduino: another Arduino class from TodBot, this one focusing on physical sensing and making motion.
Restore
December 13, 2007, at 11:08 PM by David A. Mellis - adding debounce example.
Added line 16:
Restore
August 28, 2007, at 11:15 PM by Tom Igoe -
Changed lines 71-72 from:
to:
Restore
June 15, 2007, at 05:04 PM by David A. Mellis - adding link to Processing (for the communication examples)
Added lines 27-28:
These examples include code that allows the Arduino to talk to Processing sketches running on the computer. For more
information or to download Processing, see processing.org.
Restore
June 12, 2007, at 08:57 AM by David A. Mellis - removing link to obsolete joystick example.
Deleted line 43:
Interfacing a Joystick
Restore
June 11, 2007, at 11:14 PM by David A. Mellis -
Changed lines 10-11 from:
Simple programs that demonstrate the use of the Arduino board. These are included with the Arduino environment; to open
them, click the Open button on the toolbar and look in the examples folder. (If you're looking for an older example, check
the Arduino 0007 tutorials page.
to:
Simple programs that demonstrate the use of the Arduino board. These are included with the Arduino environment; to open
them, click the Open button on the toolbar and look in the examples folder. (If you're looking for an older example, check
the Arduino 0007 tutorials page.)
Restore
June 11, 2007, at 11:13 PM by David A. Mellis -
Changed lines 10-11 from:
Simple programs that demonstrate the use of the Arduino board. These are included with the Arduino environment; to open
them, click the Open button on the toolbar and look in the examples folder.
to:
Simple programs that demonstrate the use of the Arduino board. These are included with the Arduino environment; to open
them, click the Open button on the toolbar and look in the examples folder. (If you're looking for an older example, check
the Arduino 0007 tutorials page.
Restore
June 11, 2007, at 11:10 PM by David A. Mellis - updating to 0008 examples
Changed lines 10-11 from:
Digital Output
Blinking LED
to:
Simple programs that demonstrate the use of the Arduino board. These are included with the Arduino environment; to open
them, click the Open button on the toolbar and look in the examples folder.
Digital I/O
Analog I/O
Communication
(:cell width=50%:)
Tutorials
These are more complex tutorials for using particular electronic components or accomplishing specific tasks. The code is
included in the tutorial.
Miscellaneous
Digital Input
Analog Input
Read a Potentiometer
to:
Deleted line 54:
to:
(:cell width=50%:)
Restore
May 11, 2007, at 06:06 AM by Paul Badger -
Changed lines 17-18 from:
to:
Restore
May 10, 2007, at 07:07 PM by Paul Badger -
Changed lines 36-37 from:
to:
Restore
May 10, 2007, at 07:05 PM by Paul Badger -
Changed lines 36-37 from:
to:
Restore
May 10, 2007, at 07:04 PM by Paul Badger -
Changed lines 36-37 from:
to:
Restore
May 10, 2007, at 06:59 PM by Paul Badger -
Added line 39:
Restore
April 24, 2007, at 03:40 PM by Clay Shirky -
Changed lines 13-14 from:
to:
Restore
February 08, 2007, at 12:02 PM by Carlyn Maw -
Changed lines 52-53 from:
to:
Restore
February 06, 2007, at 02:52 PM by Carlyn Maw -
Changed lines 52-54 from:
to:
Restore
February 06, 2007, at 02:51 PM by Carlyn Maw -
Changed lines 52-53 from:
to:
Restore
January 30, 2007, at 03:37 PM by David A. Mellis -
Deleted line 46:
Restore
December 25, 2006, at 11:57 PM by David A. Mellis -
Added line 20:
Restore
December 07, 2006, at 06:04 AM by David A. Mellis - adding link to todbot's C serial port code.
Changed lines 69-70 from:
to:
Arduino + C
Restore
December 02, 2006, at 10:43 AM by David A. Mellis -
Added line 1:
(:title Tutorials:)
Restore
November 21, 2006, at 10:13 AM by David A. Mellis -
Added line 64:
Arduino + MaxMSP
Arduino + Ruby
Restore
November 18, 2006, at 02:42 AM by David A. Mellis -
Changed lines 20-21 from:
to:
Added line 24:
Restore
November 09, 2006, at 03:10 PM by Carlyn Maw -
Changed lines 50-51 from:
to:
Restore
November 06, 2006, at 10:49 AM by David A. Mellis -
Changed lines 37-38 from:
to:
MIDI Output (from ITP physcomp labs) and from Spooky Arduino
Restore
November 04, 2006, at 12:25 PM by David A. Mellis -
Deleted line 53:
Deleted line 54:
Restore
November 04, 2006, at 12:24 PM by David A. Mellis -
Added lines 51-58:
Restore
November 04, 2006, at 12:24 PM by David A. Mellis -
Changed lines 50-51 from:
to:
Changed lines 77-78 from:
Also, see the examples from Tom Igoe and those from Jeff Gray.
to:
Restore
November 04, 2006, at 12:23 PM by David A. Mellis -
Changed line 77 from:
to:
Is there a sensor you would like to see characterized for Arduino, or is there something you would like to see published in
this site? Refer to the forum for further help.
Restore
November 04, 2006, at 10:38 AM by David A. Mellis -
Changed lines 3-4 from:
Here you will find a growing number of examples and tutorials for accomplishing specific tasks or interfacing to other
hardware and software with Arduino. For instructions on getting the board and environment up and running, see the Arduino
guide?.
to:
Here you will find a growing number of examples and tutorials for accomplishing specific tasks or interfacing to other
hardware and software with Arduino. For instructions on getting the board and environment up and running, see the Arduino
guide.
Restore
November 04, 2006, at 10:37 AM by David A. Mellis - lots of content moved to the new guide.
Deleted lines 52-67:
This guide to the Arduino board explains the functions of the various parts of the board.
This guide to the Arduino IDE (integrated development environment) explains the functions of the various buttons and
menus.
The libraries page explains how to use libraries in your sketches and how to make your own.
Watch Tom introduce Arduino. Thanks to Pollie Barden for the great videos.
Course Guides
todbot has some very detailed, illustrated tutorials from his Spooky Projects course: class 1 (getting started), class 2 (input
and sensors), class 3 (communication, servos, and pwm), class 4 (piezo sound & sensors, arduino+processing, stand-alone
operation)
External Resources
hack a day has links to interesting hacks and how-to articles on various topics.
Restore
November 04, 2006, at 10:17 AM by David A. Mellis -
Changed lines 3-4 from:
Here you will find a growing number of examples and tutorials for accomplishing specific tasks or interfacing to other
hardware and software with Arduino. For instructions on getting the board and environment up and running, see the Howto.
to:
Here you will find a growing number of examples and tutorials for accomplishing specific tasks or interfacing to other
hardware and software with Arduino. For instructions on getting the board and environment up and running, see the Arduino
guide?.
Restore
November 01, 2006, at 06:54 PM by Carlyn Maw -
Deleted line 49:
Restore
November 01, 2006, at 06:06 PM by Carlyn Maw -
Added line 50:
Restore
October 31, 2006, at 10:47 AM by Tod E. Kurt -
Changed lines 67-68 from:
todbot has some very detailed, illustrated tutorials from his Spooky Projects course: class 1 (getting started), class 2 (input
and sensors), class 3 (communication, servos, and pwm).
to:
todbot has some very detailed, illustrated tutorials from his Spooky Projects course: class 1 (getting started), class 2 (input
and sensors), class 3 (communication, servos, and pwm), class 4 (piezo sound & sensors, arduino+processing, stand-alone
operation)
Restore
October 22, 2006, at 12:52 PM by David A. Mellis -
Changed lines 1-4 from:
to:
Arduino Tutorials
Here you will find a growing number of examples and tutorials for accomplishing specific tasks or interfacing to other
hardware and software with Arduino. For instructions on getting the board and environment up and running, see the Howto.
Restore
October 22, 2006, at 12:51 PM by David A. Mellis -
Changed lines 67-68 from:
todbot has some very detailed, illustrated tutorials from his Spooky Projects course: class 1 (getting started), class 2 (input
and sensors).
to:
todbot has some very detailed, illustrated tutorials from his Spooky Projects course: class 1 (getting started), class 2 (input
and sensors), class 3 (communication, servos, and pwm).
Restore
October 21, 2006, at 04:25 PM by David A. Mellis - adding links to todbot's class notes.
Added lines 66-68:
Course Guides
todbot has some very detailed, illustrated tutorials from his Spooky Projects course: class 1 (getting started), class 2 (input
and sensors).
Restore
October 08, 2006, at 05:46 PM by David A. Mellis -
Changed lines 59-62 from:
This guide to the Arduino IDE? (integrated development environment) explains the functions of the various buttons and
menus.
The libraries? page explains how to use libraries in your sketches and how to make your own.
to:
This guide to the Arduino IDE (integrated development environment) explains the functions of the various buttons and
menus.
The libraries page explains how to use libraries in your sketches and how to make your own.
Restore
October 08, 2006, at 05:45 PM by David A. Mellis -
Changed lines 3-4 from:
Here you will find a growing number of step by step guides on how to learn the basics of arduino and the things you can do
with it. For instructions on getting the board and IDE up and running, see the Howto?.
to:
Here you will find a growing number of step by step guides on how to learn the basics of arduino and the things you can do
with it. For instructions on getting the board and IDE up and running, see the Howto.
Restore
October 08, 2006, at 05:38 PM by David A. Mellis -
Added lines 1-102:
Examples
Digital Output
Blinking LED
Blinking an LED without using the delay() function
Dimming 3 LEDs with Pulse-Width Modulation (PWM)
Knight Rider example
Shooting star
Digital Input
Analog Input
Read a Potentiometer
Interfacing a Joystick
Read a Piezo Sensor
3 LED cross-fades with a potentiometer
3 LED color mixer with 3 potentiometers
Complex Sensors
Read an Accelerometer
Read an Ultrasonic Range Finder (ultrasound sensor)
Reading the qprox qt401 linear touch sensor
Sound
Interfacing w/ Hardware
(:cell width=50%:)
This guide to the Arduino board explains the functions of the various parts of the board.
This guide to the Arduino IDE? (integrated development environment) explains the functions of the various buttons and
menus.
The libraries? page explains how to use libraries in your sketches and how to make your own.
Video Lectures by Tom Igoe
Watch Tom introduce Arduino. Thanks to Pollie Barden for the great videos.
Also, see the examples from Tom Igoe and those from Jeff Gray.
Is there a sensor you would like to see characterized for Arduino, or is there something you would like to see published in
this site? Refer to the forum for further help.
External Resources
hack a day has links to interesting hacks and how-to articles on various topics. (:tableend:)
Restore
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino : Tutorial / Tutorials
Examples
See the foundations page for in-depth description of core concepts of the Arduino hardware and software; the
hacking page for information on extending and modifying the Arduino hardware and software; and the links page
for other documentation.
Complex Sensors
Analog I/O
Read an ADXL3xx accelerometer
Analog Input: use a potentiometer to control the
Read an Accelerometer
blinking of an LED.
Read an Ultrasonic Range Finder (ultrasound
Fading: uses an analog output (PWM pin) to fade
sensor)
an LED.
Reading the qprox qt401 linear touch sensor
Knock: detect knocks with a piezo element.
Smoothing: smooth multiple readings of an analog
input. Sound
ASCII Table: demonstrates Arduino's advanced Multiply the Amount of Outputs with an LED
serial output functions. Driver
Dimmer: move the mouse to change the Interfacing an LCD display with 8 bits
brightness of an LED. LCD interface library
Graph: sending data to the computer and Driving a DC Motor with an L293 (from ITP
graphing it in Processing. physcomp labs).
Physical Pixel: turning on and off an LED by Driving a Unipolar Stepper Motor
sending data from Processing. Build your own DMX Master device
Virtual Color Mixer: sending multiple variables Implement a software serial connection
from Arduino to the computer and reading them RS-232 computer interface
in Processing. Interface with a serial EEPROM using SPI
Control a digital potentiometer using SPI
Multiple digital outs with a 595 Shift Register
EEPROM Library
X10 output control devices over AC powerlines
using X10
EEPROM Clear: clear the bytes in the EEPROM.
EEPROM Read: read the EEPROM and send its
values to the computer.
EEPROM Write: stores values from an analog input
to the EEPROM.
Stepper Library
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
These pages are cross-linked with the applicable language reference, example, and other pages, providing a single source for
people looking for a longer discussion of a particular topic.
This section is a work in progress, and there are many topics yet to be covered. Here's a rough list of ideas:
PROGRAMMING
conditionals
loops
functions
numbers and arithmetic
bits and bytes
characters and encodings
arrays
strings
ELECTRONICS
voltage, current, and resistance
resistive sensors
capacitors
transistors
power
noise
COMMUNICATION
serial communication
i2c (aka twi)
bluetooth
MICROCONTROLLER
reset
pins and ports
interrupts
If you see anything in the list that interests you, feel free to take a shot at writing it up. Don't worry if it's not finished or
polished, we can always edit and improve it. You can post works-in-progress to the playground and mention them on the
forum. Also, be sure to let us know if you think there's anything that we've forgotten, or if you have other suggestions.
Foundations Page
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
First Sketch
In the getting started guide (Windows, Mac OS X, Linux), you uploaded a sketch that blinks an LED. In this tutorial, you'll
learn how each part of that sketch works.
Sketch
A sketch is the name that Arduino uses for a program. It's the unit of code that is uploaded to and run on an Arduino board.
Comments
/*
* Blink
*
* The basic Arduino example. Turns on an LED on for one second,
* then off for one second, and so on... We use pin 13 because,
* depending on your Arduino board, it has either a built-in LED
* or a built-in resistor so that you need only an LED.
*
* http://www.arduino.cc/en/Tutorial/Blink
*/
Everything between the /* and */ is ignored by the Arduino when it runs the sketch (the * at the start of each line is only
there to make the comment look pretty, and isn't required). It's there for people reading the code: to explain what the
program does, how it works, or why it's written the way it is. It's a good practice to comment your sketches, and to keep
the comments up-to-date when you modify the code. This helps other people to learn from or modify your code.
There's another style for short, single-line comments. These start with // and continue to the end of the line. For example, in
the line:
Variables
A variable is a place for storing a piece of data. It has a name, a type, and a value. For example, the line from the Blink
sketch above declares a variable with the name ledPin , the type int, and an initial value of 13. It's being used to indicate
which Arduino pin the LED is connected to. Every time the name ledPin appears in the code, its value will be retrieved. In
this case, the person writing the program could have chosen not to bother creating the ledPin variable and instead have
simply written 13 everywhere they needed to specify a pin number. The advantage of using a variable is that it's easier to
move the LED to a different pin: you only need to edit the one line that assigns the initial value to the variable.
Often, however, the value of a variable will change while the sketch runs. For example, you could store the value read from
an input into a variable. There's more information in the Variables tutorial.
Functions
A function (otherwise known as a procedure or sub-routine) is a named piece of code that can be used from elsewhere in a
sketch. For example, here's the definition of the setup() function from the Blink example:
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
The first line provides information about the function, like its name, "setup". The text before and after the name specify its
return type and parameters: these will be explained later. The code between the { and } is called the body of the function:
what the function does.
You can call a function that's already been defined (either in your sketch or as part of the Arduino language). For example,
the line pinMode(ledPin, OUTPUT); calls the pinMode() function, passing it two parameters: ledPin and OUTPUT. These
parameters are used by the pinMode() function to decide which pin and mode to set.
The pinMode() function configures a pin as either an input or an output. To use it, you pass it the number of the pin to
configure and the constant INPUT or OUTPUT. When configured as an input, a pin can detect the state of a sensor like a
pushbutton; this is discussed in a later tutorial?. As an output, it can drive an actuator like an LED.
The digitalWrite() functions outputs a value on a pin. For example, the line:
digitalWrite(ledPin, HIGH);
set the ledPin (pin 13) to HIGH, or 5 volts. Writing a LOW to pin connects it to ground, or 0 volts.
The delay() causes the Arduino to wait for the specified number of milliseconds before continuing on to the next line. There
are 1000 milliseconds in a second, so the line:
delay(1000);
There are two special functions that are a part of every Arduino sketch: setup() and loop(). The setup() is called once,
when the sketch starts. It's a good place to do setup tasks like setting pin modes or initializing libraries. The loop() function
is called over and over and is heart of most sketches. You need to include both functions in your sketch, even if you don't
need them for anything.
Exercises
1. Change the code so that the LED is on for 100 milliseconds and off for 1000.
2. Change the code so that the LED turns on when the sketch starts and stays on.
See Also
setup()
loop()
pinMode()
digitalWrite()
delay()
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Pins
Pins Configured as INPUT
Arduino (Atmega) pins default to inputs, so they don't need to be explicitly declared as inputs with pinMode(). Pins configured
as inputs are said to be in a high-impedance state. One way of explaining this is that input pins make extremely small
demands on the circuit that they are sampling, say equivalent to a series resistor of 100 Megohms in front of the pin. This
means that it takes very little current to move the input pin from one state to another, and can make the pins useful for
such tasks as implementing a capacitive touch sensor.
This also means however that input pins with nothing connected to them, or with wires connected to them that are not
connected to other circuits, will report seemingly random changes in pin state, picking up electrical noise from the
environment, or capacitively coupling the state of a nearby pin for example.
Pullup Resistors
Often it is useful to steer an input pin to a known state if no input is present. This can be done by adding a pullup resistor(to
+5V), or pulldown resistor (resistor to ground) on the input, with 10K being a common value.
There are also convenient 20K pullup resistors built into the Atmega chip that can be accessed from software. These built-in
pullup resistors are accessed in the following manner.
Note that the pullup resistors provide enough current to dimly light an LED connected to a pin that has been configured as
an input. If LED's in a project seem to be working, but very dimly, this is likely what is going on, and the programmer has
forgotten to use pinMode() to set the pins to outputs.
Note also that the pullup resistors are controlled by the same registers (internal chip memory locations) that control whether
a pin is HIGH or LOW. Consequently a pin that is configured to have pullup resistors turned on when the pin is an INPUT, will
have the pin configured as HIGH if the pin is then swtiched to an OUTPUT with pinMode(). This works in the other direction
as well, and an output pin that is left in a HIGH state will have the pullup resistors set if switched to an input with
pinMode().
Pins configured as OUTPUT with pinMode() are said to be in a low-impedance state. This means that they can provide a
substantial amount of current to other circuits. Atmega pins can source (provide positive current) or sink (provide negative
current) up to 40 mA (milliamps) of current to other devices/circuits. This is enough current to brightly light up an LED (don't
forget the series resistor), or run many sensors, for example, but not enough current to run most relays, solenoids, or
motors.
Short circuits on Arduino pins, or attempting to run high current devices from them, can damage or destroy the output
transistors in the pin, or damage the entire Atmega chip. Often this will result in a "dead" pin in the microcontroller but the
remaining chip will still function adequately. For this reason it is a good idea to connect OUTPUT pins to other devices with
470O or 1k resistors, unless maximum current draw from the pins is required for a particular application.
Foundations
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Analog Pins
A description of the analog input pins on an Atmega168 (Arduino chip).
A/D converter
The Atmega168 contains an onboard 6 channel analog-to-digital (A/D) converter. The converter has 10 bit resolution,
returning integers from 0 to 1023. While the main function of the analog pins for most Arduino users is to read analog
sensors, the analog pins also have all the functionality of general purpose input/output (GPIO) pins (the same as digital pins 0
- 13).
Consequently, if a user needs more general purpose input output pins, and all the analog pins are not in use, the analog pins
may be used for GPIO.
Pin mapping
The Arduino pin numbers corresponding to the analog pins are 14 through 19. Note that these are Arduino pin numbers, and
do not correspond to the physical pin numbers on the Atmega168 chip. The analog pins can be used identically to the digital
pins, so for example, to set analog pin 0 to an output, and to set it HIGH, the code would look like this:
pinMode(14, OUTPUT);
digitalWrite(14, HIGH);
Pullup resistors
The analog pins also have pullup resistors, which work identically to pullup resistors on the digital pins. They are enabled by
issuing a command such as
Be aware however that turning on a pullup will affect the value reported by analogRead() when using some sensors if done
inadvertently. Most users will want to use the pullup resistors only when using an analog pin in its digital mode.
The analogRead command will not work correctly if a pin has been previously set to an output, so if this is the case, set it
back to an input before using analogRead. Similarly if the pin has been set to HIGH as an output.
The Atmega168 datasheet also cautions against switching digital pins in close temporal proximity to making A/D readings
(analogRead) on other analog pins. This can cause electrical noise and introduce jitter in the analog system. It may be
desirable, after manipulating analog pins (in digital mode), to add a short delay before using analogRead() to read other
analog pins.
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
PWM
The Fading example demonstrates the use of analog output (PWM) to fade an LED. It is available in the File->Sketchbook-
>Examples->Analog menu of the Arduino software.
Pulse Width Modulation, or PWM, is a technique for getting analog results with digital means. Digital control is used to create
a square wave, a signal switched between on and off. This on-off pattern can simulate voltages in between full on (5 Volts)
and off (0 Volts) by changing the portion of the time the signal spends on versus the time that the signal spends off. The
duration of "on time" is called the pulse width. To get varying analog values, you change, or modulate, that pulse width. If
you repeat this on-off pattern fast enough with an LED for example, the result is as if the signal is a steady voltage between
0 and 5v controlling the brightness of the LED.
In the graphic below, the green lines represent a regular time period. This duration or period is the inverse of the PWM
frequency. In other words, with Arduino's PWM frequency at about 500Hz, the green lines would measure 2 milliseconds each.
A call to analogWrite() is on a scale of 0 - 255, such that analogWrite(255) requests a 100% duty cycle (always on), and
analogWrite(127) is a 50% duty cycle (on half the time) for example.
Once you get this example running, grab your arduino and shake it back and forth. What you are doing here is essentially
mapping time across the space. To our eyes, the movement blurs each LED blink into a line. As the LED fades in and out,
those little lines will grow and shrink in length. Now you are seeing the pulse width.
Foundations
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Memory
There are three pools of memory in the microcontroller used on Arduino boards (ATmega168):
Flash memory and EEPROM memory are non-volatile (the information persists after the power is turned off). SRAM is volatile
and will be lost when the power is cycled.
Notice that there's not much SRAM available. It's easy to use it all up by having lots of strings in your program. For example,
a declaration like:
puts 32 bytes into SRAM (each character takes a byte). This might not seem like a lot, but it doesn't take long to get to
1024, especially if you have a large amount of text to send to a display, or a large lookup table, for example.
If you run out of SRAM, your program may fail in unexpected ways; it will appear to upload successfully, but not run, or run
strangely. To check if this is happening, you can try commenting out or shortening the strings or other data structures in
your sketch (without changing the code). If it then runs successfully, you're probably running out of SRAM. There are a few
things you can do to address this problem:
If your sketch talks to a program running on a (desktop/laptop) computer, you can try shifting data or calculations to
the computer, reducing the load on the Arduino.
If you have lookup tables or other large arrays, use the smallest data type necessary to store the values you need;
for example, an int takes up two bytes, while a byte uses only one (but can store a smaller range of values).
If you don't need to modify the strings or data while your sketch is running, you can store them in flash (program)
memory instead of SRAM; to do this, use the PROGMEM keyword.
Foundations
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Bootloader
The bootloader is a small piece of software that we've burned onto the chips that come with your Arduino boards. It allows
you to upload sketches to the board without external hardware.
When you reset the Arduino board, it runs the bootloader (if present). The bootloader pulses digital pin 13 (you can connect
an LED to make sure that the bootloader is installed). The bootloader then listens for commands or data to arrive from the
the computer. Usually, this is a sketch that the bootloader writes to the flash memory on the ATmega168 or ATmega8 chip.
Then, the bootloader launches the newly-uploaded program. If, however, no data arrives from the computer, the bootloader
launches whatever program was last uploaded onto the chip. If the chip is still "virgin" the bootloader is the only program in
memory and will start itself again.
The use of a bootloader allows us to avoid the use of external hardware programmers. (Burning the bootloader onto the chip,
however, requires one of these external programmers.)
It's possible to "confuse" the bootloader so that it never starts your sketch. In particular, if you send serial data to the board
just after it resets (when the bootloader is running), it may think you're talking to it and never quit. In particular, the auto-
reset feature on the Diecimila means that the board resets (and the bootloader starts) whenever you open a serial connection
to it. To avoid this problem, you should wait for two seconds or so after opening the connection before sending any data. On
the NG, the board doesn't reset when you open a serial connection to it, but when it does reset it takes longer - about 8-10
seconds - to timeout.
See the bootloader development page for information on burning a bootloader and other ways to configure a chip.
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Variables
A variable is a place to store a piece of data. It has a name, a value, and a type. For example, this statement (called a
declaration):
creates a variable whose name is pin, whose value is 13, and whose type is int. Later on in the program, you can refer to
this variable by its name, at which point its value will be looked up and used. For example, in this statement:
pinMode(pin, OUTPUT);
it is the value of pin (13) that will be passed to the pinMode() function. In this case, you don't actually need to use a
variable, this statement would work just as well:
pinMode(13, OUTPUT);
The advantage of a variable in this case is that you only need to specify the actual number of the pin once, but you can use
it lots of times. So if you later decide to change from pin 13 to pin 12, you only need to change one spot in the code. Also,
you can use a descriptive name to make the significance of the variable clear (e.g. a program controlling an RGB LED might
have variables called redPin, greenPin, and bluePin).
A variable has other advantages over a value like a number. Most importantly, you can change the value of a variable using
an assignment (indicated by an equals sign). For example:
pin = 12;
will change the value of the variable to 12. Notice that we don't specify the type of the variable: it's not changed by the
assignment. That is, the name of the variable is permanently associated with a type; only its value changes. [1] Note that
you have to declare a variable before you can assign a value to it. If you include the preceding statement in a program
without the first statement above, you'll get a message like: "error: pin was not declared in this scope".
When you assign one variable to another, you're making a copy of its value and storing that copy in the location in memory
associated with the other variable. Changing one has no effect on the other. For example, after:
Now what, you might be wondering, did the word "scope" in that error message above mean? It refers to the part of your
program in which the variable can be used. This is determined by where you declare it. For example, if you want to be able
to use a variable anywhere in your program, you can declare at the top of your code. This is called a global variable; here's
an example:
void setup()
{
pinMode(pin, OUTPUT);
}
void loop()
{
digitalWrite(pin, HIGH);
}
As you can see, pin is used in both the setup() and loop() functions. Both functions are referring to the same variable, so
that changing it one will affect the value it has in the other, as in:
void setup()
{
pin = 12;
pinMode(pin, OUTPUT);
}
void loop()
{
digitalWrite(pin, HIGH);
}
Here, the digitalWrite() function called from loop() will be passed a value of 12, since that's the value that was assigned to
the variable in the setup() function.
If you only need to use a variable in a single function, you can declare it there, in which case its scope will be limited to that
function. For example:
void setup()
{
int pin = 13;
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
}
In this case, the variable pin can only be used inside the setup() function. If you try to do something like this:
void loop()
{
digitalWrite(pin, LOW); // wrong: pin is not in scope here.
}
you'll get the same message as before: "error: 'pin' was not declared in this scope". That is, even though you've declared pin
somewhere in your program, you're trying to use it somewhere outside its scope.
Why, you might be wondering, wouldn't you make all your variables global? After all, if I don't know where I might need a
variable, why should I limit its scope to just one function? The answer is that it can make it easier to figure out what
happens to it. If a variable is global, its value could be changed anywhere in the code, meaning that you need to understand
the whole program to know what will happen to the variable. For example, if your variable has a value you didn't expect, it
can be much easier to figure out where the value came from if the variable has a limited scope.
[1] In some languages, like Python, types are associated with values, not variable names, and you can assign values of any
type to a variable. This is referred to as dynamic typing.
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Login to Arduino
Username:
Password:
Login
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Tutorial.Foundations History
Hide minor edits - Show changes to markup
Basics
Restore
April 29, 2008, at 10:33 AM by David A. Mellis -
Deleted lines 0-2:
test
to:
Restore
April 29, 2008, at 07:39 AM by Paul Badger -
Changed lines 31-35 from:
test
to:
test
Restore
April 29, 2008, at 07:38 AM by Paul Badger -
Changed lines 31-35 from:
test
to:
test
Restore
April 29, 2008, at 07:34 AM by Paul Badger -
Changed lines 31-35 from:
test
to:
test
Restore
April 29, 2008, at 07:31 AM by Paul Badger -
Added lines 29-35:
test
Restore
April 29, 2008, at 07:28 AM by Paul Badger -
Changed lines 51-52 from:
GroupHead
to:
Restore
April 29, 2008, at 07:27 AM by Paul Badger -
Changed lines 51-52 from:
GroupHead
to:
GroupHead
Restore
April 29, 2008, at 07:26 AM by Paul Badger -
Added lines 51-52:
GroupHead
Restore
April 22, 2008, at 05:57 PM by Paul Badger -
Restore
April 10, 2008, at 09:44 AM by David A. Mellis - adding pwm tutorial
Added lines 16-17:
PWM: How the analogWrite() function simulates an analog output using pulse-width modulation.
Port Manipulation: Manipulating ports directly for faster manipulation of multiple pins
Restore
March 31, 2008, at 06:23 AM by Paul Badger -
Changed lines 1-4 from:
to:
Restore
March 31, 2008, at 06:22 AM by Paul Badger -
Added lines 1-4:
Reference
to:
Restore
March 31, 2008, at 06:20 AM by Paul Badger -
Added lines 3-5:
Reference
Restore
March 21, 2008, at 06:27 PM by Paul Badger -
Changed lines 13-14 from:
Arduino Software
to:
Arduino Firmware
Restore
March 09, 2008, at 11:15 PM by Paul Badger -
Changed lines 5-6 from:
to:
Microcontrollers
Programming Techniques
to:
Programming Technique
Restore
March 09, 2008, at 11:12 PM by Paul Badger -
Changed lines 5-6 from:
to:
Restore
March 09, 2008, at 11:11 PM by Paul Badger -
Changed lines 5-6 from:
Chip Hardware
to:
Restore
March 09, 2008, at 11:09 PM by Paul Badger -
Changed lines 5-6 from:
Hardware
to:
Chip Hardware
Restore
March 09, 2008, at 10:49 PM by Paul Badger -
Changed lines 13-14 from:
Arduino Software
to:
Arduino Software
Restore
March 09, 2008, at 10:49 PM by Paul Badger -
Added lines 13-14:
Arduino Software
Restore
March 09, 2008, at 10:48 PM by Paul Badger -
Deleted lines 6-7:
Programming
to:
Programming Techniques
Restore
March 09, 2008, at 10:47 PM by Paul Badger -
Added lines 5-6:
Hardware
Programming
Restore
March 09, 2008, at 07:19 PM by David A. Mellis -
Changed lines 3-4 from:
This page contains chip-level reference material and low-level hardare and software techniques used in the Arduino language.
Page Discussion
to:
This page contains explanations of some of the elements of the Arduino hardware and software and the concepts behind
them. Page Discussion
Bootloader: A small program pre-loaded on the Arduino board to allow uploading sketches.
Restore
March 09, 2008, at 07:16 PM by David A. Mellis -
Changed lines 11-12 from:
to:
Restore
March 07, 2008, at 09:46 PM by Paul Badger -
Changed lines 3-4 from:
This page contains general chip-level reference material as it relates to basic low-level hardare and software techniques used
in the Arduino language. Page Discussion
to:
This page contains chip-level reference material and low-level hardare and software techniques used in the Arduino language.
Page Discussion
Restore
March 07, 2008, at 09:25 PM by Paul Badger -
Changed lines 11-12 from:
Foundations
to:
Restore
March 07, 2008, at 09:24 PM by Paul Badger -
Changed lines 3-37 from:
This page contains general chip-level reference material as it relates to basic low-level hardare and software techniques used
in the Arduino language. Page Discussion
to:
This page contains general chip-level reference material as it relates to basic low-level hardare and software techniques used
in the Arduino language. Page Discussion
Digital Pins: How the pins work and what it means for them to be configured as inputs or outputs.
Analog Input Pins: Details about the analog-to-digital conversion and other uses of the pins.
Foundations
(:if false:)
PWM (Pulse-Width Modulation): The method used by analogWrite() to simulate an analog output with digital pins.
Communication?: An overview of the various ways in which an Arduino board can communicate with other devices
(serial, I2C, SPI, Midi, etc.)
Serial Communication?: How to send serial data from an Arduino board to a computer or other device (including via
the USB connection).
Numbers?: The various types of numbers available and how to use them.
Pointers?:
Debugging?: Figuring out what's wrong with your hardware or software and how to fix it.
(:ifend:)
Restore
March 07, 2008, at 09:21 PM by Paul Badger -
Changed line 3 from:
This page contains general chip-level reference material as it relates to basic low-level techniques. Page Discussion
to:
This page contains general chip-level reference material as it relates to basic low-level hardare and software techniques used
in the Arduino language. Page Discussion
Restore
March 07, 2008, at 09:12 PM by Paul Badger -
Added lines 1-3:
Foundations
This page contains general chip-level reference material as it relates to basic low-level techniques. Page Discussion
Restore
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino : Tutorial / Foundations
Foundations
This page contains explanations of some of the elements of the Arduino hardware and software and the concepts
behind them. Page Discussion
Basics
Sketch: The various components of a sketch and how they work.
Microcontrollers
Digital Pins: How the pins work and what it means for them to be configured as inputs or outputs.
Analog Input Pins: Details about the analog-to-digital conversion and other uses of the pins.
PWM: How the analogWrite() function simulates an analog output using pulse-width modulation.
Arduino Firmware
Bootloader: A small program pre-loaded on the Arduino board to allow uploading sketches.
Programming Technique
Variables: How to define and use variables.
Port Manipulation: Manipulating ports directly for faster manipulation of multiple pins
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Login to Arduino
Username:
Password:
Login
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Tutorial.Links History
Hide minor edits - Show changes to markup
Wiring electronics reference: circuit diagrams for connecting a variety of basic electronic components.
Schematics to circuits: from Wiring, a guide to transforming circuit diagrams into physical circuits.
Restore
June 08, 2008, at 11:29 AM by David A. Mellis -
Changed lines 18-27 from:
Learn electronics using Arduino: an introduction to programming, input / output, communication, etc. using Arduino. By
ladyada.
to:
Added lines 41-49:
Learn electronics using Arduino: an introduction to programming, input / output, communication, etc. using Arduino. By
ladyada.
Restore
June 08, 2008, at 11:28 AM by David A. Mellis -
Added lines 8-28:
Arduino Booklet (pdf): an illustrated guide to the philosophy and practice of Arduino.
Learn electronics using Arduino: an introduction to programming, input / output, communication, etc. using Arduino. By
ladyada.
(:cell width=50%:)
(:cell width=50%:)
Arduino Booklet (pdf): an illustrated guide to the philosophy and practice of Arduino.
Learn electronics using Arduino: an introduction to programming, input / output, communication, etc. using Arduino. By
ladyada.
Restore
May 06, 2008, at 01:23 PM by David A. Mellis -
Added lines 29-30:
Tom Igoe's Physical Computing Site: lots of information on electronics, microcontrollers, sensors, actuators, books, etc.
Restore
May 06, 2008, at 01:21 PM by David A. Mellis -
Changed lines 51-52 from:
to:
Restore
May 06, 2008, at 01:20 PM by David A. Mellis -
Added lines 51-52:
Restore
May 06, 2008, at 01:14 PM by David A. Mellis -
Changed lines 47-48 from:
Making Things Talk (by Tom Igoe): teaches you how to get your creations to communicate
with one another by forming networks of smart devices that carry on conversations with you and your environment.
to:
Making Things Talk (by Tom Igoe): teaches you how to get your creations to communicate with one another by forming
networks of smart devices that carry on conversations with you and your environment.
Restore
May 06, 2008, at 01:13 PM by David A. Mellis -
Added lines 27-43:
Spooky Arduino: Longer presentation-format documents introducing Arduino from a Halloween hacking class taught by
TodBot:
Bionic Arduino: another Arduino class from TodBot, this one focusing on physical sensing and making motion.
to:
Making Things Talk (by Tom Igoe): teaches you how to get your creations to communicate
with one another by forming networks of smart devices that carry on conversations with you and your environment.
Changed lines 60-73 from:
Bionic Arduino: another Arduino class from TodBot, this one focusing on physical sensing and making motion.
to:
Restore
April 29, 2008, at 06:44 PM by David A. Mellis -
Added lines 5-7:
(:cell width=50%:)
to:
(:tableend:)
Restore
April 29, 2008, at 06:43 PM by David A. Mellis -
Added lines 1-49:
Links
Arduino examples, tutorials, and documentation elsewhere on the web.
Community Documentation
Tutorials created by the Arduino community. Hosted on the publicly-editable playground wiki.
Board Setup and Configuration: Information about the components and usage of Arduino hardware.
Interfacing With Hardware: Code, circuits, and instructions for using various electronic components with an Arduino board.
Output
Input
Interaction
Storage
Communication
Interfacing with Software: how to get an Arduino board talking to software running on the computer (e.g. Processing, PD,
Flash, Max/MSP).
Code Library and Tutorials: Arduino functions for performing specific tasks and other programming tutorials.
Arduino Booklet (pdf): an illustrated guide to the philosophy and practice of Arduino.
Learn electronics using Arduino: an introduction to programming, input / output, communication, etc. using Arduino. By
ladyada.
Spooky Arduino: Longer presentation-format documents introducing Arduino from a Halloween hacking class taught by
TodBot:
Bionic Arduino: another Arduino class from TodBot, this one focusing on physical sensing and making motion.
Restore
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino : Tutorial / Links
Links
Arduino examples, tutorials, and documentation elsewhere on the web.
Making Things Talk (by Tom Igoe): teaches you how to Interfacing with Software: how to get an Arduino board
get your creations to communicate with one another by talking to software running on the computer (e.g.
forming networks of smart devices that carry on Processing, PD, Flash, Max/MSP).
conversations with you and your environment.
Code Library and Tutorials: Arduino functions for
performing specific tasks and other programming
tutorials.
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
As a microcontroller, Arduino doesn't have any pre-established output devices. Willing to provide newcomers with some help
while debugging programs, we propose the use of one of the board's pins plugging a LED that we will make blink indicating
the right functionallity of the program.
We have added a 1K resistor to pin 13, what allows the immediate connection of a LED between that pin and ground.
LEDs have polarity, which means they will only light up if you orient the legs properly. The long leg is typically positive, and
should connect to pin 13. The short leg connects to GND; the bulb of the LED will also typically have a flat edge on this side.
If the LED doesn't light up, trying reversing the legs (you won't hurt the LED if you plug it in backwards for a short period of
time).
Code
The example code is very simple, credits are to be found in the comments.
/* Blinking LED
* ------------
*
* turns on and off a light emitting diode(LED) connected to a digital
* pin, in intervals of 2 seconds. Ideally we use pin 13 on the Arduino
* board because it has a resistor attached to it, needing only an LED
*
* Created 1 June 2005
* copyleft 2005 DojoDave <http://www.0j0.org>
* http://arduino.berlios.de
*
* based on an orginal by H. Barragan for the Wiring i/o board
*/
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
/*
* Code for cross-fading 3 LEDs, red, green and blue, or one tri-color LED, using PWM
* The program cross-fades slowly from red to green, green to blue, and blue to red
* The debugging code assumes Arduino 0004, as it uses the new Serial.begin()-style functions
* Clay Shirky <clay.shirky@nyu.edu>
*/
// Output
int redPin = 9; // Red LED, connected to digital pin 9
int greenPin = 10; // Green LED, connected to digital pin 10
int bluePin = 11; // Blue LED, connected to digital pin 11
// Program variables
int redVal = 255; // Variables to store the values to send to the pins
int greenVal = 1; // Initial values are Red full, Green and Blue off
int blueVal = 1;
void setup()
{
pinMode(redPin, OUTPUT); // sets the pins as output
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
if (DEBUG) { // If we want to see the pin values for debugging...
Serial.begin(9600); // ...set up the serial ouput on 0004 style
}
}
// Main program
void loop()
{
i += 1; // Increment counter
if (i < 255) // First phase of fades
{
redVal -= 1; // Red down
greenVal += 1; // Green up
blueVal = 1; // Blue low
}
else if (i < 509) // Second phase of fades
{
redVal = 1; // Red low
greenVal -= 1; // Green down
blueVal += 1; // Blue up
}
else if (i < 763) // Third phase of fades
{
redVal += 1; // Red up
greenVal = 1; // Green low
blueVal -= 1; // Blue down
}
else // Re-set the counter, and start the fades again
{
i = 1;
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
/*
* Code for cross-fading 3 LEDs, red, green and blue (RGB)
* To create fades, you need to do two things:
* 1. Describe the colors you want to be displayed
* 2. List the order you want them to fade in
*
* DESCRIBING A COLOR:
* A color is just an array of three percentages, 0-100,
* controlling the red, green and blue LEDs
*
* Red is the red LED at full, blue and green off
* int red = { 100, 0, 0 }
* Dim white is all three LEDs at 30%
* int dimWhite = {30, 30, 30}
* etc.
*
* Some common colors are provided below, or make your own
*
* LISTING THE ORDER:
* In the main part of the program, you need to list the order
* you want to colors to appear in, e.g.
* crossFade(red);
* crossFade(green);
* crossFade(blue);
*
* Those colors will appear in that order, fading out of
* one color and into the next
*
* In addition, there are 5 optional settings you can adjust:
* 1. The initial color is set to black (so the first color fades in), but
* you can set the initial color to be any other color
* 2. The internal loop runs for 1020 interations; the 'wait' variable
* sets the approximate duration of a single crossfade. In theory,
* a 'wait' of 10 ms should make a crossFade of ~10 seconds. In
* practice, the other functions the code is performing slow this
* down to ~11 seconds on my board. YMMV.
* 3. If 'repeat' is set to 0, the program will loop indefinitely.
* if it is set to a number, it will loop that number of times,
* then stop on the last color in the sequence. (Set 'return' to 1,
* and make the last color black if you want it to fade out at the end.)
* 4. There is an optional 'hold' variable, which pasues the
* program for 'hold' milliseconds when a color is complete,
* but before the next color starts.
* 5. Set the DEBUG flag to 1 if you want debugging output to be
* sent to the serial monitor.
*
* The internals of the program aren't complicated, but they
* are a little fussy -- the inner workings are explained
* below the main loop.
*
* April 2007, Clay Shirky <clay.shirky@nyu.edu>
*/
// Output
int redPin = 9; // Red LED, connected to digital pin 9
int grnPin = 10; // Green LED, connected to digital pin 10
int bluPin = 11; // Blue LED, connected to digital pin 11
// Color arrays
int black[3] = { 0, 0, 0 };
int white[3] = { 100, 100, 100 };
int red[3] = { 100, 0, 0 };
int green[3] = { 0, 100, 0 };
int blue[3] = { 0, 0, 100 };
int yellow[3] = { 40, 95, 0 };
int dimWhite[3] = { 30, 30, 30 };
// etc.
int wait = 10; // 10ms internal crossFade delay; increase for slower fades
int hold = 0; // Optional hold when a color is complete, before the next crossFade
int DEBUG = 1; // DEBUG counter; if set to 1, will write values back via serial
int loopCount = 60; // How often should DEBUG report?
int repeat = 3; // How many times should we loop before stopping? (0 for no stop)
int j = 0; // Loop counter for repeat
/* BELOW THIS LINE IS THE MATH -- YOU SHOULDN'T NEED TO CHANGE THIS FOR THE BASICS
*
* The program works like this:
* Imagine a crossfade that moves the red LED from 0-10,
* the green from 0-5, and the blue from 10 to 7, in
* ten steps.
* We'd want to count the 10 steps and increase or
* decrease color values in evenly stepped increments.
* Imagine a + indicates raising a value by 1, and a -
* equals lowering it. Our 10 step fade would look like:
*
* 1 2 3 4 5 6 7 8 9 10
* R + + + + + + + + + +
* G + + + + +
* B - - -
*
* The red rises from 0 to 10 in ten steps, the green from
* 0-5 in 5 steps, and the blue falls from 10 to 7 in three steps.
*
* In the real program, the color percentages are converted to
* 0-255 values, and there are 1020 steps (255*4).
*
* To figure out how big a step there should be between one up- or
* down-tick of one of the LED values, we call calculateStep(),
* which calculates the absolute gap between the start and end values,
* and then divides that gap by 1020 to determine the size of the step
* between adjustments in the value.
*/
if ((step) && i % step == 0) { // If step is non-zero and its time to change a value,
if (step > 0) { // increment the value if step is positive...
val += 1;
}
else if (step < 0) { // ...or decrement it if step is negative
val -= 1;
}
}
// Defensive driving: make sure val stays in the range 0-255
if (val > 255) {
val = 255;
}
else if (val < 0) {
val = 0;
}
return val;
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Knight Rider
We have named this example in memory to a TV-series from the 80's where the famous David Hasselhoff had an AI machine
driving his Pontiac. The car had been augmented with plenty of LEDs in all possible sizes performing flashy effects.
Thus we decided that in order to learn more about sequential programming and good programming techniques for the I/O
board, it would be interesting to use the Knight Rider as a metaphor.
This example makes use of 6 LEDs connected to the pins 2 - 7 on the board using 220 Ohm resistors. The first code example
will make the LEDs blink in a sequence, one by one using only digitalWrite(pinNum,HIGH/LOW) and delay(time). The
second example shows how to use a for(;;) construction to perform the very same thing, but in fewer lines. The third and
last example concentrates in the visual effect of turning the LEDs on/off in a more softer way.
Knight Rider 1
/* Knight Rider 1
* --------------
*
* Basically an extension of Blink_LED.
*
*
* (cleft) 2005 K3, Malmo University
* @author: David Cuartielles
* @hardware: David Cuartielles, Aaron Hallborg
*/
int pin2 = 2;
int pin3 = 3;
int pin4 = 4;
int pin5 = 5;
int pin6 = 6;
int pin7 = 7;
int timer = 100;
void setup(){
pinMode(pin2, OUTPUT);
pinMode(pin3, OUTPUT);
pinMode(pin4, OUTPUT);
pinMode(pin5, OUTPUT);
pinMode(pin6, OUTPUT);
pinMode(pin7, OUTPUT);
}
void loop() {
digitalWrite(pin2, HIGH);
delay(timer);
digitalWrite(pin2, LOW);
delay(timer);
digitalWrite(pin3, HIGH);
delay(timer);
digitalWrite(pin3, LOW);
delay(timer);
digitalWrite(pin4, HIGH);
delay(timer);
digitalWrite(pin4, LOW);
delay(timer);
digitalWrite(pin5, HIGH);
delay(timer);
digitalWrite(pin5, LOW);
delay(timer);
digitalWrite(pin6, HIGH);
delay(timer);
digitalWrite(pin6, LOW);
delay(timer);
digitalWrite(pin7, HIGH);
delay(timer);
digitalWrite(pin7, LOW);
delay(timer);
digitalWrite(pin6, HIGH);
delay(timer);
digitalWrite(pin6, LOW);
delay(timer);
digitalWrite(pin5, HIGH);
delay(timer);
digitalWrite(pin5, LOW);
delay(timer);
digitalWrite(pin4, HIGH);
delay(timer);
digitalWrite(pin4, LOW);
delay(timer);
digitalWrite(pin3, HIGH);
delay(timer);
digitalWrite(pin3, LOW);
delay(timer);
}
Knight Rider 2
/* Knight Rider 2
* --------------
*
* Reducing the amount of code using for(;;).
*
*
* (cleft) 2005 K3, Malmo University
* @author: David Cuartielles
* @hardware: David Cuartielles, Aaron Hallborg
*/
void setup(){
// we make all the declarations at once
for (count=0;count<6;count++) {
pinMode(pinArray[count], OUTPUT);
}
}
void loop() {
for (count=0;count<6;count++) {
digitalWrite(pinArray[count], HIGH);
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer);
}
for (count=5;count>=0;count--) {
digitalWrite(pinArray[count], HIGH);
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer);
}
}
Knight Rider 3
/* Knight Rider 3
* --------------
*
* This example concentrates on making the visuals fluid.
*
*
* (cleft) 2005 K3, Malmo University
* @author: David Cuartielles
* @hardware: David Cuartielles, Aaron Hallborg
*/
void setup(){
for (count=0;count<6;count++) {
pinMode(pinArray[count], OUTPUT);
}
}
void loop() {
for (count=0;count<5;count++) {
digitalWrite(pinArray[count], HIGH);
delay(timer);
digitalWrite(pinArray[count + 1], HIGH);
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer*2);
}
for (count=5;count>0;count--) {
digitalWrite(pinArray[count], HIGH);
delay(timer);
digitalWrite(pinArray[count - 1], HIGH);
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer*2);
}
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Shooting Star
This example shows how to make a ray of light, or more poetically a Shooting Star, go through a line of LEDs. You will be
able to controle how fast the 'star' shoots, and how long its 'tail' is. It isn't very elegant because the tail is as bright as the
star, and in the end it seems like a solid ray that crosses the LED line.
?v=0
You connect 11 LEDs to 11 arduino digital pins, through a 220 Ohm resistance (see image above).
The program starts lighting up LEDs until it reaches the number of LEDs equal to the size you have stablished for the tail.
Then it will continue lighting LEDs towards the left (if you mount it like and look at it like the image) to make the star keep
movint, and will start erasing from the right, to make sure we see the tail (otherwise we would just light up the whole line of
leds, this will happen also if the tail size is equal or bigger than 11)
The tail size should be relatively small in comparison with the number of LEDs in order to see it. Of course you can increase
the number of LEDs using an LED driver (see tutorial) and therefore, allow longer tails.
Code
/* ShootingStar
* ------------
* This program is kind of a variation of the KnightRider
* It plays in a loop a "Shooting Star" that is displayed
* on a line of 11 LEDs directly connected to Arduino
*
* You can control how fast the star shoots thanx to the
* variable called "waitNextLed"
*
* You can also control the length of the star's "tail"
* through the variable "tail length"
* First it reads two analog pins that are connected
* to a joystick made of two potentiometers
*
* @author: Cristina Hoffmann
* @hardware: Cristina Hofmann
*
*/
// Variable declaration
int pinArray [] = { 2,3,4,5,6,7,8,9,10,11,12 }; // Array where I declare the pins connected to the
LEDs
int controlLed = 13;
int waitNextLed = 100; // Time before I light up the next LED
int tailLength = 4; // Number of LEDs that stay lit befor I start turning them off, thus the tail
int lineSize = 11; // Number of LEDs connected (which also is the size of the pinArray)
// Main loop
void loop()
{
int i;
int tailCounter = tailLength; // I set up the tail length in a counter
digitalWrite(controlLed, HIGH); // I make sure I enter the loop indicating it with this LED
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Pushbutton
The pushbutton is a component that connects two points in a circuit when you press it. The example turns on an LED when
you press the button.
We connect three wires to the Arduino board. The first goes from one leg of the pushbutton through a pull-up resistor (here
2.2 KOhms) to the 5 volt supply. The second goes from the corresponding leg of the pushbutton to ground. The third
connects to a digital i/o pin (here pin 7) which reads the button's state.
When the pushbutton is open (unpressed) there is no connection between the two legs of the pushbutton, so the pin is
connected to 5 volts (through the pull-up resistor) and we read a HIGH. When the button is closed (pressed), it makes a
connection between its two legs, connecting the pin to ground, so that we read a LOW. (The pin is still connected to 5 volts,
but the resistor in-between them means that the pin is "closer" to ground.)
void loop(){
val = digitalRead(inPin); // read input value
if (val == HIGH) { // check if the input is HIGH (button released)
digitalWrite(ledPin, LOW); // turn LED OFF
} else {
digitalWrite(ledPin, HIGH); // turn LED ON
}
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Switch
This example demonstrates the use of a pushbutton as a switch: each time you press the button, the LED (or whatever) is
turned on (if it's off) or off (if on). It also debounces the input, without which pressing the button once would appear to the
code as multiple presses.
Circuit
Code
/* switch
*
* Each time the input pin goes from LOW to HIGH (e.g. because of a push-button
* press), the output pin is toggled from LOW to HIGH or HIGH to LOW. There's
* a minimum delay between toggles to debounce the circuit (i.e. to ignore
* noise).
*
* David A. Mellis
* 21 November 2006
*/
// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0; // the last time the output pin was toggled
long debounce = 200; // the debounce time, increase if the output flickers
void setup()
{
pinMode(inPin, INPUT);
pinMode(outPin, OUTPUT);
}
void loop()
{
reading = digitalRead(inPin);
// if the input just went from LOW and HIGH and we've waited long enough
// to ignore any noise on the circuit, toggle the output pin and remember
// the time
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
if (state == HIGH)
state = LOW;
else
state = HIGH;
time = millis();
}
digitalWrite(outPin, state);
previous = reading;
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
We connect three wires to the Arduino board. The first goes to ground from one of the outer pins of the potentiometer. The
second goes from 5 volts to the other outer pin of the potentiometer. The third goes from analog input 2 to the middle pin of
the potentiometer.
By turning the shaft of the potentiometer, we change the amount of resistence on either side of the wiper which is connected
to the center pin of the potentiometer. This changes the relative "closeness" of that pin to 5 volts and ground, giving us a
different analog input. When the shaft is turned all the way in one direction, there are 0 volts going to the pin, and we read
0. When the shaft is turned all the way in the other direction, there are 5 volts going to the pin and we read 1023. In
between, analogRead() returns a number between 0 and 1023 that is proportional to the amount of voltage being applied to
the pin.
Code
void setup() {
pinMode(ledPin, OUTPUT); // declare the ledPin as an OUTPUT
}
void loop() {
val = analogRead(potPin); // read the value from the sensor
digitalWrite(ledPin, HIGH); // turn the ledPin on
delay(val); // stop the program for some time
digitalWrite(ledPin, LOW); // turn the ledPin off
delay(val); // stop the program for some time
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Interfacing a Joystick
The Joystick
Schematic
How this works
The joystick in the picture is nothing but two potentiometers that allow us to messure the movement of the stick in 2-D.
Potentiometers are variable resistors and, in a way, they act as sensors providing us with a variable voltage depending on
the rotation of the device around its shaft.
The kind of program that we need to monitor the joystick has to make a polling to two of the analog pins. We can send
these values back to the computer, but then we face the classic problem that the transmission over the communication port
has to be made with 8bit values, while our DAC (Digital to Analog Converter - that is messuring the values from the
potentiometers in the joystick) has a resolution of 10bits. In other words this means that our sensors are characterized with
a value between 0 and 1024.
The following code includes a method called treatValue() that is transforming the sensor's messurement into a value between
0 and 9 and sends it in ASCII back to the computer. This allows to easily send the information into e.g. Flash and parse it
inside your own code.
Finally we make the LED blink with the values read from the sensors as a direct visual feedback of how we control the
joystick.
/* Read Jostick
* ------------
*
* Reads two analog pins that are supposed to be
* connected to a jostick made of two potentiometers
*
* We send three bytes back to the comp: one header and two
* with data as signed bytes, this will take the form:
* Jxy\r\n
*
* x and y are integers and sent in ASCII
*
* http://www.0j0.org | http://arduino.berlios.de
* copyleft 2005 DojoDave for DojoCorp
*/
void setup() {
pinMode(ledPin, OUTPUT); // initializes digital pins 0 to 7 as outputs
beginSerial(9600);
}
void loop() {
// reads the value of the variable resistor
value1 = analogRead(joyPin1);
// this small pause is needed between reading
// analog pins, otherwise we get the same value twice
delay(100);
// reads the value of the variable resistor
value2 = analogRead(joyPin2);
digitalWrite(ledPin, HIGH);
delay(value1);
digitalWrite(ledPin, LOW);
delay(value2);
serialWrite('J');
serialWrite(treatValue(value1));
serialWrite(treatValue(value2));
serialWrite(10);
serialWrite(13);
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
Knock Sensor
Here we use a Piezo element to detect sound, what will allow us to use it as a knock sensor. We are taking advantage of the
processors capability to read analog signals through its ADC - analog to digital converter. These converters read a voltage
value and transform it into a value encoded digitally. In the case of the Arduino boards, we transform the voltage into a value
in the range 0..1024. 0 represents 0volts, while 1024 represents 5volts at the input of one of the six analog pins.
A Piezo is nothing but an electronic device that can both be used to play tones and to detect tones. In our example we are
plugging the Piezo on the analog input pin number 0, that supports the functionality of reading a value between 0 and 5volts,
and not just a plain HIGH or LOW.
The other thing to remember is that Piezos have polarity, commercial devices are usually having a red and a black wires
indicating how to plug it to the board. We connect the black one to ground and the red one to the input. We also have to
connect a resistor in the range of the Megaohms in parallel to the Piezo element; in the example we have plugged it directly
in the female connectors. Sometimes it is possible to acquire Piezo elements without a plastic housing, then they will just look
like a metallic disc and are easier to use as input sensors.
The code example will capture the knock and if it is stronger than a certain threshold, it will send the string "Knock!" back to
the computer over the serial port. In order to see this text you could either use a terminal program, which will read data
from the serial port and show it in a window, or make your own program in e.g. Processing. Later in this article we propose
a program that works for the software designed by Reas and Fry.
/* Knock Sensor
* ----------------
*
* Program using a Piezo element as if it was a knock sensor.
*
* We have to basically listen to an analog pin and detect
* if the signal goes over a certain threshold. It writes
* "knock" to the serial port if the Threshold is crossed,
* and toggles the LED on pin 13.
*
* (cleft) 2005 D. Cuartielles for K3
*/
void setup() {
pinMode(ledPin, OUTPUT);
beginSerial(9600);
}
void loop() {
val = analogRead(knockSensor);
if (val >= THRESHOLD) {
statePin = !statePin;
digitalWrite(ledPin, statePin);
printString("Knock!");
printByte(10);
printByte(13);
}
delay(100); // we have to make a delay to avoid overloading the serial port
}
If, e.g. we would like to capture this "knock" from the Arduino board, we have to look into how the information is transferred
from the board over the serial port. First we see that whenever there is a knock bigger that the threshold, the program is
printing (thus sending) "Knock!" over the serial port. Directly after sends the byte 10, what stands for EOLN or End Of LiNe,
and byte 13, or CR - Carriage Return. Those two symbols will be useful to determine when the message sent by the board is
over. Once that happens, the processing program will toggle the background color of the screen and print out "Knock!" in the
command line.
// Knock In
// by David Cuartielles <http://www.0j0.org>
// based on Analog In by Josh Nimoy <http://itp.jtnimoy.com>
// Reads a value from the serial port and makes the background
// color toggle when there is a knock on a piezo used as a knock
// sensor.
// Running this example requires you have an Arduino board
// as peripheral hardware sending values and adding an EOLN + CR
// in the end. More information can be found on the Arduino
// pages: http://www.arduino.cc
import processing.serial.*;
Serial port;
void setup()
{
size(200, 200);
void draw()
{
// Process each one of the serial port events
while (port.available() > 0) {
serialEvent(port.read());
}
background(val);
}
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
/*
* Code for making one potentiometer control 3 LEDs, red, grn and blu, or one tri-color LED
* The program cross-fades from red to grn, grn to blu, and blu to red
* Debugging code assumes Arduino 0004, as it uses Serial.begin()-style functions
* Clay Shirky <clay.shirky@nyu.edu>
*/
// OUTPUT: Use digital pins 9-11, the Pulse-width Modulation (PWM) pins
// LED's cathodes should be connected to digital GND
int redPin = 9; // Red LED, connected to digital pin 9
int grnPin = 10; // Green LED, connected to digital pin 10
int bluPin = 11; // Blue LED, connected to digital pin 11
// Program variables
int redVal = 0; // Variables to store the values to send to the pins
int grnVal = 0;
int bluVal = 0;
void setup()
{
pinMode(redPin, OUTPUT); // sets the pins as output
pinMode(grnPin, OUTPUT);
pinMode(bluPin, OUTPUT);
// Main program
void loop()
{
potVal = analogRead(potPin); // read the potentiometer value at the input pin
Edit Page | Page History | Printable View | All Recent Site Changes
Arduino search
Buy | Download | Getting Started | Learning | Reference | Hardware | FAQ Blog » | Forum » | Playground »
An example of a parallel to serial register is the CD4021B, sometimes referred to as an “8-Stage Static Shift Register.” This
means you can read the state of up to 8 digital inputs attached to the register all at once. This is called Asynchronous
Parallel Input. “Input” because you are collecting information. “Parallel” because it is all at once, like hearing a musical cord.
“Asynchronous” because the CD4021B is doing all this data collection at its own pace without coordinating with the Arduino.
That happens in the next step when those 8 pin states are translated into a series of HIGH and LOW pulses on the serial-out
pin of the shift register. This pin should be connected to an input pin on your Arduino Board, referred to as the data pin.
The transfer of information itself is called Synchronous Serial Output because the shift register waits to deliver linear sequence
of data to the Arduino until the Arduino asks for it. Synchronous Serial communication, input or output, is heavily reliant on
what is referred to as a clock pin. That is what makes it “synchronous.” The clock pin is the metronome of the conversation
between the shift register and the Arduino. Every time the Arduino sends the clock pin from LOW to HIGH it is telling the
shift register “change the state of your Serial Output pin to tell me about the next switch.”
The third pin attached to the Arduino is a “Parallel to Serial Control” pin. You can think of it as a latch pin. When the latch
pin is HIGH the shift register is listening to its 8 parallel ins. When it is LOW it is listening to the clock pin and passing
information serially. That means every time the latch pin transitions from HIGH to LOW the shift register will start passing its
most current switch information.
The pseudo code to coordinate this all looks something like this:
1. Make sure the register has the latest information from its parallel inputs (i.e. that the latch pin is HIGH)
2. Tell the register that I’m ready to get the information serially (latch pin LOW)
3. For each of the inputs I’m expecting, pulse the clockPin and then check to see if the data pin is low or high
_______
switch -> | |
switch -> | C |
switch -> | D |
switch -> | 4 | -> Serial Data to Arduino
switch -> | 0 |
switch -> | 2 |
switch -> | 1 | <- Clock Data from Arduino
switch -> |_____| <- Latch Data from Arduino
If supplementing your Arduino with an additional 8 digital-ins isn’t going to be enough for your project you can have a
second CD4021 pass its information on to that first CD4021 which will then be streaming all 16 bits of information to the
Arduino in turn. If you know you will need to use multiple shift registers like this check that any shift registers you buy can
handle Synchronous Serial Input as well as the standard Synchronous Serial Output capability. Synchronous Serial Input is the
feature that allows the first shift register to receive and transmit the serial-output from the second one linked to it. The
second example will cover this situation. You can keep extending this daisy-chain of shift registers until you have all the
inputs you need, within reason.
_______
switch -> | |
switch -> | C |
switch -> | D |
switch -> | 4 | -> Serial Data to Arduino
switch -> | 0 |
switch -> | 2 | <- Clock Data from Arduino
switch -> | 1 | <- Latch Data from Arduino
switch -> |_____| <------
|
|
|
_______ | Serial Data Passed to First
switch -> | | | Shift Register
switch -> | C | |
switch -> | D | |
switch -> | 4 | ______|
switch -> | 0 |
switch -> | 2 | <- Clock Data from Arduino
switch -> | 1 | <- Latch Data from Arduino
switch -> |_____|
There is more information about shifting in the ShiftOut tutorial, and before you start wiring up your board here is the pin
diagram of the CD4021 from the Texas Instruments Datasheet
PINS Q6, Q7, Serial Output Pins from different steps in the
2, Q8 sequence. Q7 is a pulse behind Q8 and Q6 is
12, a pulse behind Q7. Q8 is the only one used in
3 these examples.
The Circuit
1. Power Connections
From now on those will be refered to as the dataPin, the clockPin and the latchPin respectively.
3. Add 8 Switches
Diagram
The Code
The Circuit
Two of these connections simply extend the same clock and latch signal from the Arduino to the second shift register (yellow
and green wires). The blue wire is going from the serial out pin (pin 9) of the first shift register to the serial data input (pin
14) of the second register.
3. Add a second set of Switches.
Notice that there is one momentary switch and the rest are toggle switches. This is because the code examples will be using
the switches attached to the second shift register as settings, like a preference file, rather than as event triggers. The one
momentary switch will be telling the microcontroller that the setting switches are being changed.