Anda di halaman 1dari 86

ROBOT CERDAS PEMBERI MAKAN HEWAN

BERBASIS KAMERA
SKRIPSI

Oleh:
SRI NUR SAHID
130431100116

PROGRAM STUDI TEKNIK ELEKTRO


JURUSAN TEKNIK ELEKTRO
FAKULTAS TEKNIK
UNIVERSITAS TRUNOJOYO MADURA
BANGKALAN
2018

1
[Halaman Ini Sengaja Dikosongkan]

2
ROBOT CERDAS PEMBERI MAKAN HEWAN BERBASIS
KAMERA
Nama : Sri Nur Sahid
NIM : 13043110016
Program Studi : Teknik Elektro
Dosen Pembimbing : Riza alfita, ST., MT
: Miftachul Ulum, S.T., M.T.
Perkembangan teknologi manusia untuk memenuhi
kebutuhannya dengan cepat. Sehingga dikembangkan teknologi robotika
untuk membantu dan meringankan pekerjaan manusia di masa depan.
Salah satu pengembanganya adalah root pemberi makan hewan dengan
menggunakan kamera. Robot ini memiliki kemampuan untuk
mengantarkan makanan secara otomatis serta membedakan jenis hewan
yang ditemui dan kemudian memberi makanan sesuai jenis hewan yang
ditemui. Dalam penelitian ini robot akan berjalan mengikuti garis sesuai
lintasan yang telah ditentukan. Selain itu penelitian ini menggunakan
kamera sebagai mata dari robot. Gambar dari kamera akan di olah
melalui image processing. Pengolahan citra (image processing) adalah
teknik mengolah citra yang mentransformasikan citra masukan menjadi
citra lain agar keluaran memiliki kualitas yang lebih baik dibandingkan
kualitas citra masukan. Setelah didapatkan citra gambar objek kemudian
proses selanjutnya adalah membandingkan dengan database
menggunakan metode Optical Character Recognation (OCR). Metode
OCR ini akan mengolah gambar ke dalam bentuk huruf ataupun angka.
Dari hasil percobaan dapat disimpulkan bahwa robot mampu berjalan

3
sesuai konsep yaitu mengikuti garis dan gambar dari kamera yang
diklasifikasi memiliki keakurasian mendekati 100%.
Kata Kunci : kamera, Image Processing, Optical Character
Recognation (OCR).

4
BAB I
PENDAHULUAN
1.1 Latar Belakang
Seiring berkembangnya teknologi, manusia selalu ingin
menciptakan robot yang mampu menggantikan kerja manusia. Robot
adalah mesin yang dapat melakukan berbagai pekerjaan yang
menggantikan satu jenis atau lebih pekerjaan yang biasa dikerjakan
oleh manusia atau suatu peralatan yang bekerja sendiri. Dalam
melakukan pekerjaannya, robot mengikuti suatu pola gerakan yang
ditentukan oleh pengguna robot Pengembangan robot ini dilakukan
dibanyak bidang, baik itu dibidang pertanian, industri, pendidikan dan
banyak bidang lainya. Seperti halnya di taman safari, dimana kerja
manuisa dalam memberi makan hewan dapat digantikan oleh robot.
Dimana teknologi ini memiliki banyak keuntungan baik dalam hal
efisiensi tenaga ataupun waktu kerja yang lebih lama dari manusia
karena robot tidak mengalami kelelahan fisik seperti manusia sehingga
mampu bekerja secara terus menerus.
Robot ini akan berjalan megikuti lintasan garis dengan
memanfaatkan sensor warna. Selain itu robot ini juga dirancang
supaya mampu mrnghindari halangan secara otomatis, oleh karena itu
robot ini juga dilengkapi dengan sensor ultrasonik. Sistem kerja robot
ini adalah memberi makan hewan secara acak sesuai jenis hewan yang
ditemui. Klasifikasi jenis hewan ini dilakukan menggunakan kamera
dan memanfaatkan teknologi pengolahan citra ( image processing).
Dengan memanfaatkan teknologi tersebut, maka diharapkan adanya
suatu aplikasi yang dapat menangkap suatu obyek yang ada di depan

5
kamera dan bisa mengidentifikasi jenis objek. Dengan sistem ini
diharapkan pemberian makan pada hewan akan berjalan lebih
maksimal. Karena selain menghemat waktu juga menghemat tenaga
1.2 Perumusan Masalah
Rumusan masalah yang akan dibahas dalam tugas akhir adalah
sebagai berikut:
1. Bagaimana merancang konfigurasi robot cerdas pemberi makan
hewan agar mampu menuju tempat yang dituju dengan
mengikuti lintasan garis ?
2. Bagaimana merancang robot cerdas pemberi makan hewan
menggunakan kamera sehingga mampu mengidentifikasi jenis
objek dan melakukan klasifikasi?
1.3 Tujuan
1. Mahasiswa mampu merancang robot cerdas pemberi makan
hewan menggunakan sensor warna untuk bergerak mengikuti
garis.
2. Mahasiswa mampu merancang robot cerdas pemberi makan
hewan menggunakan kamera agar mampu mengidentifikasi
jenis hewan yang ditemui dan memberi makan sesuai jenis
hewan tersebut.
1.4 Batasan Masalah
Batasan Masalah dari judul tugas akhir ini adalah sebagai
berikut:
1. Lintasan garis dan juga mekanisme pemberian makanan sudah
ditentukan sejak awal

6
2. Metode yang digunakan adalah OCR(Optichal Character
Rezognation), Jadi gambar an dideteksi berupa gambar tulisan
yang akan dikonversi menjadi bentuk huruf
3. Hewan yang diklasifikasi berjumlah 10 jenis(Panda, Komodo,
Singa, Sapi, Jerapah, Harimau, Ayam, Musang, Kera, Kelinci)
1.5 Metodologi Pengerjaan Tugas Akhir
Metodologi pengerjaan tugas akhir yang akan dikerjakan
memiliki 5 tahap utama. Kelima tahap tersebut antara lain tahap
persiapan, tahap perencanaan, tahap pengumpulan data, tahap
perancangan dan pembuatan robot, tahap analisa dan pengolahan
data, dan tahap pemecahan masalah.
a. Tahap Persiapan
Tahap persiapan merupakan rangkaian kegiatan sebelum
memulai pengumpulan dan pengolahan data. Dalam tahap awal
ini disusun hal-hal penting yang harus segera dilakukan dengan
tujuan untuk mengefektifkan waktu dan pekerjaan. Tahap
persiapan ini meliputi kegiatan-kegiatan sebagai berikut:
menentukan judul tugas akhir, pembuatan proposal penyusunan
tugas akhir, studi pustaka terhadap materi desain untuk
menentukan kebutuhan data. Perencanaan jadwal pembuatan
desain persiapan di atas harus dilakukan secara cermat untuk
menghindari pekerjaan yang berulang, sehingga tahap
pengumoulan data menjadi lebih optimal.
b. Tahap Perencanaan
Tahap ini memberikan gambaran mengenai langkah awal
sampai dengan akhir penyusunan laporan Tugas Akhir.

7
Pengembangan penjelasannya dituangkan dalam bentuk
diagram alir yang tersusun secara berurutan sesuai dengan
proses kerjanya.
c. Pengumpulan Data
Metode pengumpulan data yang dilakukan yaitu sebagai
berikut: Metode Literatur, yaitu mengumpulkan,
mengidentifikasi dan mengolah data tertulis serta metode kerja
yang digunakan, Metode Observasi yang dilakukan dengan
tujuan untuk dapat mengetahui kondisi riil di lapangan sehingga
dapat diperoleh gambaran-gambaran sebagai pertimbangan
dalam perencanaan desain struktur.
d. Analisan dan Pengolahan Data
Analisa dan pengolahan data dilakukan berdasarkan data-
data yang dibutuhkan, selanjutnya dikelompokkan sesuai
identifikasi tujuan permasalahan, sehingga diperoleh analisan
pemecahan yang efektif dan terarah.
e. Pemecahan Masalah
Apabila hasil-hasil dari analisa dan pengolahan data sudah
didapat, maka tahap pemecahan masalah bisa dilaksanakan,
dengan tujuan mengetahui sejauh mana kontruksi yang
sebenarnya di lapangan dan diproyeksikan terhadap kondisi rill
berdasarkan peraturan-peraturan yang telah ditetapkan
sebelumnya.

8
1.6 Sistematika Penulisan.
a. Bab I : Pendahuluan.
Bab ini berisi pendahuluan yang menjelaskan latar belakang
permasalahan, perumusan masalah, tujuan penelitian, manfaat
penelitian, batasan penelitian serta sistematika penulisan.
b. Bab II : Teori Penunjang.
Bab ini menjelaskan mengenai dasar – dasar teori
mengenai teori penunjang tugas akhir
c. Bab III : Perancangan Sistem
Bab ini berisi tentang langkah-langkah yang dilakukan
meliputi rancangan sistem.
d. Bab IV : Implementasi dan Uji Coba Sistem
Bab ini berisi tentang pembahasan.
e. Bab V : Penutup.
Bab ini berisi hasil dan kesimpulan.

