Arduino ile HM10 Bluetooth 4.0 Kullanımı
|Merhabalar,
Bu konuda yeni yeni yaygınlaşmaya başlamış Bluetooth 4.0 modülü HM-10 modülünün çalışmasına ve Arduino ile kullanımına değineceğiz. BLE(Bluetooth Low Energy) olarak da geçen Bluetooth 4.0, klasik Bluetooth(Bluetooth 2.0)’ un bir yükseltilmiş bir versiyonu değildir. Farklı kullanım amaçlarına sahip farklı bir sistemdir. BLE düşük enerji tüketimi için geliştirilmiştir ve bunu çok sık iletilmeyen küçük veri paketleri ile yapar. Gerçek zamanlı ve büyük veri aktarımının yapılması gereken uygulamalar için uygun değildir. Bu tür uygulamalar için klasik Bluetooth cihazların kullanımı tavsiye edilir. BLE cihazlar genel olarak 2 modda çalışırlar:
- Broadcaster + Observer: Standart bir bağlantı yoktur. Broadcaster genellikle bir çeşit sensördür ve Observer’ a periyodik bir sinyal gönderir. Ancak Broadcaster birinin dinleyip dinlemediğini bilmez.
- Central + Peripheral: Klasik bağlantıya benzerdir. Central cihaz bir Peripheral bulduğunda ona bağlanmak ve bağlantı başlatmak ister. Bağlantı başlayınca Master rolünü alır bağlantıyı ve zamanlamaları yönetir.
Klasik Bluetooth tek bağlantı kullanacağınızı ve uzun süre bunu değiştirmeyeceğinizi varsayar bu yüzden bağlantı kurmada hızlı şekilde çalışması gerekmez. BLE ise bir çok kısa süreli bağlantı kurmak için tasarlandığından hızlı şekilde bağlantı başlatıp sonlandırabilir.
BLE servisler ve özelliklerden(karakteristik) oluşur. Özellikler servislerin içerisinde bulunur. Tipik bir BLE cihazda üretici ismini, cihaz ismini, firmware ID yada versiyon gibi bilgileri taşıyan özellikler bulunur. Bunun dışında geçek veriyi taşıyan bir servis daha bulunur. Gerçek veri sıcaklık nem gibi bir veri olabilir ve sıcaklık verisi okunmak istendiğinde sıcaklık verisini tutan özelliği okumak yeterlidir. Görüldüğü üzere BLE klasik Bluetooth’ dan çok farklı şekilde çalışır. Klasik Bluetooth’ da sadece bir haberleşme kanalı vardır ve bütün veri buradan iletilir. Şimdi biraz da HM-10′ dan bahsedelim.
HM-10 modülü, HC-05 gibi Arduino ile kullanımı kolay bir Bluetooth modülüdür. Bluetooth 4′ ün getirdiği avantajların bir çoğuna sahiptir. Düşük güç tüketimine sahip olması ve açık alanda 100m mesafesye sahip olması bunlardan bazılarıdır. Ayrıca mikrodenetleyici ile HC-05′ de olduğu gibi UART arayüzü kullanarak haberleşir. Arduino Uno kullanacaksanız 0 ve 1 pinlerini yada SoftwareSerial kütüphanesini kullanarak herhangi iki pin yardımı ile HM-10 modülünü kullanabilirsiniz. Benim yaptığım bağlantılar aşağıdaki gibidir.
Bağlantı şemasında HM-10 5V’ a bağlı olarak görülüyor. Bazı kaynaklarda HM-10 besleme gerilimi 3.3V olarak yazar. Benim elimdeki HM-10 modülü konunun başında resmi verilen modül ve bu modülün üzerinde gerilim regülatörü mevcut. Bu yüzden besleme olarak üzerinde de yazıldığı gibi 3.6V ile 6V arası gerilim verebiliyorum. Elinizdeki cihaza besleme gerilimi bağlamadan önce kontrol etmenizi tavsiye ederim. Ancak besleme geriliminin 5V olması pinlerinin de 5V ile kullanılabileceği anlamına gelmez. Bu yüzden Arduino’ dan HM-10′ a veri iletimi yapılan kabloya gerilim bölücü dirençler koyarak Arduino pinindeki 5V’ u, 3.3V’ a indirdim. Bu herkesin dikkat etmesi gereken önemli bir detaydır.
Ayrıca aynı HC-05 modülünde olduğu gibi AT komutları kullanılarak konfigure edilebilir. Ek olarak AT komut göndermek için bağlantılarda bir değişiklik yapmanıza yada bir butona basmanıza gerek yok. Modülün herhangi bir cihaza bağlı olmadığı her an AT komut gönderebilirsiniz. Bu da kullanımı oldukça kolaylaştırıyor. Kullanabileceğiniz bazı AT komutları şunlardır.
AT+BAUD : Baud Rate’ i sorgulayabileceğiniz yada değiştirebileceğiniz komut
AT+ROLE : Master yada Slave durumunu sorgulayabileceğiniz yada değiştirebileceğiniz komut
AT+PASS : Bağlantı için gerekli şifreyi sorgulayabileceğiniz yada değiştirebileceğiniz komut
Burada sık kullanabileceğiniz bazılarını verdim sadece. Bütün AT komutlarına ulaşmak için bağlantıyı kullanabilirsiniz. Bağlantı komutlarından, servis komutlarına kadar bir çok komuta listeden ulaşabilirsiniz. HM10 aslında bir emulatör aracı olarak geçtiğinden iletişim için sadece bir özellik tanımlıdır. Araştırdığım kadarı ile de farklı özelliklerden aynı anda farklı veri göndermek mümkün değildir. Ancak bir yöntemi varsa yorum yada mail ile bilgilendirirseniz gerekli incelemeleri yapıp konuya eklemeye çalışırım.
Bunların dışında önemli olabilecek bir AT komutu olarak “AT+SLEEP” de mevcut. Bu komut ile HM-10 cihazı uyutulabilir. Uyku modunda çektiği akım mikroamplere düşecektir ki bu da güç tasarrufu gerektiren uygulamalarda oldukça önemlidir. Cihazı uykudan çıkarmak için bazı kaynaklarda 80 byte’ den daha uzun bir veri göndermenin yeterli olduğu yazıyordu. Ancak benim elimdeki modüle Bluetooth ile bağlanmak uyanması için yeterli oluyor. Yani kullandığınız cihazın içerisindeki yazılımın versiyonundan kaynaklı bazı farklılar olabilir. Bunlara dikkat etmelisiniz.
HM-10′ nun kullanımı her ne kadar zor olmasa da HC-05 kadar da kolay değil. Örneğin bir HC-05 cihaz ile eşleştiğinizde onunla bir seri port oluşturulur ve o portu dinleyen herhangi bir araç (Arduino IDE, Realterm, SSCOM) ile haberleşmeye başlayabilirsiniz. Ancak HM-10 kullanılabilecek araçlar biraz daha farklı olacak. Bilgisayardan bağlanacaksanız bağlantıdaki yada benzeri bir BLE uygulamasına ihtiyaç duyacaksınız. Eğer Android telefon kullanacaksanız bağlantıdaki LightBlue uygulamasını tavsiye ederim. Sanırım iOS versiyonu da aynı isimli olarak mevcut. BLE Terminal tarzı uygulamalar da Play Store’ da mevcut ancak anlam veremediğim bazı sorunlar yaşadım. Şimdi Windows 10 mağazasında bulunan uygulama ile nasıl bağlantı yapabileceğimize bir bakalım.
Start butonuna basınca etraftaki BLE cihazlar taranmaya başlar. Ancak önceden eşleştirdiğiniz bir ciahz varsa onlar da burada görünürler. Benim HM-10 cihazımın adı BT05 olduğundan ona bağlanıyorum. Daha sonra aşağıdaki gibi karmaşık görünen bir ekran karşımıza çıkıyor. Bu ekranda aslında yukarıda bahsettiğimiz servisler ve özellikler görünmekte. İhtiyacımız olan özelliği bulup onu dinlemeye başlamalıyız. Diğerleri ise daha önceden bahsettiğimiz cihaz özelliklerini tutan servisler. Resimden de görüldüğü gibi bu özellikler cihaz ismi, MAC adresi yada model numarası gibi özellikler.
Bu servislerin arasında kırmızı ile işaretli olanın veri iletişimi için kullanılması gereken servisi gösteriyor. Bu servisin kullanılması gerektiğini yazan bir yer görmedim. Ancak HM-10′ da yazma yetkisinin olduğu tek özellik bu. Deneme yaparak da verinin gönderildiğini ve alınabildiğini gözlemledim. Bu özelliğe tıkladığımızda aşağıdaki resimdeki gibi bir ekran karşımıza çıkıyor. Burada gelen verinin görüntüğü ve veri tipinin seçilebildiği seçenekler bulunmakta. Ben Arduino’ dan saniyede bir sıralı olarak artan “Hello World 3” şeklinde veri gönderiyorum. Okuma kısmında UTF-8 ayarı seçili olunca karakter olarak gelen veri görünmekte. Veri göndermek için ise bunun hemen altındaki kısımı kullanabiliyoruz. Okuma kısmında olduğu gibi göndermek kısmında da verinin çeşidi seçilebiliyor. “test1” şeklinde karakter dizisi bir veri karşı tarafa göndermek için yine UTF-8 veri tipi seçilmelidir.
Android uygulama kullanırken de yapılması gereken işlemler neredeyse aynıdır. Cihaz ile eşleştikten sonra servisler ekranından ilgili servis altındaki özellik seçilmeli böylece veri iletişimi gerçekleştirilebilir. Bu konuda anlatacaklarım bu kadar. C# yada Android uygulama ile de kullanımına ilerleyen zamanlarda bakmaya çalışacağım. Bu konuda yazılım olarak aşağıdaki gibi bir yazılım kullandım. Basit ve kısa bir yazılım olduğundan direk konu sonuna ekledim.
#include <SoftwareSerial.h> // HM-10 Bağlantı pinleri SoftwareSerial mySerial(2, 3); unsigned long lastTime = 0; int cnt = 0; void setup() { // put your setup code here, to run once: // Seri haberleşmeyi başlat Serial.begin(9600); // Bluetooth ile haberleşmeyi başlat mySerial.begin(9600); Serial.println("Send At Commands"); } void loop() { // bluetooth' dan gelen veriyi seri porta yazdır if(mySerial.available()) { Serial.write(mySerial.read()); } // bir saniye geçmişse sayacı bir arttırıp gönder if(millis() - lastTime > 1000) { mySerial.print("Hello World: "); mySerial.println(cnt++); lastTime = millis(); } }
İyi çalışmalar dilerim…
İyi günler. Dediklerinizi tek tek yaptım ve LE exp. üzerinde artan değerleri gördüm. Ancak Seri Port Ekranından AT komutunu gönderdiğim vakit herhangi bir yanıt gelmiyor. “HM10 serial started at 9600” yazısı dışında herhangi bir değişiklik yok. Ayrıca farklı bir cihazla(Android) bağlanmak istediğim zaman “erişim reddedildi” hatası alıyorum(Bluetooth LE exp. ve pc bağlantısını kapatıp.). Aşağıdaki linkteki basit uygulamayı denemek istedim ama sonuç alamıyorum.( Rx ve Tx pinlerini dirençledim linktekine ek olarak.)
https://circuitdigest.com/microcontroller-projects/how-to-use-arduino-and-hm-10-ble-module-to-control-led-with-android-app
Merhaba, HM-10 cihaza AT komut gönderebilmeniz için HM-10′ nun herhangi bir cihaza Bluetooth ile bağlanmamış olmaması gerekir. Aksi taktirde ona gönderdiğiniz komutları yorumlamak yerine bağlandığı cihaza gönderir. Erişim reddedildi hatasının sebebini açıkcası anlamadım. Ancak konuda bahsettiğim android uygulama dışında herhangi bir uygulama ile bağlanmaya çalışmanız sorunlara sebep olabiliyor. İyi çalışmalar dilerim…
Aynı sorunu yaşıyorum telefondan bağlanmıyor. Bir çözüm bulabildiniz mi?
merhabalar. otonom çalışan robotuma hm 10 bluetooth baglantısı yapıp bu bluetooth dan gelen verileri hemen uygulasın diye kesmeye atmak istiyorum. yani bluetooth gelen verileri kesme ile kontrol etmek istiyorum ki otonom araba sensör degerlerine bakmaksızın bluetooth gelen komutu öncelikli yapsın. Lakin kesme içindeki bluetooth komutlarını ne yazık ki okumuyor bu konu ile ilgili yardımcı olabilir misiniz lütfen.
Merhaba, açıkcası sorununuzu tam anlamadım. Yazılımınızı incelemem için mail gönderebilirsiniz. Anladığım kadarı ile yapmak istediğiniz iş için HC-05 modül kullanabilirsiniz. Size tavsiyem kullanımı daha kolay olan HC-05 kullanmanızdır. İyi çalışmalar dilerim…