Mobil Dünya

Sen de Birşeyler Yap! (2)

Geçen yazımda, Arduino ve Bluetooth kullanarak motorları nasıl hareket ettireceğimizi anlatmıştım. Şimdi bu yaptığımız işi telefonla kontrol edebileceğimiz uzaktan kumandalı araba şekline döndürelim. Araba yaparken bir Android uygulaması yapacak, Arduino programlayacak ve bir mekanik tasar...

Halil Keskin |

10.03.2015

Geçen yazımda, Arduino ve Bluetooth kullanarak motorları nasıl hareket ettireceğimizi anlatmıştım. Şimdi bu yaptığımız işi telefonla kontrol edebileceğimiz uzaktan kumandalı araba şekline döndürelim.

Araba yaparken bir Android uygulaması yapacak, Arduino programlayacak ve bir mekanik tasarım yapacağız. Bu bölümlere başlamadan önce belirtmeliyim ki zaman zaman mekanik ve yazılımsal birçok problem ortaya çıkacak. Ne hatanın sebebini ne de nasıl çözeceğiniz konusunda çoğu zaman fikriniz olmayacak, deneme yanılma yöntemiyle ilerleyebileceksiniz.

Projeye başlamak için ihtiyaç listemiz aşağıdaki gibi:

  • Herhangi bir model Arduino mikrodenetleyici
  • 4+ üstü sürüme sahip bir Android cihaz
  • Oyuncak bir araba ya da araba maketi 
  • L293D motor sürücü
  • Güç kaynağı
  • Arduino için HC-5 Bluetooth
  • Bol miktarda kablo (erkek-erkek, dişi-erkek gibi)
  • Biraz sabır :)

Öncelikle sistemin nasıl çalışacağını basit bir akış diyagramı ile anlatayım.

Görüldüğü gibi Android cihazda kullanıcı komutları vererek bunları Bluetooth aracılığıyla arabaya yönlendirmekte. Aracın üzerindeki Bluetooth modülü bu gelen davranış talepleri Arduino ile motorlara iletip, aracın kontrolü sağlanıyor. Şimdi projenin ayaklarını teker teker ele alalım.

 

Android tarafında yapılması gerekenler

Uygulama biraz karmaşık olduğu için daha çok pseudo kodlar ve akış diyagramlarıyla çalışma mantığını anlatacağım. Geliştirme kısmında aklınıza takılanlar olursa, GitHub üzerinden yazarsanız elimden geldiğince cevaplamaya çalışırım. Uygulama tilt control ve tuş kontrol ile çalışacak.

Tilt Control için akış diyagramı 

Pseudo kod:

[code]
open accelometer;
        sensorvules= take_values(accelometer); 
    
        control bluetooth;
        phone_position_x= take (phone_position);
        phone_position_y= take (phone_position);
        
        x_axes_value=(phone_position_x * max_pwn_value/tilt_pivot; //sag sol
        y_axes_value=(phone_position_y * max_pwn_value/tilt_pivot; //ileri geri
                
        if(x_axes_value > max_pwn_value)
           x_axes_value = max_pwn_value         //tilt left
        else
            if(x_axes_value < -max_pwn_value)
                x_axes_value = -max_pwn_value   // tilt right

        if(y_axes_value > max_pwn_value)
            y_axes_value = max_pwn_value;       //tilt forward
        else
            if(y_axes_value < -max_pwn_value)
                y_axes_value = -max_pwn_value;        //tilt backward 
            else
                if(y_axes_value >= 0 && y_axes_value < yThreshold)
                    y_axes_value=0;

                else                                        //y axes value between zero and threshold
                    if (y_axes_value < 0 && y_axes_value > -yThreshold) 
                        y_axes_value = 0;

        
        if(x_axes_value > 0) {        // car go left,slowdownleft motor
            rightMotor = y_axes_value; //right motor go fullspeed
            if(phone_position_x > x_pivot_point){
                leftMotor = (phone_position_x - x_pivot_point)* max_pwn_value/
                                                                      (x_axes_limit - x_pivot_point);
                leftMotor = -motorLeft * y_axes_value/max_pwn_value);
            }
            else 
            leftMotor = y_axes_value - y_axes_value * x_axes_value/max_pwn_value;
        }

        else if(x_axes_value < 0) {        // saga tilt sag motor yavaşlar
            motorLeft = y_axes_value;
            if(phone_position_x > x_pivot_point){
                rightMotor = (phone_position_x - x_pivot_point)* max_pwn_value/(x_axes_limit - x_pivot_point);
                rightMotor = -motorLeft * y_axes_value/max_pwn_value);
            else 
            rightMotor = y_axes_value - y_axes_value*x_axes_value/max_pwn_value;
        }
        else if(xAxis == 0) { //go directly
            motorLeft = y_axes_value;
            motorRight = y_axes_value;
        }
        
        if(motorLeft > 0) {            // tilt to backward
            directionLeft = "-";
        }      
        if(motorRight > 0) {        // tilt to backward 
            directionRight = "-";
        }
                 
        if(motorLeft > max_pwn_value) 
            motorLeft = max_pwn_value; //değerleri maxta tut
        if(motorRight > max_pwn_value)
            motorRight = max_pwn_value; //değerleri maxta tut
                
        sent_left_commmand = directionL+leftMotor;
        sent_right_command = directionR+rightMotor;
        
       if (Bluetooth connect)
            send(sent_left_commmand, sent_right_commmand)
    }[/code]

