You are on page 1of 36

Klub robotik universitas sebelas maret

ROBOT MANUAL PEMINDAH BARANG DENGAN JOYSTICK

Edi prasetyo Fisika FMIPA Universitas Sebelas Maret edipras19@yahoo.com Juli 2013

Klub robotik universitas sebelas maret

Robot manual adalah robot yang kendalinya dikendalikan oleh user dalam melakukan kerjanya. Sistem kendali ini bermacam-macam jenisnya dan yang akan saya bahas kali ini adalah yang menggunkan kendali joystick playstation. Sistem robot ini terdiri dari tiga bagian utama yaitu gripper atau lengan untuk menjapit dan mengakat barang menggunakan servo, remot kendali menggunakan joystick, dan penggerak robot menggunakan motor dc. Chip mikrokontroller yang digunakan yaitu atmega8535 dan driver motornya menggunakan ic l298d. Yang akan saya bahas secara detail dalam tulisan ini adalah sistem dari robot pemindah barang itu sendiri yang meliputi rangkaian elektronik robot, antar muka joystick playstation dengan mikrokontroler atmega 8535, tehnik kontrol motor servo dan Pemrograman Robot Pemindah Barang Dengan CVAVR Elektronik Robot Bagian elektronik robot ini terdiri dari bagian rangkaian kontrol yang menggunakan mikrokontroller atmega 8535,rangkaian driver motor yang menggunakan ic l298d, dan kendali menggunakan joystik dengan komunikasi serial. Rangkaian Kontrol Mikrokontroler merupakan rangkaian minimum sistem control yang mengatur kerja dari mikrokontroler. Sistem minimum mikrokontroller ini memungkinkan mikrokontroller untuk bekerja dan biasanya terdiri dari ic regulator untuk penyetabil tegangan, xtal untuk generator clok secara eksternal, dan tombol reset unutk mereset mikrokontroller. Jika belum paham tentang bagian bagian mikrokontroller bisa mencarinya ebook gratisan yang banyak beredar membahas tentang mikrokontroller avr.

Chip mikrokontroller atmega 8535

Klub robotik universitas sebelas maret

Rangkaian system minimum atmega 8535 Dalam hal ini, mikrokontroler digunakan sebagai control input dan output. Input (masukan) dari rangkaian sistem kontrol dihubungkan dengan joystik playstation melalui komunikasi serial dan akan saya jelaskan lebih lanjut tentang antar interface joystik di bagian selanjutnya tulisan ini. Sedangkan output dari rangkaian sistem konrol dihubungkan dengan driver motor dc. Rangkaian driver motor DC ini digunakan untuk mengendalikan motor DC. Rangkaian ini akan memberikan daya yang dibutuhkan oleh motor DC untuk berhenti, forward dan reverse. Berdasarkan instruksi yang dikeluarkan oleh mikrokontroler ATMega8535, karena keluaran dari mikrokontroler tidak cukup untuk menggerakkan motor, seandainya kuat mikro akan menjadi cepat panas. Output dari mikrokontroler akan masuk ke rangkaian driver ini, dan akan memberikan keluaran daya atau tegangan yang akan dibutuhkan untuk keperluan-keperluan di atas. Driver motor Dc yang digunakan penulis adalah IC L298d.

Klub robotik universitas sebelas maret

IC driver motor L298D

Rangkaian driver motor untuk 2 motor dc

Antar Muka Joystick Playstation Dengan Mikrokontroler Atmega 8535 Komunikasi yang diigunakan dalam antar muka joystick adalah komunikasi serial sinkron yaitu data dikirim satu persatu melalui melalui satu jalur data. Untuk mengkoordinasi antara pengirim dan penerima terdapat satu jalur clock.

Klub robotik universitas sebelas maret

Pada joystick PS menggunakan komunikasi SPI (serial Pheriperal Interface) atau disebut 3 wire interface. SPI adalah salah satu jenis komunikasi serial yang terkenal. Didalam joystick ps terdapat 9 pin atau 8 pin dengan warna berbeda tergantung merk dan tipe joystick ps. Untuk memastikannya bongkarlah joystik dan lihatlah konfigurasi pin didalamnnya

