Peripheral peripheral jaringan pada komputer terapan
Mouse Optik Deteksi
1. BAB I
PENDAHULUAN
1.1 Latar Belakang
Dewasa ini semakin banyak jenis mouse yang dijual dipasaran, mulai dari
mouse yang digunakan untuk keperluan pengoperasian komputer biasa sampai
mouse yang khusus diciptakan untuk keperluan bermain game. Rata rata mouse
yang digunakan adalah mouse yang menggunakan sensor optik sebagai pendeteksi
gerakan dari mouse.
Alasan kami mengambil optical mouse sebagai proyek di laboratorium
mikrokontroler adalah karena merasa bahwa optical mouse sangat menarik untuk
dipelajari dan diteliti, serta merupakan pengembangan dari mouse konvensional
yang sudah ada sebelumnya.
Disini kami akan mencoba untuk meneliti data yang dikirimkan optical
mouse menggunakan rangkaian mikrokontroler berbasis ATmega 8535. Data data
yang terkirim oleh optical mouse akan kami tampilkan pada lcd.
1.2 Tujuan
Pengerjaan proyek mikrokontroler dan penyusunan laporan ini bertujuan
untuk:
Membuat suatu modul pembelajaran mengenai sensor CMOS pada mouse
optik, sehingga pembaca dapat memperoleh informasi mengenai
karakteristuk, fungsi, prinsip kerja dan cara pengoprasian mouse optik
dengan mikrokontroler.
Mengembangkan
kreatifitas
mahasiswa
dalam
menganalisa
dan
menerapkan hasil penelitian pada suatu apilkasi dasar, guna pembuktian
hasil pnelitian.
Memenuhi tugas praktek di Section Microcontroler tingkat 3.
1
2. 1.3 Manfaat
Manfaat yang didapat adalah lebih memahami pengoprasian dan cara kerja
mouse optik sehingga kami dapat mengaplikasikannya dalam aplikasi
sederhana.
1.4 Batasan Masalah
Interface dengan mouse hanya bisa menggunakan PS/2. Apabila
menggunakan converter USB to PS/2, gerakan tidak terdeteksi.
Jenis mouse yang digunakan adalah optical mouse.
2
3. BAB II
LANDASAN TEORI
Dalam proyek ini kami menggunakan beberapa komponen pendukung supaya
perangkat yang kami rancang dapat beroprasi dengan baik sesuai dengan yang
kami harapkan. Komponen tersebut semua telah terbagi menurut fungsinya
masing-masing.
2.1 Atmega 8535
ATMEGA 8535 menggunakan teknologi RISC (Reduce Instruction
Set Computing) dimana program berjalan lebih cepat karena hanya
membutuhkan satu siklus clock untuk mengeksekusi satu instruksi
program.
Fitur-fitur yang dimiliki oleh mikrokontroler Atmega 8535 adalah
sebagai berikut :
1. Saluran I/O sebanyak 32 buah, yaitu PORT A, PORT B, PORT C,
dan PORT D.
2. ADC internal sebanyak 8 saluran.
3. 3 buah Timer/Counter dengan kemampuan pembandingan.
4. CPU yang terdiri dari 32 buah register.
3
4. 5. SRAM sebesar 512 byte.
6. Memori Flash sebesar 8 kb dengan kemampuan Read While Write.
7. PORT anantarmuka SPI.
8. EEPROM sebesar 512 byte yang dapat diprogram saat operasi.
9. Antarmuka komparator analog.
10. PORT USART untuk komunikasi serial.
11. Sistem mikroprosesor 8 bit berbasis RISC dengan kecepatan
maksimal 16 MHz.
12. Dll
Pemrograman mikrokontroler Atmega 8535 dapat menggunakan low
level language (assembly) dan high level language (C, Basic, Pascal,
JAVA, dll) tergantung compiler yang digunakan (Widodo Budiharto,
2006). Pada pembuatan proyek ini, kami menggunakan CVAVR sebagai
software dalam memberikan input instruksi ke mikrokontroler Atmega
8535.
2.2 PS/2 Mouse Optic
Mouse Optik menggunakan Light-Emitting Diode (LED) dan
Photodiode untuk mendeteksi pergerakan relatif dengan sebuah
permukaan, tidak seperti mouse mekanik yang menggunakan bola untuk
memutar shaft yang terhubung dengan encoder untuk mengukur
perpindahan.
Mouse Optik paling awal hanya dapat digunakan pada permukaan
yang telah diberi pola tertentu, namun kini mouse optik telah dapat bekerja
pada hampir semua permukaan datar. Biasanya mouse optik tidak dapat
mendeteksi pergerakan pada permukaan mengkilat seperti cermin,
4
5. walaupun beberapa model lebih lanjut dapat berfungsi bahkan pada kaca
yang bening.
PS/2 mouse interface menggunakan protocol serial bidirectional
(dua arah) untuk mengirimkan pergerakan dan kondisi tombol kepada
komputer/kontroler.
Ada kalanya juga, kontroler, mungkin mengirimkan perintah
kepada mouse untuk mengatur report rate, resolusi, mereset mouse,
menonaktifkan mouse, dsb.
Tegangan yang digunakan untuk mouse optik ini berkisar antara
5V ~ 100 mA.
2.3 LCD 2X16
LCD (Liquid Crystal Display) adalah modul penampil yang banyak
digunakan karena tampilannya menarik. LCD merupakan salah satu jenis display
elektronik yang dibuat dengan teknologi CMOS logic, yang bekerja dengan tidak
menghasilkan cahaya tetapi dengan cara memantulkan cahaya yang berada di
sekelilingnya. LCD jenis ini dapat menampilkan data berupa angka, huruf,
maupun karakter dalam dua baris dan enambelas kolom.
Proyek ini menggunakan LCD sebagai interfacenya, sehingga pengguna
bisa mengetahui berapa nilai jarak X dan Y yang terbaca oleh sensor CMOS.
5
6. BAB III
METODE PENGERJAAN
3.1Cara Kerja
Cara kerja mouse optik pada umumnya sebagai berikut: lampu LED
menembarkan cahayanya pada permukaan lalu, sensor cahaya yang ada pada
bagian bawah mouse akan menangkap pergeseran yang terjadi pada cahaya
tersebut. Atau dapat juga dikatakan sebagai berikut. Bila mouse mekanik
komputer mencatat pergeseran yang dilakukan oleh mouse, sebaliknya dengan
mouse optical, komputer mencatat pergeseran yang terjadi pada landasan mouse.
Sedangkan untuk interface dengan PS/2, hal-hal yang perlu diperhatikan adalah
Konektor PS/2:
Algoritma PS/2:
•
PS/2 port menggunakan clock keluar dan masuk untuk mengirimkan data.
Data dikirim dan diterima dan disinkronkan dengan clock ini. Mouse
mengeluarkan sinyal clock dan Data dibaca pada tepian negatif clock.
•
Susunan data adalah sebagai berikut :
1 start bit, 8 data bit, 1 parity bit, 1 stop bit
6
7. Jenis perintah yang dapat dikirimkan ke mouse:
Pesan yang dikirimkan balik oleh mouse:
7
8. Urutan inisialisasi mouse:
Power-on Reset:
Mouse: AA Self-test passed
Mouse: 00 Mouse ID
Host: FF Reset command
Mouse: FA Acknowledge
Mouse: AA Self-test passed
Mouse: 00 Mouse ID
Host: FF Reset command
Mouse: FA Acknowledge
Mouse: AA Self-test passed
Mouse: 00 Mouse ID
Host: FF Reset command
Mouse: FA Acknowledge
Mouse: AA Self-test passed
Mouse: 00 Mouse ID
Host: F3 Set Sample Rate
Mouse: FA Acknowledge
Host: 0A decimal 10
Mouse: FA Acknowledge
Host: F2 Read Device Type
Mouse: FA Acknowledge
Mouse: 00 Mouse ID
Host: E8 Set resolution
Mouse: FA Acknowledge
Host: 03 8 Counts/mm
8
9. Mouse: FA Acknowledge
Host: E6 Set Scaling 1:1
Mouse: FA Acknowledge
Host: F3 Set Sample Rate
Mouse: FA Acknowledge
Host: 28 decimal 40
Mouse: FA Acknowledge
Host: F4 Enable
Mouse: FA Acknowledge
Initialization complete...
Urutan Transmisi data:
1) Bring the Clock line low for at least 100 microseconds.
2) Bring the Data line low.
3) Release the Clock line.
4) Wait for the device to bring the Clock line low.
5) Set/reset the Data line to send the first data bit
6) Wait for the device to bring Clock high.
7) Wait for the device to bring Clock low.
8) Repeat steps 5-7 for the other seven data bits and the parity bit
9) Release the Data line.
10) Wait for the device to bring Data low.
11) Wait for the device to bring Clock low.
12) Wait for the device to release Data and Clock
Setelah itu, mouse akan mengirimkan 3 byte data yang berisikan data tentang
pergerakan dan kondisi tombol kepada host, dengan format sebagai berikut:
9
12. #include <delay.h>
#include <stdlib.h>
#include <alcd.h>
// Alphanumeric LCD functions
#define x_limit
800
//Set limit X range
#define y_limit
300
//Set limit Y range
#define Clk
#define ClkReg
#define Data
PORTB.0
DDRB.0
PORTB.1
//PORTB.0 = Clock generated from Host
//DDRB.0 = Host Clock Register
//PORTB.1 = Data generated from Host
#define DataReg
DDRB.1
//DDRB.1 = Host Data Register
#define ClkDev
PINB.0
//PINB.0 = Clock from Device
#define DataDev
PINB.1
//PINB.1 = Data from Device
/*********************Byte 1 Configuration**************************
Bit 7
| Bit 0
| Bit 6
| Bit 5
| Bit 4
Y overflow | X overflow | Y sign bit
Btn | Right Btn
| Left Btn
| Bit 3
| Bit 2
| X sign bit
| Always 1
| Bit 1
| Middle
Details:
Bit 0 - Bit 2 represents the status of mouse buttons, 1 for pressed and 0 for not
pressed.
Bit 4 & Bit 5 represents the movement direction of mouse.
12
13. Bit 6 & Bit 7 set if the counters go past 255.
******************************************************************
**********************************************************/
char i=0;
char mask[] =
//used for comparing the byte with the odd parity
{
0x01,
0x02,
0x04,
0x08,
0x10,
0x20,
0x40,
0x80
};
char oddParity(char byte)
//used for error detection
{
char i, count = 0;
nilai 1 pada Data adalah genap
//Bit paritas akan di set menjadi bernilai 1 bila
for(i=0;i<8;i++)
nilai 1 pada Data adalah ganjil
//Bit paritas akan di set menjadi bernilai 0 bila
{
paritas ganjil
//Jumlah 1 pada Data + bit paritas pasti = ganjil ->
if(mask[i] & byte)
13
14. count++;
}
return ((count+1)%2);
}
char mouseStatus = 0;
//mouse status = 0 : no activity
//mouse status = 1 : falling edge handled
//mouse status = 2 : rising edge handled
//Introduces delay in case of parity error
char mouseData = 0;
//received data will be stored here temp
char mouseIndex = 0;
//progress
char mouseFlag = 0;
= 2: Parity not matched
//mouseFlag = 1: data is received, mouseFlag
int mouseX = 0;
//Set default X coordinate
int mouseY = 0;
//Set default Y coordinate
char klikKiri = 0;
char klikKanan = 0;
char klikTengah = 0;
void readMouse()
{
if(mouseStatus==0 && ClkReg==0 && ClkDev==0 && DataReg==0 &&
DataDev==0) //if inactive and start bit is there
{
14
15. mouseStatus = 1;
//start bit received
mouseIndex = 0;
//initialise
mouseData = 0;
//initialise
mouseFlag = 0;
//initialise
}
//if falling edge handled
//look for rising edge and handle it
else if(mouseStatus==1 && ClkReg==0 && ClkDev==1)
mouseStatus = 2;
//if rising edge handled
//look for falling edge and handle it
//data is scanned at falling edge
else if(mouseStatus==2 && ClkReg==0 && ClkDev==0)
{
if(mouseIndex<8 && DataDev==1)
mouseData += (mask[mouseIndex]);
mouseIndex++;
mouseStatus = 1;
}
// stop bit
if(mouseIndex>9) //all eight bytes have been received AND stop bit gone
{
mouseStatus = 0;
15
17. void holdDataMouse()
{
Data = 0;
DataReg = 1;
}
void writeMouse(char cmd)
{
releaseDataMouse();
//Release both the lines
releaseClockMouse();
//For enabling Device-to-Host Communication, Host
clock and data must set to high to prevent inhibit
holdClockMouse();
//Bring Clock line low for at least 100 uS
delay_us(120);
holdDataMouse();
//Bring the Data line low
releaseClockMouse();
//Release the Clock line
while(ClkDev==0);
// wait for the clock high
for(i=0;i<=7;i++)
//8 data bits
17
18. {
while(ClkDev==1);
//Wait for device to bring the clock low
//Set the data bit
if(cmd & mask[i])
/*== 1)*/
releaseDataMouse(); //Changed
else
holdDataMouse();
while(ClkDev==0);
//Wait for devise to bring the clock high
}
while(ClkDev==1);
//Wait for devise to bring the clock low
//Set the parity
if(oddParity(cmd)==1)
//try reversing the parity, check every byte
{
releaseDataMouse();
}
else
{
holdDataMouse();
}
while(ClkDev==0);
//Wait for devise to bring the clock high
while(ClkDev==1);
//Wait for device to bring the clock low
18
19. releaseDataMouse();
//Release the data line
while(ClkDev==0);
//wait for clock high
while(DataDev==1);
//Wait for device to bring data low
while(ClkDev==1);
//Wait for device to bring clock low
while(ClkDev==0 || DataDev==0); //Wait for device to release clock and data
}
void mouseInit()
{
while(1)
{
delay_ms(100);
writeMouse(0xFF);
//0xFF = Reset Mouse Command - Mouse
returns AA (if passed self-test), 0x00 after self-test
//receive 0xFA - acknowledgment
while(!mouseFlag)
readMouse();
if(mouseFlag==1 && mouseData==0xFA) //0xFA = Mouse Acknowledge
Command, Sent by Mouse after each command byte
mouseFlag=0;
else continue;
//receive 0xAA - self test passed
while(!mouseFlag)
19
22. readMouse();
if(mouseFlag==1)
{
byte2 = mouseData;
mouseFlag=0;
}
else return;
while(!mouseFlag)
readMouse();
if(mouseFlag==1)
{
byte3 = mouseData;
mouseFlag=0;
}
else return;
//Byte processing
if(byte1 & 0x01) //compare the byte1 with 0x01, if 0x01 exist means left
button clicked
klikKiri=1;
else
klikKiri=0;
if(byte1 & 0x02) //compare the byte1 with 0x02, if 0x02 exist means right
button clicked
22
23. klikKanan=1;
else
klikKanan=0;
if(byte1 & 0x04) //compare the byte1 with 0x04, if 0x04 exist means middle
button clicked
klikTengah=1;
else
klikTengah=0;
if(!(byte1 & 0x10)) //X move on + coordinate
{
if(x_limit-byte2 > mouseX) //X limit - byte2 that contains X movement data
mouseX += byte2;
else
mouseX = x_limit;
//mouse reached end of the screen
}
else
//X move on - coordinate
{
if(255-byte2+1 < mouseX)
mouseX -= (255-byte2+1);
else
mouseX = 0; //mouse reached begining of the screen
}
23
24. if(!(byte1 & 0x20)) //Y move on + coordinate
{
if(y_limit-byte3 > mouseY) //Y limit - byte3 that contains Y movement data
mouseY += byte3;
else
mouseY = y_limit; //mouse reached end of the screen
}
else
//Y move on - coordinate
{
if(255-byte3+1 < mouseY)
mouseY -= (255-byte3+1);
else
mouseY = 0; //mouse reached begining of the screen
}
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
char c[20];
int loop;
// Input/Output Ports initialization
// Port A initialization
24
28. // USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
28
29. // RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 8
lcd_init(16);
releaseDataMouse();
//releasing both data and clock line to prevent inhibit
releaseClockMouse();
delay_ms(500);
lcd_clear();
mouseInit();
back the message
//initialize the mouse by sending a command and receiving
delay_ms(1000);
lcd_clear();
lcd_gotoxy(0,0);
for(loop=0;loop < 16;loop++)
//simple loading screen
{
lcd_puts("+");
delay_ms(100);
}
delay_ms(500);
lcd_clear();
while (1)
29
30. {
PORTA.3=1;
//activate LCD back lamp
lcd_clear();
lcd_gotoxy(0,0);
scanMouse();
lcd_putsf("X:");
itoa(mouseX,c);
//itoa used to convert int to char
lcd_puts(c);
lcd_gotoxy(0,1);
lcd_putsf("Y:");
itoa(mouseY,c);
//itoa used to convert int to char
lcd_puts(c);
if(mouseY>150)
{
if(mouseX<50)
lcd_gotoxy(0,0);
if(mouseX<100 && mouseX>50)
lcd_gotoxy(1,0);
if(mouseX<150 && mouseX>100)
lcd_gotoxy(2,0);
if(mouseX<200 && mouseX>150)
lcd_gotoxy(3,0);
if(mouseX<250 && mouseX>200)
lcd_gotoxy(4,0);
if(mouseX<300 && mouseX>250)
lcd_gotoxy(5,0);
30
34. 3.3
Hasil Percobaan
Hasil dari percobaan yang telah dilakukan adalah, LCD akan menampilkan
nilai koordinat X dan Y sesuai dengan pergerakan yang dilakukan oleh mouse.
Disini kami membatasi koordinat X dan Y antara 0-800. Selain itu LCD juga akan
menampilkan pointer sesuai dengan pergerakan mouse.
34
35. BAB IV
PENUTUP
4.1
Kesimpulan
Mouse optik merupakan perangkat yang menghasilkan output berupa data
yang dipengaruhi oleh faktor jarak perpindahan. Data dikirimkan dua arah secara
serial .
Mouse optik termasuk salah satu sensor pendeteksi jarak yang mudah
digunakan dalam berbagai aplikasi.
4.2
Kelebihan
Mouse optik tidak membutuhkan permukaan khusus, karena bisa
digunakan pada permukaan yang tidak rata
Sensitifitas mouse optik lebih tinggi dibandingkan mouse manual.
Harga mouse dengan konektor PS/2 lebih murah.
Apabila dipakai di komputer, konektor dengan PS/2 tidak membebani
procesor.
4.3
Kekurangan
Mouse optik memerlukan permukaan yang memantulkan cahaya.
Tidak fleksibel, apabila mencopot dan memasang dengan konektor PS/2
harus merestart host.
35