Mindwave ile Arduino kontrol

Günümüz sensör teknolojisi oldukça ilerledi.Artık hiçbir şeye dokunmadan istediğimiz eşyaları kontrol etmek mümkün hale geldi.İşte bu yazımızda Neurosky firmasının maindwave başlık seti ile arduino arasında bir iletişim kurarak birşeyler kontrol etmeye çalışacağız.

2       Mindwave beyin sinyallerini okuyarak bluetooth üzerinden farklı bir ortama aktarmak için geliştirilmiş bir set.Beynin farklı bölgelerinde farklı elektriksel sinyallerini frekanslarını okuyabiliyor. Bunlara EEG(Elektroensefalografi) sinyali deniyor.Bu işlem halk arasında ki tabiri ile “Beyin elektrosu çekme” diye geçer.

Projemizde kullanacağımız malzemeleri şöyle sıralayalım ;
1- Neurosky mindwave başlık seti
2- Arduino UNO
3- HC05 Bluetooth modülü
1

Bağlantılarımız yukarıda görüldüğü gibidir. Şimdi Arduino için kodlarımızı yazmaya başlayalım.Öncelikle bluetooth modülümüz için seri portumuzu tanıtalım.

#include <SoftwareSerial.h>     
SoftwareSerial bt(2,3); // RX TX

Daha sonra setup kısmına geçelim..

void setup() {
for(int i=4;i<=13;i++)
    pinMode(i,OUTPUT);
  Serial.begin(9600);     
  bt.begin(9600);     
bt.write("at+role=1\r\n");
delay(500); 
 bt.write("at+link=2068,9d,b8cab4\r\n");
}

Öncelikle for döngüsü içinde 4’ten 13e olan pinleri çıkış olarak tanımladık. Daha sonra USB ve bluetooth modülümüzün baudrate ayarlarını girdik. HC05’in öntanımlı baudrate ayarı 9600 olması gerek. (Farklı olan modüllerde mevcuttur.) Daha sonra at+role komutu ile modülümüzü master moduna aldık.  At+link komutu ile de bağlanacağımız cihazın MAC adresini giriyoruz. (Mindwave MAC adresini bilgisayar ile eşleştirerek veya cep telefonunuz ile eşleştirerek öğrenebilirsiniz. )

Şimdi gelen veriyi tek bayt okumak için bir fonksiyon oluşturalım…

int oku(){
  while(!bt.available());
  int a = bt.read();
  return a;
}

oku adında bir fonksiyon oluşturduk.. while döngüsü içinde verğ gelene kadar bekliyoruz. Veri geldiği zaman gelen verinin 1 bayt okuyoruz ve return ile döndürüyoruz.

Şimdi programımızın ana kısmına geçelim….

void loop(){ 
if(oku()==170){
 if(oku()==170){ 
uzunluk= oku(); 
if(uzunluk > 169) return;

 for(int i=0;i<uzunluk;i++){
 veri[i] = oku(); 
kontrol+=veri[i]; 
} 

byte k = oku();

 kontrol = 255-kontrol;
 if(k==kontrol){ 

for(int i=0;i<uzunluk;i++){

 switch(veri[i]){ 

case 0x02: 
i++; 
sinyal = veri[i]; 
break; 

case 0x04:
 i++; odaklanma = veri[i];
 break; 

case 0x05:
 i++; 
rahatlik = veri[i];
 break; 

case 0x80: 
i=i+3; 
break; 

case 0x83: 
i++; 
i = i+veri[i];
 break; 

} }

 Serial.print ("Sinyal : ");
 Serial.println(sinyal); 
Serial.print ("Odaklanma : ");
 Serial.println(odaklanma); 
Serial.print ("Rahatlık : ");
 Serial.println(rahatlik);
 Serial.println("------------------------"); 

}}} 

int m = round(attention/10); 
if(m>1 && m<11){ Serial.println(m); 
for(int j=4;j<=13;j++)
 digitalWrite(j,LOW); 

delay(200); 
for(int i=4;i<=(m+3);i++) 
digitalWrite(i,HIGH); 

} }

Yukarıda ki şekilde gelen verinin hangi sıra ile geldiği gösterilmektedir. İlk 3 bayt başlık baytı olarak nitelendirelim. Bunun ilk 2 baytı 0xAA(Desimal 170) tir. Bu veri paketinin başladığını gösterir.

if(oku()==170){
  if(oku()==170){
uzunluk= oku();
   if(uzunluk > 169) return;

Yukarıda programda arka arkaya 2 bayt okuduk.Bunlar 170 ise pakedimiz başlamış demektir.

  1. Bayt ise veri kısmının uzunluğunu verir. Bu en fazla 169 olmak zorundadır.Burada 3. Baytı okuyup kontrol ediyoruz. Eğer 169 dan küçük ise yolumuza devam ediyoruz.
    for(int i=0;i<uzunluk;i++){
         veri[i] = oku();
         kontrol+=veri[i];
       }

Daha sonra gelen veri pakedimizi okuyup bir değişkene aktarıyoruz.Bir yandan gelen veriyi toplayarak bir değişkene atıyoruz. Veri pakedinden sonra gelen kontrol değeri , gelen verinin toplamının tersidir. Bu sayede gelen verinin sağlıklı gelip gelmediğini kontrol edeceğiz.

byte k = oku();
  kontrol = 255-kontrol;
  if(k==kontrol){

Son gelen baytı yani kontrol değerimizi okuyup topladığımız veri değerinin tersi ile karşılaştırıyoruz. Eğer gelen verimiz doğru ise ayıklama işlemine başlayacağız.4

Bu tablomuza göre parçalama işlemi yapalım.

for(int i=0;i<uzunluk;i++){
    switch(veri[i]){ 
     case  0x02: 
     i++;
     sinyal = veri[i];
     break;
case  0x04: 
        i++;
        odaklanma = veri[i];
        break;
case  0x05: 
        i++;
        rahatlik = veri[i];
        break;

0x02 den sonraki gelen değerimiz tek baytlık bir değer. Bu değer bize sinyal kalitesini verecek.

Daha sonra odaklanma(attention) ve rahatlık (meditation) değerlerimizi aldık.

Bu yazımızda diğer veriler ile ilgilenmeyeceğiz. Eğer kullanacaksanız aşağıdaki tablodan faydalanabilirsiniz.
5

Daha sonra aldığımız değerleri USB üzerinden bilgisayarımıza gönderip oradan görebiliriz.
Aşağıdaki kodumuzla odaklanma değerimizi ledlerde seviye olarak göstereceğiz.

int m = round(attention/10); 
      if(m>1 && m<11){  
    for(int j=4;j<=13;j++)
    digitalWrite(j,LOW);
    delay(200);
    for(int i=4;i<=(m+3);i++)
    digitalWrite(i,HIGH); 
    }

Projeyi yaparken kullandığım herşeye linkten ulaşabilirsiniz ;
https://drive.google.com/drive/folders/0BzZfeO0duqilVnpaczZhNXdyUXc?resourcekey=0-EiRZ-WBInkTvUQHWisl29A&usp=sharing

Herkese kolay gelsin

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir