HC_05Bu çalışmada Arduino ile birlikte kullanabileceğimiz, bloutooth üzerinden haberleşen bir modül inceleyeceğiz; HC-05. Bu arkadaşın diğer versiyonu HC-06. Bunlar Arduino ile seri haberleşme yapıyorlar. Yani Tx( transmitter: verici) üzerinden veri yollayıp Rx (reciever: alıcı) üzerinden veri alıyor.  Bunları farkı ne o zaman? Seri iletişimde bir master/slave (efendi/köle 🙂 ) ilişkisi vardı. Birden fazla eleman seri haberleşirken biri iletişimi başlatıyor (gerekli ise saat sinyalini üretiyor) o yüzden de efendi oluyordu. İşte HC-06 bu iş için kullanılamıyormuş. Yani veri alabiliyormuş sadece. Bizim projemizde bu fark önemli değil. Zaten nerede önemli olduğunu da bilmiyorum! Üstelik fiyatları da aynı!

IMG_20200415_131326Bendeki model HC-05. Diğerinin görüntüsü de hemen hemen aynı.  Görüntüye baktığınızda üst üste sabitlenmiş iki kart fark ediliyor (Castellation Edge deniliyormuş bu tür işlemlere). Asıl işi yapan üstteki, bir kenarında daha önce benzerlerini gördüğümüz anten desenli olanı. Bağlantı headerlarının olduğu alttaki kartta ise bir ‘enable’ butonu, birkaç smd, eleman, LED ve bir 3.3 volt dönüştürücü var. Evet bu arkadaş 3.3 vol ile çalışıyor aslında. Üzerindeki DC-DC dönüştürücü sayesinde 5 volt ile beslenebiliyor. Ama diğer bacaklar (Tx ve Rx) 3. volt ile çalışıyor. Bu bacaklara 5 volt uygulayan örnekler de var. Ama arkadaşa zarar vermemek için özellikle Arduino’dan 5 volt seviyesinde veri aldığı Rx bacağını korumak için bu gerilimi 3.3 volta düşürmek gerekli. Bunu sağlamak için: 1)Arduino Pro Mini 3.3 volt kullanabiliriz, 2)Bu iş için tasarlanmış çift yönlü kullanabiliriz, 3) Direk 5 volt – 3.3 volt dönüştürücü kullanabiliriz, 4)Gerilim bölücü yapabiliriz.

dönüştürücü

En kolay ve ucuz olan gerilim bölücü devresi, daha önce de yapmıştık. Seri bağlı 1k ve 2.2k dirençlerin 2.2k olanın üzerindeki gerilim yaklaşık giriş gerilimini (5volt) 2/3’ünü modüle yollar. Bu da bize yeter. Bu modülün Arduino ile seri iletişim yaptığını söylemiştik. O yüzden Arduino’nun Rx pini bu modülün Tx pinine, Arduino’nun Tx pini de yukarıdaki gerilim bölücü üzerinden HC-05’in Rx pinine bağlanıyor. Burada dikkat etmemiz gereken nokta Arduino’nun da bilgisayar ile bu pinleri kullanarak haberleştiği! O yüzden Arduino’ya programı yüklerken bu pinlerdeki bağlantının (en azından Arduino’nun bilgisayardan veri aldığı Rx pininin) sökülmesi gerekiyor. Ya da yazılım ile başka iki pini Rx ve Tx olarak tanıtmak gerekiyor. Sadece kütüphane ekleyip, pinleri (bir nesne yaratarak) tanıtıyoruz. Böylece Arduino HC-05 ile bu pinler üzerinden haberleşiyor. Bu konuda çok Türkçe kaynak olduğundan buna fazla girmiyorum.

#include <SoftwareSerial.h>
SoftwareSerial BTSerial(8,9); //rx,tx pinleri

Yukarıdaki program parçasında ‘SoftwareSerial.h’ kütüphanesi yükleniyor. Sonra, 8 numaralı pinin Rx, 9 numaralı pinin Tx olduğunu belirttiğimiz ‘BTSerial’ nesnesi oluşturuyoruz. Bu kadar.

Bu modül ile seri port üzerinden haberleşebiliyoruz, yani Arduino IDE üzerinden yazışıyoruz! Seri ekrana yazdığımız komutlara “AT Komutları” (ATT: ATTention: Dikkat) deniyor. Bununla da ilgili çok kaynak var buna da girmeyeceğim. Ama büyük harflerle ve ‘AT’ ile başlayan bu komutlarla, bu modülün çalışıp çalışmadığı, versiyonu, ismi, kodu, vb. bilgileri öğrenip isim, kod gibi değişiklik yapılabiliyor. Bu arada bu iletişimi yapabilmek için, bu modülün +5 volta bağlanmadan önce üzerindeki butona basılı tutmak gerekiyor. Üzerindeki LED sönene kadar basılı tutmak gerekli. Dediğim gibi bu konuda çok kaynak var, uzatmıyorum.

Gelelim çalışmamıza. Ben daha önce ‘Arduino İle DC Motor‘ çalışması için bir plastik üzerine tekerlek bağlayıp oluşturduğum araba platformunu kullandım. Üzerine bir HC-05 modülü ekleyip, cep telefonundaki uygulama ile bloetooth üzerinden kontrol etmeye çalıştım. Devre şeması aşağıdaki gibi. Motor bağlantıları zaten vardı. Ama aracın üzeri kablo yığınları halinde olmasın diye Arduino, HC-05 ve diğer elemanları kart üzerine sabitledim.

devre resmi

Motorlar da fazla akım çektiğinden, şasenin altına 4’lü AA pil yuvası ekledim. Bu kaynak sadece motor sürücüye enerji sağlıyor. Devre kartı ise 9 volt pil ile beslendi. Arduino, HC-05 ve kablo bağlantıları için header eklendi. Devre kartı ve motor sürücü (L9110) şasiye sabitlendi.

IMG_20200415_130925

Gelelim koda: Ben modül ile haberleşmede Arduino’nun Rx, Tx pinlerini kullandım. Dolayısıyla herhangi bir kütüphane yüklemem de gerekmedi. Önce motor pinleri tanımlandı ve (setup içerinde) bu pinler çıkış olarak ayarlandı. Ayrıca yine kontrol için seri haberleşme başlatıldı. Şimdi bu alet Arduino ile seri haberleşirken en kolay veri yollama şekli tek karakter yollama. onun için ‘gelen’ isimli bir karakter değişkeni oluşturuldu. Bu değişkenin değerlerine göre hangi motorun hangi yöne hareket edeceğine karar verilecek.

char gelen = ‘0’;
#define sagIleri 11
#define solIleri 7
#define SagGeri 10
#define solGeri 6
void setup()
{
pinMode (sagIleri, OUTPUT);
pinMode (solIleri, OUTPUT);
pinMode (SagGeri, OUTPUT);
pinMode (solGeri, OUTPUT);
Serial.begin (9600);
}

Karakter okunabildiğinde (kontrol için seri ekrana gelen karakter yazdırılıp) değer okunup ‘gelen’ isimli değişkene atanıyor. Bu değer ‘i‘ ise (ileri) her iki motor da ileri yönde çalıştırılıyor. Bu değer ‘g‘ ise (geri) her iki motor da diğer yönde döndürülüyor.  ‘d‘ karakteri (dur) her iki motorun da girişini sıfır yapıyor. Sağa dönüş için ‘a‘ karakteri okunduğunda; sağ motor geri, sol motor ileri dönüyor ve araç sağa dönüyor. Sola dönüş için ise ‘o‘ okunduğunda; motorlar sağ için yapılan dönmenin tersini yapıyor. Tüm kod bu kadar:

