Sie sind auf Seite 1von 5

Praktikum Ke 2

RE304 Pengantar Robotika


Dosen : Ahmad Riyan Firdaus S.Si., M.T.

Pokok Bahasan :

Disusun Oleh :

RIAN HIDAYAT (4221701027)

Program Studi Teknik Robotika


Jurusan Teknik Elektro
Politeknik Negeri Batam
2018
2.2 Aplikasi 1: Membaca Data Rotary Encoder

#include <PinChangeInt.h>
#include <PinChangeIntConfig.h>
#define PIN1 4
#define PIN2 6

int encoder1PhaseA = 4;
int encoder1PhaseB = 5;
int encoder1Position = 0;

int encoder2PhaseA = 6;
int encoder2PhaseB = 7;
int encoder2Position = 0;
int n.m = LOW;

void setup() {
pinMode (encoder1PhaseA,INPUT);
pinMode (encoder1PhaseB,INPUT);
pinMode (encoder2PhaseA,INPUT);
pinMode (encoder2PhaseB,INPUT);
PCintPort::attachInterrupt(PIN1, readEncoder1,RISING);
PCintPort::attachInterrupt(PIN2, readEncoder2,RISING);
Serial.begin(9600);
}
void loop() {
Serial.print ("Enc1=");
Serial.print (encoder1Position);
Serial.print ("\t");
Serial.print ("Enc2=");
Serial.print (encoder2Position);
Serial.print ("\t");
}

void readEncoder1 ()
{
n = digitalRead(encoder1PhaseA);
if (n == HIGH) {
if (digitalRead(encoder1PhaseB) == LOW){
encoder1Position--;
} else {
encoder1Position++;
}
}
}

void readEncoder2 ()
{
m = digitalRead(encoder2PhaseA);
if (m == HIGH) {
if (digitalRead(encoder2PhaseB) == LOW){
encoder2Position--;
} else {
encoder2Position++;
}
}
}
Tabel 2.1 Hasil pembacaan nilai rotary encoder

No Arah Putaran Roda Kiri Nilai Encoder


1 1 putaran berlawanan arah jarum jam -791
2 1 putaran searah jarum jam 791

2.3 Aplikasi 2: Mengukur Kecepatan Putaran Roda


#include <PinChangeInt.h>
#include <PinChangeIntConfig.h>

#define PIN1 4
#define PIN2 6

int encoder1PhaseA = 4;
int encoder1PhaseB = 5;
int encoder1Position = 0;

int encoder2PhaseA = 6;
int encoder2PhaseB = 7;
int encoder2Position = 0;
int n,m = LOW;

int tickPerRev=775;
int pulsel, pulse2;

float rpm1, rpm2;


float rps1, rps2;

void setup() {
// setup timer2 to fire every 16 ms
TCCR2B = 0x00; // Disable INT Flag Reg: Clear Timer Overflow Flag
TCNT2 = 6; // 256-((16MHz*16 ms)/1024)
TIFR2 = 0x00; //Timer2 INT Flag Reg : Clear Time overflow Flag
TIMSK2 = 0X01; //Timer2 INT Reg : Timer 2 Overflow Interrupt Enable
TCCR2A = 0x00; //Timer2 Control Reg A: Wave gen Mode normal
TCCR2B = 0x07; //Timer2 Control Reg B: Timer Prescaler set to1024

pinMode (encoder1PhaseA,INPUT);
pinMode (encoder1PhaseB,INPUT);
pinMode (encoder2PhaseA,INPUT);
pinMode (encoder2PhaseB,INPUT);
PCintPort : :attchInterrupt (PIN1, readEncoder1, RISING);
PCintPort : :attchInterrupt (PIN2, readEncoder2, RISING);
Serial.begin(19200);
}

void loop() {
}
void readEncoder1 ()
{
n = digitalRead (encoder1PhaseA);
if (n == HIGH) {
if (digitalRead (encoder1PhaseB) == LOW) {
encoder1Position--;
pulse1--;
} else {
encoder1Position++;
Pulse1++;
}
}
}
void readEncoder2()
{
m = digitalRead (encoder2PhaseA);
if (m == HIGH) {
if (digitalRead (encoder2PhaseB) == LOW) {
encoder2Position--;
pulse2--;
} else {
encoder2Position++;
pulse2++;
}
}
}
ISR (TIMER2_OVF_vect) //interrupt service routine
{
TCNT2 = 6; //Reset Timer to 6
rps1 = (pulse1* (1 / 0.016)) /tickPerRev;
rps2 = -(pulse2* (1 / o.016)) /tickPerRev;
rpm1 = 60*rps1;
rpm2 = 60*rps2;

Serial.print (rps1); Serial.print(" ");


Serial.print (rps2); Serial.print(" ");
Serial.print (rpm1); Serial.print(" ");
Serial.print (rpm2);
pulse1=0;
pulse2=0;
} Tabel 2.2 Kecepatan putaran roda

No Arah Putaran Roda Kiri rps rpm


1 Berlawanan arah jarum jam -0.19 -9.68
2 Searah jarum jam 0.19 9.68
Analisa
Encoder adalah sensor pembaca putaran dengan detector berupa optocoupler yang
membaca piringan berpori, hal ini dimanfaatkan untuk mendeteksi sinyal high dan low
secara continius. Optocoupler akan memberikan output bernilai HIGH apabila tidak ada
penghalang yang menghalangi pembacaannya, dalam piringan terdapat pori. Pori inilah yang
nantinya di indikasikan sebagai sinyal HIGH, sedangkan bagian yang tidak berpori
melambangkan sinyal LOW.

Piringan digerakan oleh putaran eksternal, baik berupa putaran roda ataupun
putaran shaft dari motor yang diCoupling. Putaran secara kontinius menghasilkan
pembacaan Pulsa, jarak antara pulsa high ke pulsa high lainnya melambangkan kecepatan
putaran dari motor. Semakin rapat pulsa yang terbaca maka semakin cepat putaran motor
tersebut.

Data keluaran encoder dapat digunakan untuk mebaca kecepatan motor, hal ini bisa
dilakukan apabila kita mengetahui nilai maksimal pembacaan encoder dalam satu putaran
penuh. Acuan kecepatan encoder dapat berupa detik maupun menit. Berikut persamaan
dari RPS dan RPM :
(pulse1* (1 / 0.016))/tickPerRev;
Dimana :
Pulse = pembacaan encoder
0.016 = konstanta internal timer(16 MHz)
tickPerRev= maksimal pembacaan encoder dalam satu putaran penuh

RPM = hasil RPS x 60

Das könnte Ihnen auch gefallen