IR Kumanda ile PWM DC motor kontrol

Endormax

Üye
Katılım
26 Ara 2016
Mesajlar
9
Puanları
1
Yaş
44
Herkese Merhaba ,

Bir adet DC motor u remote kumanda ile kontrol etmek isiyorum. Daha önce bulduğum bir link üzerinden serial monitor kullanarak motor un hızını ayarlayabiliyorum.

https://resultuzen.com.tr/blog/index.php/2021/04/11/vnh2sp30-motor-surucu-kullanimi/

Burada yazılı kodlar ile sağlıklı şekilde yapabiliyorum. Ben serai monitor de manuel yazma ile değilde çok uygun olan irremote modulu ile yapmak istiyorum. Bunun içinde aşağıdaki video dan faydalandım.


Aslında amacım bu iki kodu birleştirmek serial monitorde 5 veya 6 ile motoru yavaşlatıp hızlandırmak yerine kumandanın tuşları ile yapmak istiyorum. Okuduğum kadarıyla uzaktan kumanda ile pwm kontrollü yapılmıyor aslında ben araya sadece bu kumandan gelen hex kodlarını serial monitor de manuel girdiğim tuşlar yerine kullanmak isiyorum.

Kendimce bir kod hazırladım burada motor u kapatıp açabiliyorum veya sağa sola döndürebiliyorum ama pwm tarafında çalışmıyor. Motor %50 ile başlıyor 2.5 V kumandanın yukarı okuna bastığımda serial monitor de değerin arttığını görüyorum ama çıkış voltajı hiç değişmiyor.

Çok yetkin değilim ardunio konusunda bir yerde gözden kaçırdığım bir şey olduğunu düşünüyorum. Bu konuda yardımcı olabilecek var ise çok sevinirim.

Son oluşturduğum ardunio kodu unu dosya bölümüne ekliyorum.

Şimdiden çok teşekkür ederim.
 

Ekli dosyalar

  • VNH2SP30_kumanda_v05.zip
    753 bayt · Görüntüleme: 7
Şu kodları buraya yapıştırsanız da indirmek zorunda kalmasak ne güzel olur. Aşağıdaki gibi hiz fonksiyonlarının sonuna analogWrite eklemen lazım ki pwm değeri değişsin.

C++:
//#include <IRremote.h>
#include <IRremote.hpp>

int kumandaPin = 2;
int motorAcmaPini = 8;
int motorA1Pini = 9;
int motorB1Pini = 10;
int motorHizPini = 11;
int motorAkimOlcmePini = A0;

IRrecv kumanda(kumandaPin);
decode_results sonuclar;

short motorHizi = 50;

void setup()
{
  kumanda.enableIRIn();
  pinMode(motorAcmaPini, OUTPUT);
  pinMode(motorA1Pini, OUTPUT);
  pinMode(motorB1Pini, OUTPUT);
  pinMode(motorHizPini, OUTPUT);
  pinMode(motorAkimOlcmePini, INPUT);
  Serial.begin(9600);
}
 
void loop()
{
  while (kumanda.decode(&sonuclar))
  {
    Serial.print("Tuş kodu: ");
    Serial.println(sonuclar.value, HEX);
    kumanda.resume();

    digitalWrite(motorAcmaPini, HIGH);

    if(sonuclar.value == 0xFFA25D)
    {
      digitalWrite(motorA1Pini, LOW);
      digitalWrite(motorB1Pini, HIGH);
    }
    if(sonuclar.value == 0xFF629D)
    {
      digitalWrite(motorA1Pini, HIGH);
      digitalWrite(motorB1Pini, LOW);
    }
     if(sonuclar.value == 0xFFB04F)
    {
      digitalWrite(motorA1Pini, LOW);
      digitalWrite(motorB1Pini, LOW);
      digitalWrite(motorAcmaPini, LOW);
    }
    if(sonuclar.value == 0xFF18E7)
    {
      hiziArtir();
    }
    if(sonuclar.value == 0xFF4AB5)
    {
      hiziAzalt();
    }

  }

  delay(100);
}

void hiziArtir()
{
  motorHizi = motorHizi + 10;

  if (motorHizi > 100)
  {
    motorHizi = 100;
  }

  Serial.print("Motor Speed: %");
  Serial.println(motorHizi);
 analogWrite(motorHizPini, round(motorHizi * 2.55));
}

void hiziAzalt()
{
  motorHizi = motorHizi - 10;

  if (motorHizi < 0)
  {
    motorHizi = 0;
  }

  Serial.print("Motor Speed: %");
  Serial.println(motorHizi);
  analogWrite(motorHizPini, round(motorHizi* 2.55));
}

void motoraGonder (short hedefYon, short hedefHiz)
{
      
 
 analogWrite(motorHizPini, round(hedefHiz * 2.55));
}
 
Şu kodları buraya yapıştırsanız da indirmek zorunda kalmasak ne güzel olur. Aşağıdaki gibi hiz fonksiyonlarının sonuna analogWrite eklemen lazım ki pwm değeri değişsin.

C++:
//#include <IRremote.h>
#include <IRremote.hpp>

int kumandaPin = 2;
int motorAcmaPini = 8;
int motorA1Pini = 9;
int motorB1Pini = 10;
int motorHizPini = 11;
int motorAkimOlcmePini = A0;

IRrecv kumanda(kumandaPin);
decode_results sonuclar;

short motorHizi = 50;

void setup()
{
  kumanda.enableIRIn();
  pinMode(motorAcmaPini, OUTPUT);
  pinMode(motorA1Pini, OUTPUT);
  pinMode(motorB1Pini, OUTPUT);
  pinMode(motorHizPini, OUTPUT);
  pinMode(motorAkimOlcmePini, INPUT);
  Serial.begin(9600);
}
 
void loop()
{
  while (kumanda.decode(&sonuclar))
  {
    Serial.print("Tuş kodu: ");
    Serial.println(sonuclar.value, HEX);
    kumanda.resume();

    digitalWrite(motorAcmaPini, HIGH);

    if(sonuclar.value == 0xFFA25D)
    {
      digitalWrite(motorA1Pini, LOW);
      digitalWrite(motorB1Pini, HIGH);
    }
    if(sonuclar.value == 0xFF629D)
    {
      digitalWrite(motorA1Pini, HIGH);
      digitalWrite(motorB1Pini, LOW);
    }
     if(sonuclar.value == 0xFFB04F)
    {
      digitalWrite(motorA1Pini, LOW);
      digitalWrite(motorB1Pini, LOW);
      digitalWrite(motorAcmaPini, LOW);
    }
    if(sonuclar.value == 0xFF18E7)
    {
      hiziArtir();
    }
    if(sonuclar.value == 0xFF4AB5)
    {
      hiziAzalt();
    }

  }

  delay(100);
}

void hiziArtir()
{
  motorHizi = motorHizi + 10;

  if (motorHizi > 100)
  {
    motorHizi = 100;
  }

  Serial.print("Motor Speed: %");
  Serial.println(motorHizi);
 analogWrite(motorHizPini, round(motorHizi * 2.55));
}

void hiziAzalt()
{
  motorHizi = motorHizi - 10;

  if (motorHizi < 0)
  {
    motorHizi = 0;
  }

  Serial.print("Motor Speed: %");
  Serial.println(motorHizi);
  analogWrite(motorHizPini, round(motorHizi* 2.55));
}

void motoraGonder (short hedefYon, short hedefHiz)
{
     
 
 analogWrite(motorHizPini, round(hedefHiz * 2.55));
}
Çok teşekkür ederim kusura bakmayın bir dahaki sefere hızlıca kodları yapıştıracağım.
Tekrar kontrol ettim bu şekilde şöyle bir sorun oluyor Hex kodları sürekli değiştiriyor ve bu sefer bir kaç arttırmak için tuşa basdığımda her seferinde yeni bir kod geliyor çalışmıyor.

analogWrite(motorHizPini, round(motorHizi * 2.55)); HEX kodunu alıp 2.55 ile çarmaya çalışıyor.

Aşağı ve yukarı ok tuşlarına bastığım zaman aşağıdaki gibi bir çıktı geliyor.

23:36:26.679 -> Tuş kodu: FF18E7
23:36:26.679 -> Motor Speed: %60
23:36:30.302 -> Tuş kodu: 3D9AE3F7
23:36:33.080 -> Tuş kodu: 3D9AE3F7
23:36:34.896 -> Tuş kodu: 3D9AE3F7
23:36:36.788 -> Tuş kodu: 1BC0157B
23:36:37.782 -> Tuş kodu: 1BC0157B
23:36:38.605 -> Tuş kodu: 1BC0157B
23:36:40.479 -> Tuş kodu: 1BC0157B
23:36:42.600 -> Tuş kodu: 3D9AE3F7
23:36:45.278 -> Tuş kodu: 3D9AE3F7
23:36:46.206 -> Tuş kodu: 1BC0157B
23:36:47.392 -> Tuş kodu: 1BC0157B
23:36:48.994 -> Tuş kodu: 3D9AE3F7
 
