Pengenalan Input dan Output pada Mikrokontroler

Input dan output pada mikrokontroler dibagi menjadi dua yaitu digital dan analog. Digital merupakan input atau output yang berisi isyarat biner (1 atau 0; High atau Low). Sedangkan analog berisi sinyal-sinyal analog, contohnya sinus, PWM, dan lain sebagainya.

A. Digital Input

Seperti yang telah dijelaskan di atas, digital input hanya menerima isyarat biner yakni 1 atau 0; High atau Low. Isyarat biner 1 berarti tegangan supply mikrokontroler (VCC/VDD) diberikan pada digital input mikrokontroler, tegangan supply ini bisa bervariasi tergantung jenis dan tipe mikrokontrolernya. Isyarat biner 0 berarti tegangan 0 V atau ground diberikan pada digital input mikrokontroler. Telah disinggung sebelumnya, bahwa tegangan isyarat biner 1 adalah memberikan tegangan supply mikrokontroler pada digital input dan isyarat biner 0 adalah memberikan ground pada digital input. Namun kita juga dapat memberikan logic (isyarat biner) dengan cara memberikan tegangan yang spesifik (voltage logic level) pada digital input mikrokontroler, hal ini tergantung pada jenis mikrokontrolernya (CMOS atau TTL).

Berikut merupakan voltage logic level untuk CMOS dan TTL :

Input dan Output Voltage Level CMOS
Input dan output logic voltage level CMOS

Tiap-tiap jenis dan tipe mikrokontroler memiliki jumlah pin digital input yang berbeda-beda. Contohnya seperti mikrokontroler Arduino Uno dan Leonardo memiliki 14 pin yang dapat dikonfigurasi menjadi digital input atau digital output. Sedangkan Arduino Mega memiliki 54 pin yang dapat dikonfigurasi menjadi digital input atau digital output.

Berikut merupakan percobaan pembacaan digital input menggunakan mikrokontroler Arduino MKR1000 :

Wiring diagram
//Program Intro Digital Input : Digital Read Serial & LCD
//RDD-TEAM (14-01-2020)
//www.rdd-tech.com

#include <Wire.h>
#include "DFRobot_RGBLCD.h"

const int colorR = 255;
const int colorG = 255;
const int colorB = 255;

DFRobot_RGBLCD lcd(16,2);

const int  buttonPin = 7;
bool buttonState = 0;

void setup() 
{
  Serial.begin(115200);
  
  lcd.init();
  lcd.setRGB(colorR, colorG, colorB);
  lcd.setCursor(0, 0);
  lcd.print("Button State:");

  pinMode(buttonPin, INPUT);
}

void loop() 
{
  buttonState = digitalRead(buttonPin);
  if (buttonState == 1)
    {
      Serial.print("Button State: ");
      Serial.println("HIGH");
      lcd.setCursor(0, 1);
      lcd.print("HIGH");
      lcd.print(" ");
    }
  else
    {
      Serial.print("Button State: ");
      Serial.println("LOW");
      lcd.setCursor(0, 1);
      lcd.print("LOW");
      lcd.print(" ");
    }
  delay(1);
}

Program diatas memerintahkan mikrokontroler agar membaca digital input pada pin 7 dan mencetak hasil pembacaannya pada serial monitor dan LCD.

Wiring rangkaian
Tampilan pada serial monitor ketika push button tidak ditekan
Tampilan pada serial monitor ketika push button ditekan
Tampilan pada layar LCD

B. Analog Input

Fenomena fisika alam seperti temperatur, intensitas cahaya, tekanan udara, aliran debit air di sungai, dan lain sebagainya dapat disampling menjadi sinyal-sinyal analog yang bisa dibaca oleh mikrokontroler melalui analog input. Sinyal-sinyal analog ini bersifat kontinu, oleh karena itu mikrokontroler perlu men-diskritkan sinyal-sinyal analog agar dapat diolah olehnya. Komponen pendiskrit sinyal ini (ADC atau Analog to Digital Converter) biasanya telah terpasang didalam mikrokontroler. Biasanya resolusi ADC dinyatakan dengan bit. Contohnya 10bit ADC memiliki rentang nilai dari 0 sampai 1023. Jika melakukan pembacaan sinyal dengan nilai maksimal sebesar 5V dan nilai minimal 0V, maka jika diberikan nilai 2.5V mikrokontroler akan membaca analog input sebesar 511. Semakin besar resolusi ADC maka sinyal yang terbaca oleh mikrokontroler akan semakin mendekati nilai sebenarnya.

