Sunday, October 28, 2018

Simple Input Output GPIO

Pendahuluan

Pada project embeded system hal yang paling dasar adalah bagaimana menggunakan input-output pada pin-pin controller yang digunakan. dalam kasus Raspberry Pi yang digunakan sebagai controller maka GPIO (General Purpose Input Output) merupakan pin-pin output atau gerbang interface ke dunia luar. karena dalam Raspberry Pi salah satu bahasa pemrograman yang didukung adalah Python. maka dalam artikel ini kita batasi dengan menggunakan bahasa pemrograman Python.


Hal dasar yang perlu diketahui tentang level logic yaitu pada saat Raspberry Pi mengeluarkan data High atau logika '1' maka secara fisika mengeluarkan tegangan 3.3 Volt dan saat Raspberry Pi mengeluarkan data Low atau logika '0' maka secara real mengeluarkan tegangan 0 Volt. maka didapat disimpulkan bahwa Raspberry Pi memiliki level tegangan 3.3 Volt

Akses GPIO dari Python

Untuk mengakses GPIO dari Python maka salah satu hal yang diperlukan yaitu menginstall package bernama RPi.GPIO. RPi.GPIO merupakan package Python yang berisi class untuk mengontrol GPIO pada Raspberry Pi. menurut dokumentasi Python penggunaan package ini tidak cocok untuk aplikasi yang memerlukan waktu yang sangat presisi, mengingat kita tidak bisa memprediksi kapan Python akan melakukan garbage collecting. juga karena jalan di OS under Linux dimana priority process ditentukan oleh CPU itu sendiri. untuk menginstall package RPi.GPIO dapat dilakukan dengan perintah dibawah ini :

sudo pip install RPi.GPIO
setelah terinstall tanpa error, package RPi.GPIO siap digunakan pada script Python. untuk menggunakannya langkah-langkahnya yaitu : pertama kita perlu mengimport package RPi.GPIO dengan perintah import RPi.GPIO as gpio, kemudian ada dua mode yang memetakan pin-pin di GPIO, pertama yaitu mode BOARD dimana mode ini menamakan pin sesuai dengan angka yang tercetak pada GPIO Raspberry PI. dan yang kedua mode BCM mode ini menamakan pin sesuai dengan standar "Broadcom SOC Channel". untuk mengetahui nomor pin dapat digunakan perintah pinout pada terminal sehingga akan tampil seperti gambar berikut ini :


dapat dilihat pada gambar diatas, untuk mode BOARD menggunakan nomor yang didalam tanda kurung berwarna putih, sedangkan pada mode BCM menggunakan nomor setelah tulisan GPIO berwarna hijau. contoh, pada mode BOARD pin nomor 12 akan sama dengan mode BCM pin nomor 18. untuk mengatur mode dengan perintah gpio.setmode(gpio.BOARD) jika digunakan sebagai mode BOARD dan perintah gpio.setmode(gpio.BCM) jika digunakan sebagai mode BCM.

MODE OUTPUT

Setelah menentukan mode, kemudian menentukan mode input atau output pada pin tertentu. jika digunakan sebagai output maka perintahnya yaitu gpio.setup(pin_number, gpio.OUT) contoh gpio.setup(12, gpio.OUT). untuk mengeluarkan data HIGH dapat digunakan perintah gpio.output(pin_number, gpio.HIGH) contoh gpio.output(12, gpio.HIGH).

Sedangkan untuk mengeluarkan data low dengan perintah gpio.output(pin_number, gpio.LOW) contoh gpio.output(12, gpio.lOW). contoh berikut ini merupakan script untuk membuat blink led jika terhubung ke pin 12 mode BOARD.


import RPi.GPIO as gpio 
import time 

gpio.setmode(gpio.BOARD) 
gpio.setup(12, gpio.OUT) 

gpio.output(12, gpio.LOW) 
time.sleep(1) 
gpio.output(12, gpio.HIGH) 

gpio.cleanup()
untuk rangkaian LED ke pin GPIO perlu tambahan resistor untuk mengatur arus sebesar 15mA melalui LED. untuk mengetahui besaran berapa nilai resitor tersebut dapat digunakan hukum Ohm yaitu R = V / I, jika tegangan level logika HIGH adalah 3.3 V serta tegangan jatuh pada LED adalah 2.1 V dan I = 15mA maka nilai Resitor yang harus dipasaang yaitu 3.3 - 2.1/ 0.015 = 80 ohm.


MODE INPUT