Rangkaian antarmuka koystick ps dengan mikrokontroller ATMEGA8535 Gambar diatas merupakan rangkaian antarmuka joystick dengan mikrokontroller. Pin yang digunakan adalah psxclock, psxattn, vcc, gnd, psxcmd, psxdata. Biasanya jika membongkar joystick dan melihat konfigurasi yang tertulis di pcbnya kode pinnya berbeda, yaitu psxclock = clk, psxattn = cs, psxcmd = Do, dan psxdat = Di. Jika memakai joystick dengan 8 pin biasannya warna abu abu tidak ada dan warna putih digunakan sebagai catu daya motor getar. Dan untuk memastikan konfigurasinya benar alangkah baiknya membuka lebih dahulu joystick dan melihat konfigurasi yang tertulis pcb nya.

Klub robotik universitas sebelas maret

Untuk antarmuka dengan mikrokontroller ATMega 8535 dibutuhkan 4 pin, 3 sebagai output (PB7/sck, PB5/MOSI, dan PB4) dan 1 pin sebagai input (PB6/MISO). Jika menngunakan mikrokontroller lain pemilihan pin harus disesuaikan dengan jalur SPI yang dapat dilihat pada datasheet masing-masing mikrokontroller. Dibawah ini ditunjukkan tabel pertukaran data antara joystick ps dengan mikrokontroller

Pertukaran data untuk joystik digital

Petukaran data untuk joystik analog Untuk bisa komunikasi maka pin psxattn aharus berlogika nol selanjutnya untuk mengawali komunikasi dengan joystick ps mikrokontroller mengirimkan byte pertama berupa perintah 0x01 di jalur PB5/MOSI ke psxcmd di joystick ps, kemudian byte kedua 0x42 di jalur MOSI untuk membaca data joystick dan sekaligus menerima tipe joystick dari psxdat joystick ke MISO mikrokontroller (0x41 untuk digital, 0x73 untuk analog). Byte ke tiga pin MISO mikrokontroller menerima data dari psxdat joystick 0x5A yang menandakan joystick sudah ready. Byte ke empat dan seterusnya MISO mikrokontroller berturut turut menerima

Klub robotik universitas sebelas maret

data dari joystick data digital 1 ,data digital 2 . Data digital ini menunjukan penekanan tombol dan bersifat actif low, jadi jika tidak ada tombol yang ditekan MISO mikrokontroller akan menerima data 0xff atau 0b11111111), jika joystick dalam operasi analaog maka komunikasi dilanjutkan dengan data analog 3, data analog 4. Pada kondisi netral data 0x7f (127) dengan nilai minimal 0 dan maksimal 0xff (255) dan saat operasi digital 6-9 selalu memberikan data 0xff. Teknik kontrol motor servo Dalam robot pemindah barang ini terdapat gripper yang berfungsi untuk menjapit dan mengakat barang. Penggerak gripper ini menggunakan motor servo. Motor servo adalah motor DC dengan sistem closed feedback sehingga dapat berputar berdasarkan sudut yang dikehendaki. Berdasarkan sudut putarannya, umumnya servo terdiri atas dua jenis yaitu servo continuous dan servo standar. Servo continuous adalah servo yang dapat berputar 360 derajat. Servo standar adalah servo yang hanya dapat berputar 180 derajat. Servo yang digunakan dalam robot ini memakai servo standart yaitu yang hanya dapat berputar 180 derajat. Motor servo ini nantinya dirangakai dengan sistem mekanik sehingga membentuk gripper, dimana jika servo berputar searah jarum jam maka gripper membuka dan jika berputar berlawanan arah jarum jam gripper menutup.

