Penggunaan IF

Minggu, November 21, 2010

if (conditional) and ==, !=, <, > (comparison operators)

if, which is used in conjunction with a comparison operator, tests whether a certain condition has been reached, such as an input being above a certain number. The format for an if test is:
if (someVariable > 50)
{
// do something here
}
The program tests to see if someVariable is greater than 50. If it is, the program takes a particular action. Put another way, if the statement in parentheses is true, the statements inside the brackets are run. If not, the program skips over the code.
The brackets may be omitted after an if statement. If this is done, the next line (defined by the semicolon) becomes the only conditional statement.

if (x > 120) digitalWrite(LEDpin, HIGH);

if (x > 120)
digitalWrite(LEDpin, HIGH);

if (x > 120){ digitalWrite(LEDpin, HIGH); }

if (x > 120){
digitalWrite(LEDpin1, HIGH);
digitalWrite(LEDpin2, HIGH);
} // all are correct

The statements being evaluated inside the parentheses require the use of one or more operators:
Comparison Operators:
x == y (x is equal to y)
x != y (x is not equal to y)
x <> y (x is greater than y)
x <= y (x is less than or equal to y) x >= y (x is greater than or equal to y)
Warning:
Beware of accidentally using the single equal sign (e.g. if (x = 10) ). The single equal sign is the assignment operator, and sets x to 10 (puts the value 10 into the variable x). Instead use the double equal sign (e.g. if (x == 10) ), which is the comparison operator, and tests whether x is equal to 10 or not. The latter statement is only true if x equals 10, but the former statement will always be true.
This is because C evaluates the statement if (x=10) as follows: 10 is assigned to x (remember that the single equal sign is the assignment operator), so x now contains 10. Then the 'if' conditional evaluates 10, which always evaluates to TRUE, since any non-zero number evaluates to TRUE. Consequently, if (x = 10) will always evaluate to TRUE, which is not the desired result when using an 'if' statement. Additionally, the variable x will be set to 10, which is also not a desired action.
if can also be part of a branching control structure using the if...else] construction.

sumber ; http://arduino.cc

Gambar Rangkaian Kontrol Motor

Senin, Oktober 11, 2010



LDR Sebagai Sensor

Jumat, Oktober 08, 2010

LDR singkatan dari Light Dependent Resistor adalah resistor yang nilai resistansinya berubah-ubah karena adanya intensitas cahaya yang diserap. LDR juga merupakan resistor yang mempunyai koefisien temperature negative, dimana resistansinya dipengaruhi oleh intrensitas cahaya. LDR dibentuk dari cadium Sulfied (CDS) yang mana CDS dihasilkan dari serbuk keramik. Secara umum, CDS disebut juga peralatan photo conductive, selama konduktivitas atau resistansi dari CDS bervariasi terhadap intensitas cahaya. Jika intensitas cahaya yang diterima tinggi maka hambatan juga akan tinggi yang mengakibatkan tengangan yang keluar juga akan tinggi begitu juga sebaliknya disinilah mekanisme proses perubahan cahaya menjadi listrik terjadi.

Light Dependent Resistor ( LDR )

Dalam keadaan gelap resistansi LDR sekitar 10MΩ dan dalam keadaan terang sebesar 1KΩ atau kurang. LDR terbuat dari bahan semikonduktor seperti kadmium sulfida. Dengan bahan ini energi dari cahaya yang jatuh menyebabkan lebih banyak muatan yang dilepas atau arus listrik meningkat. Artinya resistansi bahan telah mengalami penurunan.


Namun perlu juga diingat bahwa respon dari rangkaian transistor akan sangat tergantung pada nilai LDR yang digunakan. Lebih tinggi nilai tahanan nya akan lebih cepat respon rangkaian.

Akan lebih mudah mengatur respon rangkaian bila kita menggunak
an Op-Amp sebagai penguat atau saklar pada rangkaian LDR. Kita bisa gunakan berbagai jenis Op-Amp yang tersedia. Kalau tersedia jenis CMOS atau yang lain tidak akan mempengaruhi penampilan LDR pada rangkaian.

Tergantung pada aplikasi rangkaian yang akan kita rakit. Apakah keluaran Op-Amp akan tinggi saat LDR tidak mendapat cahaya atau Keluaran Op-Amp akan mencap
aitegangan supply pada saat LDR mendapat cahaya. Gunakan rangkaian dasar Op-Amp Inverse atau Non-inverse.

Dengan sifat LDR yang demikian, maka LDR (Light Dependent Resistor) biasa digunakan sebagai sensor cahaya. Contoh penggunaannya adalah pada lampu taman dan lampu di jalan yang bisa menyala di malam hari dan padam di siang hari secara otomatis. Atau bisa juga kita gunakan di kamar kita sendiri.


LINE TRACER

Rabu, Oktober 06, 2010

Sensor merupakan suatu piranti elektronika yang berfungsi untuk mengubah besaran-besaran fisik yang ada di alam menjadi besaran elektrik yang dapat dimengerti oleh rangkaian elektronika. Dalam proyek kita kali ini menggunakan sensor intensitas cahaya yang difungsikan untuk mendeteksi adanya garis putih pada lapangan dengan warna hitam.

Photo Dioda
Photo dioda disini digunakan sebagai komponen pendeteksi ada tidaknya cahaya maupun dapat digunakan untuk membentuk sebuah alat ukur akurat yang dapat mendeteksi intensitas cahaya dibawah 1pW/cm2 sampai intensitas diatas 10mW/cm2.
Photo dioda mempunyai resistansi yang rendah pada kondisi forward bias, kita dapat memanfaatkan photo dioda ini pada kondisi reverse bias dimana resistansi dari photo dioda akan turun seiring dengan intensitas cahaya yang masuk.

