Blue

Merhaba arkadaşlar. Yeni bir yazı ile yine birlikteyiz. Bu yazıda STM8 VL Discovery kitimiz ile Bluetooth uygulaması yapacağız. Daha önce HC-05, HC-06 gibi UART dan gönderilen dataları bluetooth üzerinden yayın yapabilen modüllere rast gelmişsinizdir. Bizde bu yazımızda HC-06 (Slave) modülümüz ile STM8 arasında bağlantı kurup bluetooth üzerinden veri göndereceğiz. Sonrasında ise modül için kullanılan AT komutlarından bahsedeceğiz. Bu modülle alakalı datasheet i buradan indirip, ayrıntılı olarak inceleyebilirsiniz. Bu modülün üreticisi olan firmanın web sitesinide buradan inceleyebilirsiniz. Yalnız web sitesi çince olduğundan google çeviri ile bakmanızı tavsiye ederim…


Bahsi geçen bluetooth modül aşağıdaki gibidir. Bu modülün HC-03, HC-04, HC-05, HC-06 gibi modelleri bulunmaktadır. Bu modüller master veya slave olarak türleri bulunmaktadır. Örneğin HC-05 modeli hem master, hemde slave olarak çalışabilmektedir. Hangi modda çalışacağını AT komutları ile ayarlanabilir. HC-06 modülü ise sadece slave olarak çalışan bir modüldür. Bluetooth haberleşmede master ve slave, bağlantıyı başlatabilme durumuna göre belirlenir. Bir master modül, bağlantıyı başlatabilir. Ama slave modül bağlantıyı başlatamaz. Biz bu yazı dahilinde slave olarak çalışan modülün bağlantısını pc ile sağlayacağımız için bağlantıyı pc başlatacaktır. Tabi bu haberleşmeyi etkilemeyecek. Çift yönlü datayı sağlıklı bir şekilde gönderip alabiliyoruz. Yani birçok uygulamayı rahatlıkla yapabilirsiniz.


20101214192448102


Ben HC-06 modülü dealextreme den satın aldım. Ve özellikle küçüçük pinlere lehim yapmakla uğraşmamak için hazır board üzerinde pinleri çıkartılmış şekilde tercih ettim. Yanında pinlere takılmak üzere 4lü kabloda gönderildiği için benim için kitle, modülün bağlantısını yapmam aşırı derecede kolay oldu.


sku_104299_1


Ayrıca modülün silikon kılıf içerisinde muhafaza edilmiş olmasıda gayet iyi oluyor. Modül ile birlikte gelen kabloda aşağıdaki gibi yaklaşık 15cm uzunluğunda 4 pin lik bir dişi kablodur. STM8 VL Discovery kitindeki işlemcinin pinleride erkek pin header lar ile dışarı alındığı için bağlanması kolay oluyor haliye…


sku_104299_5


Windows 7 yüklü pc de,  bluetooth aygıtlarını aratınca aşağıdaki gibi “YAREN” isimli modül görülebilir durumdadır. Ben modülü ilk aldığımda “BT-UART” ismiyle gelmişti. Daha sonra AT komutları vasıtasıyla cihaz ismini değiştirdim.. Modülü, pinleri dışarı alınmış ve base-board üzerine lehimlenmiş  halde satın almamış iseniz yani modülü en sade haliyle (ilk resimdeki halde) almışsanız, bluetooth ismi “linvor” olması gerekiyor. Şifre ise her iki türlüde aynı : “1234”… Şifreyi de daha sonra AT komutları ile değiştirebilirsiniz.


BB10


Cihazı bluetooth aygıtlarına ekledikten sonra bilgisayarınızda, modül ile ilişkilendirilmiş sanal bir com port oluşmuş olması gerekiyor. Bunu aşağıdaki gibi bluetooth ayarlarından görebiliriz.


BB11


