Arduino nRF24L01 ile Joystick Kontrollü Araba

Bir önceki yazımda, nRF24L01 modülünü nasıl daha kolay kullanırız ve nasıl toplu veri göndeririz onu anlatmıştım. O yazıyı yazarken aklıma, daha önce Bluetooth ile kontrol ettiğimiz aracımızı acaba nRF24L01 ve Joystick kullanarak kontrol etsem nasıl olur fikri geldi.

Aracım şase olarak zaten elimin altında duruyordu. O yüzden aracı nasıl yaptığımı bu yazıda anlatmayacağım. Aracın yapımına ve kodlara L298N Motor Sürücü Entegresi Kullanımı yazımdan ulaşabilirsiniz. Ben sadece aracın bağlı olduğu Arduino’ya bir adet modül ekledim. Diğer tarafta ise yine bir Arduino ve bir Joystick Shield kullandım. Joystick shield’in buton pinleri arka tarafında yazıyor, bu yüzden direk onları tanımlayarak başladım, ardından verilerini okuma işlemini gerçekleştirdim. Son olarak bu verileri göndereceğim dizi içerisine atarak gönderme işlemini yaptım.

Alıcı tarafında ise yapılan tek değişiklik motorların hızının gelen verilerdeki joystick verilerine göre değiştirilmesi oldu. O yüzden onu da kolaylıkla anlayacaksınızdır. Tabi joystick shield’den gelen verilerin tamamını okuyarak daha çok çeşitli şeyler yapılabilir ama ben şu an sadece örnek olması bakımından hız kontrolünü gerçekleştirdim.  Sorularınızı yorum olarak belirtirseniz elimden geldiği kadar yardımcı olmaya çalışacağım.

Kodların tamamına Github profilim üzerinden ulaşabilirsiniz.

Verici Modül Kodları:

https://gist.github.com/a74d2b6c892fc1356daa9e69db2d87b6

Alıcı Modül Kodları:

https://gist.github.com/f51be7950b2cc8187e4626151a7840bf

Arduino nRF24l01 Kablosuz Haberleşme

Arduino ile kablosuz haberleşme üzerine çalışmalar yapıyorum ve bir projemde her hangi bir ağa bağlanmadan, sadece 2 cihaz arasında (2 Arduino) haberleşmeyi sağlamam gerekti ve bunun için en uygun modülün nRF24l01 olduğuna karar verdim. Ama yaşadığım başka bir sıkıntı vardı, göndermem gereken verileri sadece karakter olarak gönderebiliyordum.

Bu sorunu çözmek için uzun araştırmalar yaptım. Ama modülün kendi örnekleri ve modül hakkında yazılan blog yazıları hem göndermem gereken mesajı bir ‘integer’ dizi olarak göndermiyor, hem de karmaşık yollar ile çözüme gitmeye çalışıyor ve bu benim işime yaramıyordu. O yüzden, okuması ve kullanması oldukça basit ve tek seferde birden fazla veriyi – tipi (int, float…) önemli değil – bir dizi halinde göndererek 2 modül arasında haberleşmeyi sağlayabileceğimiz bir hale getirdim.

Modülleri, alıcı ve verici için aynı şekilde bağlıyoruz.

Arduino nRF24L01 Modülü Bağlantısı
(Görsel: Turkcell Geleceği Yazanlar)

Bunu için öncelikle gerekli olan RF24 kütüphanesini kurmanız gerekiyor. (Kütüphaneye, Github sayfamdan ulaşabilirsiniz.)

Kodların içerisine gerekli olan açıklama satırlarını eklediğim için ayrıntılı olarak buradan açıklamayacağım.

Kodlara ve kütüphaneye Github profilim üzerinden ulaşabilirsiniz. Yaşadığınız sorunları yorum olarak belirtirseniz elimden geldiği kadar yardımcı olmaya çalışacağım.

Verici Modülünün Kodları:

https://gist.github.com/ea473be9404efc4b1b1eb7165926647a

Alıcı Modülünün Kodları:

https://gist.github.com/2aebd28bb2eda0ed538c02029565b8b3

Arduino ile Araba Kontrol Kütüphanesi