Rangkaian sensor garis
Jika photo dioda tidak terkena cahaya, maka tidak ada arus yang mengalir ke rangkaian pembanding, jika photo dioda terkena cahaya maka photo diode akan bersifat sebagai tegangan, sehingga Vcc dan photo dioda tersusun seri, akibatnya terdapat arus yang mengalir ke rangkaian pembanding.






Rangkaian Komparator
Jika rangkaian sensor telah sempurna, maka dilanjutkan dengan rangkaian pembanding, kemudian dengan langkah yang sama dengan diberikan dasar terang dan gelap, kedua perbedaan kondisis yang diberikan akan ditunjukan oleh nyala LED A atau B



Pada rangkaian ini telah ditentukan tegangan referensinya dengan dengan mengatur variable resistor 3k sebagai tegangan pembanding.Jika tidak ada arus yang mengalir ke rangkaian ini dari rangkaian sensor maka tegangan masukan untuk rangkaian ini adalah 0V, akaibatnya pada IC1 tegangan di terminal (+) > (-) maka keluaranya saturasi, maka LED A on, sedangkan pada IC2 sebaliknya maka LED B off.

Jika pada arus yang mengalir ke rangkaian ini dari rangkaian sensor maka tegangan masukan untuk rangkaian ini mendekati Vcc, akibatnya pada IC2 tegangan di terminal (+) > (-) maka keluarannya saturasi, maka LED B on,sedangkan pada IC1 sebaliknya maka LED A off. Maka kondisi antara titik A dan B akan selalu keterbalikan.


Driver Motor
Driver motor berfungsi sebagai piranti yang bertugas untuk menjalankan motor baik mengatur arah putaran motor maupun kecepatan putar motor.
Driver type H digunakan untuk mengontrol putaran motor yang dapat diatur arah putarannya CW (searah jarum jam) maupun CCW (berlawanan jarum jam). Driver ini pada dasarnya menggunakan 4 buah transistor untuk switching (saklar) dari putaran motor dan secara bergantian untuk membalik polaritas dari motor.


(sumber : luxsman.blogspot.com)

LENGAN ROBOT ROB3 SEBAGAI PENJEJAK BENDA

Selasa, Oktober 05, 2010



Setiap link diberi nomor dimulai dari bagian basement yang tidak bergerak. Basement disebut sebagai link 0. Batang robot yang bergerak dan berhubungan dengan basement disebut link 1. Batang bergerak yang berhubungan dengan link 1 disebut link 2 dan seterusnya. Lengan robot ROB3 terbentuk oleh link 0, link 1, link 2, link 3, link 4 dan end efector. Lengan robot ROB3 memliki empat buah joint yang masing-masing memiliki satu derajat kebebasan kecuali joint yang menghubungk an link 3 dengan end efector yang memiliki dua derajat kebebasan. Joint penghubung link 3 dengan end efector dianggap terdiri atas dua buah joint yaitu joint 4 dan joint 5. Disamping itu peletakan joint 1 adalah berhimpitan denga
n peletakan joint 2 dengan tujuan untuk mendapatkan parameter standar yang tepat.
Gambar 3.1 menunjukkan peletakan frame yang digunakan dalam penulisan ini. Frame pertama adalah basemen yang disebut sebagai frame {0}. Frame yang terakhir digunakan untuk menunjukkan posisi end efector saat membentuk gerakan berputar dan disebut frame {5}. Frame {4} dan frame {5} mempunyai pusat yang
sama walaupun arah putarannya berbeda.

Karena pembentukan gerakan robot dipeng

aruhi oleh θ5, maka perubahan θ1 , θ2 dan θ3 dipengaruhi oleh θ5. Dalam perancangan ini gerakan benda yang diikuti robot hanya gerakan ke kiri, ke kanan, ke atas dan ke bawah. Sudut yang berpengaruh untuk pembentukan gerakan ke kiri dan ke kanan adalah θ1. Karena sumbu putar θ1, yaitu Z1, paralel dengan sumbu putar θ5, yaitu Z5, walaupun keduanya berlawanan arah. Sedangkan untuk gerakan ke atas dan ke bawah, pembentukan gerakan dipengaruhi oleh θ2 dan θ3. Karena masing-masing sumbu putar d

ari kedua sudut ini, Z2 dan Z3, saling tegak lurus dengan

sumbu putar θ5, yaitu Z5.

Gerakan vertikal FC


Algoritma ini dimulai dengan pembacaan sudut θ3. Sudut ini tidak boleh melebihi batas maksimum yang diperbolehkan. Jika syarat ini dipenuhi maka proses dapat dilanjutkan dengan pemilihan motor yang akan digunakan untuk menggerakkan link 3, penentuan kecepatan putaran motor, serta penentuan arah putaran motor yang akan menentukan arah putaran link 3. Dilanjutkan dengan pembacaan θ2 setelah itu dilakukan pengecekan. Jika θ2 melebihi batas maksimum yang diperbolehkan bagi θ2, maka pengerjaan sub rutin ini diakhiri dengan pembentukan tabel PWM bagi motor 3 dan pengaktifan motor 3. Namun hal ini tidak berlaku bagi motor 2 yang menggerakkan link 2. Tetapi jika θ2 tidak melebihi batas maksimum bagi θ2, maka setelah persiapan untuk mengaktifkan motor 3 selesai dilakukan, dilanjutkan dengan mempersiapkan pengaktifan motor 2 yang meliputi pemilihan motor yang akan digunakan, penentuan kecepatan motor serta penentuan arah putaran motor. Setelah itu dilanjutkan pembentukan tabel PWM bagi motor 2 dan motor 3. Setelah sinyal PWM siap untuk dibangkitkan, dilanjutkan dengan mengaktifkan enable driver motor 2 dan 3 secara bersamaan.