9
[Halaman Ini Sengaja Dikosongan]

10
BAB II
TEORI PENUNJANG
2.1 Penelitian Terdahulu
1. Aldi Setiawan, Herry Sujaini, Arif Bijaksana pada jurnalnya
tahun 2017 tentang”Implementasi Optical Character
Recognition (OCR) Pada Mesin Penerjemah Bahasa
Indonesia Ke Bahasa Inggris”. Tujuan dari penelitian ini
adalah membuat Optical Character Recognition (OCR) pada
mesin penerjemah bahasa Indonesia ke bahasa Inggris dengan
menggunakan platform Android untuk penginputan kata
penerjemahan. Sistem dibangun menggunakan Optical
Character Recognition (OCR) dengan library mobile vision
agar user tidak perlu lagi mengetikan teks sebagai inputan kata
yang akan di terjemahankan. Daalam penelitian tersebut
memperlihatkan bahwa OCR dapat menangkap hasil kalimat
dengan cukup baik pada beberapa font dan ukuran yang
berbeda.
2. Daisy A.N Janis pada jurnalnya tahun 2014” Rancang
bangun robot pengantar makanan line follower”. Pada
penelitian ini robot line follower digunakan sebaga pengganti
pelayan dalam mengantarkan makanan ke meja pelanggan.
Hasil dari penelitian ini menunjukan bahwa robot line follower
cukup efektif dikembangkan sebagai robot pengantar
makanan.
3. Suryo Hartanto, Aris Sugiharto, dan Sukmawati Nur Endah
pada jurnalnya tahun 2017” Optical Character Recognition

11
Menggunakan Algoritma Template Matching Correlation”.
Pada penelitan ini OCR (Optical Character Recognition)
solusi yang digunakan untuk proses konversi dokumen cetak
ke dokumen digital. Permasalahan yang timbul dalam proses
pengenalan dokumen komputer adalah bagaimana teknik
pengenalan untuk mengidentifikasi berbagai jenis karakter
dengan berbagai ukuran dan bentuk. Metode pengenalan yang
digunakan dalam tugas akhir ini adalah metode Template
Matching Correlation. Sebelum proses pengenalan, citra
masukan dengan format * bmp atau jpg * diolah terlebih
dahulu di proses preprocessing, yang meliputi binerisasi,
segmentasi, dan normalisasi gambar. Rata-rata tingkat
keberhasilan pengenalan yang dihasilkan oleh sistem ini adalah
92,90%. Hasil akhir menunjukkan bahwa penggunaan metode
Template Matching Correlation cukup untuk membangun
sebuah sistem OCR dengan akurasi yang baik efektif.
2.2 Perbedaan dengan Penelitian Sebelumnya
Terdapat beberapa berbedaan dan kelebihan dengan penelitian
sebelumnya dari sistem yang akan dibuat. Berikut adalah
perbedaan dan kelebihan dari Tugas Akhir yang berjudul “ Robot
Cerdas Pemberi Makan Hewan Berbasis kamera“
a. Pada beberapa penelitian sebelumnya berdasarkan jurnal yang
digunakan dalam penelitian ini dijelasakan bahwa robot line
follower sudah banya dikembangkan sebagai pengantar
makanan. Dalam penelitian sebelumnya robot pengantar
makanan ini hanya mamu mendeteksi objek tetapi tidak bisa

12
membedakan jenis objek yng ditemui. Dalam pengembangan
selanjuutnya ini objek yang dituju adalah 10 jenis hewan,
dimana stiap jenis hewan di wakili oleh gambar yang
bertuliskan nama masing masing hewan.
b. Pada penelitian sebelumnya metode OCR sudah banyak
dikembangkan untuk penerjemah alitab, menerjemahkan
bahasa inggris ke Indonesia dan sebaliknya, Mengkonversi
dokumen dan sebagainya. Dalam enelitian selanjutnya ini
OCR dgunakan untuk klasifikasi jenis hewan berdasarkan
nama hewan.
c. Pada penelitian ini robot pengikut garis akan dikombinasikan
dengan kamera dan menggunakan metode OCR untuk
mencapai target penelitian yaitu robot yang mampu
membedakan objek hewan yang ditemui dan memberi makan
sesuai jenisnya.
2.3 Dasar Teori
2.3.1 Sensor Pengikut garis
Pada dasarnya sensor garis merupakan sensor warna
yang dibuat sedemikian rupa sehingga memiliki
kemampuan untuk membaca garis dengan prinsip
pemantulan cahaya. Sensor garis dibuat dengan beberapa
cara. Cara yang digunakan adalah dengan menggunakan
beberapa komponen elektronika, seperti LED, photodiode,
LDR, komparator atau IC sensor warna.

13
2.3.2 OCR(optichal character recognation)
OCR adalah sebuah sistem komputer yang dapat
membaca huruf, baik yang berasal dari sebuah pencetak
(printer atau mesin ketik) maupun yang berasal dari tulisan
tangan. OCR adalah aplikasi yang menerjemahkan gambar
karakter (image character) menjadi bentuk teks dengan cara
menyesuaikan pola karakter per baris dengan pola yang
telah tersimpan dalam database aplikasi. Hasil dari proses
OCR adalah berupa teks sesuai dengan gambar output
scanner dimana tingkat keakuratan penerjemahan karakter
tergantung dari tingkat kejelasan gambar dan metode yang
digunakan
Secara umum sistem kerja OCR adalah sebagai berikut:
1. Meratakan gambar (Auto Deskewing).
File gambar akan diatur kemiringannya, apabila hasil
scan ada kemiringan, maka gambar akan dibuat sejajar
atau lurus.
2. Menganalisa (Analysis)
Software (program) OCR akan menganalisa dan
memisahkan bagian teks dan bagian gambar.
3. Otomatis mengatur arah gambar (Auto Orientation).
Software (program) OCR akan mengambil sebagian area
pada file image (gambar) dan mengidentifikasi arah teks
yang benar. File image (gambar) akan diputar ke arah
yang benar, pilihannya adalah 90°, 180°, atau 270•°.

14
4. Memisahkan setiap karakter huruf dan angka.
Software (program) OCR akan memisahkan setiap
karakter yang terdapat pada image (gambar) menjadi
sebuah huruf atau angka.
5. Mengidentifikasi gambar (Capturing the features of the
characters and comparing). Software (program) OCR
akan mengidentifikasi satu persatu setiap gambar yang
sudah dipisahkan, dan melakukan pengecekan terhadap
database yang dimiliki oleh software (program) OCR,
dan menetapkan huruf atau angka yang akan digunakan.
6. Menghasilkan file akhir (Recognition result output).
Setelah setiap gambar sudah dirubah menjadi huruf atau
angka (format teks) maka software (program) OCR akan
menghasilkan sebuah file dengan format teks, seperti
Microsoft Word, Microsoft Excel, TXT, Rich Text dan
Searchable PDF, tergantung dari pengaturan awal.
2.3.3 Mikrokontrol Arduino MEGA 2560
Mikrokontroler adalah sebuah sistem komputer
fungsional dalam sebuah chip. Di dalamnya terkandung
sebuah inti processor, memori (sejumlah kecil RAM,
memori program, atau keduanya), dan perlengkapan input
output. Dengan kata lain, mikrokontroler adalah suatu alat
elektronika digital yang mempunyai masukan dan keluaran
serta kendali dengan program yang bisa ditulis dan dihapus
dengan cara khusus, Beberapa karakteristik dan fitur yang
dimiliki oleh Arduino MEGA2560 diantaranya

15
- Microcontroller ATmega2560
- Operating Voltage 5V
- Input Voltage (recommended) 712V
- Input Voltage (limits) 6-20V
- Digital I/O Pins 54 (of which 14 provide PWM output)
- Analog Input Pins 16
- DC Current per I/O Pin 40 m
- DC Current for 3.3V Pin 50 mA
- Flash Memory 256 KB of which 8 KB used by
bootloader
- SRAM 8 KB
- EEPROM 4 KB
- Clock Speed 16 MHz
2.3.4 Baterai
Baterai adalah suatu alat penyimpan energi listrik yang
dapat diisi setelah energi yang digunakan. Kapasitas atau
kemampuan menyimpan energi ditentukan oleh semua
komponen didalam baterai seperti jenis material yang
digunakan dan jenis elektrolitnya sehingga dikenal baterai
asam dan baterai alkali.
Proses pengisian baterai yang baik dan benar hendaknya
dilakukan pada suhu lingkungan kamar ( 25 oC) dengan
ventilasi keadaan terbuka. Kondisi muatan yang disimpan
dalam baterai (state of charge) dapat ditentukan dengan
mengukur tegangan terminal baterai.