Daha önce L298N entegresinin nasıl kullanıldığını ve Arduino ve Android cihaz kullanarak arabamızı nasıl kontrol edeceğimize dair yazılar yazmıştım. Bu yazımda ise o projeleri biraz daha geliştirip herkesin hemen ve kolaylıkla kullanabileceği bir kütüphane yazdım ve paylaşmak istiyorum.

Kütüphane kullanmamızın avantajları ve dezavantajları olabilir. Avantajlarından bazıları, fonksiyonları tek tek elimizle yazmak yerine hazır olarak ulaşılabilir bir şekilde elde ederiz. Dökümantasyonlarını inceleyerek hangi fonksiyonların ne işe yaradığını öğrenebiliriz. Dezavantajları ise kullandığımız programda sadece bir fonksiyonu kullanmak varken, kütüphaneyi dahil ederek tüm fonksiyonları dosyamıza çağırmış oluruz ve bu da fazladan boyuta yol açar.

Kullanmaya Başlayalım

Benim bu kütüphaneyi yazmamdaki amaç, sadece motor pinlerinin girilmesi ile harekete hazır bir arabamızın olmasıdır. Bunun için kütüphanemizi dahil ettikten sonra bir Araba nesnesi oluşturmamız gerekiyor. Daha önce kütüphaneler kullandıysanız nesnelerin nasıl oluşturulacağını az çok biliyorsunuzdur. Kütüphane eklendikten sonra ilk eklemeniz gereken kod aşağıdaki gibidir.

Araba calistir(3, 4, 7, 8, 5, 6);

Bu kod artık kütüphane içerisindeki kodlarımızı “calistir” nesnesi ile birlikte kullanabileceğimizi ifade eder. Nesnemizin parametreleri ise şu şekilde.

Pin 3 ---->  Sol Motorun 1. Çıkışı
Pin 4 ---->  Sol Motorun 2. Çıkışı

Pin 7 ---->  Sağ Motorun 1. Çıkışı
Pin 8 ---->  Sağ Motorun 2. Çıkışı

Pin 5 ---->  Sol Motorun Enable (Hız Kontrolü Yapacağımız) Çıkışı
Pin 6 ---->  Sağ Motorun Enable (Hız Kontrolü Yapacağımız) Çıkışı

Burada dikkat etmemiz gereken nokta motorların enable (hız kontrol) pinlerinin PWM sinyali verebilecek pinler olmasıdır. PWM sinyali veren pinler Arduino Uno‘da 3, 5, 6, 9, 10, 11. pinlerdir. Çeşitli Arduino modelleri için farklılık gösterebilir.

Fonksiyonlar ve Kullanımları

Motor tanımlamamızı yaptıktan sonra kullanabileceğimiz fonksiyonlara geçebiliriz. Kütüphane içerisinde şu an kullanıma hazır 8 fonksiyon bulunuyor. Fonksiyonların listesi ve kullanım talimatları aşağıdaki gibidir.
https://gist.github.com/f1fce472f8ba5423f2009601c01d4ed3

Örnek kullanım dosyası

Fonksiyonların kullanımları bu şekilde. İsterseniz örnek bir kodla nasıl kullanıldıklarını görelim.
https://gist.github.com/91a9aeb15da291b720be41f83e709d9e

Bağlantılarınızı yaptıktan sonra fonksiyonları test ederken Seri Monitörü kullanarak fonksiyonların çalışıp çalışmadığını kontrol edebilirsiniz. Her fonksiyon kendine özgü değerleri ekrana bastırıyor.

Her şeyi uygun yaptığınızı düşünüyorsanız ama yine de araçtan bir tepki alamıyorsanız ilk önce bağlantınızı, daha sonra da kod içerisinde nesne oluştururken belirtmiş olduğunuz pinlerin doğru şekilde olup olmadığını tekrar kontrol edin. Yine çözemezseniz, yorum bölümünden ve ya iletişim sayfamdan benimle iletişime geçebilirsiniz.

Projedeki gelişmeleri takip etmek için: Github — Arduino Araba Kontrol Kütüphanesi

Arduino ve Android Telefon ile Bluetooth Kontrollü Araba Yapımı


