Sesle Arduino Devresini Kontrol Edelim – Bluetooth Bağlantısı
Türkçe Arduino sesli asistan oluşturmak CEYD-A ile mümkün. IoT çalışmaları yapan geliştiriciler için faydalı olacak bu yazıda, HC 05 Bluetooth modülü ile CEYD-A’nın haberleşmeni sağlayacağız. Çalışmada gereksinimler şunlar:
Arduino Uno | |
HC 05 Bluetooth Modülü | |
1K Ohm ve 2.2K Ohm Dirençler | |
Breadboard | |
Jumper Kablolar (Erkek-erkek ve dişi-erkek) | |
CEYD-A uygulaması |
Yapının şeması aşağıdadır. Son aşamada CEYD-A, HC-05 Bluetooth modülüne 1 veya 0 değer gönderecektir. Sesli arduino asistan gerçekleştirmek CEYD-A ile mümkün olacaktır.
Arduino IDE ile oluşturulacak ve cihaza gönderilecek kod aşağıdadır. Serial ve BTSerial transfer hızlarını aynı yaptığınızdan emin olunuz. Örnekte 9600 baud kullanılmıştır. Direnç kullanılmasının sebebi HC-05 e gidecek olan gücü modülün zarar görmemesi için 3.3V a düşürmek ve akımı sınırlamak içindir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <SoftwareSerial.h> SoftwareSerial BTSerial(10, 11); // RX, TX char data; void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); BTSerial.begin(9600); pinMode(13, OUTPUT); Serial.println("Enter AT command"); } void loop() { if (BTSerial.available()) { data = BTSerial.read(); Serial.write(BTSerial.read()); if (data == '1') { digitalWrite(13, HIGH); Serial.println("Led yandi"); } if (data == '0') { digitalWrite(13, LOW); Serial.println("Led sondu"); } } if (Serial.available()) { BTSerial.write(Serial.read()); } } |
Eğer CEYD-A tarafından tek karakter (char) değil de kelime (String) tipinde gönderim yapıyorsanız, data değişkenini aşağıdaki gibi String tanımlayabilirsiniz. Kodun gerekli olan kontrollerini de değiştirebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <SoftwareSerial.h> SoftwareSerial BTSerial(10, 11); // RX, TX void setup() { Serial.begin(9600); BTSerial.begin(9600); } void loop() { if (BTSerial.available()) { String data = BTSerial.readString(); Serial.print(data); } if (Serial.available()) { char str[255]; Serial.readString().toCharArray(str,255); BTSerial.write(str); } } |
Devrenin Son Hali
CEYD Komutları
Devrenin çalışır halde olmasını sağladıktan sonra, şimdi de CEYD-A’nın desteklediği komutlara bir göz atalım:
cmdlistbluetooth
Mobil cihaza bağlı eşleştirilmiş tüm bluetooth modüllerini ekrana getirir. Gelen listeden HC-05 i seçerseniz bağlanmaya çalışır.
Seçilen modülün MAC adresi staBluetoothMacAddress değişkeninde sonradan kullanılmak üzere saklanır.
cmddiscoverbluetooth
Mobil cihazın bulduğu henüz eşleştirilmemiş tüm bluetooth modüllerini ekrana getirir.
cmdconnectsocketbluetooth (MAC ADRESİ)
Bluetooth modülün MAC adresini parametre olarak gösterip ilgili modüle socket bağlantısı sağlar.
cmdsendbluetooth (DEĞER)
Bluetooth modülüne parametredeki değeri gönderir.
cmdreceivebluetooth
Bluetooth modülünde kuyrukta bekleyen değerleri alır ve gösterir.
cmdreceivebluetoothcontinous (PAR1),(PAR2)
Bluetooth modülünde kuyrukta bekleyen değerleri alır ve devamlı gösterir.
PAR1, 0 ise mikrofona tekrar bastığımızda bu işlemi sonlandırmasını, 1 ise biz onunla sohbet etmeye devam etsek bile devreyi dinlemesini belirtir.
PAR2, 0 ise bilgiyi doğrudan ekrana yazmasını, 1 ise bilgiyi farklı işlemler yapabilmesi için onbluetoothreceived olayına yönlendirmesini belirtir.
Örnek kullanım:
1 2 3 4 5 |
SORU: sürekli bilgi al CEVAP: {!SET staShowCustomCommandUpdateButtons=0!} {!RET cmdreceivebluetoothcontinous 0,1!} |
cmdclosesocketbluetooth
Socket bağlantısını kapatır ve Bluetooth modülünü boşa çıkarır.
onbluetoothreceived (PAR1),(PAR2)
Devreden bilgi geldiğinde bu olay tetiklenir ve otomatik olarak çağrılır. Kendi olayınızı aynı formatta oluşturabilirsiniz. İçeriğine tetiklenme aşamasında CEYD-A’ nın nasıl bir davranışta bulunacağını yazabilirsiniz.
(PAR1) Bluetooth cihazının MAC adresi,
(PAR2) ise devreden gönderilen ham bilgiyi temsil eder.
Örnek kullanım:
1 2 3 4 5 6 7 8 9 10 11 |
SORU: onbluetoothreceived,25.0| SABLON: onbluetoothreceived ({PAR1}),({PAR2}) CEVAP: {!SET saat={!RET saat!}!} {!SET mesafe={!RET cmdfetchregex (.+?)cm.*,1,$2!}!} {!IF $mesafe<4??Çarptık:: {!IF $mesafe>=55??Ufukta bir cisim görünmüyor.:: {!GET mesafe!}cm !}!} <br><small><mute>{!GET mesafe!}cm uzaklıkta bir cisim var.</mute></small> |
CEYD-A ile Devreyi Konuşturalım
Eğer devreyi ilk kez kurduysanız bluetooth cihazının cep telefonu ile eşleştirilmesi gerekmektedir. Cep telefonunda bluetooth cihazlarını listeleyin ve HC-05 eşleşmemiş ise eşleştirin. Ekrana şifre ekranı gelirse 1234 deneyebilirsiniz.
CEYD-A yı açalım ve alt ekranında cmdlistbluetooth yazarak ok tuşuna basalım. Ekrana gelecek listede HC-05 seçelim. #connected uyarısı almalısınız. Sonra aşağıdaki gibi cmdsendbluetooth 1 yazalım. Bu işlem 1 değerini bluetooth cihazına gönderecektir. 1 değerini alan devre LED i yakacak, 0 değeri gönderdiğinizde ise LED i söndürecektir.
Arduino IDE nin Serial Monitor ekranında Led yandı ve Led söndü bilgilerini görebilmeniz gerekiyor.
Konuşma Dili Komutları Hazırlayalım
Bağlantı kurabilmek için önce sesli olarak Bluetooth ile Bağlan demeyi unutmayınız.
İSTEĞE BAĞLI: Eğer doğal dil cümleleri kullanmak istiyorsanız size özel kurgular oluşturabilirsiniz.
Kurguları kodla.ceyd-a.com adresinden girebilirsiniz. Giriş yaparken CEYD-A uygulamasındaki geliştirici kullanıcı bilgileriniz ile site üzerindeki giriş bilgileri aynı olmalıdır.
Tek bir kurgu, SORU, ŞABLON ve CEVAP üçlüsünden oluşmaktadır. Dilediğiniz kadar kurgu ekleyebilirsiniz. Kurguları site üzerinde güncelledikten sonra, CEYD-A uygulamasını açıp güncelle deyiniz. Kurgular cihazına yansıyacaktır.
Kurgularınızı https://kodla.ceyd-a.com sitesinden girebilir, deneyebilir ve yayınlayabilirsiniz.
Denemelerimizin başarıyla sonuçlanmasından sonra artık konuşma diliyle bu işlemleri yaptıralım.
Bluetooth a bağlan dediğimize modüle bağlantı kuracak kurgu aşağıdadır. Bu kurgu tüm kullanıcılar için oluşturulmuştur. Tekrar oluşturmanıza gerek yoktur.
1 2 3 4 5 6 7 8 9 |
SORU: bağlan% SABLON: {BAŞ}bluetooth{HER}$ CEVAP: {!IF $staBluetoothMacAddress==??{!RET cmdlistbluetooth!}:: {!SET sonuc={!RET cmdconnectsocketbluetooth {!GET staBluetoothMacAddress!}!}!} {!IF $sonuc has connected??Bağlantı sağlandı.::Bir sorun oluştu.!} !} |
Işığı aç dediğimizde bağlantı kurulan bluetooth cihazına 1 değerini gönderecek kurgu aşağıdadır.
1 2 3 4 5 |
SORU: ışığı aç CEVAP: {!SET ignored={!RET cmdsendbluetooth 1!}!} |
Işığı kapat dediğimizde bağlantı kurulan bluetooth cihazına 0 değerini gönderecek kurgu aşağıdadır.
1 2 3 4 5 |
SORU: ışığı kapat CEVAP: {!SET ignored={!RET cmdsendbluetooth 0!}!} |
Artık arduino sesli asistan denemelerimizi CEYD-A ile yapabiliriz.
Benzer çalışmalar
Oda Sıcaklığı Ne Kadar?
Geliştirilen devreleri sesle kontrol etmek CEYD-A ile çok kolay. Peki, Oda Sıcaklığı Ne Kadar? dediğimizde CEYD-A arka planda neler yapıyor? Ona uzun cümlelerle sesli olarak aşağıdakileri de söylenebilirdi. Ama bunlar kendisine öğretildi.
1) Bluetooth a bağlan
2) Bluetooth a 2 gönder
3) Bluetooth’dan bilgi al
4) Bluetooth bağlantısını kapat.
Bu örnekte Bluetooth üzerinden bilgi alacağımız için farkettiyseniz Serial çıkışı olan TXD1 pininden (yeşil kablo) gelen değeri dirençlerle oranlayarak (kahverengi kablo) üzerinden Bluetooth’un RXD pinine gönderiyoruz. Bu şekilde Bluetooth CEYD-A’ya serial da yazdığınız tüm yazıları gönderebiliyor.
Gereksinimler:
Arduino Uno | |
HC 05 Bluetooth Modülü | |
1K Ohm ve 2.2K Ohm ve 10K Ohm Dirençler | |
LM35DZ Sıcaklık Sensörü | |
Breadboard | |
Jumper Kablolar (Erkek-erkek ve dişi-erkek) | |
CEYD-A uygulaması |
Devre Şeması
Arduino IDE Kodu
LM35 sıcaklık ölçer sensörü A5 pinine bağlanmıştır. 10 nolu pin üzerinden CEYD-A’nın bluetooth’a gönderdiği bilgi alınmaktadır. Bilgi data değişkenine atılmakta ve 2 değeri gönderilmiş ise, lm35 üzerinden sıcaklık değeri alınmakta ve Serial’a bu bilgi yazılmaktadır. TXD 1 pini Serial daki bilgiyi gösterdiği için bu bilgi voltajı düşürülerek bluetooth’un RXD pinine gönderilmekte ve CEYD-A okuma yaptığında bu bilgi sesli olarak okunmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <SoftwareSerial.h> SoftwareSerial BTSerial(10, 11); // RX, TX int lm35 = A5; int okunanVoltaj; float sicaklik; char data; void setup() { analogReference(INTERNAL); Serial.begin(9600); BTSerial.begin(9600);//38400 } void loop() { if (BTSerial.available()) { data = BTSerial.read(); Serial.write(data); if (data == '2') { okunanVoltaj = analogRead(lm35); sicaklik = okunanVoltaj / 9.31 ; delay(1000); okunanVoltaj = analogRead(lm35); sicaklik = okunanVoltaj / 9.31 ; Serial.print("Sensörlerime göre oda sıcaklığı "); Serial.print(sicaklik); Serial.println(" derecedir."); } } if (Serial.available()) { BTSerial.write(Serial.read()); } } |
CEYD-A Kullanımı
Yeni öğreneceği cümleleri mevcut öğrendiği cümlelerden oluşturabiliyoruz. Bu şekilde cümle haznesi her geçen gün katlanarak artmakta.
Mesafe ne kadar?
CEYD-A, devrenin önündeki engelin kaç santimetre uzaklıkta olduğunu söylüyor.
Bilindiği gibi CEYD-A, son sürümlerden itibaren bluetooth üzerinden devreyi kontrol edip anlık bilgi alabiliyor. Gelecek sürümden itibaren, “sürekli bilgi al” komutu ile bluetooth modülünü siz tekrar mikrofona basana kadar dinliyor ve gelen bilgileri asenkron olarak ekrana yansıtabiliyor. Bu özellik, devrede bir olay olduğunda CEYD-A’nın tetiklenebilmesi demek.
Gereksinimler:
Arduino Uno | |
HC 05 Bluetooth Modülü | |
1K Ohm ve 2.2K Ohm Dirençler | |
HC-SR04 Mesafe Ölçer Sensör | |
Breadboard | |
Jumper Kablolar (Erkek-erkek ve dişi-erkek) | |
CEYD-A uygulaması |
Devre Şeması
Arduino IDE Kodu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#include <SoftwareSerial.h> #define echoPin 6 #define trigPin 7 int maximumRange = 50; int minimumRange = 0; int oncekiolcum = 0; void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { int olcum = mesafe(maximumRange, minimumRange); if(olcum!=oncekiolcum) { Serial.print(olcum); Serial.println("cm"); } delay(2500); oncekiolcum = olcum; } int mesafe(int maxrange, int minrange) { long duration, distance; digitalWrite(trigPin,LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration / 58.2; delay(50); if(distance>=maxrange || distance<=minrange) { return 0; } return distance; } |
CEYD-A Kullanımı
Çalışmanın hazırlanmasında katkıları bulunan Sn. Ahmet Taşdemir‘e teşekkür ederim.
Birde direnç neden bağlıyoruz o kısmı çözemedim hc05 i direkt olarak bağladığımızda algılıyor ardiuno aradaki direnci anlamadım
Serial.print() kullanarak CEYD-A dan hangi bilgiler geliyor onu kontrol edebilirsiniz. BTSerial ile Serial in aynı baud hızında olmasına dikkat ediniz.
Direnç bağlanmasının sebebi gücü 5v yerine daha düşük bir seviye düşürmek ve akımı dengelemek. 5v da verebilirsiniz ama yakma riski olmaması adına ben direnç koydum.
Direnç olarak 1k / 2k oranını tercih ediyoruz HC-05 e 3V civarı bir güç gidebilmesi için.
Eğer uygulamadan çıktıktan sonra da HC05 modulü bağlı görünüyorsa başja bir cihaza bağlı kalmış olabilir. Çünkü CEYD-A ya bağlı ise kapatılınca bağlantı kopar.
Bence bağlantıdan önce HC05 ışıklarının hızlı yanıp sonduğüne bakınız. Bu boşta demektir. Sonra bluetooth bağlan dediğinizde CEYD-A ya bağlanacak ver yanıp sönme hızı bir kaç saniyede bire düşecektir
Char yerine String kullanımı için şu şekilde bir kod kullanabilirsiniz:
void loop()
{
if (BTSerial.available())
{
String data = BTSerial.readString();
Serial.print(data);
}
if (Serial.available())
{
char str[255];
Serial.readString().toCharArray(str,255);
BTSerial.write(str);
}
}