Jika pada awal sub rutin, saat pengecekan θ3, ternyata didapatkan bahwa θ3 melebihi batas maksimum yang diperbolehkan, maka proses berikutnya yang dikerjakan adalah pemeriksaan θ2. Jika θ2 melebihi batas maksimum yang diperbolehkan maka sub rutin ini berakhir tanpa ada satupun dari motor 2 dan motor 3 yang diaktifkan. Sedangkan jika hasil pemeriksaan θ2 diperoleh hasil bahwa θ2 masih berada dalam rentang yang diperbolehkan maka proses berikutnya yang dikerjakan adalah melakukan persiapan bagi pengaktifan motor 2. Motor yang diaktifkan hanya motor 2 karena hanya θ2 yang tidak melebihi batas maksimum yang diperbolehkan sehingga motor 3 tidak diaktifkan karena θ3 melebihi batas maksimum yang diperbolehkan. Persiapan bagi pengaktifan motor 2 meliputi : pemilihan motor yang dapat digunakan, penentuan kecepatan dan penentuan arah putaran motor. Setelah itu proses diakhiri dengan pembentukan tabel PWM dan pengiriman sinyal PWM ke motor.

Untuk gerakan ke bawah yang membedakannya dengan gerakan ke atas hanya pada batasan yang tidak boleh dilewati oleh θ2 dan θ3. Masing-masing sudut θ2 dan θ3 tidak boleh kurang dari batas minimumnya masing-masing.

Gerakan Mendatar FC

Sub rutin untuk gerakan lengan ke kanan, seperti ditunjukkan gambar 5.1, diawali dengan pembacaan sudut θ1 dengan cara mengakses kanal ADC yang digunakan untuk mengkonversi tegangan keluaran potensiometer pada motor 1. kemudian dilakukan pengecekan pada data hasil pembacaan tersebut. Jika data melampaui batas yang diperbolehkan maka tidak akan dilakukan pengaktifan motor 1 untuk menggerakkan link 1. tetapi jika data hasil pembacaan menunjukkan bahwa posisi sudut θ1 masih berada dalam rentang yang diperbolehkan maka dilanjutkan dengan proses pengaktifan motor 1. Pengaktifan motor 1 didahului dengan pengisian register untuk memilih motor yang diaktifkan. Setelah itu dilakukan pemilihan duty cycle yang diinginkan untuk sinyal PWM yang akan digunakan untuk menggerakkan motor. Berikutnya adalah penentuan arah putaran motor, apakah motor akan bergerak searah atau berlawanan arah jarum jam. Lalu dilakukan pembentukan tabel PWM berdasarkan duty cycle dan arah yang sudah dipilih. Tabel PWM berupa sekumpulan data HIGH dan LOW yang disimpan dalam memori. Data ini akan dikeluarkan pada port 1 sehingga terbentuk sinyal PWM yang dapat menggerakkan motor. Tahap terakhir adalah tahap untuk mengeluarkan sinyal PWM dan memberikan kondisi HIGH pada kaki enable driver motor sehingga motor dapat bekerja. Setelah sub rutin ini selesai dikerjakan maka program kembali melakukan pembacaan sinyal ultrasonik untuk mengambil keputusan jenis gerakan yang akan dilakukan selanjutnya. Jika perubahan kondisi sinyal tidak terlalu besar maka sub rutin ini dikerjakan berulang-ulang. Proses ini terjadi sangat cepat sehingga seolah-olah robot tetap berada pada kondisi yang sama untuk waktu yang lama selama perubahan posisi benda yang dideteksi oleh sensor ultrasonik tidak terlalu besar.

Proses pembentukan gerakan ke kiri secara umum sama dengan proses pembentukan gerakan ke kanan. Yang membedakan adalah batasan θ1 yang diperbolehkan. Untuk putaran link 1 ke kanan θ1 tidak boleh melebihi batas maksimum θ1 sedangkan untuk putaran link 1 ke kiri, θ1 tidak boleh kurang dari batas minimumθ1 yang diperbolehkan. Selain itu pemilihan arah putaran link 1 pada putaran ke kiri berbeda dengan arah putaran link 1 untuk arah putaran ke kanan. Jika pada putaran ke kanan dipilih arah searah jarum jam, maka pada putaran ke kiri dipilih arah sebaliknya yaitu berlawanan arah jarum jam.

Robot dapat bergerak mengikuti benda dengan baik untuk arah gerakan benda mendatar. Sedangkan untuk arah gerakan vertikal, robot masih belum dapat bergerak mengikuti gerakan benda dengan baik.

Robot dapat mengikuti benda jika jarak benda kurang dari ±10 cm dari pasangan pengirim-penerima gelombang ultra sonik. Jarak benda terhadap pasangan pengirim-penerima gelombang ultra sonik berpengaruh pada besar kecilnya intensitas gelombang yang ditangkap penerima gelombang ultra sonik. Semakin dekat jarak benda, semakin besar intensitas gelombang ultra sonik yang diterima oleh sensor ultra sonik.


sumber :

Parida Yuanita Widayanti , Bambang Sutopo (UGM)



Animasi LED mikrokontroler ATMega32 dengan Assembly dan C

Sabtu, Mei 22, 2010

Artikel ini sengaja saya tulis sebagai awal pembelajaran bagaimana membuat sebuah program aplikasi mikrokontroler AVR (khususnya ATMega32 dengan frekuensi kristal 7,3728MHz) untuk membuat animasi LED berjalan dari pin 0 hingga 7.

