JavaScript is disabled or you're using old browser, please turn on your JavaScript or upgrade your browser to see fancy looking.
Archive for the ‘knowledge’ Category

Newer Entries  Older Entries 

PWM dengan Interrupt Timer

Ada beberapa teman (especially me2t) yang masih bingung bagaimana sebenarnya Interrupt Timer dapat digunakan sebagai PWM (Pulse Width Modulation). Sebelum menjelaskan lebih dalam mengenai Timer, saya akan mengulas balik tentang sumber pencacah (clock source) pada uC AVR. Sumber pencacah untuk AVR itu seperti detak jantung yang diperlukan untuk mengeksekusi instruksi. Pengeksekusian instruksi umumnya membutuhkan satu sampai tiga siklus pencacah (clock cycles). Satu siklus adalah transisi low-hi-low _|¯|_. Jadi semakin cepat pencacah berjalan (menghitung), maka semakin cepat uC bekerja. Jadi jelas uC AVR 16 MHz akan lebih cepat dari uC AVR 1 MHz. Tapi perlu diperhatikan, kecepatan pencacah tidak begitu berarti banyak. Satu prosesor dapat membutuhkan 1 siklus pencacah untuk memindahkan data dari satu register ke register lainnya, tapi prosesor lain dapat saja membutuhkan 2 sikus pencacah untuk melakukan hal yang sama. Hal ini berarti bahwa prosesor ke-2 harus memiliki kecepatan 2x lipat prosesor ke-1 untuk melakukan instruksi yang sama dalam waktu yang sama. Kuncinya disini adalah sebuah penilaian kasar yang disebut MIPS (Milion of Instructions Per Second), yang dapat digunakan untuk menilai secara kasar berapa instruksi yang dapat dilakukan uC dalam satu detik pada frekuensi pencacah tertentu. Jika pada lembar data (datasheet) tertulis “Up to 16 MIPS Throughput at 16 MHz”, kita bisa mengasumsikan secara kasar bahwa dengan pencacah 4 MHz, kita bisa mencapai 4 MIPS (4 juta instruksi per detiknya atau sekitar 1/4 uS untuk eksekusi 1 instruksi, CMIIW). Sebenarnya penjelasan untuk pencacah dapat lebih panjang, tapi sisanya saya serahkan kepada pembaca untuk mengubeknya di google dan datasheet terkait :).

Read the rest of this entry »

Line Tracer dengan Sistem Kontrol PD (Proportional Derivative)

Misalkan kita mempunyai susunan sensor, tampak atas, seperti berikut:

(4) ------ (3) - (2) -(1) ------ (0)

Dimana angka menunjukkan pin uC, katakanlah pada PORT C. Jadi kita menggunakan pin PORTC.0 untuk sensor paling kanan, PORTC.1 untuk sensor tengah kanan, dst hingga PORTC.4 untuk sensor paling kiri. Untuk mempermudah, saya biasanya menggunakan data mapping. Jadi kondisi sensor akan di mapping dengan data PWM motor. Katakanlah sensor line tracer itu aktif low, jadi pin uC akan membaca logika 0 saat mengenai garis. Oke, karena ada 5 sensor maka akan ada 2^5 = 32 kemungkinan kondisi sensor. Saya hanya akan membuat kedua robot bergerak maju, sehingga bisa di buat kontroler motor untuk bergerak satu arah saja. Saya akan membuat beberapa nilai sensor (dalam hexa) saja sebagai contoh, sisanya bisa diimpementasikan sendiri. Berikut tabelnya:

Nilai sensor PWM motor kiri PWM motor kanan
0×11 0xEF 0xFF
0×17 0xA0 0xFF
0×1D 0xEF 0×9F
0×0F 0×20 0xFF
0×1E 0xEF 0×2F
dst… dst… dst…