Gripper robot dan servo untuk kendali gripper Sekarang saya akan menjelaskan bagaimana cara mengontrol motor servo agar bisa bergerak searah jarum jam atau berlawanan jarum jam dengan sufut putar tertentu. Sudut putar ini perlu diperhatikan karena ini yang menentukan seberapa lebar nantinya gripp akan membuka. Secara umum untuk mengontrol motor servo tipe standard adalah dengan cara memberikan pulsa high selama 1,5 ms dan mengulangnya setiap 20 ms, maka posisi servo

Klub robotik universitas sebelas maret

akan berada ditengah atau netral (0). Untuk pulsa 1 ms maka akan bergerak berkebalikan arah jarum jam dengan sudut -90. Dan pulsa high selama 2 ms akan bergerak searah jarum jam sebesar 90. Untuk lebih jelasnya perhatikan gambar berikut.

20ms

1.5 ms 20ms

2 ms

20ms

Pin SIGNAL pada motor servo dapat dikoneksikan ke pin mana saja pada mikrokontroler, lihat gambar dibawah. Dan program motor servo bisa dilihat listing program bagain bawah tulisan ini.

Klub robotik universitas sebelas maret

Pemrograman Bahasa C Kendali Manual Robot Pemindah Barang Dengan CVAVR Program yang dibuat menggunakan bahasa c dan compiler CVAVR. Urutan menulis program yaitu pertam buka dulu CVAVR kemudian pilih new kemudian pilih project setelah itu kita akan berada ditampilan codewizard avr, kegunaan codewizard avr adalah untuk mengeset program yang akan kita buat. Unutk program ini yaitu program untuk robot kendali manual untuk pemindah barang. Pertama atur mikrokontroller yang digunakan dalam robot ini menggunakan atmega8535

Kedua mengatur port dari mikrokontroller apakah digunakan sebagai output atau input. port B digunakan sebagai komunikasi serial seperti yang sudah dijelaskan diatas, maka konfigurasi input output pinnya sesuai diatas. Kemudian motor dc di port c, maka port c diubah ke output semua, kemudian untuk servo digunakan port d.0 dan port d.7, maka bit ini perlu dibuat output. Dan port lainnya yang tidak dipakai terserah mau difungsikan sebgai input atau output.

Klub robotik universitas sebelas maret

Setelah semuanya selesai kemudian pilih file generate, save and exit. Kemudian muncul tiga kali perintah penyimpanan. Tiga file yang disimpan harus mempunyai nama yang sama dan folder yang sama.

Kemudian kita akan masuk ke jendela pemrograman, disini sudah ada program awal yang kita atur di codewizard avr tadi dan kemudian kita melanjutkan menulis program di jendela cvavr.

Klub robotik universitas sebelas maret

listing program dan penjelasannya

/***************************************************** This program was produced by the CodeWizardAVR V2.04.4a Advanced Automatic Program Generator Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com

Project : program robot manual pemindah barang dengan joystik Version : 1 Date Author : 27/02/2013 : EDI PRASETYO

university : universitas sebelas maret

Klub robotik universitas sebelas maret

Chip type Program type

: ATmega8535 : Application

AVR Core Clock frequency: 11,059200 MHz Memory model External RAM size Data Stack size : Small :0 : 128

*****************************************************/ //kegunaan dari #define adalah menetapkan nama pengganti dari konstanta yang sering dipakai //dibawah ini port port dari mikrokontroller di definisikan atau diganti namanya //dan memeberi nama dari konfigurasi joystick #define psxattn PORTB.4 #define servo1 PORTD.0 //control signal servo pada gripperer (port output) (port output)

#define servo2 PORTD.7 //control signal servo untuk naik turun gripperer #define Enki PORTC.7 //enable l298 untuk motor kiri #define A_Ki PORTC.5 //out A untuk motor kiri #define B_Ki PORTC.4 //out B unutk motor kiri (port output) (port output) (port output) (port output) (port output) (port output)

#define Enka PORTC.6 //enable l298 untuk motor kanan #define C_Ka PORTC.3 //out C untuk motor kanan #define D_Ka PORTC.2 //out D untuk motor kanan #define Select 1 #define Start 2

