Merhaba arkadaşlar. Bugün Arduino ile uzaktan kumandayla kontrol edilebilen otomatik stor perde yapacağız.

Malzeme Listesi

(Proje ile ilgili dokümanlara buradan erişebilirsiniz)

(Projenin vücut bulmuş halini görmek için)

Kullanılacak Malzemelerin Özellikleri

Öncelikle step motordan başlayalım. Step motoru elektrik enerjisini fiziksel harekete çeviren elektromanyetik bir dönüştürücü olarak tanımlayabiliriz. Step motorların en önemli özelliği adım adım (step  = adım ) yani hassas bir şekilde kontrol edilebiliyor olmasıdır. Bu yüzden de özel sürücülere ihtiyaç duyarlar. A4998 – DRV8825 – TMC2130 gibi…

Biz bu projemizde iki fazlı, bipolar bir step motor olan ve piyasada rahatlıkla bulabileceğiniz NEMA 17 yi ve sürücü olarak da DRV8825 i kullanacağız. DRV8825 ve A4988 sürücüler hem ucuz hem de performanslı olması sebebiyle böyle projelerin vazgeçilmezidir.

Bir diğer malzememiz olan TL1838 ( ya da KY022 de kullanabilirsiniz) ise kumandamızdan gelecek olan (IR= infrared = kızılötesi) kızılötesi ışınları algılamamızı sağlayacak olan devre elemanımızdır.

Malzemelerimizin özelliklerini de öğrendiğimize göre devremizi kurabiliriz.

Arduino ile Otomatik Stor Perde Devresi

Şimdi de devremizi tanıyalım. Öncelikle belirtmeliyim ki alıcımızın bacaklarını yanlış bağlamamaya çok dikkat edelim çünkü 5V ile GND ters bağlanması durumunda alıcınıza geri dönüşü olmayan zararlar verebilirsiniz. ( TL1838 in pinleri ,arka yani düz kısmını kendimize çevirdiğimizde soldan sağa sırasıyla VCC-GND-OUT şeklindedir)

Biraz da sürücümüz DRV8825 i inceleyelim. Sürücümüz üzerinde kullanmamız zorunda olduğumuz VMT ,VDD, GND, STEP, DIR ve bunlara ayrıyeten A1, A2 ,B1, B 2pinlerimiz var. VMT pinimize 36 volta kadar DC gerilim verebiliriz. Bu pin step motorumuzun enerjisini aldığı pindir. VDD pinimize bu devrede motorumuz çalışması gerektiği zaman lojik1 (5Volt), diğer durumlarda ise lojik 0 n(0Volt)  veriyoruz. Bu pin ise DRV8825 in çalışması için gerekli olan enerjiyi aldığı pindir. GND ise bildiğimiz üzere toprak hattımız olmaktadır. DIR pini motorumuzun hangi yönde sürüleceğine karar verir. DIR pini motorumuzu, lojik 1 için (5V) saat yönünde döndürürken, lojik 0 (0V) için saat yönünün tersinde döndürür. Motorumuzun kaç adım ilerleyeceği bilgisi ise STEP pininden verilir.

A1, A2, B1 ,B2 pinlerimiz motorumuzun kablolarının bağlanacağı pinlerdir. Motordan çıkan kabloların sırayla değil ortadaki iki kablonun yer değiştirdiğine dikkat edelim .

Devrede DRV8825 e daha dikkatli bakarsanız M0,M1 ve M2 birbirine bağlanıp 3.3V pinine gittiğini fark edebilirsiniz. Bu 3 pin (M0,M1,M2) bizim mikrostep pinlerimizdir bu pinler kısa devre edilerek step motorun hassasiyeti 8,16,32 kat artırılabilir fakat bizim burda bu üçünü kısa devre yapma sebebimiz hassasiyeti artırmaktan ziyade motorumuzun sessiz çalışmasını sağlamak. Çünkü gerçek hayatta da olduğu gibi ne kadar küçük adımlar atarsanız o kadar sessiz hareket edersiniz. Bu mantık step motorlarımız için de geçerli.

Ayrıca sürücümüz üzerinde SLP (sleep= uyku) pinimiz var. Bu pin VDD pinimize direkt olarak bağlıdır. VDD pini eğer lojik 0 ise sürücümüz otomatik olarak uyku moduna geçmiş oluyor. Sürücümüzü sürekli açık tutmamamızın, motor kullanılmadığı zaman uyku moduna almamızın sebebi ise sürücünün aşırı ısınmasını engellemek.

Arduino ile Otomatik Stor Perde Kodları

#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

int dirPin = 7;    //drv8825 pinleri
int stepPin = 8;
int powER = 6;     //uyku modu için güç pinimiz

#include <AccelStepper.h>
#define motorInterfaceType 1 // Stepper motorlar için burası 1 olmalı
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
int RECV_PIN = 11; //IR pini

IRrecv irrecv(RECV_PIN);
decode_results results;