Saya mengimplementasikan PWM dengan menggunakan interrupt timer pada uC, dimana nilai 0xff adalah PWM full speed (100%) dan motor akan berhenti dengan nilai 0. Pada kasus saya, motor kanan dan kiri akan mempunyai nilai PWM yang berbeda untuk kecepatan aktual yang terlihat sama, jika dilihat pada tabel untuk membuat motor maju lurus nilai PWM kanan dan kiri berbeda 15 desimal. Jika merujuk ke sunsunan sensor, nilai 0×11 menunjukkan tiga sensor tengah mengenai garis, sehingga PWM motor diberi hampir full agar bergerak maju lurus. Kondisi 0×17 mengharuskan robot bergerak serong kiri dan kondisi 0×1E mengharuskan robot banting kanan. Dengan cara mapping nilai sensor dari PINC dengan data PWM kita sudah mengimplementasikan sistem kontrol proportional, dimana gain motor akan mempunyai proporsi sesuai nilai sensor yg diinput ke PINC. Untuk menulisnya dengan bahasa C, saya akan menggunakan array untuk menampung data PWM, berikut potongan programnya:

/**
 * isikan data PWM motor kiri dan kanan
 * sesuai dengan 32 kondisi sensor
 */
unsigned char PWMKiri[32] = { 0x00, 0x00, ... }
unsigned char PWMKanan[32] = { 0x00, 0x00, ... }
unsigned char state;

void scan() {
    state = PINC & 0x1F; //baca PINC.0 - PINC.4
    /**
     * beri nilai PWM motor kiri dengan
     * data PWMKiri dan PWMkanan
     * dimana indexnya adalah kondisi sensor
     */
    PWMKiriVal = PWMKiri[state];
    PWMKananVal = PWMKanan[state];
}

Untuk menambahkan kontrol derivative, kita perlu menggunakan delta PWM. Kita perlu mencatat data PWM sebelumnya. Kita bisa mengubah fungsi scan menjadi:

//variabel untuk menampung nilai PWM sebelumnya
unsigned char last_state, d; 

//jika dipanggil tanpa argumen, fungsi scan hanya sistem kontrol proportional
void scan(d = false) {
    state = PINC & 0x1F;

    //jika dipanggil dengan scan(1), aktifkan fungsi proportioal-derivative
    if (d) {
        PWMKiriVal = PWMKiri[state] + (PWMKiri[state] - PWMKiri[last_state]);
        PWMKananVal = PWMKanan[state] + (PWMKanan[state] - PWMKanan[last_state]);
    } else { //sistem proportional saja
         /* beri nilai PWM motor kiri dan kanan
         * dimana indexnya adalah kondisi sensor
         */
        PWMKiriVal = PWMKiri[state];
        PWMKananVal = PWMKanan[state];
    }
last_state = state;
}

Sistem derivative di atas hanya gambaran bagaimana menerapkan sistem kontrol PD, dan agak redundant jika digunakan dalam robot sederhana dengan 5 sensor. Dalam mendesain sistem derivative perlu diperhatikan apakah penyimpangan error dalam kondisi sistem itu cukup signifikan untuk membuat sistem bergerak stabil jika ditambahkan ke dalam sistem kontrol. Jika masih bingung apa itu sistem PID, coba di googling. Sebagai pendahuluan coba baca artikel PID di Wikipedia.

Menggunakan 6 Ping dengan 2 Microcontroller AVR 8 bit RISC untuk Navigasi Robot (Bagian 0)

Daftar Tulisan Berseri untuk tutorial AVR - PING

  1. Menggunakan 6 Ping dengan 2 Microcontroller AVR 8 bit RISC untuk Navigasi Robot (Bagian 0)

Pendahuluan

Tulisan ini sebenarnya saya tujukan untuk klub robotika tidak resmi di Gunadarma (Dadank, Rum, Anto, Yogi, dkk), mudahan-mudahan niat yang ikhlas untuk belajar bersama dan berbagi ilmu dapat menambah pahala dan membuka minat para mahasiswa Gunadarma lainnya, khususnya jurusan SK, TK dan elektro, untuk menggeluti bidang robotika. Mudah-mudahan tulisan ini dapat juga berguna bagi khalayak ramai :).