16
2.3.5 PID (Proportional Integral Derivative)
Kontroler PID (dari singkatan bahasa Inggris
Proportional Integral Derivative controller) merupakan
suatu sistem kontrol yang digunakan untuk menentukan
kontrol presisi suatu sistem instrumentasi dengan
karakteristik adanya umpan balik (feedback) pada sistem
tersebut. Sebuah kontroler PID secara kontinyu
menghitung nilai error sebagai beda antara set point yang
diinginkan dan variabel proses terukur. Kontroler
mencoba untuk meminimalkan nilai error setiap waktu
dengan penyetelan variabel control
𝑡 𝑑𝑒(𝑡)
𝑢(𝑡) = 𝐾𝑝 𝑒(𝑡) + 𝐾𝑖 ∫0 𝑒(𝑡)𝑑𝑡 + 𝐾𝑑 ………….(2.1)
𝑑𝑡

Kp merupakan kontrol proporsional yang dapat


memperbaiki respon transien khususnya rise time dan
seetling time. Ki adalah kontrol integral yang memiliki
sifat lebih lambat dari kontrol proporsioanl. K d adalah
kontrol derivatif dimana hanya akan berubah ketika ada
perubahan error, sehingga kontrol derivatif harus
digunakan dengan kontrol lainnya. Berikut merupakan
blok diagram kontroler PID.[8]

17
Gambar 2.1 Blok Diagram PID