#define CH1 0x3D9AE3F7 //yukarı (kanal kodunu değiştirmeyi unutmayın)
#define CH2 0x1BC0157B //aşağı (kanal kodunu değiştirmeyi unutmayın)

void setup()
{
  Serial.begin(9600); 
  irrecv.enableIRIn();

  pinMode(dirPin, OUTPUT);
  pinMode(6, OUTPUT);

  pinMode(stepPin, OUTPUT);

  stepper.setMaxSpeed(2500); // hızı ayarladık
  stepper.setAcceleration(500); // ivmeyi ayarladık
}

void loop() {
  if (irrecv.decode(&results))
  {
    Serial.println(results.value, HEX); // kanal kodunu seri ekrana yazdırdık

    if (results.value == CH1)
    {
      digitalWrite(6, HIGH);
      stepper.moveTo(230000);  //230000 değeri NEMA17 ve 16 mikrostep ayarında 1.5 metreye denk gelmektedir.
      stepper.runToPosition();
      delay(100);
      digitalWrite(6, LOW);
    }

    if (results.value == CH2)
    {
      digitalWrite(6, HIGH);
      stepper.moveTo(0);
      stepper.runToPosition();
      delay(100);
      digitalWrite(6, LOW);
    }

    irrecv.resume();
  }
}

Kodumuz ilk önce IR iletişim ve step motor sürmek için gerekli olan kütüphaneleri eklemekle başlıyor. Bu kütüphaneler Arduino IDE içerisininde hazır olarak gelmiyor. IRemote ve Accelstepper kütüphanelerini ilgili linklerden .ZIP uzantılı olarak indirerek kurabilirsiniz.

Daha sonra DIR, STEP, uyku moduna geçmek için kullandığımız VDD pinlerinin ve alıcımızın OUT pininin nereye bağlı olduğunu yazıyoruz. Daha sonra kumandamızda perdemizi yukarı ve aşağı çekmek için  kullanacağımız tuşları tanıtıyoruz. Eğer tuşların kod karşılığını bilmiyorsanız kodu arduinoya yükleyin ve seri haberleşme ekranından kumandanızda tuşa bastığınızda o tuşa karşılık gelen HEX kodunu görün.

Setup kısmına geldiğimizde ilk önce serial porttan kumandamızın tuşlarının kodlarını görebilmek için seri haberleşmeyi 9600 baudrate de başlatıyoruz. Daha sonra pinlerimizin modlarını ayarlıyoruz ve step motorumuz için hız ve ivme ayarı yapıyoruz.

Loop kısmında ise ilk önce kumandadan veri geliyor mu diye kontrol ediyor, eğer geliyorsa onun HEX kodunu yazdırıyor ve gelen veri bizim tanımladığımız kanallardan biri ise gerekli işlemi yaptırıyoruz. Örneğin kumandamızda CH1 i tanıttığımız tuşa basmış olalım. İlk önce VDD yani 6. pinimizi aktif ediyoruz ki sürücümüz uyku modundan çıksın. Daha sonra gitmesi gereken adım sayısını motorumuza söyleyip işi tamamladığında ise 0.1 saniyelik bir bekleme yapıp sonra tekrar 6. pini inaktif ediyoruz ki motorumuz tekrar uyku moduna geçsin ve aşırı ısınmasın. En sonda ise IR okumayı bitiriyoruz, kodumuz loop kısımı tekrar dönmeye başlıyor ve arduinomuzu kumandadan veri gelmesini bekler pozisyona getirmiş oluyoruz.

Proje ile İlgili Karşılaşabileceğiniz Sorunlar

1.Motor Hiç Hareket Etmiyor

  • Bağlantıları doğru yaptığınızdan ve parçalarınızın bozuk olmadığından emin olun.
  • VMT pinine verilen voltajı artırmayı deneyin.
  • Sürücünüzün üstünde bulunan küçük potansiyometreden akım ayarını kontrol edin.
  • Motor kablolarını kontrol edin.

2.Motor Çalışıyor ama Takılıyor

  • Çok büyük ihtimalle motorun kablolarını sürücüye yanlış taktınız
  • Motorunuz unipolar ise bipolar moda doğru geçirdiğinize emin olun

3.Motor Çok Isınıyor

  • Sürücünüzün üstündeki potansiyometreden akımı çok az kısın, fazla kısarsanız motorunuz perdeyi çekerken adım kaçırmaya başlar.
  • Eğer akımı doğru ayarladığınızı düşünüyorsanız VMT pininin voltajını artırın (MT3608 kullanabilirsiniz)

4.Motor Tek Başınayken Dönüyor ama Perdeyi Çekemiyor

  • Sürücünüzdeki potansiyometreden akımı artırabilirsiniz
  • Eğer a şıkkı çözüm olmadıysa VMT pinine verdiğiniz voltajı artırın

5.IR Alıcı Gelen Veriyi Okumuyor

  • Eğer alıcıdan çok uzaktaysanız veya kumandayı alıcıya doğru tutmuyorsanız böyle bir durumla karşılaşabilirsiniz.

İyi çalışmalar dilerim…

#ProjeBaşlasın

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz