Soru & Cevap

arduino millis ...

06.08.2018 - 03:37

Herkese kolay gelsin arduino ya bağlı bir dc motoru butona basılınca dönsün tekrar basılınca dursun ama toplam 5 sn den fazla dönmesin istiyorum.butona basınca dönüp durmasını sağladım fakat 5 snden fazla dönmemesini sağlayamadım. Yardımlarınızdan dolayı şimdiden teşekür ederim

70 Görüntülenme

6 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user m_mesut_44
m_mesut_44
16.08.2018 - 04:33

hocam kısaca şöyle özetleyeyim hem buton yardımıyla hemde ır ile perdeyi kontrol edeceğim diğer iki buton perdenin tam açıldığında veya tam kapandığında durması içindi fakat bunu beğenmedim asıl sormak istediğimde buydu zaten size perdenin tam açılma süresi örnek veriyorum 10 sn butona bastığımda perde kapanacak örnek 3.sn de tekrar bastığımda duracak bir daha bastığımda 7 sn daha dönecek ve duracak bunun için l293 motor sürücü kullandım. 

picture-158072-1530701953.jpg
TGUNEYSU
16.08.2018 - 11:38

Projenizin ne yapıp nasıl çalışması gerektiğini detaylı yazarsanız yardım daha kolay olur.

IR kontrolle bir şeyi aşağı / yukarı kontrol etmek istiyorsunuz galiba. 

2 motorunuz, 4 butonunuz var.

Neden bir motor yukarı, diğeri aşağı çalıştırıyor? 

Eğer motorları belli bir noktada durdurmak lazımsa neden enkoder kullanmıyorsunuz?

Motorlarınız kontrol kardında mı, yoksa ARDUINO dan direkt mi çalıştırılıyor.

Butonlar nasıl çalışmalı? Neden çalışma ve durdurma butonları değişik ? 

Butonlar basılınca kilitleniyor mu, yoksa yalnız sinyal atıp normal pozisyona mı dönüyorlar?

Motorlar nasıl çalışmalı? Beraber mi, senkronize mi? IR dan mı kontrol edilmeleri gerekiyor ?

IR da BUTON0 tanımlamışsınız ! Ama programda da kullanılmıyor. Bu nedir?

 

Profile picture for user m_mesut_44
m_mesut_44
15.08.2018 - 06:40

hocam bendeki program şöyle sizin yazdığınızla uyarlamaya çalıştım fakat yazamadım


int motor_sag=2;
int motor_sol=3;
int butonsag=4;
int butonsol=5;
int butonsoldur=7;
int butonsagdur=8;
int durumbutonsoldur;
int durumbutonsagdur;
int butondurumsag;
int butondurumsol;
int degersag=0;
int degersol=0;
#include <IRremote.h>
int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN);
decode_results results;

#define BUTON0 0xE0E0E01F
#define YUKARI 0xE0E048B7
#define ASAGI 0xE0E008F7

 

void setup() {
  pinMode(motor_sag,OUTPUT);
  pinMode(motor_sol,OUTPUT);
  pinMode(butonsag,INPUT);
  pinMode(butonsol,INPUT);
  pinMode(butonsoldur,INPUT);
  pinMode(butonsagdur,INPUT);
  Serial.begin(9600);
  irrecv.enableIRIn();
  

}
void motorsag (){
  if(degersag==0)
    {digitalWrite (motor_sag,HIGH);
    digitalWrite (motor_sol,LOW);
    degersag=1;
    delay(400);}
    else if(degersag=1)
    {digitalWrite (motor_sag,LOW);
     digitalWrite (motor_sol,LOW);
     degersag=0;
     delay(400);}
     durumbutonsagdur=digitalRead(butonsagdur);
     if (durumbutonsagdur==1) 
     motordur();
}

void motorsol(){
   if(degersol==0)
   { digitalWrite (motor_sag,LOW);
    digitalWrite (motor_sol,HIGH);
    degersol=1;
    delay(400);}
    else if(degersol=1)
     {digitalWrite (motor_sag,LOW);
     digitalWrite (motor_sol,LOW);
     degersol=0;
     delay(400);}
     durumbutonsoldur=digitalRead(butonsoldur);
     if (durumbutonsoldur==1) 
     motordur();
}
void motordur(){
  digitalWrite (motor_sag,LOW);
  digitalWrite (motor_sol,LOW);
  
}