untuk menset pin menjadi mode input, maka pada fungsi setup di gpio mempunyai tiga parameter yaitu pin number, gpio.IN dan pull_up_down=gpio.PUD_DOWN atau pull_up_down=gpio.PUD_UP. contoh gpio.setup(11, gpio.IN, pull_up_down=gpio.PUD_DOWN)

extra parameter atau parameter ketiga pada fungsi setup ini memberikan tambahan informasi bahwa perlu diaktifkan resistor pull up atau resistor pull down. jika diberikan pull_up_down= gpio.PUD_DOWN maka resistor pull down akan aktif sehingga dalam posisi ambang atau tidak ada masukan logika pin akan bernilai LOW.

jika diberikan pull_up_down=gpio.PUD_UP maka resistor pull up akan aktif, dan dalam posisi ambang atau tanpa masukan logika tegangan pin akan bernilai HIGH. untuk membaca nilai input dapat digunakan perintah gpio.INPUT(pin number) contoh gpio.INPUT(11). berikut ini adalah contoh penggunaan mode input pada GPIO.

import RPi.GPIO as gpio 
import time 

gpio.setmode(gpio.BOARD) 
gpio.setup(12, gpio.OUT) 
gpio.setup(11, gpio.IN, pull_up_down=gpio.PUD_DOWN) 

try:
   while True :
      if gpio.input(11) == gpio.HIGH :
         gpio.output(12, gpio.LOW)
      else :
         gpio.output(12, gpio.HIGH)

except KeyboardInterrupt:
  gpio.cleanup()

OUTPUT PWM (Pulse Width Modulation)

PWM atau pulse width modulation adalah teknik mengatur lebar pulsa atau duty cycle pada frekuensi yang tetap. sebagai contoh jika terdapat sebuah sinyal kotak-kotak dengan frekuensi 50 Hz yang berarti nilai periodenya yaitu 1 /50 = 0.02 sekon atau 20mS.  dengan mengatur lebar pulsa maka lebar HIGH-nya dapat berubah-rubah begitu juga lebar LOW-nya berubah-rubah, yang mana jika dijumlahkan nilainya harus tetap yaitu 20mS. 

modulasi lebar pulsa bisa digunakan untuk mengatur terang redup nyala lampu LED, mengatuh kecepatan motor DC, menentukan derajat perputaran motor servo dan lain sebagainya. 

setiap Pin I/O pada GPIO Raspberry Pi secara software dapat dijadikan output PWM dengan menggunakan package RPi.GPIO. untuk menggunakan sebagai PWM, pin perlu di setup sebagai output kemudian ditentukan nilai frekuensinya dan mengatur duty cycle awalan dalam satuan %, kemudian dapat mengubah duty cycle pada proses berikutnya  berikut adalah contoh script output PWM dengan duty cylce 5.5 % untuk awalan :


import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

GPIO.setup(18, GPIO.OUT)

pwm = GPIO.PWM(18, 50)

pwm.start(5.5)
time.sleep(1)

pwm.ChangeDutyCycle(7.5)
time.sleep(1)


pwm.stop()
GPIO.cleanup()

dapat dilihat pada script di atas dimana mode yang digunakan BCM pin 18 sama dengan pin 12 mode BOARD, kemudian pin 18 dijadikan output, dan dibuat objek pwm dengan pin 18 sebagai output pwm dan frekuensi 50 Hz yaitu pada perintah pwm = GPIO.PWM(18, 50). dengan frekuensi 50 Hz maka periodenya yaitu 1/ 50 = 20ms/

kemudian dilanjutkan dengan menset duty cycle awal sebesar 5.5 % selama 1 detik dengan perintah pwm.start (5.5) time.sleep(1). duty cycle 5.5 % artinya memiliki Ton yaitu sebesar 5.5/100 * 20ms = 1.1 ms dan Toff sebesar 20ms - 1.1ms = 18.9ms. dilanjutkan dengan merubahnya ke nilai 7.5 % selama 1 detik dengan perintah pwm.ChangeDutyCycle(7.5) time.sleep(1). duty cycle 7.5 % artinya memliliki Ton = 7.5/100 * 20ms = 1.5ms dan Toff = 20ms - 1.5ms = 18.5ms

selanjutnya pwm berhenti dan mengembali pin-pin GPIO secara default. dengan perintah pwm.stop() GPIO.cleanup(). semoga artikel ini dapat bermanfaat bagi teman-teman. selamat bereksperimen :) .