You are on page 1of 11

TUGAS JOBSHEET

UNTUK MEMENUHI TUGAS MATAKULIAH


Praktikum Robotik
yang dibina oleh Ibu Siti Sendari
oleh kelompok F yang beranggotakan:
Andrik Kurniawan

130534608422

Leny Nur Wahyuni Azizah

130534608

Nisrina Mega Afifah


130534608384
R. Aj. Siti Fatimah Daniar Syahputri
130534608365
Sectio Ari Nugroho

130534608

Sigit Setyo Widodo

130534608364

Wahyu Bagus Saputra

UNIVERSITAS NEGERI MALANG


FAKULTAS TEKNIK

130534608

JURUSAN TEKNIK ELEKTRO


Maret 2016
E. Hasil Percobaan
1. Program Menggerakkan Motor Kanan
#include <mega168.h>
#include <delay.h>
#include <stdio.h>
#define
dir1Ki
#define
dir2Ki
#define
dir1Ka
#define
dir2Ka
#define
maju
0
#define
mundur 1
#define
stop
2
#define
lurus
#define
tikunganKiri
#define
tikunganKanan
#define
ready
#define
rawSensorData
#define
thresholdSet
#define
trackSet

PORTD.2
PORTD.3
PORTD.4
PORTD.5

0
1
2
0
1
2
3

void pwmKi(unsigned int pwm) {


OCR1AH = pwm/256;
OCR1AL = pwm%256;
}
void pwmKa(unsigned int pwm) {
OCR1BH = pwm/256;
OCR1BL = pwm%256;
}
void motorKiri(unsigned char arah,unsigned int speed) {
if (arah==maju) {
pwmKi(speed);
dir1Ki = 1;
dir2Ki = 0;
}
else if (arah==mundur) {
pwmKi(speed);
dir1Ki = 0;
dir2Ki = 1;
}
else if (arah==stop) {
dir1Ki = 0;
dir2Ki = 0;
pwmKi(1023);
}
}
void motorKanan(unsigned char arah,unsigned int speed) {
if (arah==maju) {
pwmKa(speed);
dir1Ka = 1;
dir2Ka = 0;
}
else if (arah==mundur) {

pwmKa(speed);
dir1Ka = 0;
dir2Ka = 1;
}
else if (arah==stop) {
dir1Ka = 0;
dir2Ka = 0;
pwmKa(1023);
}
}
#define ADC_VREF_TYPE 0xE0
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
void main(void){
#pragma optsizeCLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTB=0x20;
DDRB=0x07;
PORTC=0x00;
DDRC=0x00;
DDRD=0b00111100;
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TCCR1A=0xA3;
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;
TIMSK0=0x00;
TIMSK1=0x00;
TIMSK2=0x00;

UCSR0A=0x02;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x0B;
ADCSRB=0x00;
DIDR0=0x30;
ADCSRA=0x84;
SPCR=0x00;
TWCR=0x00;
while (1){
// Place your code here
motorKanan(0,100);
}}

2. Program Menggerakkan Motor Kiri


#include <mega168.h>
#include <delay.h>
#include <stdio.h>
#define
dir1Ki
#define
dir2Ki
#define
dir1Ka
#define
dir2Ka
#define
maju
0
#define
mundur 1
#define
stop
2
#define
lurus
#define
tikunganKiri
#define
tikunganKanan
#define
ready
#define
rawSensorData
#define
thresholdSet
#define
trackSet

PORTD.2
PORTD.3
PORTD.4
PORTD.5

0
1
2
0
1
2
3