Rangkaian yang digunakan ditunjukkan pada Gambar 1, sengaja LED disusun secara CA atau common Anoda, sehingga untuk menyalakan LED harus dikirimkan logika ‘0′.

Untuk kompilasi digunakan AVR Studio versi 4.0 (silahkan unduh GRATIS dari http://www.atmel.com). Program kita awali dengan beberapa macam deklarasi, keterangan sengaja saya masukkan dalam listing program untuk memudahkan pembelajaran langsung dari listingnya, perhatikan instruksi yang diawali dengan ‘.’ merupakan directive dari AVR Studio, bukan instruksi assembly mikrokontroler AVR:

;------------------------------------------

;animasi LED berjalan dalam bahasa Assembly
;untuk mikrokontroler Atmel AVR ATMega32
;frekuensi kristal 7.3728MHz
;------------------------------------------
.nolist ;bagian ini
.include "m32def.inc" ;tidak perlu ditampilkan dalam
.list ;berkas list

Ingat berkas “m32def.inc” kita sertakan (directive .include) karena akan digunakan pustaka ATMega32 dalam program kita, tetapi tidak perlu disertakan dalam hasil berkas LIST-nya (hasil kompilasi program) menggunakan directive .nolist dan .list.

Selanjutnya dilakukan inisialisasi awal:

;----------inisialisasi konstanta dan register

.equ led=0b01111111 ;portb-7 ON
.def temp=r16 ;temp sebagai alias untuk R16
;====== program utama ====================
.cseg
.org 0000 ;awal kode program pada alamat 0x0000

Variabel LED digunakan untuk menyimpan data yang akan dikeluarkan melalui PORTA, awalnya diisi 0b01111111, artinya LED-0 akan dinyalakan terlebih dahulu. Variabel TEMP digunakan variabel alias untuk R16 (register-16), Anda boleh menggunakan nama alias apa saja, misalnya, tahu, brokoli, wortel dan lain sebagainya (emang buat sayur yach? he he he)…

Program diawali dengan mendeklarasikan segmen kode (.cseg) dan dimulai alamat 0×0000 (.org) - ini paling logis kita siapkan di alamat tersebut, silahkan saja kalo mo diganti dengan alamat lain asalkan tidak konflik dengan kepentingan lainnya dalam program. Ragu-ragu? Ya sudah ikuti saja pake alamat 0×0000, aman dech…!

Selanjutnya kita lakukan INISIALISASI STACK:

;menyiapkan alamat SP - Stack Pointer

;harus dituliskan sebagai inisialisasi SP pada RCALL
;jika tidak dilakukan program akan macet!
ldi temp,low(ramend)
out spl,temp
ldi temp,high(ramend)
out sph,temp

Jika Anda lupa atau tidak melakukan inisialisasi stack, ada kemungkinan besar akan terjadi kemacetan pada program, artinya program seakan-akan stuck. Jika Anda menggunakan simulator semacam Proteus (yang pernah saya coba menggunakan Proteus 7.6 SP4), program akan berjalan tanpa kesalahan, namun ketika dicobakan ke rangkaian sesungguhnya program akan berhenti (stuck). Saran saya, ada baiknya tidak terlalu mengandalkan simulator mikrokontroler semacam Proteus, usahakan untuk mencoba di dunia nyata, di rangkaian sesungguhnya. Berikut cuplikan program untuk menginisialisasi stack di akhir ruang RAM (RAMEND).

Karena STACK pada ATMega32 ukuran 16bit atau 2byte, maka pengisian SP dilakukan dua kali untuk SP Low atau SPL dan SP High atau SPH. Fungsi Low() dan High() masing-masing digunakan untuk mendapatka bagian LOW atau HIGH dari variabel RAMEND yang suda tersimpan dalam “m32def.inc”. Pengisian register pada AVR tidak bisa dilakukan langsung, dalam hal ini melalui variabel TEMP baru kemudian dipindahkan ke SPL dan SPH. Hal ini berlaku juga untuk penjelasan terkait berikut ini…

Berikutnya, karena kita menggunakan mikrokontroler AVR, sudah wajib kita menentukan sebuah PORT sebagai masukan atau luaran, jika masing-masing bit pada register DDRx diberi nilai ‘1′ artinya sebagai luaran (jika ‘0′ sebagai masukan). Karena digunakan PORTA maka digunakan register DDRA (penulisan ke DDRA (out ddra,temp) tidak bisa langsung, sehingga digunakan variabel TEMP (ldi temp,0b01111111)):

;----------- inisialisasi port---------------------

ldi temp,0b11111111 ;set semua bit register temp
out ddra,temp ;tuliskan ke register DDRA

Selanjutnya program utama dituliskan:

;--------portb telah di seting menjadi luaran ------

ldi temp,led ;isi register temp dengan led7
sec ;set carry flag (agar carry=1, LED mati)
putar:
out porta,temp ;kirim data ke porta (LED)
rcall tunda ;tunda sesaat 0.25 detik
ror temp ;putar satu bit ke kanan melalui carry
rjmp putar ;lompat ke label putar

Data disimpan terlebih dahulu di variabel TEMP (ldi temp,led), kemudian baru dikeluarkan ke PORTA (out porta,temp), tidak bisa langsung dikirim ke PORTA. Untuk menggeser dan memutar bit pada variabel TEMP digunakan instruksi ROR (Rotate Right Using Carry), karena melewati Carry sedangkan Carry biasanya isinya ‘0′, maka harus diberi ‘1′ dulu dengan instruksi SEC. Pengulangan dilakukan dengan melompat kembali ke label ‘putar’ menggunakan rjmp putar.

Bagian akhir dari program adalah subrutin penundaan sekitar 0.25detik (lihat pada listing program lengkap). Kok bisa ya? Ya pake saja program AVR Delay Loop Generator, sebagaimana screen shoot-nya ditunjukkan pada Gambar 2, silahkan unduh gratis di-sini.

Memang menggunakan pengulangan register, penundaan 0.25 detik tidak akan akurat, tetapi lumayan buat melakukan penundaan sesaat. Jika Anda ingin akurat, gunakan fasilitas Timer/Counter pada mikrokontroler AVR yang bersangkutan.

Program selengkapnya sebagai berikut (ingat akhiri program dengan .exit)…

;------------------------------------------

;animasi LED berjalan dalam bahasa Assembly
;untuk mikrokontroler Atmel AVR ATMega32
;frekuensi kristal 7.3728MHz
;http://agfi.staff.ugm.ac.id
;------------------------------------------
.nolist ;bagian ini
.include "m32def.inc" ;tidak perlu ditampilkan dalam
.list ;berkas list

;----------inisialisasi konstanta dan register
.equ led=0b01111111 ;portb-7 on
.def temp=r16 ;temp sebagai alias untuk R16

;====== program utama ====================
.cseg
.org 0000 ;awal kode program pada alamat 0x0000

;menyiapkan alamat SP - Stack Pointer
;harus dituliskan sebagai inisialisasi SP pada RCALL
;jika tidak dilakukan program akan macet!
ldi temp,low(ramend)
out spl,temp
ldi temp,high(ramend)
out sph,temp

;----------- inisialisasi port---------------------
ldi temp,0b11111111 ;set semua bit register temp
out ddra,temp ;tuliskan ke register DDRA

;--------portb telah di seting menjadi luara ------
ldi temp,led ;isi register temp dengan led7
sec ;set carry flag (agar carry=1, LED mati)
putar:
out porta,temp ;kirim data ke porta (LED)
rcall tunda ;tunda sesaat 0.25 detik
ror temp ;putar satu bit ke kanan melalui carry
rjmp putar ;lompat ke label putar

; =============================
; delay loop generator
; 1843200 cycles:
; untuk frek 7.3728MHz
; penundaan 0.25 detik
; -----------------------------
; delaying 1843182 cycles:
tunda:
ldi R17, $12
WGLOOP0: ldi R18, $A1
WGLOOP1: ldi R19, $D3
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; -----------------------------
; delaying 18 cycles:
ldi R17, $06
WGLOOP3: dec R17
brne WGLOOP3
; =============================
ret
; =============================
.exit ;akhir program

Sedangkan dalam Bahasa C Native (menggunakan AVR Studio 4 dan GCC) ditunjukkan lengkap sebagai berikut:

//========================================

// animasi LED di PORTA
//=========================================
#include
#include //pustaka DELAY untuk frek 1MHz
#define PORTLED PORTB //penentuan alias untuk PORTB
#define DDRLED DDRB //penentuan alias untuk DDRB

int main (void)
{
unsigned char temp=0x80; // data untuk LED
DDRLED=0xFF; // PORT sebagai luaran
while(1){
PORTLED=temp; //tulis ke port
_delay_ms(250); //lakukan penundaan sesaat
temp=(temp<<7)|(temp>>1);} //ROR dalam bahasa C
return(0);
}

Silahkan Anda cermati perbedaan penulisan menggunakan Assembly dan Native C (gcc), untuk urusan penundaah digunakan fungsi _delay_ms() yang sudah didefinisikan di berkas “delay.h” dan berlaku untuk frekuensi operasional 1MHz. Sedangkan inisialisasi PORT sama seperti pada Assembly. Yang mungkin Anda pertanyakan adalah pengganti perintah ROR yaitu menggunakan instruksi “temp=(temp<<7)|(temp>>1);“, untuk ROL tinggal Anda ganti dengan “temp=(temp<<1)|(temp>>7);” dan “unsigned char temp=0×80;” menjadi “unsigned char temp=0×01;“.

Demikian penjelasan singkat saya tentang aplikasi animasi LED berjalan menggunakan bahasa assembly dan C untuk mikrokontroler AVR ATMega32. Semoga bermanfaat dan sukses selalu untuk Anda! Ingin private dengan saya untuk Belajar Mikrokontroler AVR ATMega32 menggunakan bahasa BASIC? Silahkan cermati informasinya disini.



Sumber : http://agfi.staff.ugm.ac.id

Flowcode AVR 3.0: Aplikasi dengan LCD 2×16

belajar pemrograman aplikasi mikrokontroler AVR menggunakan Flowcode 3 for AVR sebagaimana sudah saya tulis artikel-nya sejak awal. Kali ini dicoba membuat aplikasi dengan tampilan LCD 2×16, hanya sekedar menampilkan dua kalimat, masing-masing di baris-1 dan baris-2, diagram atau flow-nya ditunjukkan pada Gambar 1 (termasuk hasil simulasinya).

Gambar 1

Hasil kompilasi kedalam Bahasa C saya tunjukkan satu persatu. Pada bagian pertama, sebagaimana ditunjukkan pada Gambar 2, merupakan deklarasi fungsi-fungsi makro untuk menangani LCD (baris 66 - 74). Terdapat 9 macam fungsi makro LCD dan hanya 3 yang akan digunakan dalam program, yaitu:

  • FCD_LCDDisplay0_Start(), digunakan untuk inisialisasi LCD;
  • FCD_LCDDisplay0_PrintString(char* String, char MSZ_String), digunakan untuk menuliskan string, dan
  • FCD_LCDDisplay0_Cursor(char x, char y), digunakan untuk menempatkan kursor dengan posisi kolom,baris).

