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:
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.