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 :
  1. Laptop + Software Arduino & Proteus 7 ( Arduino Portable dan Proteus Portable )
  2. Arduino UNO R3
  3. Motor Encoder 
  4. Sensor Suhu LM35
  5. Button
  6. LED-RED
  7. LCD LM016L
  8. 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


  1. 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).
  2. 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).
  3. 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














Komentar

Posting Komentar

Postingan populer dari blog ini

menghitung konvolusi sirkular

Jelaskan hal-hal yang berkaitan dengan jenis-jenis sambungan trafo 3 fasa