LM 393 Kızılötesi Hız Sensörü Kullanımı

1 350

Bir dc motorun hangi yönde ne kadar hızla döndüğü, kaç tur yaptığı vs bilgilere, bazı projelerde ihtiyaç duymaktayız. Bundan dolayı bu yazımda sizlere lm 393 kızılötesi hız sensöründen bahsedeğim.

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.

Şimdi örnek bir proje yaparak daha iyi kavrayalım. Projede bir tane dc motorun hızını ve devrini ölçeceğiz.

Malzemeler:

  1. Arduino
  2. Lm393 hız sensörü
  3. Motor sürücü ( l293d yeterli)
  4. Potansiyometre
  5. Dc motor ve Tekerlek
  6. Encoder disk
  7. Jumper kablolar
  8. Batarya

Encoder diski aşağıdaki gibi motor miline takın  ve sensörü de şekildeki gibi encoder diske konumlandırın.

Elektronik Kısım: 

 

Şekildeki gibi bağlantıları yapalım.

 Yazılım Kısmı:

Yazılımda Interrupt (kesme) özelliği kullanmak uygun olacaktır. Kesme işlemi yaparsanız hatasız sonuç alırsınız. Çünkü arduino başka olayları çalıştırırken, kesmeye bağlı olay gerçekleştiğinde otomatik olarak haberi olur. Buradaki sensördeki durum değiştiğinde otomatik olarak tespit eder . Interrupt kütüphanesini aşağıdan indirebilirsiniz.

Kütüphane: timerone-r11

/* Robimek - Robotik Sistemler
www.robimek.com */
#include <TimerOne.h>
unsigned int sayac=0;
 
int in1 = 9; 
int in2 = 5; 
 int ena = 10;
void say() // sayma işlemi
{
 sayac++; // sayacı bir arttır
} 
 
void timerIsr()
{
 Timer1.detachInterrupt(); //zamanlayıcıyı durdur
 Serial.print("Motor hızı: "); 
 int devir = (sayac / 15); // buradaki 15 sayısı encoderdeki boşluk veya delik sayısıdır. Sizdeki kaç delik ise o sayıyı yazın.
 Serial.print(devir,DEC); 
 Serial.println(" Saniyedeki Devir Sayısı"); 
 sayac=0; // sayacı sıfırla
 Timer1.attachInterrupt( timerIsr ); //zamanlayıcıyı etkinleştir
}
 
void setup() 
{
 Serial.begin(9600);
 
 pinMode(in1, OUTPUT); 
 pinMode(in2, OUTPUT); 
 pinMode(ena, OUTPUT);
 digitalWrite(in1, HIGH); 
 digitalWrite(in2, LOW); 
 Timer1.initialize(1000000); // zamanlayıcıyı bir saniyeye ayarla
 attachInterrupt(0, say, RISING); // Sensör pini high olduğunda sayacı bir arttır.
 Timer1.attachInterrupt( timerIsr ); // timerIsr zamanlayıcıyı etkinleştir
} 
 
void loop()
{
 int pot_deger = analogRead(0); // Potansiyometreden veri okuma 
 int motor_hizi = map(pot_deger, 0, 680, 255, 0); // hız değerini hesapla
 analogWrite(ena, motor_hizi); // hız değerini yazdır.
 
}

Koddaki ” int devir = (sayac / 15); ” ifadesinde 15 değeri encoderdin üzerindeki delik veya boşluk sayısıdır. Sizdeki encoderde kaç tane varsa o sayıyı yazınız.

Bunları da beğenebilirsin

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

1 yorum

  1. erdinç

    slm sezgin ben devir sayısı üzerine led yakmak istiyorum devir arttıkça 4 led sırayla yanacak düştükçe sırayla sönecek bu konuda yardımcı olabilirmisn