Sumber:(http://www.leselektronika.com/2012/06/)

Pengendali PID (Proportional Integral Derivated)


sebenarnya terdiri dari tiga jenis pengendali yang saling
dikombinasikan yaitu pengendali P (Proportional),
pengendali I (Integral), dan pengendali D (Derivative).
Masing-masing memiliki parameter tertentu yang harus
disetting untuk dapat beroperasi dengan baik yang disebut
dengan konstanta.

a. Pengendali P (Proportional)
Pengendali Proportional memiliki keluaran yang
sebanding dengan besarnya sinyal kesalahan/ error. Secara
sederhana dapat dikatakan bahwa keluaran pengendali
Proportional merupakan perkalian antara konstanta
proportional (Kp) dengan sinyal masukannya. Perubahan
pada sinyal masukannya menyebabkan sistem secara
langsung mengubah keluarannya sebesar konstanta
pengalinya. Secara eksperimen, penggunaan pengendali

18
Proportional harus memperhatikan ketentuan-ketentuan
berikut:

1. Jika nilai Kp kecil, pengendali Proportional hanya


mampu melakukan koreksi kesalahan yang kecil,
sehingga akan menghasilkan respon sistem yang
lambat.
2. Jika nilai Kp dinaikkan, respon sistem menunjukkan
semakin cepat mencapai keadaan mantapnya.
3. Namun jika nilai Kp diperbesar hingga mencapai harga
yang berlebihan, akan mengakibatkan sistem bekerja
tidak stabil atau respon sistem akan berosilasi.
Hubungan antara sinyal kendali dan error adalah:

𝑢(𝑡) = 𝐾𝑝 . 𝑒(𝑡)……………………………………... (2.2)


dengan : u(t) = output pengendali P, Kp = konstanta
proporsional, dan e(t) = error.
Fungsi transfer dalam domain s adalah:
𝑢(𝑠)
= 𝐾𝑝 ……………………………………………..(2.3)
𝐸(𝑠)

dengan : u(s) = sinyal keluaran pengendali proporsional,


E(s) = sinyal error, dan Kp= konstanta proporsional
b. Pengendali I (Integral)
Pengendali Integral berfungsi menghasilakan respon
sistem yang memiliki kesalahan keadaan mantap nol. Jika
sinyal kesalahan tidak mengalami perubahan maka

19
keluaran akan tetap seperti sebelum terjadi perubahan
masukan.

Secara eksperimen, penggunaan pengendali Integral


memiliki karakteristik-karakteristik berikut:

1. Keluaran pengendali membutuhkan selang waktu


tertentu, sehingga cenderung memperlambat respon.
2. Jika sinyal kesalahan nol maka keluaran pengendali
akan bertahan pada nilai sebelumnya.
3. Jika sinyal kesalahan tidak bernilai nol maka keluaran
akan menunjukkan kenaikan atau penurunan yang
dipengaruhi oleh besarnya sinyal kesalahan dan nilai
konstanta Integral (Ki).
4. Konstanta Integral (Ki) yang bernilai besar akan
mempercepat hilangnya offset, tetapi akan
mengakibatkan peningkatan osilasi dari sinyal keluaran
pengendali.
Sinyal keluaran kendali integral merupakan luas
bidang yang dibentuk oleh kurva kesalahan penggerak.
Sinyal keluaran akan berharga nol. Hubungan antara
sinyal kendali dan error adalah:

𝑑𝑢(𝑡)
= 𝐾𝑖 . 𝑒(𝑡)……………………………………... (2.4)
𝑑𝑡

𝑑𝑢(𝑡)
dengan : = sinyal keluaran pengendali integral, Ki
𝑑𝑡

= konstanta integral, dan e(t) = error.

20
𝑡
𝑢(𝑡) = ∫0 𝑒(𝑡)𝑑𝑡…………………………………... (2.5)

Fungsi transfer dalam domain s adalah:

𝑢(𝑠) 𝐾𝑖
= …………………………………. (2.6)
𝐸(𝑠) 𝑠

Selama sinyal error masih ada, maka sinyal kendali


akan bereaksi terus. Ketika sinyal eror nol, maka u(t) tetap
stasioner. Dengan demikian, aksi kendali integral akan
menghilangkan steady state error. Artinya, output sistem
akan selalu mengejar setpoint sedekat mungkin. Aksi
kendali integral sering disebut automatic reset kendali.
Kerugian dari aksi kendali ini adalah terjadi osilasi
sehingga mengurangi kestabilan system

c. Pengendali D (Derivative)
Perubahan yang mendadak pada masukan dari
pengendali derivative akan mengakibatkan perubahan
yang sangat cepat dan besar. Secara eksperimen,
penggunaan pengendali derivative memiliki karakteristik
sebagai berikut:

1. Pengendali ini tidak akan menghasilkan keluaran


apabila tidak ada perubahan pada masukannya (berupa
sinyal kesalahan).
2. Jika sinyal kesalahan berubah terhadap waktu maka
keluaran yang dihasilkan pengendali tergantung pada

21
nilai konstanta derivative (Kd) dan laju perubahan
sinyal kesalahan.
3. Pengendali derivative mempunyai suatu karakter untuk
mendahului, sehingga pengendali ini dapat
menghasilkan koreksi yang signifikan sebelum
kesalahan bertambah besar, sehingga dipakai untuk
mempercepat respon awal suatu sistem, meskipun tidak
memperkecil kesalahan pada keadaan tunaknya.Dapat
dikatakan bahwa masing-masing pengendali P, I, dan D
memiliki kelebihan dan kekurangan. Sehingga jika
digabungkan ketiganya secara paralel menjadi
pengendali Proportional plus Integral plus Derivative
atau biasa disebut pengendali PID, maka akan saling
menutupi. Elemen-elemen pengendali P, I, dan D
masing-masing secara keseluruhan bertujuan untuk
mempercepat reaksi sebuah sistem, menghilangkan
offset dan menghasilkan perubahan awal yang besar.
𝐾𝑑 = 𝐾𝑝 𝑇𝑑 ………………………………………….. (2.7)

𝐾𝑝
𝐾𝑖 = ……………………………………………… (2.8)
𝑇𝑖

dengan : Ti = konstanta integral, Td = konstanta detivatif

22
2.3.6 Metode Tuning PID dengan Ziegler-Nichols 2
Aspek yang sangat penting dalam desain kontroler PID
ialah penentuan parameter kontroler PID supaya sistem
close loop memenuhi kriteria performansi yang diinginkan.
Hal ini disebut juga dengan tuning kontroler.Terkadang
pemodelan matematis suatu plant susah untuk dilakukan.
Jika hal ini terjadi maka perancangan kontroler PID secara
analitis tidak mungkin dilakukan sehingga perancangan
kontroler PID harus dilakukan secara eksperimental.
Metode tuning Ziegler-Nichols 2 dilakukan dengan cara
meberikan kontroler P pada suatu sistem close loop dengan
plant terpasang. Lalu nilai Kp ditambahkan sampai sistem
berosilasi terus menerus dengan teratur. Nilai Kp saat itu
disebut penguatan kritis (Kcr). Periode saat itu disebut
periode kritis (Pcr). Berikut cara menetukan periode kritis
(Pcr) seperti terlihat pada gambar berikut ini.[8]

Gambar 2.2 Cara Menetukan Periode Kritis (Pcr)


Sumber: (Buku Control Systems, 2009, 73)

23
Tahap selanjutnya ialah menentukan nilai Kp, Ki, dan Kd
berdasar tabel 2.1 berikut.
Tabel 2.1 Cara Menetukan Nilai Kp, Ki, dan Kd
Sumber : Buku Control Systems, 2009, 73

Tipe
KP Ki Kd
Alat Kontrol

P 0.5 Kcr ~ 0

PI 0.45 Kcr 1/1.2 Pcr 0

PID 0.6 Kcr 0.5 Pcr 0.125 Pcr

Berdasarkan tabel di atas dikarenakan kontrol yang


digunakan pada alat penetas telur menggunakan PID maka
dapat ditentukan nilai Kp dengan cara 0.6 dikalikan dengan
Kcr, Ki sama dengan 0.5 dikalikan Pcr, dan Kd sama dengan
0.125 dikalikan Pcr.

24
BAB III
PERANCANGAN SISTEM
3.1. PERANCANGAN PERANGKAT KERAS (HARDWARE)
3.1.1 Blok Diagram Sistem
Pada Perancangan tugas akhir ini terdapat beberapa
tahapan dan alur sistem agar perencanaan sesuai dengan apa
yang diharapkan. Berikut adalah rancangan sistem dalam
bentuk blok diagram.

Diagram Blok Sistem

INPUT PROSES OUTPUT

Sensor
pengikut
garis

Motor DC

Kamera Arduino
Servo

OCR
Phase

Gambar 3.1 Blok Diagram Sistem


Sumber:(Dokumen Pribadi)
Dari gambar 3.1. blok diagram diatas dapat dijelaskan
bahwa bagian input awal blok diagram adalah sensor
pengiut garis dan juga kamera yang akan mengirim data ke
arduino untuk diroses.
Berikut penjelasan lengkapnya

25
- Proses pertama yaitu input dari sensor pengikut garis
merupakan data nilai ADC. Nilai ADC ini yang akan
diprose untuk menentukan gerak robot maju,
mundur,berhenti, belok kanan ataupun belok kiri melalui
Motor DC.
- Selanjutnya di set poin yang telah ditentukan, kamera akan
mengambil gambar. Gambar yang diambil kamera ini akan
di proses melalui image processing .
- Metode yang digunakan adalah OCR(Optical Character
Recognation). Metode ini digunakan untuk klasifikasi 10
jenis hewan, dimana setiap jenis hewan diwakili oleh papan
nama sesuai nama hewan tersebut. Data hasil klasifkasi ini
akan diolah oleh arduino dan outputnya merupakan gerakan
servo untuk membuka pintu makanan sesuai papan nama
hewan yang diproses.
3.1.2 Perancangan Supply Batterai
Suplly batterai yang yang diperlukan oleh motor DC
adalah 24 volt dan 12 volt masuk ke rangkaian arduino
mega. Sehingga dibut rangkaian seri dengan 2 tombol on off
dan 2 ouput. Output pertama 24 volt untuk motor dan 12
volt untuk rangkaian arduino mega
3.1.3 Perancangan pengikut garis
Rangkain sensor pengikut garis dibuat menggunakan 6
LED dan 6 photodidoda. Setiap satu sensor terbuat dari
sebuah LED dan photodiode. Sensor pengikut garis ini

26
mendapat supply 12 volt dari batterai dan terhubung dengan
arduino
3.1.4 Perancangan driver Motor DC
Driver motor disini digunakan untuk menggerakan 3
motor DC, 2 motor untuk menggerakan roda robot baik itu
CCW ataupun CW dan 1 motor DC untuk menggerakan
conveyor. Driver motor disini terhubung dengan supply
batterai 24 volt. Selain itu driver motor DC juga terhubung
dengan arduino pin 2, 3, 4, 5, 6, dan 7.
3.1.5 Perancangan konveyor dan tempat makanan
Conveyor disini digerakan oleh motor DC dan di design
dengan 10 ruang sebagai wadah makanan dan 10 penutup
sebagai pintu keluarnya makanan. Pintu makanan digerakan
leh servo yang di kontrol dari Arduino
3.1.6 Perancangan Mekanik penopang tubuh robot
Body robot di buat dari besi dengan bentuk kubus dengan
ukuran panjang x lebar x tinggi = 50 x 40 x 30 cm. Body
robot ini menopang conveyor dibagian atas. Dibawah body
robot terdapat 4 roda, 2 roda belakang yang dikontrol dari
arduino dan 2 roda bebas didepan.
3.2 PERANCANGAN PERANGKAT LUNAK (SOFTWARE)
3.2.1 Arduino IDE
IDE itu merupakan kependekan dari Integrated
Developtment Enviroenment, atau secara bahasa mudahnya
merupakan lingkungan terintegrasi yang digunakan untuk
melakukan pengembangan. Disebut sebagai lingkungan

27
karena melalui software inilah Arduino dilakukan
pemrograman untuk melakukan fungsi-fungsi yang
dibenamkan melalui sintaks pemrograman. Arduino
menggunakan bahasa pemrograman sendiri yang
menyerupai bahasa C. Bahasa pemrograman Arduino
(Sketch) sudah dilakukan perubahan untuk memudahkan
pemula dalam melakukan pemrograman dari bahasa aslinya.
Sebelum dijual ke pasaran, IC mikrokontroler Arduino telah
ditanamkan suatu program bernama Bootlader yang
berfungsi sebagai penengah antara compiler Arduino
dengan mikrokontroler.Arduino IDE dibuat dari bahasa
pemrograman JAVA. Arduino IDE juga dilengkapi dengan
library C/C++ yang biasa disebut Wiring yang membuat
operasi input dan output menjadi lebih mudah. Arduino IDE
ini dikembangkan dari software Processing yang dirombak
menjadi Arduino IDE khusus untuk pemrograman dengan
Arduino.
3.2.2 Python
Python adalah bahasa pemrograman interpretatif
multiguna dengan filosofi perancangan yang berfokus pada
tingkat keterbacaan kode. Python diklaim sebagai bahasa
yang menggabungkan kapabilitas, kemampuan, dengan
sintaksis kode yang sangat jelas, dan dilengkapi dengan
fungsionalitas pustaka standar yang besar serta
komprehensif.

28
Python juga didukung oleh komunitas yang besar. Python
mendukung multi paradigma pemrograman, utamanya;
namun tidak dibatasi; pada pemrograman berorientasi objek,
pemrograman imperatif, dan pemrograman fungsional.
Salah satu fitur yang tersedia pada python adalah sebagai
bahasa pemrograman dinamis yang dilengkapi dengan
manajemen memori otomatis. Seperti halnya pada bahasa
pemrograman dinamis lainnya, python umumnya digunakan
sebagai bahasa skrip meski pada praktiknya penggunaan
bahasa ini lebih luas mencakup konteks pemanfaatan yang
umumnya tidak dilakukan dengan menggunakan bahasa
skrip. Python dapat digunakan untuk berbagai keperluan
pengembangan perangkat lunak dan dapat berjalan di
berbagai platform sistem operasi.
3.2.1 Visio 2016
dalah sebuah program aplikasi komputer yang sering
digunakan untuk membuat diagram alur (flowchart),
brainstorm dan skema jaringan yang diliris oleh Microsoft
Corporation. Aplikasi ini menggunakan grafik vector untuk
membuat diagram-diagramnya.
3.2. ANALISA KEBUTUHAN
3.3.1 Kebutuhan Software
Perangkat lunak yang digunakan dalam pembuatan alat ini
antara lain:

29
Table 3.1 software yang digunakan
Nama Software Fungsi
Arduino IDE Pemrograman mikrokontroler dari mulai
membaca sensor sampai menggerakan motor
Python Pemrograan image processing

Visio Menggambar blok diagram dan algortma


sistem

3.3.2 Kebutuhan Hardware


Perangkat keras yang digunakan dalam pembuatan alat ini
antara lain:
Table 3.2 komponen-komponen yang digunakan

Nama Hardware Fungsi Jumlah


Battery 12V Sumber tegangan 2 buah
Sensor pengikut garis Mengikuti garis hitam 1 buah
Driver motor DC Mengatur gerak motor 1 buah

Arduino mega 2560 Chip IC yang berisi program dan 1 buah


dapat deprogram berulang kali
Motor DC Penggerak robot dan conveyor 3 buah
Kamera Mengambil gambar yang akan 1 buah
diproses
Servo tower pro sg90 Membuka pintu makanan 10
buah

30
BAB IV
PENGUJIAN DAN ANALISA
4.1 Pengujian
4.1.1 Pengujian motor
pengujian dilakukan dengan cara motor diberi supply
tegangan dari baterai 24 V, apabila motor dapat bergerak
cw (counter wise)dan ccw (counter clock wise)makan
motor dapat dipastikan dalam keadaan baik atau normal
begitupun sebaliknya.

Gambar 4.1. Pengujian motor


4.1.2 Pengujian sensor garis
Pengujian dilakukan dengan memberi intervensi warna
terhadap sensor. Jika nilai ADC sensor berubah sesuai
intervensi cahaya yang diberika maka sensor pengikut
garis dalam keadaan baik

31
Gambar 4.2. Pengujian sensor pengikut garis
4.1.3 Pengujian kamera
Pengujian kamera dilakukan dengan menghubungkan
kamera dengan laptop melalui port USB. Apabila kamera
mampu menangkap gambar maka kamera dalam kondisi
baik. Fokus kamera bisa diatur sesuai keinginan

Gambar 4.3 Pengujian kamera

32
4.1.4 Pengujian gerak robot
Pengujian gerak robot dilakukan dengan meletakan
robot diatas lintasan garis bewarna hitam. Jika robot
mampu bergerak megikuti garis hitam maka sistem gerak
robot sudah bekerja dengan baik.

Gambar 4.4 Pengujian sistem gerak robot

33
4.1.5 Analisa data sensor pengikut garis

S1 S2 S3 S4 S5 S6 Kiri Kanan

1 0 0 0 0 0 27 255

0 0 0 0 0 1 227 0

1 1 0 0 0 0 52 255

0 0 0 0 1 1 202 0

0 0 0 1 1 1 177 15

1 1 1 0 0 0 77 239

1 1 1 1 1 1 15 177

1 1 1 1 1 1 152 71

0 1 1 1 1 0 127 127

Tabel 4.1 Tabel nilai PWM motor


Tabel 4.1 Menampilkan nilai PWM motor berdasarkan kondisi
sensor. Nilai 1 menunjukan kondisi sensor membaca warna hitam
dan nilai 0 menunjukan kondisi sensor membaca warna putih.

Keterangan :

S1 : Sensor ke 1

S2 : Sensor ke 2

S3 : Sensor ke 3

34
S4 : Sensor ke 4

S5 : Sensor ke 5

S6 : Sensor ke 6

Kiri : PWM motor kiri

Kanan : PWM motor kanan

Hasil pengambilan data dari tabel 3.1 ditampilkan di bawah ini:

1. Sensor S1 membaca warna hitam

Gambar 4.5. Nilai PWM motor ketika S1 membaca warna hitam

Dari gambar 4.5 ditampilkan nilai PWM motor kanan = 255


dan PWM motor kiri = 27. Karena nilai PWM motor kanan lebih
besar, maka roda kanan berputar lebih cepat dari roda kiri sehingga
robot akan bergerak belok ke kiri

35
2. Sensor S6 membaca warna hitam

Gambar 4.6. Nilai PWM motor ketika S6 membaca warna hitam

Dari gambar 4.6 ditampilkan nilai PWM motor kanan = 0 dan


PWM motor kiri = 227. Karena nilai PWM motor kanan lebih kecil,
maka roda kanan berputar lebih pelan dari roda kiri sehingga robot
akan bergerak belok ke kanan

3. Sensor S1 dan S2 membaca warna hitam

Gambar 4.7. Nilai PWM ketika S1dan S2 membaca warna hitam

36
Dari gambar 4.7 ditampilkan nilai PWM motor kanan = 255
dan PWM motor kiri = 52. Karena nilai PWM motor kanan lebih
besar, maka roda kanan berputar lebih cepat dari roda kiri sehingga
robot akan bergerak belok ke kiri

4. Sensor S5 dan S6 membaca warna hitam

Gambar 4.8. Nilai PWM ketika S5 dan S6 membaca warna hitam

Dari gambar 4.8 ditampilkan nilai PWM motor kanan = 0 dan


PWM motor kiri = 202. Karena nilai PWM motor kiri lebih besar,
maka roda kiri berputar lebih cepat dari roda kanan sehingga robot
akan bergerak belok ke kanan

37
5. Sensor S1, S2 dan S3 membaca warna hitam

Gambar 4.9. PWM ketika S1, S2, dan S3 membaca warna hitam

Dari gambar 4.9 ditampilkan nilai PWM motor kanan = 239


dan PWM motor kiri = 77. Karena nilai PWM motor kanan lebih
besar, maka roda kanan berputar lebih cepat dari roda kiri sehingga
robot akan bergerak belok ke kiri

6. Sensor S4, S5 dan S6 membaca warna hitam

Gambar 4.10. PWM ketika S4, S5, dan S6 membaca warna hitam

38
Dari gambar 4.10 ditampilkan nilai PWM motor kanan = 15
dan PWM motor kiri = 177. Karena nilai PWM motor kiri lebih
besar, maka roda kiri berputar lebih cepat dari roda kanan sehingga
robot akan bergerak belok ke kanan

7. Sensor S1, S2, S3, S4, S5 dan S6 membaca warna hitam

Gambar 4.11.PWM ketika S1, S2, S3, S4, S5 dan S6 membaca


warna hitam

Dari gambar 4.11 ditampilkan nilai PWM motor kanan = 239


dan PWM motor kiri = 77. Karena nilai PWM motor kanan lebih
besar, maka roda kanan berputar lebih cepat dari roda kiri sehingga
robot akan bergerak belok ke kiri

39
8. Sensor S6, S5, S4, S3, S2 dan S1 membaca warna hitam

Gambar 4.12.PWM ketika S6, S5, S4, S3, S2 dan S1 membaca


warna hitam

Dari gambar 4.12 ditampilkan nilai PWM motor kanan = 71


dan PWM motor kiri = 152. Karena nilai PWM motor kiri lebih
besar, maka roda kiri berputar lebih cepat dari roda kanan sehingga
robot akan bergerak belok ke kanan

9. Sensor , S5, S4, S3 dan S2 membaca warna hitam

Gambar 4.13.PWM ketika S1, S2, S3, S4, S5 dan S6 membaca


warna hitam

40
Dari gambar 4.13 ditampilkan nilai PWM motor kanan = 127
dan PWM motor kiri = 127. Karena nilai PWM motor kanan dan
kiiri sama besar, maka robot akan bergerak maju

B. Pengujian kamera dan image processing

NO Indikator Percobaan Tingkat Servo (on)


akurasi

1 Sapi 10 kali 100% Servo 1

2 Kelinci 10 kali 100% Servo 2

3 Jerapah 10 kali 100% Servo 3

4 Harimau 10 kali 100% Servo 4

5 Panda 10 kali 100% Servo 5

6 Musang 10 kali 100% Servo 6

7 Komodo 10 kali 100% Servo 7

8 Ayam 10 kali 100% Servo 8

9 Kera 10 kali 100% Servo 9

10 Singa 10 kali 100% Servo 10

Tabel 4.2 Data percobaan klasifikasi 10 hewan

Dari table 4.2 dapat dilihat bahwa percobaan dilakukan 10 kali untuk
setiap sampel dengan tingkat akurasi 100%. Ketika klasifikasi berhasil
maka arduino akan mengirim perintah ke arduino dan servo akan aktif

41
sesuai dengan nomor yang telah ditentukan. Hasil pengambilan data dari
tabel 4.2 ditampilkan dibawah ini:

1. data 1

Gambar 4.14 Pembacaan OCR pada gambar tulisan “SAPI”

Pada gambar 4.14 gambar hasil capture kamera diproses oleh


OCR dan dari beberapa percobaan menunjukan hasil yang akurat
yaitu “SAPI”

2. data 2

Gambar 4.15 Pembacaan OCR pada gambar tulisan “KELINCI”

42
Pada gambar 4.15 gambar hasil capture kamera diproses oleh
OCR dan dari beberapa percobaan menunjukan hasil yang akurat
yaitu “KELINCI”

3. data 3

Gambar 4.16 Pembacaan OCR pada gambar tulisan “JERAPAH”

Pada gambar 4.16 gambar hasil capture kamera diproses oleh


OCR dan dari beberapa percobaan menunjukan hasil yang akurat
yaitu “JERAPAH”

4. data 4

Gambar 4.17 Pembacaan OCR pada gambar tulisan “HARIMAU”

43
Pada gambar 4.17 gambar hasil capture kamera diproses oleh
OCR dan dari beberapa percobaan menunjukan hasil yang akurat
yaitu “HARIMAU”

5. data 5

Gambar 4.18 Pembacaan OCR pada gambar tulisan “PANDA”

Pada gambar 4.18 gambar hasil capture kamera diproses oleh


OCR dan dari beberapa percobaan menunjukan hasil yang akurat
yaitu “PANDA”

6. data 6

Gambar 4.19 Pembacaan OCR pada gambar tulisan “MUSANG”

44
Pada gambar 4.19 gambar hasil capture kamera diproses oleh
OCR dan dari beberapa percobaan menunjukan hasil yang akurat
yaitu “MUSANG”

7. data 7

Gambar 4.20 Pembacaan OCR pada gambar tulisan “KOMODO”

Pada gambar 4.20 gambar hasil capture kamera diproses oleh


OCR dan dari beberapa percobaan menunjukan hasil yang akurat
yaitu “KOMODO”

8. data 8

Gambar 4.21 Pembacaan OCR pada gambar tulisan “AYAM”

45
Pada gambar 4.21 gambar hasil capture kamera diproses oleh
OCR dan dari beberapa percobaan menunjukan hasil yang akurat
yaitu “AYAM”

9. data 9

Gambar 4.22 Pembacaan OCR pada gambar tulisan “KERA”

Pada gambar 4.14 gambar hasil capture kamera diproses oleh


OCR dan dari beberapa percobaan menunjukan hasil yang akurat
yaitu “KERA”

10. data 10

Gambar 4.23 Pembacaan OCR pada gambar tulisan “SINGA”

46
Pada gambar 4.23 gambar hasil capture kamera diproses oleh
OCR dan dari beberapa percobaan menunjukan hasil yang akurat
yaitu “SINGA”. Gambar sebelah kanan bertuliskan “singa, musang,
panda dll” adalah hasil capture kamera. Sedangkan gambar sebelah
kiri bertuliskan”1 possible plates found ” adalah hasil pembacaan
OCR.

C. Tahap tahap image processing dari gambar awal menjadi karakter

1. Gambar Awal

Gambar 4.24 Gambar awal yang diambil kamera

2. Preprocessing

Pada tahap ini gambar diubah ke bentuk grayscale (tingkat


keabu abuan) kemudian diubah ke bentuk hitam putih

47
Gambar 4.25 Tahap preprocessing pada OCR

3. Pada tahap ini dicari kemungkinan karakter yang terdapat dalam


gambar

Gambar 4.26 Tahap pencarian karakter pada gambar

48
4. Mencari vector dari beberapa vertor karakter yang sesuai
dengan template yang disediakan

Gambar 4.27 Tahap pencarian vector yang sesuai

5. Extract Plates

Pada tahap ini kemungkinan karakter yang ada diambil dan


dipotong dipisahkan dari background gambar

49
Gambar 4.28 Tahap pengambilan karakter

6. Preprocessing

Pada tahap ini kemungkinan karakter yang telah dipisah dari


background di ubah ke bentuk grayscale kemudian diubah ke
hitam putih

Gambar 4.29 Tahap preprocessing kedua pada OCR

50
7. Pada tahap ini dicari lagi karakter yang memungkinkan untuk
diambil

Gambar 4.30 Tahap pencarian karakter yang memungkinkan

8. Pada tahap ini dicari nilai vector dari vector- vector karakter
yang sesuai

Gambar 4.31 Tahap pencarian vector yang sesuai

9. Cari nilai vector terpanjang dari karakter yang sesuai

Gambar 4.32 Tahap pemilihan vektor

51
10. Hasil karakter yang sesuai

Gambar 4.33 Hasil akhir diperoleh karakter yang sesuai

52
BAB V
SIMPULAN DAN SARAN

A. SIMPULAN
Berdasarkan Percobaan yang telah dilakukan dapat diambil
beberapa kesimpulan dibawah ini :

1. Hasil perancangan sistem dapat bekerja, yaitu robot


mampu berjalan mengikuti garis dan kamera mampu
mengambil gambar lalu melakukan klasifikasi jenis
hewan yang ditemui
2. Metode OCR(Optical Character Recognation) yang
digunakan mampu melakukan klasifikasi dengan
kekuratan 100 %.
3. Sensor pengikut garis mampu membaca warna garis
dengan baik, tetapi perlu diperhatikan agar sensor tidak
mendapat intervensi cahaya dari luar
4. Jarak kamera dengan gambar dan juga pencahayaan
sangat berpengaruh pada keakurasian metode OCR.

A. SARAN

Berdasarkan pengujian yang telah dilakukan diharapkan untuk


penelitian selanjutnya supaya lebih memperhatikan tipe kamera
yang digunakan karena membutuhkan kamera dengan kualitas
pengambilan gambar yang baik dan mekanik conveyor untuk
pemberian makanan perlu diperbaiki serta motor yang digunakan
untuk menggerakan robot perlu torsi dan juga kecepatan yang lebih
baik

53
DAFTAR PUSTAKA
1. Aldi Setiawan, Herry Sujaini, Arif Bijaksana PN,”
Implementasi Optical Character Recognition (OCR) Pada
Mesin Penerjemah Bahasa Indonesia Ke Bahasa Inggris”,
Jurnal Sistem dan Teknologi Informasi (JUSTIN) Vol. 1, No. 2,
(2017)
2. Daisy A.N Janis, dkk, ,” Rancang bangun robot pengantar
makanan line follower”, jurnal Teknik elektro dan komputer
ISSN :2301-8402 1, UNSRAT, Manado. Tahun 2014.
3. Johanes Ohoiwutun,” Analisis Dan Perancangan Smart Dump
Menggunakan Arduino Mega 2560 Rev3 Dan Gsm
Sim900”,Jurnal Teknik Elektro Luceat Vol. 4 No. 1 Juli 2018
4. Suryo Hartanto, Aris Sugiharto, dan Sukmawati Nur Endah,”
Optical Character Recognition Menggunakan Algoritma
Template Matching Correlation” Jurusan Ilmu Komputer /
Informatika, FSM Universitas Diponegoro tahun 2017
5. R. Sandhika Galih A, Erik , Muhammad Lukman Hakim,”
Penerapan Teknik Ocr (Optical Character Recognition) Pada
Aplikasi Terjemahan Kitab Fiqih Safinah An-Naja
Menggunakan Readiris ”,Jurnal Seminar Nasional Informatika
2014 (semnasIF 2014)
6. Ossy D.E.W1, T.M. Zaini, Frizka, ”Penerapan Optical
Character Recognation Pada Penterjemah Inggris ↔
Indonesia Mobile Berbasis Augmented Reality” Jurnal
Informatika, Vol. 13, No.1, Juni 2013.

54
7. Siti Maimunah,” Optimasi Sistem Pengenalan Karakter Pada
Optical Character Recognition (Ocr)”,Jurnal Teknik Elektro
Universitas Trunojoyo Madura, tahun 2018
8. K. Joni, M. Ulum dan Z. Abidin, “Robot Line Follower
Berbasis Kendali ProportionalIntegral-Derivative (PID) Untuk
Lintasan Dengan Sudut Ekstrim,” INFOTEL, vol. VIII, no. 2, p.
140, 2016..

55
Lampiran 1 : source code line follower dan servo

int Kecepatan = 255;

int S1_min = 700;

int S1_max = 900;

int S2_min = 400;

int S2_max = 600;

int S3_min = 400;

int S3_max = 600;

int S4_min = 600;

int S4_max = 800;

int S5_min = 500;

int S5_max = 700;

int S6_min = 600;

int S6_max = 800;

#define IR 40

//////////// Inisialisasi Variabel////////////////

/**/ float T = 0.5; /**/

56
/**/ float SET_POIN = 0; /**/

/**/ // PID Motor Kanan /**/

/**/ float eror1, erorI1, erord1, temp1; /**/

/**/ float kP1=50; /**/

/**/ float kI1=12; /**/

/**/ float kD1=30; /**/

/**/ /**/

/**/ // PID Motor Kiri /**/

/**/ float eror2, erorI2, erord2, temp2; /**/

/**/ float kP2=20; /**/

/**/ float kI2=10; /**/

/**/ float kD2=30; /**/

//////////////////////////////////////////////////

int P1, P2, P3, P4, P5, P6;

int Biner, Status;

int data;

int data_IR;

57
char data_Serial = 'Z';

int PWM_1, PWM_2;

// Konfigurasi Sensor

#define S1 A0

#define S2 A1

#define S3 A2

#define S4 A3

#define S5 A4

#define S6 A5

// Konfigurasi Motor

#define En_Kanan 7

#define En_Kiri 5

#define PWM_Kanan 6

#define PWM_Kiri 4

// Konfigurasi Motor Konveor

#define En_Konv 2

#define PWM_Konv 3

58
// Konfigurasi Servo

#define Serv0 22

#define Serv1 24

#define Serv2 26

#define Serv3 28

#define Serv4 30

#define Serv5 32

#define Serv6 34

#define Serv7 36

#define Serv8 38

#define Serv9 41 // Dirubah

// Masukan Library

#include <Servo.h>

// Inisialisasi Hardware

Servo Servo0;

Servo Servo1;

Servo Servo2;

59
Servo Servo3;

Servo Servo4;

Servo Servo5;

Servo Servo6;

Servo Servo7;

Servo Servo8;

Servo Servo9;

// Kondisi Inisialisasi

void setup()

// Interrupt

noInterrupts();

TCCR1A = 0;

TCCR1B = 0;

TCNT1 = 34286;

TCCR1B |= (1 << CS10);

TIMSK1 |= (1 << TOIE1);

60
interrupts();

// Konfigurasi Sensor

pinMode(S1, INPUT);

pinMode(S2, INPUT);

pinMode(S3, INPUT);

pinMode(S4, INPUT);

pinMode(S5, INPUT);

pinMode(S6, INPUT);

// Konfigurasi IR

pinMode(IR, INPUT);

// Konfigurasi Motor

pinMode(En_Kanan, OUTPUT);

pinMode(En_Kiri, OUTPUT);

pinMode(PWM_Kanan, OUTPUT);

pinMode(PWM_Kiri, OUTPUT);

// Konfigurasi Motor Konveor

pinMode(En_Konv, OUTPUT);

61
pinMode(PWM_Konv, OUTPUT);

// Konfigurasi Servo

Servo0.attach(Serv0);

Servo1.attach(Serv1);

Servo2.attach(Serv2);

Servo3.attach(Serv3);

Servo4.attach(Serv4);

Servo5.attach(Serv5);

Servo6.attach(Serv6);

Servo7.attach(Serv7);

Servo8.attach(Serv8);

Servo9.attach(Serv9);

// Komunikasi

Serial.begin(9600);

void loop()

62
//Print_data();

if(analogRead(S1) > ((S1_min+S1_max)/2)){P1 = 1;} else{P1 = 0;}

if(analogRead(S2) > ((S2_min+S2_max)/2)){P2 = 1;} else{P2 = 0;}

if(analogRead(S3) > ((S3_min+S3_max)/2)){P3 = 1;} else{P3 = 0;}

if(analogRead(S4) > ((S4_min+S4_max)/2)){P4 = 1;} else{P4 = 0;}

if(analogRead(S5) > ((S5_min+S5_max)/2)){P5 = 1;} else{P5 = 0;}

if(analogRead(S6) > ((S6_min+S6_max)/2)){P6 = 1;} else{P6 = 0;}

Biner = (P1*1) + (P2*2) + (P3*4) + (P4*8) + (P5*16) + (P6*32);

if(Biner == 0b00000001){temp1 = -4; temp2 = 4; Status = 0;}else

if(Biner == 0b00000011){temp1 = -3; temp2 = 3; Status = 0;}else

if(Biner == 0b00000111){temp1 = -2; temp2 = 2; Status = 0;}else

if(Biner == 0b00001111){temp1 = -1; temp2 = 1; Status = 0;}else

if(Biner == 0b00011111){temp1 = -1; temp2 = 1; Status = 0;}else

if(Biner == 0b00011110){temp1 = 0; temp2 = 0; Status = 0;}else

if(Biner == 0b00111100){temp1 = 1; temp2 = -1; Status = 1;}else

if(Biner == 0b00111110){temp1 = 1; temp2 = -1; Status = 1;}else

if(Biner == 0b00111000){temp1 = 2; temp2 = -2; Status = 1;}else

63
if(Biner == 0b00110000){temp1 = 3; temp2 = -3; Status = 1;}else

if(Biner == 0b00100000){temp1 = 4; temp2 = -4; Status = 1;}else

{temp1 = temp1; temp2 = temp2;}

if(digitalRead(IR) == 0)

data = 1;

else

data = 0;

if(Serial.available() > 0)

data_Serial = Serial.read();

if(data_Serial != 'Z')

64
Motor_Kanan (0,0);

Motor_Kiri (0,0);

Konveor(150,0);

servo();

else

PID();

Konveor(0,0);

servo();

int inc;

ISR(TIMER1_OVF_vect)

TCNT1 = 34286;

inc++;

65
if(inc >= 50)

Serial.print(data);

inc = 0;

void PID()

float K_1, I_1, D_1;

eror1 = abs(SET_POIN) - temp1;

K_1 = kP1 * eror1;

erorI1 += kI1 * eror1 * T;

if (erorI1>= 255.00){erorI1= 255.00;}

if (erorI1<=-255.00){erorI1=-255.00;}

I_1 = erorI1;

D_1 = kD1 * (1 / T) * (eror1 - erord1);

erord1 = eror1;

66
PWM_1 = K_1 + I_1 + D_1 + (Kecepatan/2);

if ( PWM_1 > 255){PWM_1 = 255;}

if ( PWM_1 < 0){PWM_1 = 0;}

if ( temp1 == 0) {PWM_1 = Kecepatan/2;}

if ( SET_POIN == 0 ) { Motor_Kanan (PWM_1,1); erorI1 = 0.0;}

if ( SET_POIN < 0 ) { Motor_Kanan (PWM_1,0); }

if ( SET_POIN > 0 ) { Motor_Kanan (PWM_1,1); }

float K_2, I_2, D_2;

eror2 = abs(SET_POIN) - temp2;

K_2 = kP2 * eror2;

erorI2 += kI2 * eror2 * T;

if (erorI2>= 255.00){erorI2= 255.00;}

if (erorI2<=-255.00){erorI2=-255.00;}

I_2 = erorI2;

D_2 = kD2 * (1 / T) * (eror2 - erord2);

erord2 = eror2;

67
PWM_2 = K_2 + I_2 + D_2 + (Kecepatan/2);

if ( PWM_2 > 255){PWM_2 = 255;}

if ( PWM_2 < 0){PWM_2 = 0;}

if (temp2 == 0) {PWM_2 = Kecepatan/2;}

if ( SET_POIN == 0 ) { Motor_Kiri (PWM_2,0); erorI2 = 0;}

if ( SET_POIN < 0 ) { Motor_Kiri (PWM_2,1); }

if ( SET_POIN > 0 ) { Motor_Kiri (PWM_2,0); }

void Stop()

Motor_Kiri (0,1);

Motor_Kanan (0,1);

void Konveor(int a, int b)

analogWrite (PWM_Konv, a);

digitalWrite(En_Konv, b);

68
}

