Arduino ile Android Kontrollü Neopixel Led

Merhabalar,

Bu konuda hobi olarak yaptığım bir ışıldağın yapım adımlarına değineceğiniz. Uygulamada ışık vermek üzere 16′ lı neopixel kullanacağız. Neopixel’ lerin özellikle fazalaca ışık vermesi, 1 pin üzerinden RGB olarak kontrol edilebilmesi ve efekt verilebilmesi özellikleri ile çokca tercih edilmekteler. Bende bununla ilgili bir uygulama paylaşmak istedim.

Uygulamamızda kullanacağımız malzemelere gelecek olursak:

  • Arduino Nano
  • Neopixel Dairesel Led (12 – 16 – 24 farketmez)
  • HC-05 Bluetooth
  • LDR
  • 7805 Regülatör

Göründüğü gibi çok az malzeme ile yapılabilir bir uygulama gerçekleştireceğiz. Yapacağımız projede kullanacağımız Neopixel Led’ in parlaklığını ve rengini Android bir uygulama üzerinden değiştirebileceğiz yada istersek bazı görsel efektler oluşturabileceğiz. Ayrıca Led’ in parlaklığını adaptif olmasını ve aydınlık ortamlarda az yanmasını sağlayabileceğiz. Çalışma mantığından da bahsettikten sonra sıra geldi bağlantı şemasına:

Resmi büyültmek için üzerine tıkla
Resmi büyültmek için üzerine tıkla

Az sayıda eleman kullandığımız için bağlantı şemamız da son derece basit. Projeyi ister delikli plakete isterseniz normal devre basımı şeklinde basabilirsiniz.

Şimdi devrenin çalışma mantığına biraz değinip yazılım kısmına geçelim. Devremizde kullandığımız HC-05 bluetooth cihazına Android telefonumuz ile bağlanarak, yazdığımız uygulama yardımı ile devre üzerindeki Neopixel’ ledin kontrolünü sağlıyacağız. Bu kontrol hem renk değişimi hem parlaklık ayarı şeklinde olacaktır. Ayrıca devredeki LDR sayesinde, Android telefon üzerinden otomatik paralık ayarını seçmemiz durumunda paralaklığın dış ortamdaki ışığa göre ayarlanmasını sağlıyacağız. Ayrıca android uygulamadan yapılan ayarlamaları Arduino üzerindeki EEPROM’ a kaydederek kapatıp açmada ayarların kaydedilmesini sağlayacağız.

Arduino kısmında yazacağımız yazılıma gelirsek. Dahil edeceğimiz kütüphaneler aşağıdaki gibidir. İlk kütüphane Neopixel kullanımı için gerekli kütüphanedir. İkincisi Bluetooth ile yapacağımız seri haberleşme için kullanacağımız kütüphanedir. Üçüncüsü ise Arduino içerisindeki EEPROM’ u kullanabilmemiz için gerekli kütüphanedir.

#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>

Bu yazılımda normal Serial yerine SoftwareSerial sınıfını kullanmamızdaki en önemli sebep Arduino’ yu programlamada güçlük çekmemektir. Bilindiği üzere Arduino herhangi bir cihaz ile seri haberleşme(Serial sınıfı ile) içerisinde iken programlanamaz. Bu yüzden yazılımsal olarka oluşturulmuş seri haberleşme sınıfı kullanarak bu sorunun önüne geçmiş olduk ve Arduinu’ yu Bluetooth cihazın bağlantısını sökmek zorunda kalmadan programlayabildik.

Sıra geldi sınıfları ve değişkenleri tanımlamaya. Bu kısımda anlaşılması güç olan bir durum bulunmadığı için hızlı geçiyorum.

#define DEBUG         //haberleşme mesajlarını göster
#define NUM_LEDS 16   //Neopixel led saysıı
#define PIN 4         //Neopixel in bağlı olduğu digital pin

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
SoftwareSerial btSerial(10, 11);

bool adaptive = true;
uint8_t rVal, gVal , bVal, lastBright = 0, brVal1 = 0, setBright = 0;
int effectIndex = 0;

Ayar fonksiyonumuzun içinde EEPROM’ a daha önceden kaydettiğimiz değerleri okuma işlemi yaptık. Böylece güç kesilmesi durumunda Android uygulamadan yaptığımız renk, parlaklık ve efekt ayarları kaybolmamış oldu.

void setup() {
  // put your setup code here, to run once:
#if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif

  strip.begin();
  strip.show();
  btSerial.begin(9600);         //bluetooth haberleşmesi başlattık
  Serial.begin(9600);           //usb seri haberleşmeyi başlattık

  adaptive = EEPROM.read(0);    //ldr nin adaptif olma durumu
  rVal = EEPROM.read(1);        //kırmızı renk değeri
  gVal = EEPROM.read(2);        //yeşil renk değeri
  bVal = EEPROM.read(3);        //sarı renk değeri

  strip.setBrightness(EEPROM.read(4));    //paralıklık değeri

  effectIndex = EEPROM.read(5);    //efekt indisi

  //hafızzadaki efekt indisine göre başlangıç efektini seç
  switch (effectIndex)
  {
    case 0:
      colorWipe(strip.Color(rVal, gVal, bVal), 50);
      break;
    case 1:
      theaterChase(strip.Color(rVal, gVal, bVal), 50);
      break;
  }
}

Neopixel üzerindeki ledler normal şerit led’ lerde olduğu gibi kırmızı, yeşil ve mavi renklerin karışımından elde edilen rengi bize gösterirler. Örneğin saf kırmızı elde etmek istersek kırmızı ledin parlaklığını en fazla yapmalı, yeşil ve mavi renkleri ise yakmamalıyız. Bu uygulamada da ayarlamak istediğimiz rengin RGB değerlerini android kısmındaki “colorpicker” paketi yardımı ile elde ettik. Bu RGB değerlerini bluetooth üzerinden Arduino gönderdik ve Neopixel üzerinde görüntülenmesini sağladık.

Kullandığım “colorpicker” paketinin github bağlantısına buradan ulaşabilirsiniz.

Uygulamamızın döngü kısmına geldik. Bu kısımda Bluetooth’ dan gelen verileri parselleyip neopixel’ e aktarım işlemini gerçekleştireceğiz. Kendi tanımladığım “parseData” isimli fonksiyon içerisinde Android uygulamadan gelen karakterlere göre işlem seçimi yaptık. Bu karakterler:

  • #  ==> Renk seçimi
  • &  ==> Parlaklık ayarı
  • $  ==> Efekt seçimi
  • +  ==> Manuel yada otomatik parlaklık değişimi

Bluetooth’ dan gelen bu karakterleri sorguladıktan gelen veriyi elde etmemiz gerek. Bu adımda Arduino kendi içerisinde bulunan “parseInt” isimli fonksiyonu kullanacağız. Bu fonksiyon gelen verideki tamsayıya çevrilebilir veriyi geri döndürür.Eğer veri tamsayıya çevrilemez bir veri ise “0” değeri geri döner. Eğer göndereceğimiz veride birden fazla ayrı işe yarıyacak tamsayı değer varsa parseInt fonksiyonu kullanabilmemiz için veriyi karakterler ile ayırmamız gerekir. Bu durumda veri formatımız şu şekilde olmalıdır:

#|100|20|30

En soldaki karakter veri ayıracımız. Eğer # gelmişse renk seçimi yapacağız deriz ve daha sonrasında 3 tam sayı değer parselleme işlemi yaparız. Yani kod kısmını şu şekilde yapabiliriz.

if (c == '#')           //renk seçimi
    {
      rVal = s->parseInt();
      gVal = s->parseInt();
      bVal = s->parseInt();
    }

Bu şekilde birden fazla tamsayı değeri ayırabiliriz. Şimdi sırada parlaklık değişimini yumuşak yapmak için yazdığım fonksiyonda. Bu fonksiyon sadece otomatik parlaklık ayarında çalışacaktır.

int changeBrightness(uint8_t p_val)
{
  if (p_val < brVal1)
  {
    brVal1--;
  } else if (p_val > brVal1)
  {
    brVal1++;
  }

  delay(5);
  return brVal1;
}

Yukarıdaki fonksiyon yardımı ile o anki parlaklık ayarının ortam şartı için uygun olan değere kadar adım adım artması sağlanmıştır. Ana döngü içerisinde sürekli çağrıldığı için bir döngüye koyulmamış ve diğer işlemleri engellenmesi önlenmiştir.

Arduino kısmındaki yazılım tamamına bağlantıdan ulaşabilirsiniz. 

Ayarlamaları yapmak için kullandığım Android uygulamanın kaynak kodlarına  bağlantıdan ulaşabilirsiniz. Android uygulama konusunda çok tecrübeli olmamam ve uygulamanın bu şekilde adım adım anlatım için biraz fazla büyük olması sebepleri ile Android uygulmanın anlatımını yapmayacağım. Uygulamanın ekran arayüzü aşağıdaki gibidir.

 

 

Add a Comment

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