Arduino , DC motor ve Ultrasonic Sensör ile hemzemin geçit sistemi
  • Arduino ile hemzemin geçit projem var ancak yazılımsal olarak bazı sorunlarım var Kod aşağıdaki gibi ama sürekli sensörden değer okunduğundan moror çalışmaya devam ediyor ,yatay konuma yada dikey konuma geçtikten sonra aynı değeri okusa bile bariyerin sabit kalması sağlamam lazım. Yardımcı olursanız sevinirim.


    int sure;
    int mesafe;
    int DonmeHizi = 175;


    const int INPUT1 = 7;
    const int INPUT2 = 6;

    /*
    Motor sürücüsünün üzerinde INPUT1,INPUT2,INPUT3,INPUT4
    pinleri mevcut bunlar motorun dönüş yönünü belirler ,
    INPUT1 ve INPUT2 1.motora , INPUT3 ve INPUT4 2.motora aittir
    , ki sizde 1 motor olduğundan INPUT1,INPUT2 yi kullanın
    mesela INPUT1 HIGH ve INPUT2 LOW ise motor sağa döner
    tersinde ise sola döner anladınız siz onu
    */

    const int motorEnable = 8;

    const int trigger_pin =13;
    const int echo_pin =12;
    const int kled =3;
    const int sled =4;
    const int yled =5;

    void bariyer_dik(int hiz){
    analogWrite(motorEnable, hiz);
    digitalWrite(INPUT1,HIGH); /* sağa dönme sağlanıyor */
    digitalWrite(INPUT2,LOW);
    }

    void bariyer_yatay(int hiz){
    analogWrite(motorEnable, hiz);
    digitalWrite(INPUT1,LOW); /* sola dönme sağlanıyor */
    digitalWrite(INPUT2,HIGH);
    }
    void dur()
    {
    /* motor kitlenerek durma sağlanıyor */
    digitalWrite(INPUT1, HIGH);
    digitalWrite(INPUT2, HIGH);

    }

    void setup() {
    /* motorları kontrol eden pinler çıkış olarak ayarlanıyor */
    pinMode(INPUT1 ,OUTPUT);
    pinMode(INPUT2 ,OUTPUT);
    pinMode(motorEnable ,OUTPUT);

    pinMode(kled ,OUTPUT);
    pinMode(sled ,OUTPUT);
    pinMode(yled ,OUTPUT);
    pinMode(trigger_pin ,OUTPUT);
    pinMode(echo_pin ,INPUT);
    Serial.begin(9600);

    }

    void loop()
    {
    digitalWrite(trigger_pin , HIGH);
    delayMicroseconds(1000);
    digitalWrite(trigger_pin , LOW);
    sure =pulseIn(echo_pin , HIGH);
    mesafe = (sure/2) /28.5;


    if (mesafe <= 10 ) <br />
    {

    digitalWrite(sled ,HIGH);
    delay(10);
    digitalWrite(sled ,LOW);
    digitalWrite(yled ,LOW);
    digitalWrite(kled ,HIGH);
    delay(100);
    /*
    bu süreyi ayarlayın ışık yanınca pat diye kapatmasın bariyeri biraz
    gecikme zamanı verin
    */
    bariyer_yatay(DonmeHizi);
    delay(100);
    /*
    buradan ayarlayın motor ne kadar hareket edecek
    bariyer dik konumdan yatay konuma ne kadar sürede geçiyor aynı
    süreyi yatay konumdan dik konuma geçiş içinde kullanın
    */
    dur();


    }


    if (mesafe >= 10 && mesafe <=25 )<br /> {

    digitalWrite(sled ,HIGH);
    digitalWrite(yled ,LOW);
    digitalWrite(kled ,LOW);
    delay(10);
    /*
    buraya herhangi bir motor hareketi koymadım sarı ışıkta
    yansın sadece
    */

    }

    if ( mesafe >=25 )
    {


    digitalWrite(sled ,LOW);
    digitalWrite(yled ,HIGH);
    digitalWrite(kled ,LOW);
    delay(10);

    bariyer_dik(DonmeHizi);
    delay(100); /*
    bariyer yataydan dik konuma geçiyor
    */
    dur();


    }

    }
  • Ben tam olarak anlamadım. Bir bariyeri ultrasonik sensörle açıp kapatmak mı istiyorsun ?
  • barıyer tepedeyken bir stop anahtarı koy oraya dayandıgında motor surmeyı kesersın yada tepe noktaya gelene kadar sureyı olc o sureye gelınce motor surmeyu durdur.
  • ekmekci 8:10AM --evet ultrasonik sensör treni algılayıp bariyerin hareketini kontrol edecek.
    okoman 11:27AM--2.dediğinizi yapmaya çalışıyorum limitswitch v.s kullanmadan.. hocam sıkıntı yine devam edecek sensör yine değer okuyacağından komut tekrar çalışacak mesela mesafenin 10 ile 25 arasında olduğunda sürekli if (mesafe >= 10 && mesafe <=25 ) komut satırını işleyecek ve motoru hareket ettirecek istediğim şey bir kere sensörden dğer okusun eğer aynı aralıktaysa bir kere motoru hareket ettirsin taki mesafe değişene kadar
  • o zaman;

    int kontrolbit=1;

    if (mesafe >= 10 && mesafe <=25 && kontrolbit)<br />{
    kontrolbit=0;
    //işlem
    }
    else kontrolbit=1;

    böylece sensör 10 ile 25 arasında bir değer gördüğünde ifin içerisine girer işlemini yapar ve kontrol bitini 0 yapar bir sonraki döngüde mesafe 10 ile 25 arasında olsa dahi buraya girmez çünkü kontrol biti 0. Ta ki eğer sensör 10 ile 25 arasında birşey görmeyi keserse kontrol biti aktif olur ve bir sonraki 10 ile 25 arasındaki gördüğünde tekrar aynı işlemi yapar
  • @ekmekci anladım hocam bunu denerim birde @okoman hocam stop anahtarı deyince 2 tane limit switch kullandım ben yataya ve dikeye olmak üzere ama yine sıkıntı var çalışmasında ama nerede bulamıyorum


  • 2 limitswitch ile hemzemin geçit sistemi çalışır duruma getirildi ve bu küçük ama mütevazi proje belki birilerine başlangıç , fikir olur diye çalışan kodu paylaşaraktan konuyu kapatıyorum.Yardım için yorum yapanlara teşekkürler.


    ////////////////////////////////////////////////////////////////////

    int sure;
    int mesafe;
    int DonmeHizi = 175;


    const int INPUT1 = 7;
    const int INPUT2 = 6;

    /*
    Motor sürücüsünün üzerinde INPUT1,INPUT2,INPUT3,INPUT4
    pinleri mevcut bunlar motorun dönüş yönünü belirler ,
    INPUT1 ve INPUT2 1.motora , INPUT3 ve INPUT4 2.motora aittir
    , ki sizde 1 motor olduğundan INPUT1,INPUT2 yi kullanın
    mesela INPUT1 HIGH ve INPUT2 LOW ise motor sağa döner
    tersinde ise sola döner anladınız siz onu
    */
    int limit_dik = A0; /* üstteki limit switch
    */
    int limit_yatay =A1; /* alttaki limit switch
    */
    const int motorEnable = 8;

    const int trigger_pin =13;
    const int echo_pin =12;
    const int kled =3;
    const int sled =4;
    const int yled =5;

    void bariyer_dik(int hiz){
    analogWrite(motorEnable, hiz);
    digitalWrite(INPUT1,HIGH); /* sağa dönme sağlanıyor */
    digitalWrite(INPUT2,LOW);
    }

    void bariyer_yatay(int hiz){
    analogWrite(motorEnable, hiz);
    digitalWrite(INPUT1,LOW); /* sola dönme sağlanıyor */
    digitalWrite(INPUT2,HIGH);
    }

    void dur()
    {
    /* motor kitlenerek durma sağlanıyor */
    digitalWrite(INPUT1, HIGH);
    digitalWrite(INPUT2, HIGH);

    }

    void setup() {
    /* motorları kontrol eden pinler çıkış olarak ayarlanıyor */
    pinMode(INPUT1 ,OUTPUT);
    pinMode(INPUT2 ,OUTPUT);
    pinMode(motorEnable ,OUTPUT);

    pinMode(limit_dik, INPUT); // A0 pin
    pinMode(limit_yatay, INPUT); // A1 pin

    pinMode(kled ,OUTPUT);
    pinMode(sled ,OUTPUT);
    pinMode(yled ,OUTPUT);
    pinMode(trigger_pin ,OUTPUT);
    pinMode(echo_pin ,INPUT);
    Serial.begin(9600);

    }

    void loop()
    {
    digitalWrite(trigger_pin , HIGH);
    delayMicroseconds(1000);
    digitalWrite(trigger_pin , LOW);
    sure =pulseIn(echo_pin , HIGH);
    mesafe = (sure/2) /28.5;


    if ( mesafe <= 10 && digitalRead(limit_yatay) == LOW ) <br />
    {

    digitalWrite(sled ,HIGH);
    delay(100);
    digitalWrite(sled ,LOW);
    digitalWrite(yled ,LOW);
    digitalWrite(kled ,HIGH);

    /*
    bu süreyi ayarlayın ışık yanınca pat diye kapatmasın bariyeri biraz
    gecikme zamanı verin
    */
    int a;
    for (a = 0; a < 30000; a++) {
    bariyer_yatay(DonmeHizi);

    if ( digitalRead(limit_yatay) == HIGH ) {
    dur();
    break;
    }
    }
    }


    if ( mesafe >= 10 && mesafe <=25 )<br /> {

    digitalWrite(sled ,HIGH);
    digitalWrite(yled ,LOW);
    digitalWrite(kled ,LOW);
    delay(100);
    /*
    buraya herhangi bir motor hareketi koymadım sarı ışıkta
    yansın sadece
    */

    }

    if ( mesafe >=25 && digitalRead(limit_dik) == LOW )
    {

    digitalWrite(sled ,LOW);
    digitalWrite(yled ,HIGH);
    digitalWrite(kled ,LOW);

    int b;
    for (b = 0; b < 30000; b++) {

    bariyer_dik(DonmeHizi);

    if (digitalRead(limit_dik) == HIGH) {
    dur();
    break;
    }
    }
    }
    }

    //////////////////////////////////////////////////////////////////

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.