void Motor_Kanan(int a, int b)

analogWrite (PWM_Kanan, a);

digitalWrite(En_Kanan, b);

void Motor_Kiri(int a, int b)

analogWrite (PWM_Kiri, a);

digitalWrite(En_Kiri, b);

void servo()

if(data_Serial == '0') {Servo0.write(100);delay(4000); data_Serial =


'Z';}else

if(data_Serial == '9') {Servo1.write(100);delay(4000); data_Serial =


'Z';}else

69
if(data_Serial == '2') {Servo2.write(100);delay(4000); data_Serial =
'Z';}else

if(data_Serial == '3') {Servo3.write(100);delay(4000); data_Serial =


'Z';}else

if(data_Serial == '4') {Servo4.write(100);delay(4000); data_Serial =


'Z';}else

if(data_Serial == '5') {Servo5.write(100);delay(4000); data_Serial =


'Z';}else

if(data_Serial == '6') {Servo6.write(100);delay(4000); data_Serial =


'Z';}else

if(data_Serial == '7') {Servo7.write(100);delay(4000); data_Serial =


'Z';}else

if(data_Serial == '8') {Servo8.write(100);delay(4000); data_Serial =


'Z';}else

if(data_Serial == '1') {Servo9.write(100);delay(4000); data_Serial =


'Z';}