Gambar 2

Untuk fungsi FCD_LCDDisplay0_Start() listing programnya ditunjukkan pada Gambar 3. Apa yang dilakukan oleh fungsi ini adalah melakukan inisialisasi tampilan LCD dengan antarmuka 4 bit data (Flowcode 3 AVR hanya menyediakan antarmuka 4-bit data LCD walaupun bisa juga digunakan rangkaian antarmuka 8-bit data LCD). Rangkaian yang digunakan menggunakan pemetaan PORT dan pin LCD sebagai berikut:

#define LCD_2360334_BIT0    2
#define LCD_2360334_BIT1 3
#define LCD_2360334_BIT2 4
#define LCD_2360334_BIT3 5
#define LCD_2360334_RS 0
#define LCD_2360334_E 1

Gambar 3

Untuk fungsi FCD_LCDDisplay0_PrintString() listingnya ditunjukkan pada Gambar 4. Fungsi ini digunakan untuk menampilkan string ke LCD pada posisi kursor saat itu. Fungsi ini membutuhkan dua parameter, string yang akan ditampilkan dan jumlah karakter pada string tersebut.

Gambar 4

Untuk fungsi FCD_LCDDisplay0_Cursor(char x, char y) listingnya ditunjukkan pada Gambar 5. Fungsi ini membutuhkan dua parameter yaitu x (untuk posisi kolom) dan y (untuk posisi baris), jika dituliskan FCD_LCDDisplay0_Cursor(0,1) artinya menempatkan kursor pada kolom pertama baris kedua, demikian seterusnya…

