1 / 33

Lecture 9: Microcontrollers – part 1

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

ludwig
Télécharger la présentation

Lecture 9: Microcontrollers – part 1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Lecture 9: Microcontrollers – part 1 BJ Furman 29OCT2012

  2. 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

  3. 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

  4. 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-to-digital converters, serial communication hardware, etc. ATmega328the ‘brain’ of the Arduino http://www.amazon.com/AVR-Pin-20MHz-32K-ATMega328/dp/B004G5AVS6

  5. Where are Microcontrollers Used? • Everywhere! • Car • Phone • Toothbrush • Microwave oven • Copier • Television • PC keyboard • Appliances • http://ecomodder.com/wiki/index.php/MPGuino

  6. The Arduino Platform Digital Pins Pin 13 LED Rx + TxLEDs • 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 • $13 ‘breadboardable’ PowerLED ResetButton USBjack FTDIUSB chip Voltageregulator ICSPHeader Microcontroller powerjack Analog Pins Pwr/GND Pins http://arduino.cc/

  7. R B G Cathode The Spartronics Experimenter Board • Momentary SPSTpush-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 Pot http://www.sparkfun.com/commerce/images/products/00105-03-L_i_ma.jpg

  8. Handling the Arduino - How NOT to Do It! Improper Handling - NEVER!!!

  9. Handling the Arduino - The Proper Way Proper Handling - by the edges!!!

  10. Programming the Arduino /* 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 } • An arduino program == ‘sketch’ • Must have: • setup() • loop() • setup() • 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

  11. Using setup() const byte ledPin = 13; // LED on digital pin 13 void setup() { // initialize the digital pin as an output: pinMode(ledPin, OUTPUT); } • 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 • Input • the world outside the microcontroller determines the voltage applied to the pin • Information is taken in • pinMode() • sets whether a pin is an inputor 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 aboutthe commands, etc? http://arduino.cc/en/Reference/Extended

  12. Blinking the LED in loop() • digitalWrite() • Causes the voltage on the indicated pin to go HIGH (+5V) or LOW (0V) • Note: must first configure the pin to be an output • To make pin go to 5V (high): • digitalWrite(pin_num,HIGH); • Best to #define pin num. • To make pin go to 0V (low): • digitalWrite(pin_num,LOW); • delay() • Causes the program to wait for a specified time in milliseconds #define LED_PIN 13 // LED on digital pin 13 #define DELAY_ON 500 // in ms #define DELAY_OFF 100 void setup() { // initialize the digital pin as an output: pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); // turn LED on delay(DELAY_ON); // wait for DELAY_ON ms digitalWrite(LED_PIN, LOW); // turn LED off delay(DELAY_OFF); // wait for DELAY_OFF ms } http://arduino.cc/en/Reference/Extended

  13. 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 8 7 4

  14. Pull-up Resistor Concept Pull-up resistor OFF Pull-up resistor ON ATmega328 ATmega328 VTG= +5V VTG= +5V Pull-up resistor 1 1 PD3 PD3 0 0

  15. 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 9 6 3

  16. Spartronics Experimenter Digital Pin Assignments

  17. Spartronics Experimenter Analog Pin Assignments

  18. Code to Set Up Button Pins • Two steps: • Make the pin an INPUT • pinMode() • Turn the pull-up resistor on • digitalWrite() a 1 to the pin const byte SW0 = 12; // button SW0 const byte SW1 = 8; // button SW1 const byte SW2 = 7; // button SW2 const byte SW3 = 4; // button SW3 void setup() { pinMode(SW0, INPUT); // make SW0 an INPUT digitalWrite(SW0, HIGH); // turn on pullup resistor etc. } (See full_test.pde for a more elegant approach to setting up button pins)

  19. 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

  20. 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 • make it an _______ • SW0_pin • make it an ______ • turn on pull-up resistor on SW0 pin • pin will read high (1) until pulled low (0) • see schematic OUTPUT INPUT void setup() { pinMode(RGB_blue_pin, OUTPUT); pinMode(SW0_pin, INPUT); digitalWrite(SW0_pin, HIGH); }

  21. Digital I/O Example - loop() Algorithm • Refine the pseudocode, cont.: • loop forever (use function loop()) • If button is not pressed: • voltage on button pin 12 will be _______ • make pin 6 voltage low (LED will go off or stay off) • If button is pressed: • voltage on button pin 12 will be _______ • make pin 6 voltage high (LED will go on or stay on) high (5V) low (0V) void loop() { if(digitalRead(SW0_pin) == LOW) { digitalWrite(RGB_blue_pin, HIGH); } else { digitalWrite(RGB_blue_pin, LOW); } }

  22. Digital I/O Example - Arduino Program /* 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); } • Arduino program • Suppose a change to the specifications: • LED is on until button pressed, then off • Contrast mechatronic approach vs. non-mechatronic • re-wire, or… • re-program • the mechatronics approach separates the sensing elements from the control elements

  23. Digital I/O Example - Modification /* 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); } • 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

  24. Comparison of Digital I/O Programs /* 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; /* 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, LOW); else digitalWrite(RGB_blue_pin, HIGH); } /* 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); }

  25. Analog In with Serial Out #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 } • Read the POT • Note: analog voltage! • 0 V 0 • 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 POT_input_Serial_Out.pde

  26. 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

  27. 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) 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 5V time

  28. Front Panel 30% duty cycle Block Diagram

  29. 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)

  30. Analog Output Example 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 the red LED in, then out • duty cycle is incremented then decremented • 256 steps • 0% to 100% fade_example.pde

  31. Review

  32. 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/

  33. Spartronics Experimenter Board

More Related