else {Servo0.write(10);

Servo1.write(10);

Servo2.write(10);

Servo3.write(10);

70
Servo4.write(10);

Servo5.write(10);

Servo6.write(10);

Servo7.write(10);

Servo8.write(10);

Servo9.write(10);}

void Print_data()

Serial.print(P1);

Serial.print(" ");

Serial.print(P2);

Serial.print(" ");

Serial.print(P3);

Serial.print(" ");

Serial.print(P4);

Serial.print(" ");

71
Serial.print(P5);

Serial.print(" ");

Serial.print(P6);

Serial.print(" ");

Serial.print(analogRead(S1));

Serial.print(" ");

Serial.print(analogRead(S2));

Serial.print(" ");

Serial.print(analogRead(S3));

Serial.print(" ");

Serial.print(analogRead(S4));

Serial.print(" ");

Serial.print(analogRead(S5));

Serial.print(" ");

Serial.print(analogRead(S6));

Serial.print(" ");

Serial.print("PWM KANAN: ");

72
Serial.print(PWM_1);

Serial.print(" PWM KIRI: ");

Serial.print(PWM_2);

Serial.print(" IR: ");

Serial.print(digitalRead(IR));

Serial.print(" \n");

Lampian 2: Source code image processing

import cv2

import numpy as np