Tulisan ini ditujukan untuk pemula yang ingin mengenal microcontroller (uC) AVR RISC serta penggunaan 6 sensor PING (sensor ultrasonic) untuk navigasi robot dengan penerapan metode Fuzzy Logic. Dasar elektronika, microprocessor-microcontroller (uC/uP), dan pengetahuan dalam bahasa pemrograman prosedural (C, Pascal, atau Basic) merupakan nilai tambah untuk dapat mempermudah memahami tulisan ini. Read the rest of this entry »

Libaries for your Computer Vision project

Now i wonder why is so hard to accomplish two totally different area projects. For example, you are noobs in signal processing and you’ve to build apps based on voice recognition. In the same time, you are a top guy in developing web apps where you get money from there. But you are also a nice guy who helps your friends finishing their tasks, say microcontroller projects (this will never hurt you in case you’re happy to do that). But, i felt this situation makes myself being trapped. So i decide not to develop some apps from scratch. OK, sorry too much bullshit here.. lets move ahead.

If you trying to build Computer Vision apps, these libraries will shorten your project time :

  • OpenCV (Open Source Computer Vision Library). This libray covers large areas of computer vision. Some demos (apps that come with the library) are included. The only reason why i use this library for my face recognition project is the community where i can get answer from annoying problems. OpenCV Wiki is a good start to get answer, then you can go to OpenCV Forums at Yahoo Groups.
  • Torch3vision (The Vision Package of Torch), a machine vision library based on Torch (a machine learning library written in simple C++ and developed at IDIAP). Sebastien Marcel, one of the developers, gives some demos based on real-time face detection & recognition using Torch3vision available on his homepage. It’s awesome dude. He also gives information in comparison between OpenCV face detector and IDIAP face detector.
  • MPT (Machine Perception Toolbox) which is developed at machine perception laboratory of UCSD. It supplies cross-platform libraries for real-time perception primitives, including face detection, eye detection, blink detection, color tracking. Soon it will also include expression recognition, predictive color tracking, and tracking based on multisensor fusion. You should see some examples (screenshoots of application) which use this library.
  • Collection of computer vision software (with source code) at School of Computer Science / CMU.

So why you should build code which already built by top guys? If you have suggestions to be listed above just tell me, or you maybe interested to join with me in my face recognition project :D

Fuzzy Logic Untuk Navigasi Robot (Bagian I)

Seperti apa yang pernah diucapkan almarhum buyut :D:

The only source of knowledge is experience

Albert Einstein

Saya ingat bagaimana saya membuat robot pertama kali dengan pengetahuan nol dalam bidang robotika dan juga elektronik. Meskipun banyak buku, artikel dan tutorial yang membahas bagaimana membuat robot dari awal, rasanya hanya akan membuat bingung dengan segudang referensi tanpa mengotori tangan dengan solder dan coding. Akhirnya saya lupakan referensi dan mengingat sebagaian referensi yang masih menyangkut di otak. Ini saatnya memakai otak untuk sedikit berpikir dan berimajinasi. Jadi teringat pesan buyut :D :

Any man who reads too much and uses his own brain too little falls into lazy habits of thinking.

Albert Einsten.

Berhubung robot yang dibuat hanya sebatas tugas lab, maka saya tidak memprioritaskan untuk membuatnya istimewa. Cukup bekerja sesuai deskripsi yang diminta. Apabila saya mengingat robot itu, saya tertawa membayangkan baris program yang sangat sederhana sekali, tapi beberapa orang melihatnya cukup serius :D. Mungkin ini juga sering terjadi apabila Anda belajar bahasa pemrograman dan sebulan kemudian melihat program Hello World. Tadinya saya berniat menaruh skematik beserta program di tulisan ini, tapi filenya entah di mana.. :D. Robot yang saya buat ini adalah light seeking, hanya menggunakan 3 LDR. Kalau tidak salah ada koran yang memuatnya (he2.. narsis).