Son düzenleme:
Her seferinde yeni bir kod gelimiyor orda iki tane 32 bitlik sayı var birisi yukarı birisi aşağı tuşunun değeri.
0xFF18E7 değerinin yerine 0x3D9AE3F7 veya 0x1BC0157B koy birisi uyacaktır.
 
Tekrar denedim ama bu sefer hiç tepki vermiyor çünkü ilk bastığımda eski hex kodu alıyor bunun yerine veya operatoru kullanayım diye düşündüm aşağıdaki gibi ama gene motor hızını yükseltmiyor veya düşürmüyor bir kaç kez basında motor voltajı 0 a iniyor ve sonra hiç bir kumanda tuşu çalışmıyor.

//#include <IRremote.h>
#include <IRremote.hpp>

int kumandaPin = 2;
int motorAcmaPini = 8;
int motorA1Pini = 9;
int motorB1Pini = 10;
int motorHizPini = 11;
int motorAkimOlcmePini = A0;

IRrecv kumanda(kumandaPin);
decode_results sonuclar;

short motorHizi = 50;

void setup()
{
kumanda.enableIRIn();
pinMode(motorAcmaPini, OUTPUT);
pinMode(motorA1Pini, OUTPUT);
pinMode(motorB1Pini, OUTPUT);
pinMode(motorHizPini, OUTPUT);
pinMode(motorAkimOlcmePini, INPUT);
Serial.begin(9600);
}

void loop()
{
while (kumanda.decode(&sonuclar))
{
Serial.print("Tuş kodu: ");
Serial.println(sonuclar.value, HEX);
kumanda.resume();

digitalWrite(motorAcmaPini, HIGH);

if(sonuclar.value == 0xFFA25D || sonuclar.value == 0xE318261B)
{
digitalWrite(motorA1Pini, LOW);
digitalWrite(motorB1Pini, HIGH);
}
if(sonuclar.value == 0xFF629D || sonuclar.value == 0x511DBB)
{
digitalWrite(motorA1Pini, HIGH);
digitalWrite(motorB1Pini, LOW);
}
if(sonuclar.value == 0xFFB04F || sonuclar.value == 0xF0C41643)
{
digitalWrite(motorA1Pini, LOW);
digitalWrite(motorB1Pini, LOW);
digitalWrite(motorAcmaPini, LOW);
}
if(sonuclar.value == 0xFF18E7 || sonuclar.value == 0x3D9AE3F7 )
{
hiziArtir();
}
if(sonuclar.value == 0xFF4AB5 || sonuclar.value == 0x1BC0157B )
{
hiziAzalt();
}

}

delay(100);
}

void hiziArtir()
{
motorHizi = motorHizi + 10;

if (motorHizi > 100)
{
motorHizi = 100;
}

Serial.print("Motor Speed: %");
Serial.println(motorHizi);
analogWrite(motorHizPini, round(motorHizi * 2.55));
}

void hiziAzalt()
{
motorHizi = motorHizi - 10;

if (motorHizi < 0)
{
motorHizi = 0;
}

Serial.print("Motor Speed: %");
Serial.println(motorHizi);
analogWrite(motorHizPini, round(motorHizi * 2.55));

}

void motoraGonder (short hedefYon, short hedefHiz)
{


analogWrite(motorHizPini, round(hedefHiz * 2.55));
}
 
C++:
kumanda.resume();

komutunu bulunduğu if bloğunun sonuna indir. aldığın kumanda kodunu işlemeden sıradakini istiyorsun o yüzden bir sonrakiyle birleştirip veriyor.
 
yok bu şekilde hiç bir tepki vermemeye başladı. Serial monitor hiç bir çıktı gelmiyor.
 
Bence yanlış yere yazdın. Onun sonda veya başta olması çalışmayı etkilemez sadece motoru etkiler.
 

Forum istatistikleri

Konular
128,133
Mesajlar
915,308
Kullanıcılar
449,850
Son üye
umutbaysal9

Yeni konular

Geri
Üst