import os

import serial

import DetectChars

import DetectPlates

import PossiblePlate

73
# module level variables
##########################################################
################

SCALAR_BLACK = (0.0, 0.0, 0.0)

SCALAR_WHITE = (255.0, 255.0, 255.0)

SCALAR_YELLOW = (0.0, 255.0, 255.0)

SCALAR_GREEN = (0.0, 255.0, 0.0)

SCALAR_RED = (0.0, 0.0, 255.0)

showSteps = False

##########################################################
#########################################

def main():

cam = cv2.VideoCapture(0)

count = 0

x=0

arduino = serial.Serial('COM5',9600)

data_L = ""

data_N = ""

74
while True:

ret, frame = cam.read()

cv2.imshow("test", frame)

if not ret:

break

data_L = data_N

data_N = arduino.read()

k = cv2.waitKey(1)

if k%256 == 27:

# ESC

cam.release()

cv2.destroyAllWindows()

break

if data_N == b'1':

if data_L != b'1':

if x == 0:

img_name = "capture.png".format(count)

75
cv2.imwrite(img_name, frame)

count += 1

x=1

if x == 1:

x=0

blnKNNTrainingSuccessful =
DetectChars.loadKNNDataAndTrainKNN() # attempt KNN
training

if blnKNNTrainingSuccessful == False: # if
KNN training was not successful