void pwmKi(unsigned int pwm) {


OCR1AH = pwm/256;
OCR1AL = pwm%256;
}
void pwmKa(unsigned int pwm) {
OCR1BH = pwm/256;
OCR1BL = pwm%256;
}
void motorKiri(unsigned char arah,unsigned int speed) {
if (arah==maju) {
pwmKi(speed);
dir1Ki = 1;
dir2Ki = 0;
}
else if (arah==mundur) {
pwmKi(speed);
dir1Ki = 0;
dir2Ki = 1;
}
else if (arah==stop) {
dir1Ki = 0;
dir2Ki = 0;
pwmKi(1023);

}
}
void motorKanan(unsigned char arah,unsigned int speed) {
if (arah==maju) {
pwmKa(speed);
dir1Ka = 1;
dir2Ka = 0;
}
else if (arah==mundur) {
pwmKa(speed);
dir1Ka = 0;
dir2Ka = 1;
}
else if (arah==stop) {
dir1Ka = 0;
dir2Ka = 0;
pwmKa(1023);
}
}
#define ADC_VREF_TYPE 0xE0
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
void main(void){
#pragma optsizeCLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTB=0x20;
DDRB=0x07;
PORTC=0x00;
DDRC=0x00;
DDRD=0b00111100;
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TCCR1A=0xA3;
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;

TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;
TIMSK0=0x00;
TIMSK1=0x00;
TIMSK2=0x00;
UCSR0A=0x02;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x0B;
ADCSRB=0x00;
DIDR0=0x30;
ADCSRA=0x84;
SPCR=0x00;
TWCR=0x00;
while (1){
// Place your code here
motorKiri(1,100);
}}

3. Program Pembacaan Sensor


// Baca ADC
data1
data2
data3
data4

=
=
=
=

read_adc(4);
read_adc(5);
read_adc(6);
read_adc(7);

xsensor = sensor;
sensor = 0;
// Jika nilai DATA lebih besar dari BATAS, maka sensor berada di
atas permukaan terang
if (data1>batas) sensor |= 0x01;
if (data2>batas) sensor |= 0x02;
if (data3>batas) sensor |= 0x04;
if (data4>batas) sensor |= 0x08;
// Invert nilai sensor untuk jalur terang di atas permukaan gelap
if (trackWarnaPutih) {
sensor = sensor ^ 0x0F;
}

Menampilkan hasil pembacaan pada LCD