Klub robotik universitas sebelas maret

#define kiri 3 #define bawah 4 #define kanan 5 #define atas 6 #define kotak 7 #define peng 8 #define bunder 9 #define segitiga 10 #define R1 11 #define L1 12 #define R2 13 #define L2 14 #define R3 15 #define L3 16 #define pengR1 17 #define pengR1R2 18 #define segitigaR1 19 #define segitigaR1R2 20 #define pengL1 21 #define pengL1L2 22 #define segitigaL1 23 #define segitigaL1L2 24 #define tidakditekan1 25

Klub robotik universitas sebelas maret

#define tidakditekan2 26 #define pengR2 27 #define segitigaR2 28 #define pengL2 29 #define segitigaL2 30 #define kotakR1 31 #define kotakR1R2 32 #define bunderR1 33 #define bunderR1R2 34 #define kotakL1 35 #define kotakL1L2 36 #define bunderL1 37 #define bunderL1L2 38 #define kotakR2 39 #define bunderR2 40 #define kotakL2 41 #define bunderL2 42 #define R1R2 43 #define L1L2 44 #define R1L1 45 #define R2L2 46 #define R2L1 47 #define R1L2 48

Klub robotik universitas sebelas maret

//dibawah adalah kode untuk memanggil library yang letaknya diluar program //sehingga tidak perlu menulis program ini lagi karena sudah ada di library, hanya tinggal memanggil #include <mega8535.h> #include <delay.h> #include <spi.h> void maju() // fungsi untuk robot bergerak maju { Enki=1;Enka=1; A_Ki=1;B_Ki=0; // motor kiri berputar searah jarum jam, dilihat dari posisi motor

C_Ka=0;D_Ka=1; // motor kanan berputar berlawanan jarum jam } void mundur() { Enki=1;Enka=1; A_Ki=0;B_Ki=1; // motor kiri berputar berlawanan jarum jam C_Ka=1;D_Ka=0; // motor kanan berputar searah jarum jam } void belok_kanan () //fungsi robot belok kanan { Enki=1;Enka=1; A_Ki=1; B_Ki=0; // C_Ka=0; D_Ka=0; //

Klub robotik universitas sebelas maret

} void belok_kiri() //fungsi robot belok kiri { Enki=1;Enka=1; A_Ki=0; B_Ki=0; // C_Ka=0; D_Ka=1; //

} //fungsi gripperer, jika masih bingung tentang fungsi ini baca lagi tehnik mengontrol motor servo void membuka() { servo1=1; //memberikan pulsa high delay_ms(3); //pulsa high diberikan selama 3 ms servo1=0; delay_ms(20); } void menutup() { servo1=1;//memberikan pulsa high delay_ms(0.5);//pulsa high diberikan selama 3 ms servo1=0; delay_ms(20); //fungsi untuk menutup gripperer //fungsi untuk membuka gripperer