Bir önceki yazımda yazmış olduğum MIT: App Inventor ile geliştirdiğim bir Android uygulaması ile Arduino kullanarak hazırlamış olduğum arabamı kontrol etmeyi başardım. Yazının içerisinde arabanın çalışma mantığından ve yazılım kısmından elimden geldiğince ayrıntılı olarak bahsetmeye çalışacağım. Arabamız, ileri, geri, sağ, sol, durma, sağ sinyal, sol sinyal, dörtlü yakma ve korna özelliklerine sahip. Bu özelliklerin hepsini bluetooth ile telefonumuz üzerinden kontrol edebiliyoruz.

Daha önceki yazımda sadece entegre olarak elinizde bulunan L288N sürücüsünü nasıl kullanacağınızı anlatmıştım.

2 tekeri Eskişehir’de unuttuğum için şuan fotoğraf ve video ekleyemiyorum. Ama en kısa sürede ekleyeceğim.

Kullandığım komponentler:

  • Arduino Uno
  • HC-06 Bluetooth modülü
  • L298N Motor Sürücüsü
  • 4 adet DC Motor
  • Harici Güç Kaynağı (Pil)
  • Led’ler
  • Jumper kablolar

İlk olarak aracımızın devre şeması ile başlayalım. Benim oluşturduğum aracın devre şeması tamamen aşağıdaki gibidir. Eğer daha çok özellik ekleyerek geliştirmek isterseniz Arduino Mega 2560‘da kullanabilirsiniz. Devre şeması biraz karışık gelebilir, ilk defa Fritzing üzerinden devre çizdim. Bunun hakkındaki sorularınızı yorum olarak belirtebilirsiniz.

Arduino-Android-Telefon-ile-Bluetooth-Kontrollü-Araba-Devre-Çizimi

Arduino Kodumuzu İnceleyelim

Devremizi sıkıntısız şekilde kurduysak aşağıdaki arduino içerisine atarak küçük bir deneme yapalım. Eğer benim gibi motor sürücü kartı değil de motor sürücü modülü kullanırsanız devreniz biraz karışık görünebilir. O yüzden çalışma sırasında küçük sorunlar ortaya çıkabilir, bu deneme kodunu o yüzden çalıştırıp denemeniz sorunlar çözmek için en kolay yoldur. Kodları burada paylaşınca yazılımsal bir sıkıntı ile karşılaştığım için Github Linkleri üzerinden erişim sağlayabilirsiniz.

Github: Araba Motor Sürücü Deneme Kodu

Denedik ve çalışıyor ise artık arabamızı araba yapan kodları içerisine atabiliriz. Benim arabam için kullandığım Pin yapısı devre şemasındakinin aynısıdır, o yüzden kodlar benim devre şemama göre yazılmıştır. Eğer siz pinlerde değişiklik yaparsanız kodların en üst kısmında yer alan kısımdan düzeltebilirsiniz.

Github: Araba Kontrol Dosyası

Son olarak MIT: App Inventor ile oluşturduğum Android uygulamasını telefona kurmanız gerekmektedir. Bu yazıda uygulamanın nasıl yazıldığı hakkında ayrıntılı bilgi vermeyeceğim. Dosyalar içerisinde uygulamanın App Inventor dosyasını da paylaşacağım, incelemek isteyenler o dosyayı import ederek inceleyebilirler. Uygulama hakkındaki her türlü soru ve geliştirme önerilerinizi bana iletebilirsiniz.

Arduino-Android-Telefon-ile-Bluetooth-Kontrollü-Araba-Telefon-Uygulaması

Uygulamanın tüm dosyalarına ulaşmak için aşağıdaki linki kullanabilirsiniz.

Uygulamaya gelen geri dönüşler ile birlikte güncellemeler gelecektir. Lütfen hatalı veya daha iyi olmasını istediniz kısımları yorum olarak belirtiniz.

Github: Arduino ve Android telefon ile bluetooth kontrollü araba yapımı

Gelecek Güncellemeler:

  • Uygulama ile Motorların Hız Kontrolü Yapılacak.
  • Kullandığımız kod daha tutarlı hale getirilecek. Kod içerisinde yapılandırmalar olacak.

Arduino L298N Motor Sürücü Entegresi Kullanımı

Daha önceki yazılarımda bir araba projem olduğundan bahsetmiştim. Bu yazımda ise araba projemde kullandığım motor sürücü entegresinin nasıl kullanılacağını anlatacağım. Bunu anlatma sebebim tamamen Türkçe kaynak eksikliğinden kaynaklanıyor. Ben kullanmak için uzun süre uğraştım ve sonunda entegreyi çözmeyi başardım.

