Microcontroller Mekatronika, STT Mandala
MicrocontrollerMekatronika, STT Mandala
Isi Kuliah
• Arsitektur Microcomputer • Microcontrollers untuk aplikasi rekayasa
– Apa itu microcontroller?– Bagaimana menggunakan microcontrollers?– Platform perangkat keras Arduino– Programming the Arduino
• Basic steps• Digital I/O• Analog I/O
Sistem Mekatronika
Arsitektur Mikrokomputer
Microcomputer
• Microprocessor: chip VLSI dgn rangkaian digital yg mengerjakan
aritmetika, logika, komunikasi dan kontrol• ALU: arithmetic logic unit, mengeksekusi fungsi matematika dalam biner• Instruction decoder: interpretasi instruksi dari memory oleh control unit
dan disimpan di instruction register. Setiap instruksi me merintahkan ALU
untuk melakukan manipulasi bit seperti penambahan biner atau fungsi
logika, dan disimpan di register. Hasil dari ALU juga disimpan
dalam data register dan ditransfer ke memory oleh control unit• Bus: jalur komunikasi (jaringan saraf komputer)• ROM : penyimpanan data secara permanen• RAM: penyimpanan data selama program berjalan
– SRAM: static RAM : data dalam flip-flops selama memory ada daya– DRAM : dynamic RAM, penyimpanan capacitive harus di refreshed karena charge – leakage
• EPROM: erasable programmable EEPROM : electrically EPROM
Microcomputer
• RISC : Reduced instruction-set computer, jika instruksi2 yg digunakan
hanya sedikit maka disebut RISC microcomputer• Bahasa mesin: komunikasi ke dan dari microprocessor terjadi melalui
input/output (I/O) yg terhubung ke bus. Dalam mekatronika : ADC, DAC
D/D merupakan interface antara microcomputer dan switch, sensor
dan aktuator • Bahasa Assembly: bahasa yg dpt digunakan untuk memprogram
Microprocessor, yg terdiri dari perintah2 dasar seperti ADD, MOV• Assembler: mengkonversi bahasa assembly menjadi bahasa mesin
sehingga microprocessor mengerti dan mengeksekusi instruksi• High level language: program dengan bahasa tingkat tinggi : basic, C, dll
Microcontroller
Microcontroller:Microprocessor dalam sebuah IC -PIC--Atmel--Intel 8051-dll
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.
http://www.amazon.com/AVR-Pin-20MHz-32K-ATMega328/dp/B004G5AVS6
ATmega328the ‘brain’ of the Arduino
Atmega 328 pin mapping
Penggunaan Microcontroller
– Car– Phone– Toothbrush– Microwave oven– Copier– Television– PC keyboard– Appliances
• http://ecomodder.com/wiki/index.php/MPGuino
Platform Arduino
• 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
FTDIUSB chip
Digital Pins
Analog Pins
USBjack
Microcontrollerpowerjack
Voltageregulator
Pwr/GND Pins
ICSPHeader
ResetButton
PowerLED
Pin 13 LEDRx + TxLEDs
http://arduino.cc/
Programming the Arduino
• 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
/* 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 13const 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()
• 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
const byte ledPin = 13; // LED on digital pin 13
void setup(){ // initialize the digital pin as an output: pinMode(ledPin, OUTPUT); }
where can you find out aboutthe commands, etc?
http://arduino.cc/en/Reference/Extended
pinMode() 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 … ?
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
Pull-up Resistor Concept
ATmega328
PD3
VTG= +5V
0
1
ATmega328
PD3
VTG= +5V
0
1
Pull-up resistor OFF Pull-up resistor ON
Pull-up resistor
Code to Set Up Button Pins
• Two steps:1. Make the pin an
INPUT• pinMode()
2. Turn the pull-up resistor on
• digitalWrite() a 1 to the pin
const byte SW0 = 12; // button SW0const byte SW1 = 8; // button SW1const byte SW2 = 7; // button SW2const 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)
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
– 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
void setup() { pinMode(RGB_blue_pin, OUTPUT); pinMode(SW0_pin, INPUT); digitalWrite(SW0_pin, HIGH);}
OUTPUT
INPUT
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)
void loop() { if(digitalRead(SW0_pin) == LOW) { digitalWrite(RGB_blue_pin, HIGH); } else { digitalWrite(RGB_blue_pin, LOW); }}
high (5V)
low (0V)
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. non-mechatronic
• 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);}
/* 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
Comparison of Digital I/O Programs
/* 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);}
/* 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);}
Analog In with Serial Out
• 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
#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 1const byte ledPin = 6; // blue LED on pin 6unsigned int potVoltage = 0; // value of pot voltageunsigned 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)– 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
5Vtime
30% dutycycle
Front Panel
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 Experimenterconst byte FADE_MAX = 255; // max value for setting duty cycleconst 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