Download presentation
1
Mekatronika, STT Mandala
Microcontroller Mekatronika, STT Mandala
2
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
3
Sistem Mekatronika
4
Arsitektur Mikrokomputer
5
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
6
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
7
Microcontroller Microcontroller: Microprocessor dalam sebuah IC PIC
-Atmel -Intel 8051 dll
8
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. ATmega328 the ‘brain’ of the Arduino
9
Atmega 328 pin mapping
10
Penggunaan Microcontroller
Car Phone Toothbrush Microwave oven Copier Television PC keyboard Appliances
11
Platform Arduino http://arduino.cc/ Atmel ATmega328 microcontroller
USB jack Microcontroller power jack Voltage regulator Pwr/GND Pins ICSP Header Reset Button Power LED Pin 13 LED Rx + Tx LEDs Digital Pins 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 FTDI USB chip Analog Pins
12
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() configures pin modes and registers runs the main body of the program forever like while(1) {…} Where is main() ? Arduino simplifies things Does things for you This slide is meant as a quick overview of an Arduino sketch. We’ll unpack and describe the pieces in more detail later. Think of setup() as what you would do when you first get in a rental car or a car you have borrowed from a friend: adjust the mirrors, adjust the steering wheel, the seats, change the stereo channel settings, etc. The car can be driven by anyone, but everyone likes to customize it for their comfort. main() { init(); setup(); while (1) loop(); } And the reason that they do it this way is so it's guaranteed that init() gets called, which is critical for Arduino initialization.
13
Using setup() A digital pin can either be an output or an input Output
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 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 … ? Emphasize that the distinction between inputs and outputs. As an example, you might have the class envision that the front row of students in the class are digital pins (everyone else are internals elements of the microcontroller). Designate one student as an OUTPUT. Have the rest of the students (in unison) tell the OUTPUT student to raise his or her hand. (Have the designated ‘OUTPUT’ follow the command!). Then have the rest of the class (in unison) tell the ‘OUTPUT’ to put his or her hand down. Thus, the microcontroller has sent information ‘out’, and the pin designated as an OUTPUT has responded accordingly. Similarly designate one student in the front row as an INPUT. Have the rest of the class ask the INPUT student what the state of the room light is (is it on or off?). Have the INPUT student report to the rest of the class the state of the room light. Explain the declaration of ledPin as a const byte variable. Explain the advantage over #define ledPin 13 Digital HIGH = = 5V (usually taken as logical 1) Digital LOW = = 0V (usually taken as logical 0) wiring.h in arduino/hardware/cores/arduino #DEFINEs OUTPUT as 0x1 and INPUT as 0x0 where can you find out about the commands, etc?
14
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 // 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 wiring.h in arduino/hardware/cores/arduino #DEFINEs OUTPUT as 0x1
15
Pull-up Resistor Concept
Pull-up resistor OFF Pull-up resistor ON ATmega328 PD3 VTG= +5V 1 ATmega328 PD3 VTG= +5V 1 Pull-up resistor
16
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)
17
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
18
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 Be careful. This program relies on the mode for pin 6 starting out as an input and pullup resistor off. To be safe, you ought to have a digitalWrite(RGB_blue_pin, LOW); INPUT void setup() { pinMode(RGB_blue_pin, OUTPUT); pinMode(SW0_pin, INPUT); digitalWrite(SW0_pin, HIGH); }
19
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: 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);
20
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 This example very simple. A microcontroller is certainly not needed to implement the function of turning on an LED when a button is pressed. This functionality could be achieved much more easily and less expensively by directly wiring the switch to the LED (through a current limiting resistor, of course!). However, a small change in requirements, like that given above, might lead to time consuming and expensive efforts to meet the new functionality using the non-mechatronic approach. The mechatronic approach may be faster and less expensive to implement. It also lends itself to greatly enhanced flexibility and functionality. How about implementing a delay? Or having the LED go on only after the button has been pressed twice… or twice within a given time window, etc. Toyota problem might be fixed by modifying the software: if brake pedal AND accelerator are pressed at the same time, the brake has priority or the maximum speed is limited to X mi/hr.
21
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 Pin assignments stay the same - no change to the external hardware or its connection to the Arduino setup() - add a line to turn on the LED loop() - swap the arguments in the digitalWrite() function calls: if button is pressed, then LOW, else, HIGH
22
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
23
Analog In with Serial Out
#define MAX_DELAY_TIME // 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: 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 So far, we’ve been dealing with digital I/O: just on or off. Now we want to work with a sensor that gives an output signal that can vary in a continuous (non-discrete) way over 0V to 5V. The analog pins can be used as digital pins if desired. POT_input_Serial_Out.pde
24
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 Try to avoid using delay() for relatively long delays. Note also the use of #define to replace ‘magic’ numbers and for conditional compilation.
25
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 So far, we’ve talked about digital I/O and analog input. How about getting an analog output?
26
Front Panel 30% duty cycle Block Diagram
Show PWM_demo.vi and discuss a bit about Lab View Block Diagram
27
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)
28
Analog Output Example Fade the red LED in, then out
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) Fade the red LED in, then out duty cycle is incremented then decremented 256 steps 0% to 100% fade_example.pde
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.