Arduino
OKUDUĞUNUZ KONU
Arduino DC Motor Hız Ölçer Yapımı
3

Arduino DC Motor Hız Ölçer Yapımı

Yazar : Utkan Subaşı7 Temmuz 2018

DC motorların hız ölçümü projelerde yaşanan en büyük sorunlardan birisidir , bu projemizde hız ölçer yapımını göstereceğiz.Motorların bazıları patinaj yaptığından dolayı arabalarda düz gitmeme sorunu yaşanmaktadır.Bu sorunu dc motorun hızını ölçerek ve motorların birbirine eşitleme algoritmasını kullanarak çözebiliriz.

Kullanılacak sensör kızılötesi IR sensördür.Bu sensörün temelde çalışma mantığı çok basittir.DC motor üzerine yerleştirilen delikli disk sensörün görebileceği şekilde konumlandırılır.Temel mantık delik saymadır.Örneğin diskinizde 20 delik olsun sensör 20 kez delik gördüğünde motor 1 tur atmış demektir.1 turu kaç sanayinede attığını hesaplar ve motorun hızını bulur.

Projemizde Kullanılan Malzemeler

Sensörün çalışma mantığı:

Sensör kızılötesi iletişim metodunu kullanarak, verici ile alıcı arasına engel girdiğinde çıkış low, engel olmadığında ise high verir. Yani bir buton gibi devreyi açıp kapatır diyebilir. Bu high low durumları bir yorumlayıcı ile işlenerek saydırma işlemi yapılır ve  motorun hızı,  devri ölçülür.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
   
LiquidCrystal_I2C lcd(0x3f, 16, 2);

int in1 = 9; 
int in2 = 5; 
int ena = 6;
const int dataIN = 2; 

unsigned long prevmillis; 
unsigned long duration;
unsigned long lcdrefresh; 

int rpm; 

boolean currentstate; 
boolean prevstate;
  
void setup() 
{
Serial.begin(9600);
lcd.begin();  
lcd.backlight();
pinMode(in1, OUTPUT); 
pinMode(in2, OUTPUT); 
pinMode(ena, OUTPUT);

digitalWrite(in1, HIGH); 
digitalWrite(in2, LOW); 
pinMode(dataIN,INPUT);
prevmillis = 0;
prevstate = LOW;  
} 
  
void loop()
{

  currentstate = digitalRead(dataIN); 
 if( prevstate != currentstate)
   {
     if( currentstate == HIGH ) 
       {
         duration = ( micros() - prevmillis ); 
         rpm = (6000000/duration); 
         prevmillis = micros(); 
       }
   }
  prevstate = currentstate; 
  
  if( ( millis()-lcdrefresh ) >= 100 )
    {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Motor Hizi");
      lcd.setCursor(0,1);
      lcd.print("RPM = ");
      lcd.print(rpm);         
      lcdrefresh = millis();   
    }
  
 int pot_deger = analogRead(1); 
 int motor_hizi = map(pot_deger, 0, 1023, 255, 0);
 analogWrite(ena, motor_hizi); 
  
}

SİZCE NASIL OLMUŞ?
Beğendim
75%
İlginç
0%
Eh İşte
13%
Anlamadım
0%
Kötü
0%
Berbat
13%
YAZAR HAKKINDA
Utkan Subaşı
Utkan Subaşı
Arduino'ya 11 yaşında başladım. Çok sevdim. Devam ettim. Tübitak Ortaokullar Arası Yapılan Yarışmada 3. Oldum. ARDUİNO'YA DEVAMM...
3 YORUMLAR
  • M. Fatih Vahaboğlu
    22 Temmuz 2018 at 00:38

    Hocam Elinize sağlık çok güzel bir poroje olmuş. Ancak bazı soularım olucak.
    – Bende bu motordan var ancak bu projdeki delikli diski nerden bulurum ?

    – bu diski kendimiz bir şekilde yapmış olsak da üzerindeki delik sayısını algoritmada tanımladığımız kısım neresidir ?

    Çok teşekkürler…

  • M. Fatih Vahaboğlu
    22 Temmuz 2018 at 00:42

    Farklo bir sensör kullandığımızı var sayalım;
    Bu sistemin ölçebileceği maximum hız ne olabilir ?

  • TURGUT
    TURGUT
    5 Ağustos 2018 at 23:19

    Makalenizde anlattığınız hız ölçme algoritması ile sunduğunuz kod arasında hiç bir ilişki yok !
    – Tekniğiniz delikleri sayıp toplamı 20 ye bölmekten (Enkoder da 20 delik olduğu için) bahsediyor, fakat kodda böyle bir uygulama yok.
    – Bir dakika süre içinde DIG2 pinini değişimlerini saymaya çalışmışsınız, fakat kullandığınız micros() işlevine göre bir dakikanın 6000000 yerine 60000000 micros olması gerekir. Bundan dolayı RPM hesaplamanız yanlıştır.
    – Saymayı LOOP() devresi içinde digitalRead() koduyla yapıyorsunuz. LOOP() içindeki öteki bütün işlemlerin sayısına ve motorun dönüş hızına göre yüksek devirleri saymanız zordur. Hele motor tipi yüksek hızlı bir tipe değişirse bu teknik doğru sonuç vermez. Doğru uygulama KESME ile yapılmalıdır.

YORUM YAP