Mengatur RPM Motor Encoder/Rotary Encoder dan Sensor Suhu LM35 Berbasis Arduino
"Motor Encoder/Rotary Encoder dan Sensor Suhu LM35"
Assalamualaikum Wr Wr.
Pada artikel kali ini, saya akan berbagi ilmu sederhana mengenai bagaimana mengatur Rpm Motor Encoder/Rotary Encoder dan Sensor Suhu pada Aplikasi Proteus berbasis arduino.
1. Motor Encoder/Rotary Encoder
Secara umum prinsip kerja rotary encoder ini dapat
diilustrasikan sebagai berikut.
Dua buah sensor optis (Channel A dan B) pendeteksi “hitam dan putih”
digunakan acuan untuk menentukan arah gerakan. Searah jarum jam (clock-wise,
CW) atau (counter clock-wise, CCW). Sedangkan jumlah pulsa (baik A atau B)
dapat dihitung (menggunakan prinsip counter) sebagai banyak langkah yang ditempuh.
Dengan demikian arah gerakan dan posisi dapat dideteksi.
Contoh rotary encoder.
Biasanya encoder ini dipasang segaris dengan poros (shaft) motor, gearbox,
sendi datau bagian berputar lainnya. Beberapa tipe encoder memiliki poros
berlubang (hollow shaft encoder) yang didesain untuk sistem sambungan langsung
ke poros obyek yang dideteksi.
2. Sensor suhu IC LM 35
Sensor suhu IC LM 35 merupkan chip IC produksi
Natioanal Semiconductor yang berfungsi untuk mengetahui
temperature suatu objek atau ruangan dalam bentuk besaran elektrik, atau
dapat juga di definisikan sebagai komponen elektronika yang
berfungsi untuk mengubah perubahan temperature yang diterima dalam perubahan
besaran elektrik. Sensor suhu IC LM35 dapat mengubah perubahan temperature
menjadi perubahan tegangan pada bagian outputnya. Sensor suhu IC LM35 membutuhkan
sumber tegangan DC +5 volt dan konsumsi arus DC sebesar 60 µA dalam beroperasi.
Bentuk fisik sensor suhu LM 35 merupakan chip IC dengan kemasan yang
berfariasi, pada umumnya kemasan sensor suhu LM35 adalah kemasan TO-92
seperti terlihat pada gambar dibawah.
Dari gambar diatas dapat diketahui bahwa sensor suhu IC LM35
pada dasarnya memiliki 3 pin yang berfungsi sebagai sumber supply tegangan DC
+5 volt, sebagai pin output hasil penginderaan dalam bentuk perubahan tegangan
DC pada Vout dan pin untuk Ground.
Karakteristik Sensor suhu IC LM35 adalah :
- Memiliki sensitivitas suhu, dengan faktor skala linier antara tegangan dan suhu 10 mVolt/ºC, sehingga dapat dikalibrasi langsung dalam celcius.
- Memiliki ketepatan atau akurasi kalibrasi yaitu 0,5ºC pada suhu 25 ºC seperti terlihat pada gambar diatas
- Memiliki jangkauan maksimal operasi suhu antara -55 ºC sampai +150 ºC.
- Bekerja pada tegangan 4 sampai 30 volt.
- Memiliki arus rendah yaitu kurang dari 60 µA.
- Memiliki pemanasan sendiri yang rendah (low-heating) yaitu kurang dari 0,1 ºC pada udara diam.
- Memiliki impedansi keluaran yang rendah yaitu 0,1 W untuk beban 1 mA.
- Memiliki ketidaklinieran hanya sekitar ± ¼ ºC.
Sensor suhu IC LM35 memiliki keakuratan tinggi dan mudah
dalam perancangan jika dibandingkan dengan sensor suhu yang lain, sensor
suhu LM35 juga mempunyai keluaran impedansi yang rendah dan linieritas yang
tinggi sehingga dapat dengan mudah dihubungkan dengan rangkaian kontrol khusus
serta tidak memerlukan seting tambahan karena output dari sensor suhu LM35
memiliki karakter yang linier dengan perubahan 10mV/°C. Sensor suhu LM35
memiliki jangkauan pengukuran -55ºC hingga +150ºC dengan akurasi ±0.5ºC.
Cara mengatur Rpm Motor Encoder/Rotary Encoder dan Sensor Suhu pada Aplikasi Proteus berbasis arduino.
Bahan yang diperlukan :
- Laptop + Software Arduino & Proteus 7 ( Arduino Portable dan Proteus Portable )
- Arduino UNO R3
- Motor Encoder
- Sensor Suhu LM35
- Button
- LED-RED
- LCD LM016L
- Resistor
Kemudian buat rangkaian seperti gambar di bawah ini :
buka software arduino, dan buat coding seperti dibawah ini :
#include <LiquidCrystal.h>
#define N 150 // lubang pada cakram
#define T 400 // Time window = 80 ms
#define res 1 // 60000/(T*N)
#define LEDPIN3 A5
LiquidCrystal lcd(13,12,10,9,6,4);
String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
long suhu, suhu_;
int slot = 0;
int velo;
char tulisan[16];
char PW = 90;
char fase = 1;
void setup() {
lcd.begin(16, 2);Serial.begin(9600);
inputString.reserve(200);suhu_=0;
EICRA |= (1<<ISC01);
EIMSK |= (1<<INT0);
sei();
pinMode (LEDPIN3,OUTPUT);
lcd.setCursor(7, 1);lcd.print("W= Rpm");
pinMode(11, OUTPUT); // OC2A PWM generator
noInterrupts(); // disable all interrupts
TCCR0A = 0;TCCR0B = 0; // Timer0 as Time Window
TCCR1A = 0;TCCR1B = 0; // Timer1 as Encoder Pulse Counter
TCCR2A = 0;TCCR2B = 0; // Timer2 as PWM generator
OCR0A = 250;// T = 250*5*64 us = 80000 us
TCCR0A |= (1<<WGM01); // CTC mode, Output Compare Timer 0A.
TCCR0B |= (1<<CS02) | (1<<CS00); //1024 prescaller, XTAL 16 MHz, tick = 64 us.
TIMSK0 |= (1<<OCIE0A); // enable timer 0A compare interrupt
TCCR1B |= (1<<CS12) | (1<<CS11) | (1<<CS10); //rising edge 16-bit counter
TCCR2A |= (1<<WGM21); // CTC mode, Output Compare Timer 2A.
TCCR2B |= (1<<CS22) | (1<<CS21) | (1<<CS20); //1024 prescaler
TIMSK2 |= (1<<OCIE2A); // enable timer 2A compare interrupt
TCNT2 = 0; OCR2A = PW;
EICRA = 0; EIMSK = 0;
EIMSK |= (1<<INT1) | (1<<INT0); // interrupt enable
EICRA |= (1<<ISC11) | (1<<ISC01); // falling edge trigger
interrupts(); // enable all interru
}
ISR(TIMER0_COMPA_vect) // timer0A compare interrupt service routine
{
slot++;
if(slot == 5) TCNT1=0; // 30-25 = 5 slot = 80000 us, agar res = 15 rpm
if(slot == 30) { // 30 slot = 480000 us, 0.48 detik, interval update speed di LCD
noInterrupts(); // disable all interrupt
velo = TCNT1;
velo = velo*1;
itoa(velo,tulisan,10); // convert int to decimal string
lcd.setCursor(9, 1); // kolom kelima baris kedua
lcd.print(" ");
lcd.setCursor(9, 1);
lcd.print(tulisan);
slot = 0;
interrupts(); // enable interrupt
}
}
ISR(TIMER2_COMPA_vect) // timer2A compare interrupt service routine
{//duty cycle 2*PW %, OCR2A = 2*PW, 200-2*PW
switch (fase) {
case 1: fase = 2; OCR2A = 200 - 2*PW;
digitalWrite(11, LOW); break;
case 2: fase = 1; OCR2A = 2*PW;
digitalWrite(11, HIGH); break; }
}
ISR(INT0_vect) { PW -= 5;if(PW<=0) PW = 5;}
ISR(INT1_vect) {PW += 5;if(PW>=100) PW = 95;}
void loop() {
if (stringComplete) {
if(inputString.charAt(0) == 's') lcd.setCursor(0,0);
else lcd.setCursor(0,1);
lcd.print(inputString);
inputString = ""; stringComplete = false;}
suhu = analogRead(0); suhu=suhu*500/1023;
if(suhu != suhu_) {suhu_=suhu;Serial.print("suhu = ");Serial.println(suhu);
if (suhu >= 80)
digitalWrite (LEDPIN3,HIGH);
if (suhu < 80)
digitalWrite (LEDPIN3,LOW);
} }
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') {stringComplete = true;}}}
Cara Kerja Program
#include <LiquidCrystal.h>
#define N 150 // lubang pada cakram
#define T 400 // Time window = 80 ms
#define res 1 // 60000/(T*N)
#define LEDPIN3 A5
LiquidCrystal lcd(13,12,10,9,6,4);
String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
long suhu, suhu_;
int slot = 0;
int velo;
char tulisan[16];
char PW = 90;
char fase = 1;
void setup() {
lcd.begin(16, 2);Serial.begin(9600);
inputString.reserve(200);suhu_=0;
EICRA |= (1<<ISC01);
EIMSK |= (1<<INT0);
sei();
pinMode (LEDPIN3,OUTPUT);
lcd.setCursor(7, 1);lcd.print("W= Rpm");
pinMode(11, OUTPUT); // OC2A PWM generator
noInterrupts(); // disable all interrupts
TCCR0A = 0;TCCR0B = 0; // Timer0 as Time Window
TCCR1A = 0;TCCR1B = 0; // Timer1 as Encoder Pulse Counter
TCCR2A = 0;TCCR2B = 0; // Timer2 as PWM generator
OCR0A = 250;// T = 250*5*64 us = 80000 us
TCCR0A |= (1<<WGM01); // CTC mode, Output Compare Timer 0A.
TCCR0B |= (1<<CS02) | (1<<CS00); //1024 prescaller, XTAL 16 MHz, tick = 64 us.
TIMSK0 |= (1<<OCIE0A); // enable timer 0A compare interrupt
TCCR1B |= (1<<CS12) | (1<<CS11) | (1<<CS10); //rising edge 16-bit counter
TCCR2A |= (1<<WGM21); // CTC mode, Output Compare Timer 2A.
TCCR2B |= (1<<CS22) | (1<<CS21) | (1<<CS20); //1024 prescaler
TIMSK2 |= (1<<OCIE2A); // enable timer 2A compare interrupt
TCNT2 = 0; OCR2A = PW;
EICRA = 0; EIMSK = 0;
EIMSK |= (1<<INT1) | (1<<INT0); // interrupt enable
EICRA |= (1<<ISC11) | (1<<ISC01); // falling edge trigger
interrupts(); // enable all interru
}
ISR(TIMER0_COMPA_vect) // timer0A compare interrupt service routine
{
slot++;
if(slot == 5) TCNT1=0; // 30-25 = 5 slot = 80000 us, agar res = 15 rpm
if(slot == 30) { // 30 slot = 480000 us, 0.48 detik, interval update speed di LCD
noInterrupts(); // disable all interrupt
velo = TCNT1;
velo = velo*1;
itoa(velo,tulisan,10); // convert int to decimal string
lcd.setCursor(9, 1); // kolom kelima baris kedua
lcd.print(" ");
lcd.setCursor(9, 1);
lcd.print(tulisan);
slot = 0;
interrupts(); // enable interrupt
}
}
ISR(TIMER2_COMPA_vect) // timer2A compare interrupt service routine
{//duty cycle 2*PW %, OCR2A = 2*PW, 200-2*PW
switch (fase) {
case 1: fase = 2; OCR2A = 200 - 2*PW;
digitalWrite(11, LOW); break;
case 2: fase = 1; OCR2A = 2*PW;
digitalWrite(11, HIGH); break; }
}
ISR(INT0_vect) { PW -= 5;if(PW<=0) PW = 5;}
ISR(INT1_vect) {PW += 5;if(PW>=100) PW = 95;}
void loop() {
if (stringComplete) {
if(inputString.charAt(0) == 's') lcd.setCursor(0,0);
else lcd.setCursor(0,1);
lcd.print(inputString);
inputString = ""; stringComplete = false;}
suhu = analogRead(0); suhu=suhu*500/1023;
if(suhu != suhu_) {suhu_=suhu;Serial.print("suhu = ");Serial.println(suhu);
if (suhu >= 80)
digitalWrite (LEDPIN3,HIGH);
if (suhu < 80)
digitalWrite (LEDPIN3,LOW);
} }
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') {stringComplete = true;}}}
Cara Kerja Program
- Setelah software proteus di play maka LCD akan menampilkan besar Rpm Motor Encoder pada masing-masing arduino dengan resolusi 1 Rpm. LCD juga menampilkan suhu yang diambil dari masing-masing sensor LM35, kemudian dikirim ke LCD yang berlawanan (LM35_1 ke LCD 2 & LM35_2 ke LCD 1).
- Ketika Button C dan E ditekan maka secara otomatis Rpm Motor akan bejalan pelan (minimal 1 Rpm). Dan ketika Button D dan F ditekan maka Rpm Motor akan berjalan cepat (maksimal 145 Rpm).
- Ketika LM35 menunjukkan angka 0 sampai 79 derajat maka lampu LED akan mati, namun ketika pembacaan sensor LM35 menunjukkan angka 80 sampai 100 makan LED akan Menyala.
Untuk file dari rangkaian dan coding arduino dapat di download di bawah ini :
1. Rangkaian Motor Encoder dan LM35
2. Coding Arduino Motor Encoder dan LM35
Demikian artikel yang dapat saya sampaikan, semoga bermanfaat bagi semua yang berkunjung ke blog saya ini. Untuk video simulasi dapat dilihat di sini .
Terima kasih,
Wassalamualaikum Wr Wb.
Baehaqi
41417120030
terbaik👊
BalasHapus