Gambar 5

Nah program utama ditunjukkan pada Gambar 6. Diawali dengan inisialisasi register MCUCSR dan WDTCR pada baris 373 dan 374 (baca artikel saya sebelumnya). Kemudian dilanjutkan dengan melakukan inisialisasi LCD (baris 381) menggunakan fungsi FCD_LCDDisplay0_Start(). Diikuti dengan menampilkan string “Halo Flowcode3″ (baris 386, angka 14 merupakan jumlah karakter pada string yang bersangkutan), menempatkan kursor pada baris kedua kolom pertama (baris 391), menampilkan string “by ATMega32″ (baris 396) dan diakhiri dengan infinite-loop atau kalang-takhingga (baris 399).

Gambar 6

Jika Anda perhatikan baik-baik pada ketiga fungsi tersebut, maka bisa Anda temukan pemanggilan fungsi lain yaitu LCD_2360334_RawSend(char nIn, char nMask), yang digunakan untuk mengirimkan satu karakter. Pendefinisian fungsi ini ada di dalam fungsi FCD_LCDDisplay0_GetDefines().

Program selengkapnya bisa diunduh disini.

Semoga bermanfaat.

Flowcode AVR 3.0: Aplikasi Masukan/Luaran (I/O) Sederhana

Kali ini Flowcode AVR kita gunakan untuk mencoba membuat sebuah aplikasi sederhana yang melakukan pembacaan masukan di PORT A kemudian menampilkan hasil pembacaan tersebut, yang sebelumnya melalui suatu variabel DATANYA, ke PORT B. Rancangan Flowcode AVR-nya ditunjukkan pada Gambar 1.

Gambar 1

Kemudian kita kompail dan disimulasikan hasilnya (juga) bisa dilihat pada Gambar 1 tersebut. Perhatikan bahwa tidak semua masukan PORT A kita buat berlogika 1, hanya A7, A5, A3 dan A1. Hasilnya juga tidak semua LED pada PORT B menyala, hanya sesuai dengan PORT A saja, yaitu B7, B5, B3 dan B1. Nah sekarang pertanyaannya:

Bagaimana dengan hasil kompilasi dalam bahasa C-nya (juga dalam bahasa ASM-nya)?

Berikut saya cuplik sebagian hasil kompilasi dalam bahasa C (baris 59-96), cukup yang utama dulu, selebihnya Anda bisa mencermati bahwa di awal program C-nya merupakan inisialisasi variabel, pemetaan mikrokontroler dan lain-lain. Perhatikan Gambar 2.

Gambar 2

Pada cuplikan listing tersebut saya sudah memberikan catatan. Bagaimana dengan Anda? Apa yang dilakukan pada bagian inisialisasi, baris 76 dan 77? Instruksi MCUCSR = 0×00; digunakan untuk mereset (memberikan logika 0) pada semua bit di register MCU Control and Register, perhatikan penjelasan pada gambar MCUCSR. Sedangkan WDTCR = 0×10; digunakan untuk mematikan watchdog, perhatikan penjelasan register WDTCR (Watchdog Control Register). Langkah ini dilakukan oleh Flowcode, menurut saya, untuk keamanan atau play safe saja. Karena kemungkinan kompailer C yang digunakan tidak mematikan watchdog secara otomatis (ada beberapa kompailer yang bisa melakukan-nya secara otomatis selama tidak secara eksplisit dinyatakan penggunaan watchdog).

MCUCSR

WDTCR

Listing program selebihnya adalah sesuai dengan yang diharapkan, baca masukan seperti pada baris 85, namun sebelumnya ada inisialisasi PORT A sebagai masukan, mengapa tidak langsung aja DDRA = 0×00? Kok harus di-AND-kan segala dengan 0, khan hasilnya sama saja logika-0 khan? Aneh? Kemudian dilanjutkan dengan mengirimkan isi variabel dari pembacaan PORT A ke PORTB, lihat baris 91, yang sebelumnya (juga) diawali dengan inisialisasi PORT B sebagai luaran (nah kalo ini caranya langsung).

