AVR – Bluetooth Kontrol

Gruplarda birkaç kişinin satışını gördüğüm aslında çok basit olan bluetooth kontrol konusuna değinmek istiyorum. Bir yıl önce çocuklar için yaptığım minik bir araba üstünden konuyu aktaracağım. Benim gibi amatörlerin bunları satın almasına karşıyım. Oturup yapmak yerine, bu tür şeyleri hazır almak öğrenme açısından size bir şey katmaz. Kullanılan modül ve motor sürücü için çok fazla Türkçe kaynak var.Bu nedenle çok detaya girmeyeceğim.

Bluetooth Modül (HC-06)

Kolay ve ucuz ulaşabileceğiniz bir modül (GSM-LORA vb. kıyasla) HC-06, eşleşme çağrısına yanıt verebilen, eşleştirme isteği gönderemeyen bir modüldür. Yalnızca köle modunda çalışır. GSM modülleri gibi AT komut seti kullanılarak gerekli ayarlamalar yapılır. Kullandığım modül HC-06 (ZS-040)(EGBT-046S)

Resim: www.martyncurrey.com/arduino-and-hc-06-zs-040/

Pinler sırasıyla  RXD, TXD, GND, VCC şeklindedir. (State ve En bağlı değil).

RXD: Şekilde görüldüğü gibi 5V ile çalışan bir denetleyicide voltaj bölücü ile bağlanmalıdır. Denetleyicinin Tx pinine bağlantı yapılacak.

TXD: Denetleyicinin Rx pinine bağlanacak. Bu iki pin UART iletişimin yapıldığı pinlerdir, UART konusunu burada anlatmaya çalıştım.

GND: Negatif besleme

VCC: +3,3 ve +6V arası pozitif besleme pinleridir.

State bağlantı durumunu gösteren pindir, “1” olduğunda eşleşme gerçekleşmiştir. EN pini komut veya veri modu seçimi için kullanılan pindir.

AT Komutları

AT komut setini kullanarak ayarlama yapmak isterseniz USB seri çevirici kullanmanız gerekir. Elinizde bu yoksa Arduino kartlarını da kullanabilirsiniz. Bunun için Arduino İde de örnekler, “Software Serial” kütüphanesi içinde bulunan “SoftwareSerialExample” ile Rx-Tx pinlerini bağlayarak yapabilirsiniz. (Voltaj bölücü bağlantıyı unutmayın) Baud rate 9600 olarak ayarlamanız ve seri port ekranı altında yer alan “Satır sonu yok” seçeneğini “NL ve CR ile birlikte” seçeneğini seçmek gerekir.

AT: UART bağlantısı kurulmuşsa “OK” cevabını döndürür.

AT+ADDR: Modül adresi cevap olarak gelir.

AT+NAME: Modül ismi cevap olarak gelir. Değiştirmek isterseniz, “AT+NAME=BLUECAR” şeklinde yazabilirsiniz.

AT+UART: Baud rate, Stop bit sayısı, Eşlik biti şeklinde cevap döndürür. Fabrika ayarları olarak 9600,0,0 cevabı gelir. Baud rate=9600,Stop bit sayısı 1 bit ve eşlik biti yok şeklindedir. Burada sadece baud rate değişikliği yapmanızı tavsiye edeceğim. Bunun için “AT+UART=38400,0,0” şeklinde komut göndermeniz gerekir. Diğer komutlar için Buraya bakabilirsiniz.

Motor Sürücü

L293D elimde olduğundan onu kullandım. 600mA çıkış vermekte, bu kullandığım motorlar için yeterli. Yüksek akım çeken motorlar için farklı sürücü kullanmanız gerekir. L293D birbirinden bağımsız iki motoru iki yönde çalıştırma imkânı verir.

Bilgi sayfasından alıntı bu resimde pinler açıklanmış. Resmin durumuna göre Sol-Sağ motor olarak isimlendireceğim.

1-9 (1,2EN-3,4EN): Bu pinler “1” olduğunda motorlar hareket edecektir. PWM ile motor dönüş hızı kontrol edilebilir.