print("\nerror: KNN traning was not successful\n") # show


error message

return # and exit


program

# end if

imgOriginalScene = cv2.imread("capture.png") #
open image

if imgOriginalScene is None: # if image was


not read successfully

76
print("\nerror: image not read from file \n\n") # print error
message to std out

os.system("pause") # pause so user can


see error message

return # and exit program

# end if

listOfPossiblePlates =
DetectPlates.detectPlatesInScene(imgOriginalScene) # detect
plates

listOfPossiblePlates =
DetectChars.detectCharsInPlates(listOfPossiblePlates) # detect
chars in plates

cv2.imshow("imgOriginalScene", imgOriginalScene) #
show scene image

if len(listOfPossiblePlates) == 0: # if no plates
were found

print("\nno license plates were detected\n") # inform user


no plates were found

else: # else

# if we get in here list of possible plates has at leat one plate

77
# sort the list of possible plates in DESCENDING order (most
number of chars to least number of chars)

listOfPossiblePlates.sort(key = lambda possiblePlate:


len(possiblePlate.strChars), reverse = True)

# suppose the plate with the most recognized chars (the first
plate in sorted by string length descending order) is the actual plate

licPlate = listOfPossiblePlates[0]

#cv2.imshow("imgPlate", licPlate.imgPlate) # show


crop of plate and threshold of plate

#cv2.imshow("imgThresh", licPlate.imgThresh)

#//if len(licPlate.strChars) == 0: # if no chars


were found in the plate

#// print("\nno characters were detected\n\n") # show


message

#// return # and exit program

# end if

drawRedRectangleAroundPlate(imgOriginalScene, licPlate)

if licPlate.strChars == "AYA":

licPlate.strChars = "AYAM"

78
if licPlate.strChars == "USANG":

licPlate.strChars = "MUSANG"

if licPlate.strChars == "HARMAL":

licPlate.strChars = "HARIMAU"

elif licPlate.strChars == "HARM":

licPlate.strChars = "HARIMAU"

elif licPlate.strChars == "HARMAU":

licPlate.strChars = "HARIMAU"

elif licPlate.strChars == "ARMAU":

licPlate.strChars = "HARIMAU"

elif licPlate.strChars == "ARMAL":

licPlate.strChars = "HARIMAU"

if licPlate.strChars == "JERAPAL":

licPlate.strChars = "JERAPAH"

elif licPlate.strChars == "JERAPAY":

licPlate.strChars = "JERAPAH"

elif licPlate.strChars == "JERAPY":

79
licPlate.strChars = "JERAPAH"

elif licPlate.strChars == "JERAP":

licPlate.strChars = "JERAPAH"

elif licPlate.strChars == "RAPAH":

licPlate.strChars = "JERAPAH"

if licPlate.strChars == "COMODO":

licPlate.strChars = "KOMODO"

elif licPlate.strChars == "KOMOD":

licPlate.strChars = "KOMODO"

elif licPlate.strChars == "KOMODC":

licPlate.strChars = "KOMODO"

elif licPlate.strChars == "OMODO":

licPlate.strChars = "KOMODO"

elif licPlate.strChars == "OMODC":

licPlate.strChars = "KOMODO"

elif licPlate.strChars == "OMOD":

licPlate.strChars = "KOMODO"

80
if licPlate.strChars == "SNGA":

licPlate.strChars = "SINGA"

if licPlate.strChars == "KELNC":

licPlate.strChars = "KELINCI"

if licPlate.strChars == "SAP":

licPlate.strChars = "SAPI"

# draw red rectangle around plate

if licPlate.strChars == "SAPI":

arduino.write('0'.encode())

if licPlate.strChars == "KELINCI":

arduino.write('1'.encode())

if licPlate.strChars == "SINGA":

arduino.write('2'.encode())

if licPlate.strChars == "KOMODO":

arduino.write('3'.encode())

if licPlate.strChars == "JERAPAH":

arduino.write('4'.encode())

81
if licPlate.strChars == "HARIMAU":

arduino.write('5'.encode())

if licPlate.strChars == "MUSANG":

arduino.write('6'.encode())

if licPlate.strChars == "AYAM":

arduino.write('7'.encode())

if licPlate.strChars == "PANDA":

arduino.write('8'.encode())

if licPlate.strChars == "KERA":

arduino.write('9'.encode())

print(licPlate.strChars) # write license plate text to std out

#print("----------------------------------------")

writeLicensePlateCharsOnImage(imgOriginalScene,
licPlate) # write license plate text on the image

#cv2.imshow("imgOriginalScene", imgOriginalScene)
# re-show scene image

cv2.imwrite("imgOriginalScene.png", imgOriginalScene)
# write image out to file

82
if count == 1:

count = 0

# end if else

return

# end main

##########################################################
#########################################

def drawRedRectangleAroundPlate(imgOriginalScene, licPlate):

p2fRectPoints = cv2.boxPoints(licPlate.rrLocationOfPlateInScene)
# get 4 vertices of rotated rect

cv2.line(imgOriginalScene, tuple(p2fRectPoints[0]),
tuple(p2fRectPoints[1]), SCALAR_RED, 2) # draw 4 red lines

cv2.line(imgOriginalScene, tuple(p2fRectPoints[1]),
tuple(p2fRectPoints[2]), SCALAR_RED, 2)

cv2.line(imgOriginalScene, tuple(p2fRectPoints[2]),
tuple(p2fRectPoints[3]), SCALAR_RED, 2)

cv2.line(imgOriginalScene, tuple(p2fRectPoints[3]),
tuple(p2fRectPoints[0]), SCALAR_RED, 2)

# end function

83
##########################################################
#########################################

def writeLicensePlateCharsOnImage(imgOriginalScene, licPlate):

ptCenterOfTextAreaX = 0 # this will be the center


of the area the text will be written to

ptCenterOfTextAreaY = 0

ptLowerLeftTextOriginX = 0 # this will be the bottom


left of the area that the text will be written to

ptLowerLeftTextOriginY = 0

sceneHeight, sceneWidth, sceneNumChannels =


imgOriginalScene.shape

plateHeight, plateWidth, plateNumChannels = licPlate.imgPlate.shape

intFontFace = cv2.FONT_HERSHEY_SIMPLEX #
choose a plain jane font

fltFontScale = float(plateHeight) / 30.0 # base font scale


on height of plate area

intFontThickness = int(round(fltFontScale * 1.5)) # base font


thickness on font scale

textSize, baseline = cv2.getTextSize(licPlate.strChars, intFontFace,


fltFontScale, intFontThickness) # call getTextSize

84
# unpack roatated rect into center point, width and height, and
angle

( (intPlateCenterX, intPlateCenterY), (intPlateWidth, intPlateHeight),


fltCorrectionAngleInDeg ) = licPlate.rrLocationOfPlateInScene

intPlateCenterX = int(intPlateCenterX) # make sure center is


an integer

intPlateCenterY = int(intPlateCenterY)

ptCenterOfTextAreaX = int(intPlateCenterX) # the horizontal


location of the text area is the same as the plate

if intPlateCenterY < (sceneHeight * 0.75):


# if the license plate is in the upper 3/4 of the image

ptCenterOfTextAreaY = int(round(intPlateCenterY)) +
int(round(plateHeight * 1.6)) # write the chars in below the plate

else: # else if
the license plate is in the lower 1/4 of the image

ptCenterOfTextAreaY = int(round(intPlateCenterY)) -
int(round(plateHeight * 1.6)) # write the chars in above the plate

# end if

textSizeWidth, textSizeHeight = textSize # unpack text size


width and height

85
ptLowerLeftTextOriginX = int(ptCenterOfTextAreaX -
(textSizeWidth / 2)) # calculate the lower left origin of the text
area

ptLowerLeftTextOriginY = int(ptCenterOfTextAreaY +
(textSizeHeight / 2)) # based on the text area center, width, and
height

# write the text on the image

cv2.putText(imgOriginalScene, licPlate.strChars,
(ptLowerLeftTextOriginX, ptLowerLeftTextOriginY), intFontFace,
fltFontScale, SCALAR_YELLOW, intFontThickness)

# end function

##########################################################
#########################################

if __name__ == "__main__":

main()

86

Anda mungkin juga menyukai