Jika Anda berikan loop pada program, seperti pada Gambar 3, hasilnya juga sama saja, keunikan juga terjadi lagi seperti saya jelaskan pada artikel sebelumnya.

Gambar 3

Semoga bermanfaat, amin!

Flowcode AVR 3.0: Aplikasi Masukan/Luaran (I/O) Sederhana

Kali ini Flowcode AVR kita gunakan untuk mencoba membuat sebuah aplikasi sederhana yang melakukan pembacaan masukan di PORT A kemudian menampilkan hasil pembacaan tersebut, yang sebelumnya melalui suatu variabel DATANYA, ke PORT B. Rancangan Flowcode AVR-nya ditunjukkan pada Gambar 1.

Gambar 1

Kemudian kita kompail dan disimulasikan hasilnya (juga) bisa dilihat pada Gambar 1 tersebut. Perhatikan bahwa tidak semua masukan PORT A kita buat berlogika 1, hanya A7, A5, A3 dan A1. Hasilnya juga tidak semua LED pada PORT B menyala, hanya sesuai dengan PORT A saja, yaitu B7, B5, B3 dan B1. Nah sekarang pertanyaannya:

Bagaimana dengan hasil kompilasi dalam bahasa C-nya (juga dalam bahasa ASM-nya)?

Berikut saya cuplik sebagian hasil kompilasi dalam bahasa C (baris 59-96), cukup yang utama dulu, selebihnya Anda bisa mencermati bahwa di awal program C-nya merupakan inisialisasi variabel, pemetaan mikrokontroler dan lain-lain. Perhatikan Gambar 2.

Gambar 2

Pada cuplikan listing tersebut saya sudah memberikan catatan. Bagaimana dengan Anda? Apa yang dilakukan pada bagian inisialisasi, baris 76 dan 77? Instruksi MCUCSR = 0×00; digunakan untuk mereset (memberikan logika 0) pada semua bit di register MCU Control and Register, perhatikan penjelasan pada gambar MCUCSR. Sedangkan WDTCR = 0×10; digunakan untuk mematikan watchdog, perhatikan penjelasan register WDTCR (Watchdog Control Register). Langkah ini dilakukan oleh Flowcode, menurut saya, untuk keamanan atau play safe saja. Karena kemungkinan kompailer C yang digunakan tidak mematikan watchdog secara otomatis (ada beberapa kompailer yang bisa melakukan-nya secara otomatis selama tidak secara eksplisit dinyatakan penggunaan watchdog).

MCUCSR

WDTCR

Listing program selebihnya adalah sesuai dengan yang diharapkan, baca masukan seperti pada baris 85, namun sebelumnya ada inisialisasi PORT A sebagai masukan, mengapa tidak langsung aja DDRA = 0×00? Kok harus di-AND-kan segala dengan 0, khan hasilnya sama saja logika-0 khan? Aneh? Kemudian dilanjutkan dengan mengirimkan isi variabel dari pembacaan PORT A ke PORTB, lihat baris 91, yang sebelumnya (juga) diawali dengan inisialisasi PORT B sebagai luaran (nah kalo ini caranya langsung).

Jika Anda berikan loop pada program, seperti pada Gambar 3, hasilnya juga sama saja, keunikan juga terjadi lagi seperti saya jelaskan pada artikel sebelumnya.

Gambar 3

Semoga bermanfaat, amin!

H-Bridge Motor Driver

Jumat, April 23, 2010

Driver motor yang kita bangun menggunakan konfigurasi jembatan H (H-Bridge),yang akan mengendalikan motor ke dua arah, searah jarumjam dan berlawanan arah jarumjam. Secara konsep rangkaian ini terdiri dari 4 saklar yang tersusun sedemikian rupa sehingga memungkinkan motor dapat teraliri arus dengan arah yang berkebalikan. Seperti yang dijelaskan pada bab sebelumnya, pemberian polaritas tegangan pada terminal motor akan mempengaruhi arah arus yang melewati motor,dengan demikian motor akan berputar sesuai dengan arah arusnya. Pada rangkaian driver motor ini, saklar-saklar tersebut digantikan oleh transistor yang dikerjakan pada daerah saturasi dan cut-off (Switch).

Motor DC

Motor merupakan komponen yang mengubah energi listrik menjadi energi mekanik, dalam kasus perancangan robot,umumnya digunakan motorDC,karena jenis motor ini lebih mudah untuk dikendalikan. Kecepatan yang dihasilkan oleh motor DC berbanding lurus dengan potensial yang diberikan.

Bagaimana cara mengatur arah putar motor DC?

Untuk mengatur arah putar motor DC cara yang paling mudah adalah membalik polaritas tegangan yang kita berikan pada terminal motor tersebut.

Bagaimana H-Bridge bekerja?

  1. Ketika S1 dan S4 tertutup (diagonal) dan lainnya terbuka maka arus akan mengalur dari batery ke kutub positif motor kemudian keluar ke kutub negatif motor,makamotor akan berputar kearah kanan.
  2. Ketika S2 dan S3 tertutup (diagonal) dan lainnya terbuka,maka arus akan mengalir sebaliknya,motor juga akan berputar kearah sebaliknya.
  3. Jika semua saklar tertutup, maka motor akan berhenti, dan jika ini diteruskan maka akan menyebabkan rangkaian menjadi”short circuit“.

090209_0931_HBridgeMoto5.png

Rangkaian H-Bridge Dengan pengatur kecepatan menggunakan PWM.

090209_0931_HBridgeMoto6.png

Roda gigi (Gear)