void loop()
{
if (Serial.available())
{
gelen = Serial.read();
Serial.println(gelen);
if (gelen == ‘i’) {                           // İleri komutu geldiğinde;
digitalWrite (sagIleri, HIGH);digitalWrite (solIleri, HIGH);
digitalWrite (SagGeri, LOW);digitalWrite (solGeri, LOW);}
else if (gelen == ‘g’) {                   // Geri komutu geldiğinde;
digitalWrite (sagIleri, LOW);digitalWrite (solIleri, LOW);
digitalWrite (SagGeri, HIGH);digitalWrite (solGeri, HIGH);}
else if (gelen == ‘a’) {                  // Sağ komutu geldiğinde;
digitalWrite (sagIleri, LOW);digitalWrite (solIleri, HIGH);
digitalWrite (SagGeri, HIGH);digitalWrite (solGeri, LOW);}
else if (gelen == ‘o’) {                  // Sol komutu geldiğinde;
digitalWrite (sagIleri, HIGH);digitalWrite (solIleri, LOW);
digitalWrite (SagGeri, LOW);digitalWrite (solGeri, HIGH);}
else if (gelen == ‘d’){                  // Dur komutu geldiğinde;
digitalWrite (sagIleri, LOW);digitalWrite (solIleri, LOW);
digitalWrite (SagGeri, LOW);digitalWrite (solGeri, LOW);}
}
}

Kodu Arduino’ya yükledikten sonra cep telefonu uygulamasına bakalım. Genelde HC-05 ile ilgili videolarda hazır uygulama kullanılmış. Biz kendimiz yapmaya çalışalım. Baştan söyleyelim bu uygulama sadece Android telefonlara kurulabiliyor! Ayrıca bir g-mail hesabına da ihtiyacınız var. Uygulama yazacağımız program MIT (Massachusetts Instute of Technology) tarafından geliştirilmiş ve ücretsiz kullanılabiliyor. Bu konu hakkında da uzun Türkçe kaynaklar var. Ama kısaca işimize yarayacak kısmı için çok karmaşık. Biz sadece bize yeten kadarına bakacağız. Önce https://appinventor.mit.edu sitesine giriyoruz.

appinventor.mit.edu

Tepedeki sarı ‘Create Apps!’ butonuna tıklıyoruz. Burdan başka bir adrese yollanıyoruz ai2 ile başlayan. Sorun yok (Vakti zamanında MIT’ciler google’cularla anlaşamamış ve programı yayından çekmişler. Sonra tekrar anlaşınca bu ikinci versiyon olmuş, falan filan)! Sonra bizden e-posta adresi istiyor. G-mail hesabı bunun için geçerli.  Hemen bir hesap oluşturuyoruz. Sonra, sol üstte ‘Start a new project’ butonu ile yeni projemize başlıyoruz. Bize proje ismi soruluyor. Türkçe karakter kullanmadan basit bir isim vererek başlayabiliriz. ‘Ok’ deyince açılan sayfada;

appinventor1

En üstteki yeşil çubuğun en solunda proje ismi (bendeki ‘sil’ olan), yanında ekran ismi (Screen) var. En sağda da ‘Designer’ (o seçili zaten) ve yanında ‘Blocks bulunuyor. ‘Dursunlar orada. En solda ‘palette’ yanında ekranımızı gösteren bir telefon görüntüsünün olduğu ‘viewer’ (burada değiştirilebilen bir ekran boyut bilgisi var), onun sağında eklediklerimizi gösteren (ilk başta boş) ‘components’ ve en sağda da eklediğimiz bileşenlerin değiştirebileceğimiz (renk, yazı tipi, resim vb.) özelliklerinin olduğu ‘Properties’  sütunu var.  Şimdi bunu bluethooth üzerinden HC-05 kullanarak Arduino’ya veri yollayacak şekilde tasarlayalım. Nelere ihtiyaç var?

IMG-20200415-WA0016Önce bloetooth üzerinde bağlı aygıtları bulup seçmemize yarayacak bir bağlantı bulucu. Sonra da aracımızı dört yana hareket ettirecek ve durduracak olan ‘i’,’g’, ‘a’, ‘o’, ‘d’ (kodu hatırlayalım: ‘ileri’, ‘geri’, ‘sağ’, ‘sol’ ve dur) karakterlerini yollayacak olan toplam 5 buton. Önce bağlı aygıtların listesini görmek için en soldaki ‘Palette’ bölümünden ‘ListPicker’ tıklayıp telefon ekranına sürüklüyoruz. Ekranda göründü, ayrıca bir sağdaki ‘Component’ kısmında da ‘Screen 1’ altında ‘ListPicker1’ geldi. Artık en sağdaki ‘Properties’ bu eklediğimiz arkadaşa ait. Burada aşağı doru inerek; yazı fontunu, yüksekliği, genişliği, rengi, yazı rengini değiştirip istersek resim bile ekleyebiliyoruz. Benim örneğimdeki oklar ve ortadaki ‘Dur’ yazısı buradan eklendi. Şimdi bu eklediğimiz butonu ortalamak için sağdaki ‘Width’ yani genişlik tıklanıp altındaki ‘Fill parent’ seçilip (A) Ok dendiğinde butonun ekranın iki yanına yaslandığını göreceksiniz (C). Yine aynı bölümden üzerinde yazan yazıyı da ben ‘Aygıt Arama’ olarak değiştirdim (B).

fill parent

Şimdi buton ekleyelim. Yalnız ‘İleri’ butonu yatayda tam ortada olacağından önce bir yerleştirme yapmamız gerekli. Bunun için soldaki ‘Palette’ sütununda aşağıda ‘Layout’ sekmesini açmamız (D)ve oradan en üstteki ‘Horizontal/Arrangement’ yatay düzenlemeyi sürükleyerek telefon resmine taşıyoruz. Yine sağdaki ‘Properties’ den ; ‘Width’ ve ‘Fill parent’ ile bu bölgeyi iki yana yaslıyoruz. Sonra soldan tekrar ‘User Interface’ e dönüp, en üstten ‘Button’ u sürükleyip bu eklediğimiz kutunun içine yerleştiriyoruz. Daha sonra sağdaki özelliklerden ‘Text’ içine girip yazıyı ‘İleri’ olarak değiştirelim. Ekran görüntümüz oluştu (E).

ileri

Sonraki işlemde aynı hat üzerinde ‘Sol’, ‘Dur’ ve ‘Sağ’ butonları var. Yine ‘Layout’ içinden ‘Horizontal/Arrangement’ yatay düzenlemeyi sürükleyerek telefon resmine taşıyoruz. Yine sağdaki ‘Properties’ den ; ‘Width’ ve ‘Fill parent’ ile bu bölgeyi iki yana yaslıyoruz. Soldan tekrar ‘User Interface’ e dönüp, en üstten ‘Button’ u sürükleyip bu eklediğimiz kutunun içine yerleştiriyouz. Bu kez kutunun içine 3 buton ekliyoruz. Her butonu sağdan Width’ altındaki ‘Fill parent’ seçilip, ortalı yerleştirildikten sonra, ‘Text’ menüsünden (Sağ, Dur, Sol) isimleri yazılıyor. Hatta ortadakinin rengini değiştirdim. Siz de bu renkleri ve yazı fontlarını kurcalayabilirsiniz. İlk satırda ileri için yaptığımız işlemi tekrarlayıp geri tuşunu da oluşturuyoruz. Ekleyeceğimiz son şey bir bluetooth alıcısı. Bunu da yine soldaki ‘Palette’ nin altlarında bulunan ‘Connectivity’ başlığı altından ‘BluetoothClient’ ı tutup telefon ekranı üzerine sürüklemek. Ekrandan gitti! Olsun, o zaten ekranda görünmeyecekti. Yandaki ‘Component’ kısmında görebiliyoruz.

client_eklendi

Ekran düzenlemesi tamam. Şimdi bu eklediklerimize fonksiyon kazandıralım. Tepedeki yeşil barın en sağındaki ‘Blocks’ sekmesini tıklıyoruz. Ekrandaki telefon görüntüsü gitti. Ama solda altta eklediklerimiz (Components’de görünen liste şeklinde) göründü. ‘ListPicker’ ile başlayabiliriz. Tıkladığınızda kod blokları gelmeli.

kod1

Burada iki ekleme yapacağız. Buetooth aygıtını bulmadan önce ve sonra yapılacaklar. Yani ‘.BeforePicking’ i kulağından tutup ortaya sürükleyelim. Bir de aynısını ‘.AfterPicking’ olanına yapalım. Şimdi masa üzerinde iki blok var. Seçimden önce demek bu butona basmadan önce anlamında. Şimdi yine soldan ‘ListPicker’ ı tıklayıp yeşil ‘Set Listpicker1 Elements to’ yu sürükleyip üstteki bloğa yerleştiriyoruz. Yerine oturduğunda bir klik sesi çıkıyor. Bu şimdi neyi seçecek? Bağlı bluetooth adresini ve adını. Onun için soldan ‘BluetoothClient1’ seçilip içinden ‘BluetoothClient1 AdressesAndNames’ sürüklenip biraz önce eklediğimiz yeşil ‘.. Elements to’ nun hemen sağına yerleştirilecek.

kod2

Bu butona basıldığında ne olacak? Bir seçim yapılacak. yine soldan ‘ListPicker’ ı tıklayıp yeşil ‘Set Listpicker1 Selection to’ yu sürükleyip alttaki bloğa yerleştiriyoruz. Neyi seçecek? BluetoothClient1 üzerinden ‘Connect address’ biraz öncek eklediğimiz in ucuna ekliyoruz. Burada seçim için eklememiz gereken soy şey yine soldan ‘ListPicker’ den ‘ListPicker Selection’. Yani ‘Aygıt Arama’ butonuna basıldığında bizim modülün adresine bağlanacak. Bağlandığında ise üzerindeki yazı değişecek; ‘bağlandık’ falan diyecek.  Yine ‘ListPicker’ den ‘set LİstPicker Text to’araya eklenip ucuna soldaki ‘text’ de bunun kuyruğuna eklenecek. Sonra da o textin içine tıklayıp ‘bağlandık’ yazacağız. Türkçe karakter kullanabiliyoruz.

kod3

Bu blokları incelersek; bu butona basıldığında renk değişimi, yazı rengi değişimi vb. işlemler yapabileceğimizi görebiliriz. Şimdi girişle işimiz bitti. Yön butonlarına bakabiliriz. Bloklarda kopyala/yapıştır şansımız olduğu için bir butonda çalışıp diğerlerini bundan kopyalayabiliriz. Soldan ‘Button1’ içinden basıldığında ne olacağını anlatmak için ‘when Button1 click’ tutulup masa üzerine sürüklenir. Butona basıldığında bluetooth aletine bir karakter yollayacağından ‘BluetoothClient1’ üzerinden ‘call BluetoothClient1SendText’ ve kuyruğuna ‘text’ ekleyip içine yollayacağımız ‘i‘ harfini yazıyoruz. Daha sonra sarı bloğa sağ tıklayıp ‘Duplicate’ ile aynısından bir tane daha oluşturuyoruz. Üzerindeki ‘Button1’ yazan yerin yanına tıklayıp açılan listeden ‘Button2’ yi seçiyoruz. Bu soldaki buton yani sola dön komutu olan. Onun için ‘text’ de yazan ‘i‘ yerine ‘o‘ yazıyoruz. Tekrar ‘Duplicate’ ile buton 3, 4 ve 5’i çoğaltıp içlerine ‘d‘, ‘s‘, ‘g‘ harflerini ekleyince işlem tamam!

buttons

 

 

Bu sayfa burada beklesin. Cep telefonuna geçelim. ‘Play Store’ a gidip ‘App Inventor Companion’ yazıp bunu telefona indiriyoruz. Uygulamayı açıp ‘Scan QR Code’ tıklandığında ekranda bir QR kod okuyucu çıkıyor. Ama ne okuyacak? Şimdi Bilgisayarda oluşturduğumuz sayfaya geri dönüp; tepedeki yeşil çubuğun (Add Screen’in tam üzerindeki) üzerindeki ‘Build’ sekmesinin alyındaki  ‘Provide QRCode’ tıklayıp biraz beklenince ekranda bir kod belirlenecek. Bunu şimdi cep telefonuyla okuttuğunuzda uygulama cep telefonunuza iniyor. Cep telefonunuzun modeline göre yönergeleri uyguladığınızda masa üzerinde uygulamanız hazır.

Biraz uzun oldu ama umarım faydalanırsınız. Güle güle kullanın!

IMG-20200416-WA0011

 

Kod İçin: https://www.dropbox.com/s/i6ockw3s69nkvln/ardu_car.ino?dl=0