2-7 (1A-2A) ve  10-15 (3A-4A: Sol-Sağ motor ileri-geri dönüş pinleridir. 2 numaralı pin (1A)  “1” ve 7 numaralı pin (2A) “0” olduğunda sol motor ileri tersi olduğunda (2 “0” ve 7 “1”) sol motor geri dönecektir. Sağ motor içinde ilgili pinlerle aynı şey geçerlidir.

3-6(1Y-2Y) ve 11-14(3Y-4Y): Motor besleme pinleridir. 3-6 sol motor ve 11-14 sağ motor.

4-5,12-13 : GND negatif besleme ve soğutucu bağlantısı yapılacak pinlerdir.

VCC1: Entegrenin +5V besleme pinidir.

VCC2: Motorların pozitif besleme pinidir. +4,5 ve +36V arası besleme yapılabilir.

PWM

Burada ve internette detaylı bilgi bulunmakta, kabaca değinmek gerekirse PWM bir çıkışı “1” ve “0” yaparak Analog bir sistem gibi voltaj ayarı yapmamıza olanak verir. “1” ve “0” arası  geçişlerin süresine göre bu ayarlamayı yapabiliyoruz. Atmega 328p de bu işlemler için 3 adet zamanlayıcı ve bu zamanlayıcılara bağlı 6 adet pin bulunur. Ben PD5 (OC0B) ve PD6 (OC0A)  pinlerini kullandım. (Uno D5-D6). Bu pinler Timer 0 zamanlayıcısına bağlıdır ve ilgili registerler ve daha fazlası için Atmega 328p

Timer0 da bir sayaç (TCNT0) üst sınıra kadar çıkar (0xFF)(255), tekrar sıfırlanır veya sıfıra doğru azalır. Bu işlem sürekli tekrar eder. Ayarlayacağımız değer ile eşleştiğinde (OCR0A veya OCR0B) OC0A (PD6) veya OC0B (PD5) pinleri “1” veya “0” olur. PWM için farklı modlar bulunmaktadır. Bunlar pinlerin frekansını değiştirmemize olanak sağlar. Prescaler ile birlikte istenilen frekans değerine ulaşılabilir.  Ben Faz Doğrulamalı PWM Modu kullanacağım. Benim için esas olan “1” ve “0” durumunun birbirine göre yüzdesi olduğundan frekans çok düşük olmadıkça önemi yok.

Timer 0 kontrol register A :

7 (COM0A1)  ve 6 (COM0A0)numaralı bitler OC0A (PD6)pininin OCR0A ile TCNT0 eşleştiğinde ne olacağını seçmemizi sağlayan bitlerdir. Seçilen moda göre ve WGM02 bit durumuna göre değişkenlik gösterir. Faz doğrulamalı mod için tablo:

Tabloda görüldüğü gibi COM0A1 (7) ve COM0A0 (6) bitlerine göre OC0A (PD6)pininin eşleşme olduğunda toggle (tersi), clear (0) veya set (1) seçimini yapmamıza olanak verir.  Örnek olarak OCR0A=64, COM0A1=1 ve COM0A0=0 şeklinde ayarlayıp PWM aktif ettiğimizde %25 ile  1,25V gibi bir çıkış etkisi verecektir. Sadece COM0A1=0 ve COM0A0=1 yaptığımızda  %75 ile 3,75V çıkış etkisi verecektir. Aradaki fark eşleşme oluşunca pinin “1” veya “0” olmasıdır.

5 (COM0B1)  ve 4 (COM0B0)numaralı bitler OC0B (PD5)pininin OCR0B ile TCNT0 eşleştiğinde ne olacağını seçmemizi sağlayan bitlerdir.

1 (WGM01) ve 0 (WGM00) numaralı bitler Timer0 zamanlayıcısının modlarını seçmemizi sağlayan bitlerdir. Tabloda 1 numaralı mod olan PWM Phase Correct için (WGM00) “1” yapılmalıdır.

Timer 0 kontrol register B :

7 ve 6 numaralı bitler PWM olmadığında etkindir yani bu konunun dışındadır.  3 numaralı (WGM02) bit TCCR0A register 1 ve 0 numaralı bitler ile birlikte zamanlayıcı mod seçiminde kullanılır. (tablo 19-9).

2,1 ve 0 numaralı (CS02,CS01 ve CS00) bitler Prescaler seçiminin yapılmasını sağlar. 16Mhz ile çalışan denetleyici kristalden gelen her saat darbesinde TCNT0 sayacının değerini bir artırır. Presacler değerini /64 yaptığımızda 64 darbede bir artırır. Böylece saniyede 16.000.000/256 defa üst değere ulaşan TCNT0 16.000.000/64/256=976,56 Hz  üst değere ulaşır. Arduino uno için en yüksek frekans değeri budur. C dili ile aynı denetleyici faz doğrulamalı mod ile 31.372 Hz değerine ulaşır. (Fast Pwm 62.500 Hz).

Kısaca dedim ama oldukça uzun oldu. Umarım sıkıcı veya haddimi aşarak yanlış bilgiler vermiyorum. PWM konusunda register ve bitler bu şekilde. Bu işlemleri yapmak için bu şekilde bir fonksiyon tanımlıyorum.

Android Uygulama

Telefon veya tablet ile yönlendirme yapmak için http://ai2.appinventor.mit.edu/ adresinde uygulama oluşturabilirsiniz.

Bu yazı Haluk ŞİMŞEK tarafından yazılmıştır.

 

      

Kodlar

 

 

You may also like...

2 Responses

  1. Murat dedi ki:

    Teşekkürler, çok güzel anlatım, dolu içerik.

    • Haluk Şimşek dedi ki:

      Teşekkür ederim, biraz yüzeysel geçtiğimi düşünüyordum, yorumunuz beni rahatlattı. 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.