Sinyal Analog dan Sinyal Diskrit

Tiap-tiap jenis dan tipe mikrokontroler memiliki jumlah pin analog input yang berbeda-beda. Contohnya seperti mikrokontroler Arduino Uno dan Leonardo memiliki 6 pin analog input, Arduino Mega memiliki 16 pin analog input, sedangkan Arduino MKR1000 memiliki 7 pin analog input.

Berikut merupakan percobaan pembacaan analog input menggunakan mikrokontroler Arduino MKR1000:

Wiring diagram
//Program Intro Analog Input : Analog Read Serial & LCD
//RDD-TEAM (14-01-2020)
//www.rdd-tech.com
#include <Wire.h>
#include "DFRobot_RGBLCD.h"

const int colorR = 255;
const int colorG = 255;
const int colorB = 255;

DFRobot_RGBLCD lcd(16,2);

int potPin = A0;
int potValue = 0;
float potValue_V_1 = 0.00;
float potValue_V = 0.00;


void setup()
{
  Serial.begin(115200);
  
  lcd.init();
  lcd.setRGB(colorR, colorG, colorB);
  lcd.setCursor(0, 0);
  lcd.print("Pot Value:");
  lcd.setCursor(7, 1);
  lcd.print("/");
  lcd.setCursor(15, 1);
  lcd.print("V");

  analogReadResolution(12); //ADC pada MKR1000 memiliki resolusi max 12bit
  analogReference(AR_DEFAULT);
}

void loop()
{
  potValue = analogRead(potPin);
  potValue_V_1 = potValue;
  potValue_V = (potValue_V_1/4095)*5; //konversi dari nilai ADC ke tegangan
  
  Serial.print(4095);
  Serial.print(" ");
  Serial.print(potValue);
  Serial.print(" ");
  Serial.println(0);

  lcd.setCursor(0, 1);
  lcd.print(potValue);
  lcd.print(" ");
  lcd.setCursor(8, 1);
  lcd.print(potValue_V);
  lcd.print(" ");
  
  delay(10);
}

Program diatas memerintahkan mikrokontroler untuk membaca nilai tegangan yang dimasukan pada kaki A0 dengan jeda (delay) 10 milidetik tiap pembacaannya. Lalu, mencetak hasilnya pada serial monitor maupun serial plotter dan LCD.

Wiring rangkaian

Setelah potensiometer diputar-putar berikut hasil pembacaan analog input yang ditampilkan melalui serial plotter:

Tampilan pada serial plotter
Tampilan pada layar LCD

C. Digital Output

Sama seperti digital input, digital output hanya dapat mengeluarkan isyarat biner (1 atau 0; High atau Low. Sinyal digital output biasanya digunakan untuk men-drive beban yang besar, seperti relay yang terhubung dengan motor atau fan, power MOSFET yang digunakan untuk menyalakan lampu High Powered LED (HPL) dan lain sebagainya.

Seperti yang telah dibahas sebelumnya, Arduino Uno dan Leonardo memiliki 14 pin digital I/O (input output). 1 pin hanya dapat digunakan untuk 1 fungsi saja, misalnya pin 13 dikonfigurasi menjadi digital output dan tidak bisa dikonfigurasi menjadi digital input secara bersamaan.

Berikut adalah percobaan digital output menggunakan mikrokontroler Arduino MKR1000 :

Wiring diagram
//Program Intro Digital Output : Running LED 
//RDD-TEAM (14-01-2020)
//www.rdd-tech.com

#include <Wire.h>
#include "DFRobot_RGBLCD.h"

const int colorR = 255;
const int colorG = 255;
const int colorB = 255;

DFRobot_RGBLCD lcd(16,2);

int pin = 0;
int state;

void setup()
{
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);

  Serial.begin(115200);
  Serial.println("Running LED");
  
  lcd.init();
  lcd.setRGB(colorR, colorG, colorB);
  lcd.setCursor(0, 0);
  lcd.print("Running Mode:");
  
  state = 1;
}

void loop()
{
  if (state == 1)
    {
      lcd.setCursor(0, 1);
      lcd.print("Forward    ");
      Serial.println("Forward");
      digitalWrite (pin, HIGH);
      delay(250);
      digitalWrite (pin, LOW);
      pin++;
      if (pin == 3)
        {
          state = 2;
          lcd.print(" ");
        }
     }
  if (state == 2)
     {
      lcd.setCursor(0, 1);
      lcd.print("Reverse   ");
      Serial.println("Reverse");
      digitalWrite(pin, HIGH);
      delay(250);
      digitalWrite(pin, LOW);
      pin--;
      if (pin < 0)
        {
          pin =0;
          state = 3;
          lcd.print(" ");
        }
     }
   if (state == 3)
     {
      lcd.setCursor(0, 1);
      lcd.print("Center-Back");
      Serial.println("Center-Back");
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      delay(250);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      delay(250);
      digitalWrite(0, HIGH);
      digitalWrite(3, HIGH);
      delay(250);
      digitalWrite(0, LOW);
      digitalWrite(3, LOW);
      delay(250);
      state = 4;
      lcd.print(" ");
     }
   if (state == 4)
     {
      lcd.setCursor(0, 1);
      lcd.print("Back-Center");
      Serial.println("back-Center");
      digitalWrite(0, HIGH);
      digitalWrite(3, HIGH);
      delay(250);
      digitalWrite(0, LOW);
      digitalWrite(3, LOW);
      delay(250);
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      delay(250);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      delay(250);
      state = 1;
      lcd.print(" ");
     }
  else
     {
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      lcd.print(" ");
     }
}

Program diatas memerintahkan mikrokontroler untuk menyalakan dan memadamkan LED yang terpasang pada pin 0 sampai 3 dengan berbagai mode.

Wiring rangkaian
Running LED

D. Analog Output

Analog output adalah kebalikan dari analog input, pada analog input sinyal yang masuk diubah menjadi sinyal digital oleh ADC. Namun pada analog output sinyal digital diubah menjadi sinyal analog (DAC atau Digital to Analog Converter) dengan menggunakan pendekatan PWM (Pulse Width Modulation). PWM pada mikrokontroler juga memiliki resolusi sama seperti ADC. Contohnya Arduino Uno, Leonardo, Mega dan MKR1000 memiliki PWM dengan resolusi 8 bit (0 sampai 255).

Pulse Width Modulation (PWM)

Pin PWM pada mikrokontroler Arduino memiliki lambang gelombang disamping marker angka pin. Contohnya seperti pada gambar dibawah ini.

Pin yang dapat mengeluarkan PWM diberi kotak merah

Pada Arduino Uno atau Leonardo ini terdapat 2 frekuensi gelombang PWM yaitu 490Hz dan 980Hz. Pin dengan frekuensi 490Hz adalah pin 5, 6, dan 9. Sedangkan pin dengan frekuensi 980Hz adalah pin 3, 11, dan 13. Namun pada Arduino MKR1000 semua pin PWMnya (pin D2, D3, D4, dan D5) memiliki frekuensi yang sama sekitar 733Hz.

Berikut adalah percobaan analog output menggunakan mikrokontroler Arduino MRK1000 :

Wiring diagram
//Program Intro Analog Output : Fading LED
//RDD-TEAM (14-01-2020)
//www.rdd-tech.com

#include <Wire.h>
#include "DFRobot_RGBLCD.h"

const int colorR = 255;
const int colorG = 255;
const int colorB = 255;

DFRobot_RGBLCD lcd(16,2);

int ledPin0 = 2; 
int ledPin1 = 3;
int ledPin2 = 4;
int ledPin3 = 5;

void setup()
{ 
  lcd.init();
  lcd.setRGB(colorR, colorG, colorB);
  lcd.setCursor(0, 0);
  lcd.print("Fading Value:");
}

void loop()
{
  for (int fadeValue = 0; fadeValue <= 255; fadeValue +=5)
    {
      analogWrite(2, fadeValue);
      analogWrite(3, fadeValue);
      analogWrite(4, fadeValue);
      analogWrite(5, fadeValue);
      lcd.setCursor(0, 1);
      lcd.print(fadeValue);
      delay(50);
      lcd.print(" ");
    }
  for (int fadeValue = 255; fadeValue >= 0; fadeValue -=5)
    {
      analogWrite(2, fadeValue);
      analogWrite(3, fadeValue);
      analogWrite(4, fadeValue);
      analogWrite(5, fadeValue);
      lcd.setCursor(0, 1);
      lcd.print(fadeValue);
      delay(50);
      lcd.print(" ");
    }
}

Program diatas memerintahkan mikrokontroler untuk menyalakan dan memadamkan LED secara perlahan yang terpasang tiap pin PWM.

Wiring rangkaian
Fading LED
Nilai RMS PWM pada osiloskop

Pada osiloskop terlihat nilai RMS gelombang berubah bersamaan dengan terang/redup LED.

Was this article helpful?

Related Articles

Leave A Comment?