Robot kedua yang saya buat dibuat untuk mengikuti kontes robot line follower di kampus, kontes perdana.
Masih dengan pengetahuan yang sangat minim dan agak sotoy (karena menganggap enteng) dan masih acuh terhadap sistem kontrol, maka yang terbesit saat itu hanya teknik kontrol ON-OFF. Teknik kontrol seperti ini masih bisa di terapkan di arena tak bersimpang, namun arena yang digunakan banyak terdapat simpangan, sehingga dibutuhkan teknik kontrol
yang dapat mentolelir gain motor. Hal yang pertama di lakukan adalah melakukan pendataan kondisi sensor pada garis dan menentukan aksi terhadap kondisi tersebut. Pada robot tersebut digunakan 5 sensor dengan susunan sebagai berikut :

(4)___(3)_(2)_(1)___(0)

Angka tersebut menunjukkan urutan pin pada port mikrokontroller. Untuk nilai binary dengan 4 variabel (sensor) memliki kemunkinan nilai unik (kondisi sensor) sebanyak 2^4 = 16. Tidak semua kondisi digunakan. Adapun kondisi yang perlu diprioritaskan untuk mendapatkan aksi adalah :

—————————————————-
4 | 3 | 2 | 1 | 0 | Aksi
—————————————————-
x | 0 | 1 | 0 | x | Maju
x | 1 | 1 | 0 | x | Serong kiri
x | 1 | 0 | 0 | x | banting kiri
x | 0 | 1 | 1 | x | serong kanan
x | 0 | 0 | 1 | x | banting kanan
x |1 | 1 | 1 | x | Maju
——————————————————
1 menunjukkan sensor berada pada garis.
Pengaturan jarak antar sensor disini memungkinkan 2 atau 3 sensor mengenai garis. Dengan mengabaikan sensor paling kiri (4) dan kanan (0) dan menggunakan aksi sesuai tabel, robot saya dapat berjalan cukup smooth mengikuti garis lurus. Bila terdapat jalur berupa huruf L, sensor (0) dan (4) bisa membantu. Kontrol yang digunakan hanya proportional
saja, yaitu pemberian PWM motor. Apabila diinginkan pergerakan yang lebih smooth bisa menambah kontrol derivative. Mendapatkan nilai konstanta proportional yang tepat adalah melalui test berulang kali. Ini seperti melakukan mapping input sensor terhadap output PWM motor. Nilai input disini sangat sederhana jadi tidak perlu menggunakan fuzzy logic. Beberapa orang menyebutnya dengan table lookup. Oia ini video robotnya, cupu abis :

http://www.youtube.com/v/ks1zYPqFcEI

Sialnya nih robot dah di gondol oleh orang yang tidak tahu berterima kasih tidak bertanggung jawab, tidak menghargai karya orang lain, menipu dosen (dengan mengklaim robot saya sebagai robot buatannya). Dan parahnya dia adalah seorang wanita yang seharusnya menjadi pamong bagi mahasiswa/i di filkom (ketua BEF). Astagfirullah,
mudah-mudahan Allah ta’ala memaafkannya. Saya sendiri sudah mengikhlaskannya (mudah2an). Apabila ada yang tertarik ini source codenya. Saya bukan programmer sekelas Kel, jadi masih banyak menggunakan delay. Rutin utama yang perlu diperhatikan adalah rutin scan :scan:
mov a,p1
anl a,#0eh
jz cekKiKamov p2, #66h
mundur: ;serkan / serkir / maju, 0,6,c,e
mov B, A
movc A,@A+dptr
mov pwmKi, A
mov A, B
inc A
movc A,@A+dptr
mov pwmKa, A
ret

mundur_:mov p2, #3Ch
sjmp mundur