Klub robotik universitas sebelas maret

} void naik() { servo2=1; //memberikan pulsa high //fungsi untuk gripperer naik

delay_ms(0.5); //pulsa high diberikan selama 1 ms

servo2=0; delay_ms(20); } void turun() { servo2=1;//memberikan pulsa high delay_ms(3);//pulsa high diberikan selama 2 ms //fungsi untuk gripperer turun

servo2=0; delay_ms(20); } void normal() { Enki=0; Enka=0; //fungsi ini digunakan jika tidak ada penekanan stick

Klub robotik universitas sebelas maret

// Declare your global variables here //deklarasi variabel dahulu sebelum digunakan unsigned char spi(unsigned char data); unsigned char byte4, byte5, xkanan, ykanan, xkiri, ykiri; unsigned char id,ss; int key; void scan_remot() { //seperti yang sudah saya jelaskan, //dibawah ini adalah proses komunikasi serial joystik dan mikro psxattn=0; // memberi nilai psxattn mengawali komunikasi //fungsi pembacaan penekanan joystik

delay_us(10); // untuk mengawali komunikasi mikrokontroller mengirimkan byte pertama mengirim //berupa perintah 0x01 di jalur PB5/MOSI ke psxcmd di joystick spi(0x01); delay_us(10); // byte kedua 0x42 di jalur MOSI untuk membaca data joystick dan // sekaligus menerima tipe joystick dari psxdat joystick ke MISO mikrokontroller // dalam program ini diwakilkan oleh variabel id (0x41 untuk digital, 0x73 untuk analog). id=spi(0x42); delay_us(10); //Byte ke tiga pin MISO mikrokontroller menerima data dari psxdat joystick 0x5A

Klub robotik universitas sebelas maret

//yang menandakan joystick sudah ready ss=spi(0); delay_us(10); //byte ke 4 dan seterusnya mikro menerima data dari joystick byte4 =spi(0); delay_us(10); byte5 =spi(0); delay_us(10); xkanan =spi(0); delay_us(10); ykanan =spi(0); delay_us(10); xkiri =spi(0); delay_us(10); ykiri =spi(0); delay_us(10); //mengakhiri komunikasi psxattn=1; delay_us(10);

} //memberi nama hasil penekan tombol dengan switch //bilangan hexa dibawah merupakan data yang diterima dari joystick

Klub robotik universitas sebelas maret

//bisa dihitumg dengan melihat tabel pertukaran data joystik switch (byte4) { case 0x7F: key=kiri; break; case 0xBF: key=bawah; break; case 0xDF: key=kanan; break; case 0xEF: key=atas; break; case 0xF7: key=Start; break; case 0xFB: key=R3; case 0xFD: key=L3; case 0xFE: key=Select; break; case 0xff: key=tidakditekan1; break; } switch (byte5) { case 0x7F: key=kotak; case 0xBF: key=peng; case 0xDF: key=bunder; break; break; break; break; break;

case 0xEF: key=segitiga; break; case 0xF7: key=R1; case 0xFB: key=L1; case 0xFD: key=R2; case 0xFE: key=L2; break; break; break; break;

Klub robotik universitas sebelas maret

case 0xB7: key=pengR1; case 0xB5: key=pengR1R2; case 0xE7: key=segitigaR1;

break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break;

case 0xE5: key=segitigaR1R2; case 0xBB: key=pengL1; case 0xBA: key=pengL1L2; case 0xEB: key=segitigaL1; case 0xEA: key=segitigaL1L2; case 0xff: key=tidakditekan2; case 0xBD: key=pengR2; case 0xED: key=segitigaR2; case 0xBE: key=pengL2; case 0xEE: key=segitigaL2; case 0x77: key=kotakR1; case 0x75: key=kotakR1R2; case 0xD7: key=bunderR1; case 0xD5: key=bunderR1R2; case 0x7B: key=kotakL1; case 0x7A: key=kotakL1L2; case 0xDB: key=bunderL1; case 0xDA: key=bunderL1L2; case 0xDE: key=bunderL2; case 0xDD: key=bunderR2;

Klub robotik universitas sebelas maret

case 0x7D: key=kotakR2; case 0x7E: key=kotakL2;

break; break;