printf("S1=%3d S2=%3d S3=%3d S4=
%3d\n",data1,data2,data3,data4);
locate(1,1);
lcd_putInt(data1,3);
locate(1,5);
lcd_putInt(data2,3);
locate(0,1);

lcd_putInt(data3,3);
locate(0,5);
lcd_putInt(data4,3);

TUGAS
1. Hal-hal yang perlu diperhatikan dalam pembuatan dan pengkodean Robot LF
Pembuatan:
-

Penentuan sensor yang akan digunakan untuk mengikuti track/jalur

(Photodioda, LDR, atau lainnya)


Penentuan jumlah sensor yang akan digunakan (4 sensor, 8 sensor, 16

sensor, dll)
Penentuan posisi penempatan sensor / desain (setengah lingkaran, persegi,

segi 8, atau yang lainnya)


Penentuan mikrokontroler yang digunakan (ATMega168, ATMega8535,

dll)
Penentuan driver motor
Penentuan Motor
Penentuan daya yang digunakan
Ban/ roda
dll

Pengkodean:
-

Mengetahui jalur/track yang akan diikuti, apakah berwarna hitam

atau putaih.
Mengetahui pergerakan motor LF
Kecepatan pada tiap-tiap motor dapat ditentukan dari PWM yang

diberikan pada motor.


Mengetahui jumlah dan posisi penempatan sensor.
Membuat program untuk Inisialisasi Pin dan variabel yang

dibutuhkan untuk pengkodean rabot LF.


Mendefinisian variable dan file header yang akan digunakan,
sehingga saat menuliskan listing cukup memanggil variabelnya

saja.
Penulisan listing program untuk pengendalian motor dengan

menggerakkan motor kanan dan kiri.


Penulisan listing program untuk pembacaan sensor mendeteksi
warna gelap dan terang (hitam dan putih)

Perhitungan kecepatan untuk robot LF


Pengkombinaasian maju mundur untuk suatu gerakan (tikung kiri, tikung

kanan, belok kiri, belok kanan, dll)


2. Program untuk kalibrasi sensor
buttonCheck();
// Baca ADC

data1 = read_adc(4);
data2 = read_adc(5);
data3 = read_adc(6);
data4 = read_adc(7);
xsensor = sensor;
sensor = 0;
// Jika nilai DATA lebih besar dari BATAS, maka sensor berada di atas
permukaan terang
if (data1>batas) sensor |= 0x01;
if (data2>batas) sensor |= 0x02;
if (data3>batas) sensor |= 0x04;
if (data4>batas) sensor |= 0x08;
// Invert nilai sensor untuk jalur terang di atas permukaan gelap
if (trackWarnaPutih) {
sensor = sensor ^ 0x0F;
}
Tabel Kalibrasi ADC Sensor

Port ADC
ADC.0
ADC.1
ADC.2
ADC.3
ADC.4
ADC.5
ADC.6
ADC.7

Nilai ADC
pada kertas
putih
822
800
780
800
810
812
811
811

Nilai ADC
pada kertas
hitam
1022
1000
1020
1020
1021
1024
1023
1012

Nilai
tengah
922
900
890
989
960
994
989
967

Script:
void buttonCheck(void) {
if (!tombol1) {
counterT2 = 0;
if (displayMode==ready) {
if (start==0) {
start = 1;
sensor = 0xFF;
putlcd(lcdCmd,displayclear);
locate(0,2);lcd_putsf("START!");
locate(1,1);lcd_putsf("TRACKING");
if (batas!=batasEE) {
batasEE = batas;delay_ms(10);
}
if (trackWarnaPutih!=trackMode) {
trackMode = trackWarnaPutih;delay_ms(10);
}
}

}
else if (displayMode==rawSensorData) {
}
else if (displayMode==thresholdSet) {
if (!tombol2)
batas--;
else
batas++;

}
else if (displayMode==trackSet) {
trackWarnaPutih ^= 0x01;
delay_ms(100);
}
}
else {
counterT1 = 0;
}
if (!tombol2) {
counterT1 = 0;
if (displayMode==ready) {
if (start==1) {
putlcd(lcdCmd,displayclear);
start = 0;
lastStat = 0;
}
}
else if (displayMode==rawSensorData) {
}
else if (displayMode==thresholdSet) {
}
else if (displayMode==trackSet) {
}
counterT2++;
if (counterT2>10) {
putlcd(lcdCmd,displayclear);
displayMode++;
counterT2 = 0;
}
if (displayMode>trackSet) displayMode=ready;
}
else {
}

counterT2 = 0;

ANALISA
1. Pendefinisian variabel dilakukan untuk mempermudah dalam pengkodean.
Hasil dari klasifikasi pin untuk memudahkan dalam pengkodean dapat
dilakukan pendefinisian variabel sehingga saat menuliskan listing program
cukup memanggil variabelnya saja.
2. Pengendalian Motor dilakukan dengan menggunakan function
motorKanan dan motorKiri dengan mengeset arah motor (0 untuk maju, 1

untuk mundur dan 2 untuk stop) dan PWM untuk mengatur kecepatan
motor. Besarnya PWM yang di set pada function motorKanan dan
motorKiri mempengaruhi arah gerak motor. Misalnya untuk belok kanan
maka perlu diset PWM kanan lebih kecil dibanding PWM kiri, untuk
belok kiri perlu di set PWM kiri lebih kecil dari PWM kanan, dan untuk
maju maka PWM kanan dan kiri diset dengan besar yang sama
3. Pembacaan Sensor dilakukan menggunakan ADC, hasil pembacaan sensor
ditampilkan pada LCD menggunakan perintah
KESIMPULAN

You might also like