Tilt control ivme ölçer sensorünü kullanarak kullanıcının hareketlerine göre yapmak istediği davranışı belirtmektedir. Cihazınızı direksiyon gibi kullanacaksınız.

Projeye https://github.com/sercesh/Arduino_Car_Android-Uygulamas- adresinden erişebilirsiniz. 

(Projeye destek verirseniz çok memnun olurum)

 

Arduino tarafında yapılması gerekenler

Arduino üzerinde yapmanız gereken bağlantı tablosunu ve kodu bu bölümde vereceğim. Arduino tarafındaki kod çok karmaşık değil. İşleyiş şemasını aşağıda kısaca özetliyorum:

Alınan sinyaller mantıklı hale getirilip kontrol fonksiyonuyla motor sürücüye gönderilerek motorların dönmesi sağlanıyor. Sağa sola dönüşlerde difransiyelli bir sistem kullanmadığımız için dönüşlerin nasıl olduğu biraz kafa karışıklığına sebep olabiliyor. Biz motorların dönüş yönlerini kullanılarak dönüşleri gerçekleştiriyoruz. Örneklemek gerekirse, sağa dönüş için sağ taraftaki motorlar pozitif yönde dönerken; sol taraftaki motor negatif yönde dönüyor. Bu da aracın kolay bir şekilde dönüş yapabilmesini sağlıyor.

Kodu https://github.com/sercesh/arduino_car_arduino_code adresinden indirebilirsiniz.

Elektronik tasarım ise aşağıdaki şemadan görülebilir:

Özetle Bluetooth'un RX'ini Arduino'nun TX'ine, Bluetooth'un TX'ini Arduino'nun RX'ine bağladıktan sonra 2, 3, 4, 5 numaralı pinleri motor sürücüye göre bağlıyorsunuz.

Şimdiden keyifli sürüşler :)

Halil Keskin |

10.03.2015

Yorumlar

Hakan Dursun
08.01.2016 - 01:28

parçaları nasıl ve nereden temin edebiliriz yardımcı olursanız sevinirim

Halil Keskin
08.01.2016 - 03:03

Hocam selam,

robotistan, robot kutusu gibi internet sitelerinde parçaların çoğu var, istersen karaköydeki elektronikçiler çarşısında da bulabilirsin.

gkhnyldz
11.08.2015 - 05:14

Yapmaya başladım ama fiyatlardan dolayı çin den malzeme bekleyeceğim ve diğer bir sorun bluetooth la bağlantı sağladığımızdan veri geç ulaşır kumanda gibi olmaz dedi doğru mu?

 

Taner Gergül
21.03.2015 - 09:08

Çok güzel bir makale olmuş gerçekten böyle çılgın bir proje yapılabilir.