Struktur robot hampir tidak pernah terlepas dari konstruksi mekanik, dan tentu saja motor menjadi penggerak utamanya. Robot manipulator dan navigator biasanya memiliki konstruksi yang lebih rumit dibandingkan dengan robot yang bertugas sebagai navigator saja. Contohnya robot mobile yang dilengkapi dengan lengan tangan dan gripper untuk memindahkan barang, konstruksinya akan menjadi lebih rumit dibandingkan dengan robot mobile yang hanya yang mengikuti garis.

Jika kita mendesain mekanik robot hal penting yang tidak bisa kita tinggalkan adalah perhitungan torsi untuk menggerakkan roda ataupun sendi. Roda gigi, atau lebih familiar dengan sebutan gir (bahasa inggris: Gear) memungkinkan kita untuk merubah kecepatan putaran dan torsi untuk menyesuaikan motor dengan kondisi bebannya. Gir juga memungkinkan kita untuk mentransmisikan daya motor dari tangkai (shaft) satu ke yang lain. Konsepnya sebenarnya bukan hal yang baru. Orang bangsa Yunani kuno sudah menggunakan gir terbuat dari kayu untuk mentransmisikan daya dari kincir air ke mesin penggiling. Jaman sekarang gir terbuat dari potongan metal atau plastik yang presisi sehingga transmisi daya lebih efisien, halus dan awet.

Spur Gear

Gambar 1 berikut menunjukkan dua spur gear yang saling bertautan. Daya ditransmisikan oleh gigi gir satu ke gigi gir yang lain. Jika gigi pada gir mempunyai bentuk yang sesuai, sebenarnya gigi-gigi tersebut seolah menggelinding mendorong satu sama lain, jadi bukan menggesek, sehingga gesekannya sangat kecil. Perhatikan bagaimana gigi-gigi gir saling mendorong dan akhirnya memutar gir, keajidan in berulang untuk gigi gir selanjutnya. Kekurangan gir ini adalah jeda gerakan ketika gir dikemudikan pada arah yang berlawanan (backlash).

Gambar 1. Urutan perubahan posisi akibat gigi gir yang menggelinding satu sama lain

Gambar 2. Spur Gear

Jika dua gir dengan diameter berbeda ditautkan, mereka akan berputar dengan kecepatan yang berbeda pula. Arah putarnya menjadi berlawanan antara satu gir dengan gir lainnya, untuk mendapatkan arah putaran yang sama seperti pada poros utama (biasanya yang terdapat pada motor), maka gir harus disusun dengan jumlah ganjil. Secara teori ukuran roda gir digambarkan dengan lingkaran (pitch circle) memiliki diameter (pitch diameter) yang lebih kecil dari diameter keseluruhan gir karena gigi gir saling berpotongan (overlap). Jarak antara gigi satu dan yang lain dalam satu gir disebut dengan circular pitch. Jumlah gigi pada suatu gir dapat ditentukan dengan rumus:

Ingat bahwa jumlah gigi pada gir adalah suatu bilangan bulat, kita tidak bisa membuat gigi gir sebanyak 4.5 buah !

Mengubah kecepatan menggunakan gir

Rasio gir adalah rasio jumlah gigi pada dua gir. Dua gir pada gambar memiliki 40 dan 20 gigi, maka rasio gir tersebut adalah 40/20 = 2. Tapi tidak sampai disini, untuk mentautkan dua gir yang perlu kita perhatikan adalah ukuran gigi gir haruslah sama, dengan kata lain keduanya harus memiliki jumlah gigi yang sama tiap inci keliling gir. Jadi rasio gir adalah juga rasio keliling gir, dan tentu saja persamaannya akan seperti ini

Untuk persamaan diatas asumsikan bahwa gir 1 adalah gir yang “menggerakkan” (penggerak) atau memberikan daya, sedangkan gir 2 adalah gir yang menerima daya (yang “digerakkan”)

Jika terdapat rasio gir A dan gir B sebesar 3 : 1, ini artinya bahwa gir B akan berputar satu kali penuh jika gir A berputar sebanyak 3 kali, ini berarti juga bahwa gir A berputar lebih cepat 3 kali dibandingkan dengan gir B. Persamaan berikutnya membandingkan antara rasio gir dengan kecepatan gir berputar.

Contoh 1 :

Sebuah motor dan roda dihubungkan dengan gir dengan rasio 1 : 3 (lihat gambar untuk detailnya) , jika motor berputar 60o berapa derajatkah roda akan berputar?

Gambar 3. Hubungan gir 1:3 pada motor dan roda

Penyelesaian:

Gir yang terpasang pada roda lebih besar daripada yang terpasang di motor, dan pastinya akan berputar kurang dari 60o. Dengan menggunakan persamaan ketiga, sudut yang ditempuh roda adalah:

Jadi roda akan berputar 20o ketika motor berputar sejauh 60o.

Contoh 2:

Sebuah motor berputar pada kecepatan 200 rpm mengendalikan roler kertas mesin printer. Gir pada motor mempunyai 20 gigi, dan gir pada roler mempunyai 50 gigi. Berapa kecepatan roler?

Penyelesaian:

Perlu diketahui bahwa gir roler lebih besar daripada gir yang terdapat pada motor, jadi gir roler akan berputar lebih lambat daripada gir di motor. Kecepatan roler dihitung sebagai berikut:

Contoh 3:

Berapa rasio gir pada kombinasi seperti gambar berikut?

Penyelesaian:

Gir penggerak mempunyai diameter 2 cm, sedangkan gir yang digerakkan berdiameter 4 cm, maka rasio gir dapat dicari dengan membagikan diameter masing-masing gir.

Jadi persamaan gir tersebut adalah 2:1 .


 
Robotron-UNM © 2016 | Editor by Asis Robotron | Blogger Template by Blog Zone