İlk olarak entegreden biraz bahsetmek istiyorum. Motor sürücü entegreleri, çeşitli bağlantılarını gerçekleştirerek motorunuzu kodlar yardımıyla kontrol etmenize yarayan entegrelerdir. Ben ilk olarak L293D modelini denedim ama ondan istediğim verimi alamadım o yüzden L298N modeli ile yoluma devam ediyorum. İçerisinde çift H köprüsü barındıran bu model ile aynı anda 2 motoru kontrol edebiliyorsunuz ve bu size çok avantaj sağlıyor.

Entegremiz 8 uzun ve 7 kısa olmak üzere 15 bacaktan oluşuyor. İnternet üzerinde bulduğum çok güzel bir resim ile anlatımıma devam edeceğim.

Arduino L298N Entegre Datasheet

Kaynak: http://electronics.stackexchange.com/questions/5043/l298-motor-driver-spinning-motor-only-one-way

Yukarıda yazan bacakların açıklamasını yapıyorum.

  • Current Sensing: Tam olarak çözemesem de sanırım Enable bacaklarını nötr hale getirmek için toprak hattına bağlamamız gerekiyor.
  • Output: Motorumuzdan gelen kabloları bağlayacağımız bağlantı noktası.
  • Input: Arduino’muzdan çıkan digital pinlerimizin bağlantı noktası.
  • Enable: PWM sinyali alabileceğimiz bir pine bağlanarak motorun hız kontrolünü yapacağımız bağlantı noktası.
  • Logic Supply Voltage: Arduino’muzdan gelen 5v.
  • GND: Toprak Hattı (Ground)
  • Supply Voltage: Besleme Voltajımız, dışardan yapacağımız destek.

Bağlantılarımızı yaparken resimdeki uzun olan bacaklar, entegremizdeki kısa bacakları, resimdeki kısa bacaklar ise entegremizdeki uzun bacakları temsil ediyor. Bunu akılda tutmak zor olur derseniz entegredeki ve resimdeki uzun bacak sayılarını sayarak farkı o şekilde akılda tutabilirsiniz.

Evet. Resimde bağlantıları çok güzel anlatmış ancak ben de anlatmak istiyorum. Current Sensing bacaklarımızı direk olarak toprak hattımızı çektiğimiz noktaya yani GND hattımıza takıyoruz. Output noktalarımıza ise motorumuzun bacaklarını yerleştiriyoruz. Arduino’muzun herhangi bir Digital Pin‘inden gelen kablomuzu ise Input bacaklarının olduğu yere takıyoruz. Ardından Enable bacaklarından çıkarttığımız kabloyu Arduino’muzun PWM sinyali veren pinlerinden birisine bağlayarak motorumuzun hız kontrolünü gerçekleştireceğiz. Logic Supply Voltage‘ı da aynı şekilde + hattına takabilirsiniz. Bildiğiniz gibi zaten GND kablomuz toprak hattına takılmak zorunda ve ardında dışardan (örneğin 9v bir pil ile) yapacağımız beslememizi ise Supply Voltage kısmına takıyoruz, pilin artı ucu Supply Voltage’ı takılacağı için eksi ucunu da breadboard üzerindeki GND noktasına takabilirsiniz.

Entegremizin bağlantısı bu şekilde. Kodlaması ise oldukça basit.

https://gist.github.com/1dee1e0e92f55350349b3208a89a2ac7

Eğer loop kısmında 4. pini LOW, 3. pini HIGH yaparsanız bu sefer motor tam tersi yönde dönecektir.

Entegremizin kullanımı bu şekilde, umarım faydalı bir yazı olmuştur. İleriki günlerde bu entegrenin PIC ile nasıl kullanılacağını, nasıl programlanacağını anlatan bir yazı yazmayı da planlıyorum.

Arduino ile ilgili daha yazılacak çok yazı var ama ben sadece Türkçe kaynak sıkıntı olan yazıları yazmaya çalışacağım. Eğer sizinde sorunlarınızı olursa ve ya Türkçe kaynak sıkıntısı çektiğiniz bir kullanım olursa yorum olarak belirtin, o eksiği tamamlamaya çalışacağım.

Arduino ve Android ile Bluetooth’lu araç kontrolü yazımı okuyabilirsiniz.