Haber

DBM01 Bluetooth 4.0

Mavidiş 4.0 düşük güç tüketim modülü (Bluetooth 4.o low energy module, Bluetooth LE , Bluetooth Smart) sağlık ,spor ,güvenlik ve ev eğlence sektörlerinde yeni uygulamalara yönelik “Bluetooth Special Interest Group” tarafından tasarlanan ve pazarlanan bir kablosuz kişisel alan ağ teknolojisidir. Klasik Bluetooth ile karşılaştırıldığında Bluetooth Smart benzer bir iletişim alanını korurken önemli ölçüde azaltılmış güç tüketimi ve maliyet etkin bir çözüm sağlamak için tasarlanmıştır. Bluetooth Smart 2006 yılında Nokia tarafından Wibree adı altında tanıtıldı. Bugün IOS , Android, Windows Phone ve BlackBerry gibi mobil işletim sistemlerinin yanı sıra OS X ,Linux ve Windows 8 dahil olmak üzere bir çok işletim sistemi doğal olarak Bluetooth Smartı desteklemektedir.

GnexLab nesnelerin interneti (IoT) projemizde sensor iletişim networkü olarak Bluetooth 4.0 da kulanmayı düşündüğümüz için Texas Instrumets’ın CC2540 çipini kullanan DBM01 modülü ile bazı çalışmalar yapmaya karar verdik. Bu modülü direnc.net den satın alabilirsiniz.

 

DBM01Modülün temel özellikleri şu şekilde:

  • Frequency Range: 2402~2480MHz
  • UART Data Interface
  • Sensitivity: -93dBm
  • Output Power: ≥3dBm
  • AES-128 Encryption and Decryption
  • Self-adaptable frequency hopping
  • Supply voltage: 2.0~3.6V

Modül ile ilgili datasheet

 

Şimdi modülü nasıl kullanacağımız ile ilgili teknik detaylara bakalım. Öncelikle pin yapısını incelersek:

screen-shot-2014-04-24-at-20-47-48

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Biz temel olarak 5 bacak ile ilgileniyoruz. Bunlar besleme voltajı olarak 3.3V ve GND. İletişim için RX ve TX birde AT komut setini kullanabilmemiz için CTRL. Bu beş bacağa bir iki direncinizi feda edip bacaklardan tel çıkarmanız yerinde olur zira modül oldukça küçük kullanması biraz sıkıntı olabilir. Ben aşağıdaki resim gibi gerekli bacaklara telleri lehimledim.

photo (13)

 

 

 

 

 

 

 

 

 

 

 

 

İletişim için yine USB serial çeviricimizi kullanacağız. Voltaj olarak 3.3v olan bir model seçmeniz yerinde olacaktır. Elimde daha önceden seeedstudio dan aldığım bir USB UART çevirici vardı. Aşağıda resmini görebilirsiniz.

 

photo 2 (4)photo 1 (6)

 

 

 

 

 

 

 

Seeedstudio da halen buna benzer modüller var. Bağlantıların şöyle olması gerekmekte.

USB UART modülü   ————    Bluetooth modülü

vcc ———————————–vcc

gnd———————————–gnd

rx————————————-txd

tx————————————-rxd

gnd———————————–CTRL

Modül için gerekli voltaşıda USB UART modülünden alıyoruz. Aşağıda Breadboard da yaptığım bağlantıları görebilirsiniz.

photo 1 (7)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Şimdi bir terminal programı ile modül ile iletişim kuralım.

Ben bilgisayar olarak MAC kullandığım için Terminal den screen komutu ile bir haberleşme terminali açtım. Komut şöyle:

screen /dev/tty.usbserial-A800BQZZ 38400

Windows kullanıcıları için Realtherm bir seçenek olabilir. Dikkat etmeniz gereken usb modülün driverını kurmak, doğru com porta 38400 baud hızla bağlanmak.

Modülün desteklediği AT komutsetine modülün datasheetinden ulaşabilirsiniz.

İlk olarak denenmesi gereken komut AT komutu bu komuta karşılık OK cevabını alabildiyseniz modül ile iletişimi kurmuşsunuz demektir.

