Vous êtes sur la page 1sur 33

Lecture 9:

Microcontrollers part 1
BJ Furman
29OCT2012

The Plan for Today

Microcontrollers for engineering


applications

What is a microcontroller?
How are microcontrollers used?
The Arduino hardware platform
The Spartronics Experimenter board
Programming the Arduino
Basic steps
Digital I/O
Analog I/O

Learning Objectives

Explain what a microcontroller is

Explain where microcontrollers are used

Describe the Arduino prototyping platform

Describe the Spartronics Experimenter board

Explain what is meant by a pin being an input


or an output

Write programs for the Arduino that can do:

Digital I/O

Analog I/O

What is a Microcontroller?

A small computer usually implemented on a


single IC that contains a central processing
unit (CPU), some memory, and peripheral
devices such as counter/timers, analog-todigital converters, serial communication
hardware, etc.
ATmega328
the brain of the Arduino

http://www.amazon.com/AVR-Pin-20MHz32K-ATMega328/dp/B004G5AVS6

Where are Microcontrollers Used?

Everywhere!

Car
Phone
Toothbrush
Microwave oven
Copier
Television
PC keyboard
Appliances
http://ecomodder.com/wiki/index.php/MPGuino

The Arduino Platform

Atmel ATmega328
microcontroller
14 digital I/O pins

6 with PWM

6 analog I/O pins


32 kB (-2 kB)
Flash memory
2 kB RAM
1 kB EEPROM
16 MHz clock
$22 - $30 built

Rx + Tx
LEDs

Pin 13 LED

Digital Pins
Power
LED

USB
jack

Reset
Button

FTDI
USB chip

Voltage
regulator

Microcontroller
power
jack

$13 breadboardable

http://arduino.cc/

Pwr/GND Pins

Analog Pins

ICSP
Header

The Spartronics Experimenter Board

Momentary SPST
push-button switches
Red LEDs
Piezo speaker
Potentiometer (pot)
Temperature sensor
Light sensor
Dual 7-segment display
RGB LED

Dual 7-segment display

RGB LED

speaker
Light sensor
R
G
Cathode

http://www.sparkfun.com/commerce/images/products/00105-03-L_i_ma.jpg

Pot

Handling the Arduino - How NOT to Do It!


Improper Handling - NEVER!!!

Handling the Arduino - The Proper Way


Proper Handling - by the edges!!!

Programming the Arduino

An arduino program == sketch


Must have:

setup()

setup()
loop()
configures pin modes and
registers

loop()

runs the main body of the


program forever

like while(1) {}

Where is main() ?

Arduino simplifies things


Does things for you

/* Blink - turns on an LED for DELAY_ON msec,


then off for DELAY_OFF msec, and repeats
*/
const byte ledPin = 13; // LED on digital pin 13
const int DELAY_ON = 1000;
const int DELAY_OFF = 1000;
// setup() method runs once, when the sketch starts
void setup()
{
// initialize the digital pin as an output:
pinMode(ledPin, OUTPUT);
}
// loop() method runs forever,
// as long as the Arduino has power
void loop()
{
digitalWrite(ledPin, HIGH); // set the LED on
delay(DELAY_ON); // wait for DELAY_ON msec
digitalWrite(ledPin, LOW); // set the LED off
delay(DELAY_OFF); // wait for DELAY_OFF msec
}

Using setup()

const byte ledPin = 13; // LED on digital pin 13

A digital pin can either be


an output or an input

Output

your program determines


what the voltage on a pin is
(either 0V (LOW or logic 0)
or 5V (HIGH or logic 1)

Information is sent out

the world outside the


microcontroller determines
the voltage applied to the
pin

Information is taken in

pinMode()

Input

void setup()
{
// initialize the digital pin as an output:
pinMode(ledPin, OUTPUT);
}

sets whether a pin is an


input or an output

ledPin byte constant


assigned the value of 13
OUTPUT is a macro
defined constant
Which has the value 1
INPUT is a macro ?
where can you find out about
the commands, etc?

http://arduino.cc/en/Reference/Extended

Blinking the LED in loop()

digitalWrite()

#define LED_PIN 13 // LED on digital pin 13


#define DELAY_ON 500 // in ms
#define DELAY_OFF 100

Causes the voltage on the


indicated pin to go HIGH
(+5V) or LOW (0V)
Note: must first configure the
pin to be an output

void setup()
{
// initialize the digital pin as an output:
pinMode(LED_PIN, OUTPUT);
}
To make pin go to 5V (high):
void loop()
{
digitalWrite(pin_num,HIGH);
Best to #define pin num. digitalWrite(LED_PIN, HIGH); // turn LED on
delay(DELAY_ON); // wait for DELAY_ON ms
To make pin go to 0V (low):
digitalWrite(LED_PIN, LOW); // turn LED off
digitalWrite(pin_num,LOW);
delay(DELAY_OFF); // wait for DELAY_OFF ms
}

delay()

Causes the program to wait for


a specified time in milliseconds
http://arduino.cc/en/Reference/Extended

Spartronics Experimenter Button Pinout


To ATmega328

Pin and Button map


12 - SW0
8 - SW1
7 - SW2
4 - SW3
How should the associated
pins be configured: as
INPUTS or as OUTPUTS?
Active LOW

Voltage on pin changes


from 5V to 0V when
switch is pressed
Need to turn on internal
pull-up resistor, so that
5V is supplied to pin

12

Pull-up Resistor Concept


Pull-up resistor OFF

Pull-up resistor ON

ATmega328

ATmega328
Pull-up resistor

VTG= +5V

PD3
0

VTG= +5V

PD3
0

Spartronics Experimenter LED Pinout

Pin and LED map

11 - LED0 (red)
9 - LED1 (red) or RGB (green)
6 - LED2 (red) or RGB (blue)
3 - LED3 (red) or RGB (red)
13 - LED on Arduino

Jumper determines whether pins


map to red LEDs or the RGB
11

Spartronics Experimenter Digital Pin

Assignments
13

12

11

10

SCK

MISO

MOSI

SS

OC1

ICP

AIN1

AIN0

T1

T0

INT1

INT0

TXD

RXD

LED

LED

LED
pwm

pwm

LED0

pwm

pwm

pwm

pwm

LED1

LED2

LED3

green

blue

red
piezo

servo
SW0

SW1

SW2

SW3

Spartronics Experimenter Analog Pin

Assignments
7

photocell

POT

temp sensor

Code to Set Up Button Pins

Two steps:
1.

Make the pin an


INPUT

2.

pinMode()

Turn the pull-up


resistor on

const byte SW0 =


const byte SW1 =
const byte SW2 =
const byte SW3 =

12;
8;
7;
4;

// button SW0
// button SW1
// button SW2
// button SW3

void setup()
{
pinMode(SW0, INPUT); // make SW0 an INPUT
digitalWrite(SW0, HIGH); // turn on pullup resistor

etc.
}

digitalWrite()
a 1 to the pin

(See full_test.pde for a more elegant approach to setting up button pins)

Digital I/O Example - Problem Statement

Write a program to turn on the blue of the


RGB LED (connected to digital pin 6) when
SW0 is pressed (off otherwise)

Pseudocode:
define pin assignments
configure pins (which are input, which are output)
loop forever

if SW0 button is pressed


make pin 6 high
else
make pin 6 low

Digital I/O Example - Pin Assignment and


Configuration

Refine the pseudocode:

define pin assignments

const byte RGB_blue_pin = 6;


const byte SW0_pin = 12;

configure pins (in function setup())

RGB_blue_pin

SW0_pin

make it an OUTPUT
_______
INPUT
make it an ______

turn on pull-up resistor on


SW0 pin

pin will read high (1) until


pulled low (0)
see schematic

void setup()
{
pinMode(RGB_blue_pin, OUTPUT);
pinMode(SW0_pin, INPUT);
digitalWrite(SW0_pin, HIGH);
}

Digital I/O Example - loop() Algorithm

Refine the pseudocode, cont.:

loop forever (use function loop())

If button is not pressed:

high (5V)
voltage on button pin 12 will be _______
make pin 6 voltage low (LED will go off or stay off)

If button is pressed:

low (0V)
voltage on button pin 12 will be _______
make pin 6 voltage high (LED will go on or stay on)
void loop()
{
if(digitalRead(SW0_pin) == LOW)
{
digitalWrite(RGB_blue_pin, HIGH);
}
else
{
digitalWrite(RGB_blue_pin, LOW);
}
}

Digital I/O Example - Arduino Program

Arduino program
Suppose a change to the
specifications:

LED is on until button


pressed, then off
Contrast mechatronic
approach vs. nonmechatronic

re-wire, or
re-program
the mechatronics
approach separates the
sensing elements from
the control elements

/* Blue_LED_button_cntrl1 - turns on blue LED when


SW0 on Experimenter board is pressed, off otherwise
*/
/* pin assignments */
const byte RGB_blue_pin = 6;
const byte SW0_pin = 12;
/* configure pins */
void setup()
{
pinMode(RGB_blue_pin, OUTPUT);
pinMode(SW0_pin, INPUT);
digitalWrite(SW0_pin, HIGH);
}
/* loop forever */
void loop()
{
if(digitalRead(SW0_pin) == LOW)
digitalWrite(RGB_blue_pin, HIGH);
else
digitalWrite(RGB_blue_pin, LOW);
}

Digital I/O Example - Modification

Modify Arduino
program, so that
LED is on until
button is pressed,
then turns off

How?

Pin assignments?

setup()?
Need to turn on
the LED!
loop()?
Swap values of
second
argument in
digitalWrite calls

/* Blue_LED_button_cntrl1 - turns on blue LED when


SW0 on Experimenter board is pressed, off otherwise
*/
/* pin assignments */
const byte RGB_blue_pin = 6;
const byte SW0_pin = 12;
/* configure pins */
void setup()
{
pinMode(RGB_blue_pin, OUTPUT);
pinMode(SW0_pin, INPUT);
digitalWrite(SW0_pin, HIGH);
}
/* loop forever */
void loop()
{
if(digitalRead(SW0_pin) == LOW)
digitalWrite(RGB_blue_pin, HIGH);
else
digitalWrite(RGB_blue_pin, LOW);
}

Comparison of Digital I/O Programs


/* Blue_LED_button_cntrl1 - turns on blue LED
when SW0 on Experimenter board is pressed, off
otherwise */

/* Blue_LED_button_cntrl2 - turns off blue LED


when SW0 on Experimenter board is pressed, on
otherwise */

/* pin assignments */
const byte RGB_blue_pin = 6;
const byte SW0_pin = 12;

/* pin assignments */
const byte RGB_blue_pin = 6;
const byte SW0_pin = 12;

/* configure pins */
void setup()
{
pinMode(RGB_blue_pin, OUTPUT);
pinMode(SW0_pin, INPUT);
digitalWrite(SW0_pin, HIGH);
}

/* configure pins */
void setup()
{
pinMode(RGB_blue_pin, OUTPUT);
pinMode(SW0_pin, INPUT);
digitalWrite(SW0_pin, HIGH);
digitalWrite(RGB_blue_pin, HIGH);
}

/* loop forever */
void loop()
{
if(digitalRead(SW0_pin) == LOW)
digitalWrite(RGB_blue_pin, HIGH);
else
digitalWrite(RGB_blue_pin, LOW);
}

/* loop forever */
void loop()
{
if(digitalRead(SW0_pin) == LOW)
digitalWrite(RGB_blue_pin, LOW);
else
digitalWrite(RGB_blue_pin, HIGH);
}

Analog In with
Serial Out

Read the POT

Note: analog voltage!

0V0
5 V 1023

Blink an LED at a rate


proportional to the pot
voltage
Output the pot voltage
to the serial monitor

Initialize with
Serial.begin()
Map voltage to delay
Write a line with
Serial.print or
Serial.println

#define MAX_DELAY_TIME 1000 // max delay in ms


#define MIN_DELAY_TIME 10 // min delay in ms
#define MAX_POT_VALUE 855 // max pot reading
#define MIN_POT_VALUE 0 // min pot reading
const byte potPin = 1; // pot output on pin 1
const byte ledPin = 6; // blue LED on pin 6
unsigned int potVoltage = 0; // value of pot voltage
unsigned int delay_ms;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(potPin, INPUT);
Serial.begin(9600); // init serial comm at 9600 bps
}
void loop() {
potVoltage = analogRead(potPin); // read pot
delay_ms =
map(potVoltage,MIN_POT_VALUE,MAX_POT_VALUE,MIN
_DELAY_TIME,MAX_DELAY_TIME);
Serial.print("sensor = " ); // print to monitor
Serial.print(potVoltage);
Serial.print(" delay, ms = " );
Serial.println(delay_ms); // print delay and linefeed
digitalWrite(ledPin, HIGH); // turn the LED on
delay(delay_ms); // wait for delay_ms
digitalWrite(ledPin, LOW); // turn the LED off:
delay(delay_ms); // wait for delay_ms
}
POT_input_Serial_Out.pde

Effect of Using delay()


Leads to poor (slow) performance as
delay time increases
Try to avoid long delays

Use millis() instead


Check for time exceeding millis() + delay_time
Ex. POT_in_Serial_Out.pde

Note also the use of #ifdef for conditional compilation


Note how roll-over of millis() is handled

Analog Out (PWM) Concept

No facility exists on most microcontrollers


to directly output an analog voltage (i.e., a
voltage that varies continuously over the
range of 0 to 5V) 5V
time

Use Pulse Width Modulation (PWM) to


approximate an analog voltage
Digital outputs are capable of 0V or 5V
Over a fraction (ton) of a time period tcycle, keep pin
at 5V, the rest of the time, at 0V

The average voltage is proportional to ton/tcycle, which is


called the Duty Cycle
See Lab View PWM_demo.vi

Front Panel
30% duty
cycle

Block Diagram

Arduino analogWrite( )

analogWrite(pin, value);

0 value 255
0% duty cycle --> 0 V --> analogWrite(pin, 0);
100% duty cycle --> 5 V --> analogWrite(pin, 255);

fade_example.pde (see next page)

Analog Output Example

Fade the red


LED in, then
out

duty cycle is
incremented
then
decremented
256 steps

0% to 100%

const byte ledPin = 3; // red RGB LED on Experimenter


const byte FADE_MAX = 255; // max value for setting duty cycle
const byte FADE_INC = 5; // increment for changing duty cycle
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
int fadeValue; // PWM value
// fade in from min to max in increments of 5 points:
for(fadeValue = 0 ; fadeValue <= FADE_MAX; fadeValue +=FADE_INC)
{
analogWrite(ledPin, fadeValue); // sets the value (range from 0 to
255):
}
// fade out from max to min in increments of 5 points:
for(fadeValue = FADE_MAX; fadeValue >= 0; fadeValue -=FADE_INC)
{
analogWrite(ledPin, fadeValue); // sets the value (range from 0 to
255):
}
fade_example.pde
}

Review

References
Microcontroller. (2009, November 20). In
Wikipedia, the free encyclopedia.
Retrieved November 21, 2009, from
http://en.wikipedia.org/wiki/Microcontroller
Arduino Home Page. (2009, November
21). Retrieved November 21, 2009, from
http://arduino.cc/

Spartronics Experimenter Board

Vous aimerez peut-être aussi