case 0xF5: key=R1R2; case 0xFA: key=L1L2; case 0xF9: key=R2L1; case 0xF6: key=R1L2; } } void main(void) {

break; break; break; break;

//konfigurasi dari mirikontroller yand didapat dari pengaturan code wizard tadi // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=P State0=P PORTA=0x03; DDRA=0xFC; // Port B initialization // Func7=out Func6=In Func5=out Func4=out Func3=In Func2=In Func1=In Func0=In // State7=T State6=p State5=T State4=t State3=T State2=T State1=T State0=T PORTB=0x10;

Klub robotik universitas sebelas maret

DDRB=0xb0; // Port C initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTC=0x00; DDRC=0xFF; // Port D initialization // Func7=out Func6=out Func5=out Func4=out Func3=out Func2=out Func1=out Func0=out // State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P PORTD=0x00; DDRD=0xFF; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 10,800 kHz // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped

Klub robotik universitas sebelas maret

// Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 10,800 kHz // Mode: Normal top=FFh

Klub robotik universitas sebelas maret

// OC2 output: Disconnected ASSR=0x00; TCCR2=0x07; TCNT2=0x00; OCR2=0x00; // External Interrupt (s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x41; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; SPCR=(0<<SPIE) | (1<<SPE) | (1<<DORD) | (1<<MSTR) | (1<<CPOL) | (1<<CPHA) | (1<<SPR1) | (1<<SPR0); SPSR=(0<<SPI2X);

// Global enable interrupts

Klub robotik universitas sebelas maret

#asm("sei") //perintah while (1) digunakan untuk mengulang terus tanmpa berhenti program utama while (1) { // Place your code here //memanggil fungsi scan_remot(); //dibawah ini perintah dari hasil penekan tombol joystick switch (key) { case kiri: break; case bawah: break; case kanan: break; case atas: break; case Start: break; case Select: break; //jika ditekan kotak maka memanggil fungsi belok_kiri

Klub robotik universitas sebelas maret

//robot akan belok kiri case kotak: belok_kiri();

break; case peng: break; case bunder: belok_kanan(); maju();

break; case segitiga: mundur(); break; case R1: break; case L1: break; case R2: break; case L2: break; case R3: break; turun(); naik(); membuka(); menutup();

Klub robotik universitas sebelas maret

case L3: break; case pengR1: { maju(); menutup(); break; } case pengR2: { maju(); naik(); break; } case pengR1R2: { maju(); menutup(); naik(); break; } case segitigaR1: {

Klub robotik universitas sebelas maret

mundur(); menutup(); break; } case segitigaR2: { mundur(); naik(); break; } case segitigaR1R2: { mundur(); menutup(); naik(); break; } case pengL1: { maju(); membuka(); break; }

Klub robotik universitas sebelas maret

case pengL2: { maju(); turun(); break; } case pengL1L2: { maju(); membuka(); turun(); break; } case segitigaL1: { mundur(); membuka(); break; } case segitigaL2: { mundur(); turun();

Klub robotik universitas sebelas maret

break; } case segitigaL1L2: { mundur(); membuka(); turun(); break; } case kotakR1: { belok_kiri(); menutup(); break; } case kotakR2: { belok_kiri(); naik(); break; } case kotakR1R2: {

Klub robotik universitas sebelas maret

belok_kiri(); menutup(); naik(); break; } case bunderR1: { belok_kanan(); menutup(); break; } case bunderR2: { belok_kanan(); naik(); break; } case bunderR1R2: { belok_kanan(); menutup(); naik(); break;

Klub robotik universitas sebelas maret

} case kotakL1: { belok_kiri(); membuka(); break; } case kotakL2: { belok_kiri(); turun(); break; } case kotakL1L2: { belok_kiri(); membuka(); turun(); break; } case bunderL1: { belok_kanan();

Klub robotik universitas sebelas maret

membuka(); break; } case bunderL2: { belok_kanan(); turun(); break; } case bunderL1L2: { belok_kanan(); membuka(); turun(); break; } case R1R2: { menutup(); naik(); break; } case L1L2:

Klub robotik universitas sebelas maret

{ membuka(); turun(); break; } case R2L1: { naik(); membuka(); break; } case R1L2: { menutup(); turun(); break; } default: normal(); break; } }; }

Klub robotik universitas sebelas maret

Daftar Pustaka Charles Ronald Harahap.2009. Perancangan Robot Pemadam Api Gedung Bertingkat Berbasis Mikrokontroler ATMega8535. ELECTRICIAN Jurnal Rekayasa dan Teknologi Elektro Volume: 3, No.2 | Mei 2009 Agung nugroho adi.Antar Muka Joystick Playstation Dengan Mikrokontroller Avr Menggunkan Cvavr.labolatorium mekatronika jurusan teknik mesin universitas islam indonesia http://elektro-kontrol.blogspot.com

You might also like