cekKiKa:jnb sKiLuar,_kanan
_kiri: mov pwmKi,#40h
mov pwmKa,#50h
mov p2, #36h
ret

_kanan: jnb sKaLuar,mundur_
mov pwmKi,#50h
mov pwmKa,#40h
mov p2, #6Ch
ret

Pemanggilan rutin scan secara otomatis akan memandu robot untuk mengikuti track putih tanpa mempedulikan simpangan. Pertama-tama kontroler akan membaca kondisi sensor saat itu nilai sensor akan menentukan alamat pengambilan data PWM motor. Penggunaan instruksi ‘anl a,#0eh’ akan membaca 3 sensor tengah (sesuai dengan susunan sensor yang saya jelaskan di atas). Instruksi ‘jz cekKiKa’ akan mengecek nilai accumulator, apabila ‘0′ maka sensor paling ujung (0 & 4) akan dicek. Jika ada salah satu dari sensor (0) atau (4) mengenai track putih (memberikan logik ‘1′) maka robot akan spin ke arah sensor bernilai ‘1′ tersebut. Ini berguna untuk track yang memiliki belokan berbentuk huruf L. Jika 3 sensor tengah memberikan nilai ‘0′ dan tidak ada sensor (0) dan (4) yang memberikan logik ‘1′ maka robot akan mundur. Ini kurang efektif, jika saya berpikir sekarang, untuk digunakan sebenarnya. Sayangnya, rutin ini hanya bisa diimplemetasikan pada jalur lurus. Ada paper menarik, Penggunaan Kombinasi Sensor Array Depan dan Belakang pada Robot Pengikut Garis (Kasus Robot Otomatis ASKAF-i), yang menggunakan tambahan sensor belakang dalam kombinasi sensor Array. Jika Anda menginginkan navigasi line tracking yang lebih robust, paper ini dapat dijadikan acuan. Jika jalur yang digunakan tidak lurus, terdapat jalur melengkung, ada baiknya melihat robot ini.
Robot yang saya kerjakan saat ini (sudah selesai seminggu yang lalu) menggunakan fuzzy logic untuk navigasinya, baik untuk wall following (mengikuti dinding) dan obstacle avoidance (menghindari dinding). Karena menggunakan sensor ultrasonic, data untuk satu sensor tidak lagi berupa biner. Biner dalam bahasa pemrograman tingkat tinggi dapat di padankan sama halnya dengan tipe data boolean (true atau false). Engineer melihatnya sebagai level tegangan, apabila bekerja dengan komponen logika, yang mempresentasikan 0 atau 5 V. Tapi tidak absolut 0 atau 5 (tergantung spesifikasi komponen tersebut). Misal jika sebuah sensor memberi masukan 5 V, program melihatnya sebagai ‘1′ atau true, yang mengindikasikan sensor menangkap adanya objek yang berdekatan. Bila tidak objek yang menghalangi sensor dalam batas toleransinya, maka akan dihasilkan tegangan 0 V, dimana program merepresentasikan nya sebagai ‘0′ atau false. Secara sederhana program dapat di tulis seperti ini :

if (sensor==1) {
aksi(1); //aksi yang dilakukan sistem bila ada objek
} else {
aksi(0); //aksi yang dilakukan sistem bila tidak ada objek
}

Dalam teknik kontrol, ini termasuk kontrol ON-OFF. Bagaimana bila sistem yang kita inginkan dapat melakukan aksi yang berbeda untuk jarak yang sangat jauh, jarak jauh, sedang, cukup dekat dan dekat. Mungkin ini saatnya menggunakan Fuzzy logic. Teori fuzzy logic dipropose oleh seorang ahli matematika bernama Lotfi Zadeh pada tahun 1973. Sebelumnya Zadeh memperkenalkan teori fuzzy set pada tahun 1965.

Bersambung … (Ntar lagi ya lanjutinnya, banyak image nya soalnya bagian ke-II)

Newer Entries  Older Entries