Artık modül vasıtası ile bluetooth üzerinden haberleşmemiz gerçekleşebilir. Yukarıda görüldüğü gibi PC de COM4 üzerinden bir portumuz açılmış vaziyette. Mikrodenetleyici ile UART üzerinden gönderdiğimiz kodlar bluetooth ile PC ye COM4 üzerinden alınabiliyor. Ve PC den de COM4 üzerinden gönderilen datalar, mikrodenetleyiciye ulaşır.


Ezcümle, mikrodenetleyici üzerinden PC ye periyodik olarak bir text gönderelim… Bunun için aşağıdaki kodları kullanabiliriz.


MCU -> PC   
#include <iostm8s003k3.h>
#include <intrinsics.h>
 
unsigned char a;
 
void InitClock(void)
{
   CLK_ICKR_HSIEN = 1;
   while(!CLK_ICKR_HSIRDY);
   CLK_CKDIVR = 0x00;
}
 
void InitUART(void)
{
  UART1_BRR2  = 0x05;
  UART1_BRR1  = 0x11;
  UART1_CR2_REN  = 1;
  UART1_CR2_TEN  = 1;
}
 
void SendByte(char i)
{
  while(UART1_SR_TXE!=1);
  UART1_DR = i;
}
 
void SendString(const char *s)
{
   while(*s)
      SendByte(*s++);
}
 
void __delay(void)
{
  unsigned long int j=150000;
  while(j--);
}
 
void main(void)
{
   InitClock();
   InitUART();
 
   for(;;)
   {     
     SendString("WWW.MCU-TURKEY.COM ");
     SendByte('0'+a++);
     SendString("\n\r"); 
     if(a==10) a=0;
      __delay();
   }
}


Kodlardan anlaşılacağı üzere, main fonksiyonunda ilk olarak “clock” ve “uart” ayarları yapılmıştır.  Daha sonra sonsuz döngü içerisinde ise belirli bir text gönderilip ardındanda a değişkeni ile belirlenen ve her gönderimde sayısı artırılan bir sayı gönderilmiştir. Ardından da CR LF karakterleri gönderilip yeni satıra geçilmesi sağlanmıştır. Son olarak a değişkeninin 10’a ulaşıp ulaşmadığı kontrol edilmiş, eğer ulaşmışsa sıfırlanmış ve belirli bir gecikme uygulanarak aynı işlemler sürekli olarak devam ettirilmiştir. Bu kod vasıtasıyla PC ye gönderilen datalara bakacak olursak,


BB42


Görüldüğü gibi 57600 bps baudrate hızında 8-N-1 formatta başarılı bir şekilde mikrodenetleyiciden gönderilen data alınmıştır. Bir başka örnek olarak aşağıdaki kodlar ile PC den mikrodenetleyiciye veri gönderimi örneği yapalım isterseniz.


PC -> MCU   
#include <iostm8s003k3.h>
#include <intrinsics.h>
 
unsigned char ReceiveByte;
 
void InitClock(void)
{
   CLK_ICKR_HSIEN = 1;
   while(!CLK_ICKR_HSIRDY);
   CLK_CKDIVR = 0x00;
}
 
void InitGPIO(void)
{
  PD_DDR_DDR0 = 1;
  PD_CR1_C10  = 1;
  PD_ODR_ODR0 = 1;
}
 
void InitUART(void)
{
  UART1_BRR2  = 0x0A;
  UART1_BRR1  = 0x08;
  UART1_CR2_REN  = 1;
  UART1_CR2_RIEN = 1;
}
 
void __delay(void)
{
  unsigned long int j=150000;
  while(j--);
}
 
void main(void)
{
   InitClock();
   InitGPIO();
   InitUART();
 
   __enable_interrupt();
 
   for(;;);
}
 
#pragma vector=UART1_R_RXNE_vector
__interrupt void uart1_RX_ISR(void)
{
   ReceiveByte = UART1_DR;
 
   if(ReceiveByte=='A')
   {
     PD_ODR_ODR0 = 0;
     __delay();
     PD_ODR_ODR0 = 1;
   }   
}


Burada da, PC den ‘A’ karakteri gönderilirse, kit üzerindeki PD0 pinine bağlı led yakılıp, bir süre beklenip sonrada söndürülmektedir. Bir başka örnek yapalım isterseniz… Burada da PC den gönderilen data PC ye geri gönderilsin. Yani ECHO dediğimiz olayı yazılım ile gerçekleştirelim. (Bu arada baudrate 115.2 kbps hızına alınmıştır.)


#include <iostm8s003k3.h>
#include <intrinsics.h>
 
unsigned char ReceiveByte;
 
void InitClock(void)
{
   CLK_ICKR_HSIEN = 1;
   while(!CLK_ICKR_HSIRDY);
   CLK_CKDIVR = 0x00;
}
 
void InitUART(void)
{
  UART1_BRR2  = 0x0A;
  UART1_BRR1  = 0x08;
  UART1_CR2_REN  = 1;
  UART1_CR2_TEN  = 1;
  UART1_CR2_RIEN = 1;
}
 
void SendByte(char i)
{
  while(UART1_SR_TXE!=1);
  UART1_DR = i;
}
 
void main(void)
{
   InitClock();
   InitUART();
 
   __enable_interrupt();
 
   for(;;);
}
 
#pragma vector=UART1_R_RXNE_vector
__interrupt void uart1_RX_ISR(void)
{
   ReceiveByte = UART1_DR;
   SendByte(ReceiveByte);  
}


Aşağıda son yazılım ile ilgili terminal çıktısını görebilirsiniz. Bu arada ben terminal programı olarak Eltima firmasının Advanced Serial Port Terminal yazılımını kullanıyorum. Gayet kullanışlı ve kullanımı kolay. Tavsiye ederim.


BB13


Birde bu modül ile alakalı AT komutlarından bahsetmek istiyorum. Bu modül ile ilgili aşağıdaki gibi AT komutlarını kullanabilirsiniz.


1. AT KOMUTLARI İLE HABERLEŞMEYİ TEST ETMEK


TX : AT

RX : OK


Aşağıdaki kod vasıtası ile bir deneme yapalım hemen…


#include <iostm8s003k3.h> 
#include <intrinsics.h> 
 
unsigned char ReceiveBuffer[20]; 
unsigned char Index; 
 
void InitClock(void) 
{ 
   CLK_ICKR_HSIEN = 1; 
   while(!CLK_ICKR_HSIRDY); 
   CLK_CKDIVR = 0x00; 
} 
 
void InitUART(void) 
{ 
   UART1_BRR2 = 0x0A; 
   UART1_BRR1 = 0x08; 
   UART1_CR2_REN = 1; 
   UART1_CR2_TEN = 1; 
   UART1_CR2_RIEN = 1; 
} 
 
void SendByte(char i) 
{
   while(UART1_SR_TXE!=1);
   UART1_DR = i; 
} 
 
void SendString(const char *s) 
{ 
   while(*s) SendByte(*s++); 
} 
 
void __delay(void) 
{ 
   unsigned long int j=300000; 
   while(j--); 
} 
 
void main(void) 
{ 
   InitClock(); 
   InitUART(); 
 
   __enable_interrupt(); 
 
   __delay(); 
 
   SendString("AT"); // "AT" komutu gönderiliyor... 
 
   for(;;); 
} 
 
#pragma vector=UART1_R_RXNE_vector __interrupt 
void uart1_RX_ISR(void) 
{ 
   ReceiveBuffer[Index++] = UART1_DR; 
}

AT1


Yazılımı derleyip yükledikten sonra, debug ortamında 3-5 sn bekledikten sonra durdurduktan sonra modülden gelen datayıizleme penceresinden görebiliriz… Aşağıdada “AT” komutu gönderildiğinde modül “OK” cevabını vermiştir.


2. AT KOMUTLARI İLE HABERLEŞME HIZINI (BAUDRATE) DEĞİŞTİRMEK


TX : AT+BAUD1

RX : OK1200


Modül içerisinde kullanılabilecek baudrate değerleri tanımlanmıştır. Bizim gönderdiğimiz “BAUD1” sözcüğü aslında “1200” değerini ifade etmektedir. Diğer tanımlı değerler ise şunlardır.


BAUD1 : 1200

BAUD1 : 2400

BAUD3 : 4800

BAUD4 : 9600

BAUD5 : 19200

BAUD6 : 38400

BAUD7 : 57600

BAUD8 : 115200


Örneğin, “AT+BAUD4” olarak komut gönderdiğimizde baudrate i 9600 yapmak istiyoruz demektir. Yukarıdaki AT komutu için kullandığımız örnek yazılımdaki satırı “AT+BAUD4” olarak denediğimizde aşağıdaki sonucu debug ortamından görebiliriz.


at2


Görüldüğü gibi artık baudrate değerimiz değişti. Bundan sonraki denemelerimizde uart ayarlarını yaparken yeni baudrate değerine göre yapmamız gerektiğini unutmayalım. Yoksa haberleşme sağlanmaz…!


3. AT KOMUTLARI İLE MODÜL İSMİNİ DEĞİŞTİRMEK


TX : AT+NAMEcihaz_ismi

RX : OKsetname


Burada da “AT+NAMExxxx” komutuyla cihaz ismini değiştiriyoruz. xxxx yazan yere, modüle vermek istediğimiz cihaz ismini yazıyoruz ve gönderiyoruz. Yukarıdaki AT komut örneği ile denediğimizde aşağıdaki sonucu gözlemleyebiliriz.


at3


Yukarıdanda görüldüğü gibi modüle gönderdiğimiz cihaz ismini değiştirmek için kullandığımız AT komutuna cevap olarak “OKsetname” almışız. Yani gönderdiğimiz isim kabul edildi. Bundan sonra modül ile PC arasında eşleştirm yapılacağı zaman bizim belirlediğimiz isim görünecektir. Ben AT komutunu “AT+NAMEYAREN” olarak gönderdiğim için modül “YAREN” olarak görünecektir.


4. AT KOMUTLARI İLE MODÜL ŞİFRESİNİ DEĞİŞTİRMEK


TX : AT+PINxxxx

RX : OKsetPIN


Modülün bluetooth eşleştirme şifresini değiştirmek için yukarıdaki gibi bir AT komutu kullanıyoruz. xxxx yerine belirlemek istediğimiz 4 haneli rakamı yazıyoruz. Ve bu rakamlar modülün yeni şifresi oluyor. Yine bu komutuda yukarıdaki örnekle denemek istersek, aşağıdaki gibi bir sonuç gözlemleyebiliriz.


at4


Görüldüğü gibi başarılı bir şekilde modülün şifresi değiştirilmiş oldu. Bu arada şunuda söylemek gerekir ki, yeni cihaz ismi ve cihaz şifresi modül resetlendiğinde aktif olur. Mesela az önce cihazın şifresini “1453” olarak değiştirmeme rağmen modülün enerjisini kesip tekrar vermediğim için yeni şifre aktif olmadı. Veya eşleşmiş olan PC niz den aygıtı kaldırıp tekrar eşleştirirseniz, yeni şifreniz aktif olmuş olur.


STM8 VL Discovery ve HC-06 Bluetooth Modül İkilisi

STM8 VL Discovery ve HC-06 Bluetooth Modül İkilisi


STM8 VL Discovery kiti ile çalışırken besleme jumper ını 3.3V konumuna almayı unutmayın. Aksi taktirde modüle zarar verebilirsiniz. Zira modülün rx ve tx pinleri hassastır. Böylelikle bir yazının daha sonuna geldik. Konu ile ilgili bana ulaşabilir, soru sorabilir ve aşağıdaki kısımdan yorum yapabilirsiniz. Faydalı olabilmek niyetiyle… Şimdilik Hoşçakalın…


Ferudun GÖKCEGÖZ

fgokcegoz@yahoo.com