void loop() {
  butondurumsag=digitalRead(butonsag);
  if (butondurumsag==1)
    {
      motorsag();
    }
 durumbutonsagdur=digitalRead(butonsagdur);
 if (durumbutonsagdur==1)
   {
    motordur();
   }
   durumbutonsagdur=digitalRead(butonsagdur);
   butondurumsag=digitalRead(butonsag);
   if (durumbutonsagdur==1&&butondurumsag==1)
   
   {
    motordur();    
   }
   durumbutonsagdur=digitalRead(butonsagdur);
   butondurumsol=digitalRead(butonsol);
   if (durumbutonsagdur==1&&butondurumsol==1)
   {
    motorsol();
   }
   //----------------sol---------------------
   butondurumsol=digitalRead(butonsol);
  if (butondurumsol==1)
    {
      motorsol();
    }
 durumbutonsoldur=digitalRead(butonsoldur);
 if (durumbutonsoldur==1)
   {
    motordur();
   }
   durumbutonsoldur=digitalRead(butonsoldur);
   butondurumsol=digitalRead(butonsol);
   if (durumbutonsoldur==1&&butondurumsol==1)
   {
    motordur();    
   }
   durumbutonsoldur=digitalRead(butonsoldur);
   butondurumsag=digitalRead(butonsag);
   if (durumbutonsoldur==1&&butondurumsag==1)
   {
    motorsag();
   }

   //------------uzak---------------------
   if (irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);
    if(results.value == YUKARI)
    motorsag();
    delay(10);
    irrecv.resume();
    }


   if (irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);
    if(results.value == ASAGI)
    motorsol();
    delay(10);
    irrecv.resume();
    }
}

Profile picture for user m_mesut_44
m_mesut_44
15.08.2018 - 03:39

ÇOK SAĞOLUN HOCAM ÇOK YARDIMCI OLDUNUZ TEŞEKÜR EDERİM

picture-158072-1530701953.jpg
TGUNEYSU
07.08.2018 - 01:27

Elimde BUTON olmadığından örnek kodu SERI okuyarak yazdım. SERI ye 1 girince BUTON basıldı, 0 girince BUTON basılmadı olarak kabul edin.

LED13 yanınca MOTOR çalışıyor demek. LED13 sönünce MOTOR durdu demek.

İyi çalışmalar. 

 

// TIMER kullanarak DC Kontrolü
#include <TimerOne.h>

const int LEDPin = 13; //LED13 kullan
byte  buton = -1;      // simule buton
volatile byte saniye = 0;
byte motorZamani = 5;
 
void setup() {
  Serial.begin(1200);     //Seri Monitör hız ayarı
  pinMode(LEDPin, OUTPUT);  //LED13 ü çıkış olarak ayarla
  Serial.println("SERI monitorde 'No Line Ending' seçin");
  Serial.println("Buton için 0 veya 1 girin.");
  Timer1.initialize(1000000);
}
 
void loop() {
   
   if (Serial.available()) {
    buton = Serial.read();  // 0 veya 1 okuyacak
    Serial.println(buton);
  
    if (buton == '1') {   
      Serial.println("BUTONa basıldı: DC ON\tLED ON for 5sec");
      LEDon();
      saniye = 0;
      Timer1.attachInterrupt(ISR_1); 
    } 
    else if (buton == '0'){
      Serial.println("BUTONa basıldı: DC OFF\tLED OFF");
      LEDoff();
      Timer1.detachInterrupt();
      saniye = 0;
    }
  }
  if (saniye >= motorZamani){ISR_2();}
}

void ISR_1() {
  saniye++;
}

void ISR_2() {
  // LEDi söndür
    Serial.println("****** TIMER1: 5 saniye oldu - DC OFF\tLED OFF"); 
    LEDoff();
    Timer1.detachInterrupt();
    saniye=0;
}
 
void LEDon() {
  digitalWrite (LEDPin, HIGH);
}
 
void LEDoff() {
  digitalWrite (LEDPin, LOW);
}

 

picture-158072-1530701953.jpg
TGUNEYSU
06.08.2018 - 05:33

Eğer yazdığınız kodu buraya koyarsanz yardımcı olabilirim. 

Bu problem değişik usullerde çözülebilir. Tercih ve bilgi derecenize göre.

Bu kısma yazdığım MILLIS() ve KESME kullanma yazılarına bir göz atın. 

Olmadıysa gene yazın.