Haberleşmenin diğer ucunu iphone olarak düşünürsek Bluetooth cihazlar ile ilgili çalışmak için geliştirilmiş olan generik LightBlue iphone uygulamasını (ücretsiz) indirip iphonea kuruyoruz. Çevredeki cihazları tarayan yazılım bizim modlülü buluyor ve aşağıdaki ekranla karşılaşıyoruz.

 DBM BLE yi seçecek olursak cihaz ile ilgili bir çok bilgi ekranda görünüyor.

 

photo 2

photo 3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Bu aşamadan sonra AT+SEND=xxx komutu ile cihaza veri göndermemiz mümkün. iphone uygulamasından da read diyerek gelen datayı ekranda görebiliyoruz. xxx komutunun Hexadecimal olması gerektiğini hatırlatalım. Bu yazıda modülü tanıma ve çalıştırma egzersizi yapmış olduk. Daha can alıcı ve iot uygulamalarında bu modülü nasıl kullanabileceğimiz ile ilgili bir başka yazı planlamaktayım.

www.direnc.net den Ersin Yılmaz Bey’e bize test etmemiz için ücretsiz gönderdiği modüller için teşekkür ederiz.

Çeşitli Kaynaklar:

  • http://wingoodharry.wordpress.com/2014/04/24/uart-with-bluetooth-low-energy-ble-using-dorji-dbm01/
  • http://dorji.com/docs/app/ADW1009_Testing_DBM01_In_Android_IPHONE_IPAD.pdf
  • http://dorji.com/docs/app/ADW1009_Testing_DBM01_In_Android_IPHONE_IPAD.pdf
  • http://hackaday.io/project/151-smartcar

 

Haber

ESP8266 İlk Denemeler

ESP8266 modülü ile ilgili genel bilgileri burada vermiştik. Şimdi ilk deneme çalışmaları ile ilgili sizleri bilgilendirmek istiyorum. Bu çip ile iletişim kurmak için seri bağlantı yapmak ve bu bağlantıdan AT komutları ile çiple haberleşmek gerekmekte. Bunu bir çok şekilde yapmak mümkün. Ben ilk olarak çipi tanımak amacıyla USB UART bir cevirici ile bağlantı kurarak çipi kurcalamaya başladım. Elimde daha önceden seeedstudio dan aldığım bir USB UART çevirici vardı. Aşağıda resmini görebilirsiniz.

 

photo 2 (4) photo 1 (6)

 

 

 

 

 

 

 

Baktım seeedstudio da halen buna benzer modüller var. Dikkat edilmesi gereken 3.3v olan modeli kullanmak. esp8266 modülümüz 3.3v olduğundan 5v ürünler kullanmamaya dikkat edilmesi gerekmekte.

ESP8266 wifi modülünü bacak bağlantılarını verelim.

 

4262791411877023544

 

USB UART modlü ile ESP8266 Wifi modülünü bağlarken;

USB UART modülü   ————    ESP8266 Wifi modülü

vcc ———————————–vcc

gnd———————————–gnd

rx————————————-txd

tx————————————-rxd

Bir önemli bağlantı da CH_PD bağlantısını modülün vcc sine bağlamak gerekmekte ben basitce bir tel lehimledim.

Bağlantıları tamamladığımıza göre modül ile ilk iletişimlerimizi kuralım. Ben bilgisayar olarak MAC kullandığım için Terminal den screen komutu ile bir haberleşme terminali açtım. Komut şöyle:

screen /dev/tty.usbserial-A800BQZZ 115200

Windows kullanıcıları için Realtherm bir seçenek olabilir. Dikkat etmeniz gereken usb modülün driverını kurmak, doğru com porta 115200 baud hızla bağlanmak. Bundan sonra terminalden şu komutları göndererek esp8266 ile haberleşebilirsiniz. (Gönderilen komutların başına > işareti koyuyorum bunları terminale biz yazıp enterliyoruz diğer mesajlar modülün geri gönderdikleri onları da italik yapıyorum.)

>AT+RST

  

OK

  

ets Jan  8 2013,rst cause:4, boot mode:(3,7)

  

wdt reset

  

load 0x40100000, len 24444, room 16

  

tail 12

  

chksum 0xe0

  

ho 0 tail 12 room 4

  

load 0x3ffe8000, len 3168, room 12

  

tail 4

  

chksum 0x93

  

load 0x3ffe8c60, len 4956, room 4

  

tail 8

  

chksum 0xbd

  

csum 0xbd

  

ready

Bu reset komutu en sonda ready mesajını alıyorsanız herşey yolunda gidiyor demektir.

Ben ev wifi networküme bağlanmak için aşağıdaki komutu kullandım.

>AT+CWJAP="NNetwork","xxxx"

OK

siz de wifi isim ve passwordünüzü bu şekilde modüle tanıtmalısınız.

Bunun gibi bir çok AT komut seti var bunların tamamını buradan görebilirsiniz.

AT komut setleri ile modüle her istediğinizi yaptırmanız mümkün mesela mevcut wifi modüllerini ve sinyal güçlerini listeletebilirsiniz.

ya da bir web servarına bağlanabilirsiniz.

Peki bu AT komut setlerini gerçek hayatta nasıl modüle gönderebiliriz? Tabiki bir mikro işlemci ile. Aslında esp8266 modülü hem mikro işlemci hem de wifi radio modülü bu çipi direkt programlayarak başka bir mikro işlemciye ihtiyaç kalmadan kullanmak mümkün. Ben bu işlemciyi programlamak yerine herkesin daha aşina olduğu Arduino yu devreye sokarak bir uygulama yaptım. Biraz ondan bahsedeyim.

Mikro işlemci için bir Arduino Mega kullandım. Birden fazla UART a sahip olduğundan bir uart ile ciple haberleşip diğeri ile ekrana debug mesajları yollamak mümkün oluyor.

Kullandığım programı aslında buradan buldum. Biraz modifiye ederek aşağıdaki şekli verdim.

 

#define SSID "NNetwork"
#define PASS "B1065f26C847" // My luggage has the same combination!
#define DEST_HOST "localhost"
#define DEST_IP "192.168.1.2"
#define TIMEOUT 5000 // mS
#define CONTINUE false
#define HALT true

// #define ECHO_COMMANDS // Un-comment to echo AT+ commands to serial monitor

// Print error message and loop stop.
void errorHalt(String msg)
{
 Serial.println(msg);
 Serial.println("HALT");
 while(true){};
}

// Read characters from WiFi module and echo to serial until keyword occurs or timeout.
boolean echoFind(String keyword)
{
 byte current_char = 0;
 byte keyword_length = keyword.length();
 
 // Fail if the target string has not been sent by deadline.
 long deadline = millis() + TIMEOUT;
 while(millis() < deadline)
 {
 if (Serial1.available())
 {
 char ch = Serial1.read();
 Serial.write(ch);
 if (ch == keyword[current_char])
 if (++current_char == keyword_length)
 {
 Serial.println();
 return true;
 }
 }
 }
 return false; // Timed out
}

// Read and echo all available module output.
// (Used when we're indifferent to "OK" vs. "no change" responses or to get around firmware bugs.)
void echoFlush()
 {while(Serial1.available()) Serial.write(Serial1.read());}
 
// Echo module output until 3 newlines encountered.
// (Used when we're indifferent to "OK" vs. "no change" responses.)
void echoSkip()
{
 echoFind("\n"); // Search for nl at end of command echo
 echoFind("\n"); // Search for 2nd nl at end of response.
 echoFind("\n"); // Search for 3rd nl at end of blank line.
}

// Send a command to the module and wait for acknowledgement string
// (or flush module output if no ack specified).
// Echoes all data received to the serial monitor.
boolean echoCommand(String cmd, String ack, boolean halt_on_fail)
{
 Serial1.println(cmd);
 #ifdef ECHO_COMMANDS
 Serial.print("--"); Serial.println(cmd);
 #endif
 
 // If no ack response specified, skip all available module output.
 if (ack == "")
 echoSkip();
 else
 // Otherwise wait for ack.
 if (!echoFind(ack)) // timed out waiting for ack string 
 if (halt_on_fail)
 errorHalt(cmd+" failed");// Critical failure halt.
 else
 return false; // Let the caller handle it.
 return true; // ack blank or ack found
}

// Connect to the specified wireless network.
boolean connectWiFi()
{
 String cmd = "AT+CWJAP=\""; cmd += SSID; cmd += "\",\""; cmd += PASS; cmd += "\"";
 if (echoCommand(cmd, "OK", CONTINUE)) // Join Access Point
 {
 Serial.println("Connected to WiFi.");
 return true;
 }
 else
 {
 Serial.println("Connection to WiFi failed.");
 return false;
 }
}

// ******** SETUP ********
void setup() 
{
 Serial.begin(115200); // Communication with PC monitor via USB
 Serial1.begin(115200); // Communication with ESP8266 via 5V/3.3V level shifter
 
 Serial1.setTimeout(TIMEOUT);
 Serial.println("ESP8266 Demo");
 
 delay(2000);

 echoCommand("AT+RST", "ready", HALT); // Reset & test if the module is ready 
 Serial.println("Module is ready.");
 echoCommand("AT+GMR", "OK", CONTINUE); // Retrieves the firmware ID (version number) of the module. 
 echoCommand("AT+CWMODE?","OK", CONTINUE);// Get module access mode. 
 
 // echoCommand("AT+CWLAP", "OK", CONTINUE); // List available access points - DOESN't WORK FOR ME
 
 echoCommand("AT+CWMODE=1", "", HALT); // Station mode
 echoCommand("AT+CIPMUX=1", "", HALT); // Allow multiple connections (we'll only use the first).

 //connect to the wifi
 boolean connection_established = false;
 for(int i=0;i<5;i++)
 {
 if(connectWiFi())
 {
 connection_established = true;
 break;
 }
 }
 if (!connection_established) errorHalt("Connection failed");
 
 delay(5000);

 //echoCommand("AT+CWSAP=?", "OK", CONTINUE); // Test connection
 echoCommand("AT+CIFSR", "", HALT); // Echo IP address. (Firmware bug - should return "OK".)
 //echoCommand("AT+CIPMUX=0", "", HALT); // Set single connection mode
}

// ******** LOOP ********
void loop() 
{
 // Establish TCP connection
 String cmd = "AT+CIPSTART=0,\"UDP\",\""; cmd += DEST_IP; cmd += "\",80";
 if (!echoCommand(cmd, "OK", CONTINUE)) return;
 delay(2000);
 
 // Get connection status 
 if (!echoCommand("AT+CIPSTATUS", "OK", CONTINUE)) return;

 // Build HTTP request.
 cmd = "Hi from Arduino long message test from the wifi modul hello"; //cmd += DEST_HOST; cmd += ":80\r\n\r\n";
 
 // Ready the module to receive raw data
 if (!echoCommand("AT+CIPSEND=0,"+String(cmd.length()+1), ">", CONTINUE))
 {
 echoCommand("AT+CIPCLOSE", "", CONTINUE);
 Serial.println("Connection timeout.");
 return;
 }
 
 // Send the raw HTTP request
 echoCommand(cmd, "OK", CONTINUE); // GET
 
 
 
 
 
 // Loop forever echoing data received from destination server.
 while(true)
 while (Serial1.available())
 Serial.write(Serial1.read());
 
 errorHalt("ONCE ONLY");
}

 

Burada gördüğünüz gibi bir UDP bağlantısı yapıyoruz. Daha sonra Node.js ile yazdığım çok basit bir UDP server ile haberleşeceğiz. İşte Node.js kodu böyle;

 

var PORT = 80;
var HOST = '192.168.1.2';

var dgram = require('dgram');
var server = dgram.createSocket('udp4');

server.on('listening', function () {
    var address = server.address();
    console.log('UDP Server listening on ' + address.address + ":" + address.port);
});

server.on('message', function (message, remote) {
    console.log(remote.address + ':' + remote.port +' - ' + message);

});

server.bind(PORT, HOST);

Node.js ile karşılaşmayanlara duyrulur javascriptin serverda çalışan şekli mutlaka vakit ayırıp bakın. Arkasında Google var ve çok gelecek vaadediyor.

Bağlantılar için benim setup ım aşağıdaki gibi:

photo (12)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Bord üzerinde bir TTL çevirici kullandım (kırmızı olan). Bunun nedeni daha önce söylediğim gibi modül 3.3v ile çalışıyor. Arduino mega çıkışları 5v. Bu voltajı modüle zarar vermemek için düşürüyoruz. İlgilenen arkadaşlar olursa daha ayrıntılı şemalar verebilirim.

Bu da çalıştırma videosu: