1.12.2012

Wixel Nedir ?

       Wixel

 
Pololu tarafından üretilen programlanabilir ve aynı zamanda kablosuz haberleşmede yapmaya yarayan bir cihaz. Almadan önce benimde fazla bir fikrim yoktu fakat programlanabilir olması ve programlamak için harici derleyiciye gerek olmaması, boyutu ve işleri ile cezbetti :) Ayrıca indirim söz konusuydu fazla düşünecek ve kıyaslayacak vaktimde yoktu açıkçası ;) Wixel ile kablosuz haberleştirme gerektiği durumlarda ek olarak pic,arduino vs. kullanmadan dahi uygulama geliştirmem mümkün olacak. Fakat ben Wixel'i daha çok Arduino üzerinde geliştireceğim uygulamları bilgisayar ile kablosuz olarak kontrol edebilmek için kullanacağım. Wixel'in diğer bir güzel yanı üzerindeki usb soket aracılığı ile kolaylıkla bilgisayara bağlanabiliyor ve programlanabiliyor olması. Bunun için sadece sürücülerini kurmak yeterli. Herhangi bir harici programlayıcıya ihtiyaç duymuyor.

Ayrıntılı bilgi için ya da satın almak http://www.pololu.com/catalog/product/1337 linke bakabilirsiniz.

Genel olarak özellikleri :

- USB bağlantı
- 2.4 GHz. ve 256 faklı kanal
- Üzerinde 24 Mhz. işlemci var. 
- 15 tane giriş çıkış pini 6 tane analog giriş pini mecut. :)
- Açık kaynak kod uygulamalar
- 2,7-6,5 V aralığında çalışabiliryor
- Açık kaynak kod. Gerekli kaynaklara https://github.com/pololu/wixel-sdk linkten erişilebilir.

Radyo sinyal özellikleri :
  • Frekans  : 2400 – 2483.5 MHz 
  • Mesafe : Yaklaşık 50 adım
  • Bit rate : 350 kbps
  • Effective data rate:  10 KB/s;

    Aşağıdaki reşimde wixel'in boyutu ve pinleri görülebilir. Oldukça ufak bir işlemciye ve boyuta sahip. Bu sayede projelerde yer sıkıntısı yaratmıyacağından rahatlıkla kullanılabilir.





Aşağıdaki resimde Wixel'in giriş ve çıkışları görünüyor.







Daha öncede söylediğim gibi Wixel programlanabilir kablosuz haberleşme modülü. Dolayısıyla gelelim programlanabilirlik kısmına. Aşağıda wixel için yazılmış olan açık kaynak kod basit bir proje var. Bu proje led yakıp söndürme yani diğer bir anlamı ile "Hello World" uygulaması :) Bu aynı zamanda Wixel kurulumundan bahsettikten sonraki yazımın konusu ve ilk proje olacak. Kodlama yapılırken C programlama dili kullanılıyor. Dolayısıyla az biraz C programla bilgisi gerektiriyor. Bunun dışında C ile yazılmış uygulamarımızı derlemek için hertürlü derleyici kullanılabilir ve kolayca derleyebiliriz. Şuan için Wixel için hazırlanmış kütüphaneler ve yazılmış fonksiyonların durmunu tam olarak bilmiyorum. Fakat inceledeğim kadarı ile programlama için temel ihtiyaçları giderecek kadar yeterli düzeydeler. Ayrıca açık kaynak kod olması nedeni ile bir çok kullanıcının geliştirdiği kütüphaneler vardır diye düşünüyorum. 

Aşağıdaki uygulama Wixel üzerindeki kırmızı renkli ledin belirlenen süredeki aralıklarla ışık vermesini ve sönmesini sağlıyor. Örneği şimdilik programlama hakkında önbilgi olarak göz atılması için koyuyorum ayrıntısına bir dahaki yazıda gireceğim. Zaten anlaşılamsı kolay ve oldukça basit bir uygulama.

#include wixel.h
#include usb.h
#include usb_com.h
#include studio.h

int32 CODE param_blink_period_ms = 500;
uint32 lastToggle = 0;
void updateLeds()
{
    usbShowStatusWithGreenLed();
    LED_YELLOW(0);
    if (getMs() - lastToggle >= param_blink_period_ms/2)
    {
        LED_RED(!LED_RED_STATE);
        lastToggle = getMs();
    }
}
void main()
{
    systemInit();
    usbInit();
    while(1)
    {
        boardService();
        updateLeds();
        usbComService();
}
}
  
Wixel için yazılmış olan uygulamaları incelemek için aşağıdaki linke bakabilirsiniz.

Bir sonraki yazıda görüşmek üzere ;)


27.11.2012

Android & Processing

Processing and Android

Daha önce processing programlama dilinden ve derleyicisinden bahsetmiştim. Bunun için Processing yazımı okuyabilirsiniz. Ayrıca arduino ile birlikte kullanıp bir kaç uygulama yapmıştım. Bunun içinde Arduino bölümüne bakabilirsiniz. Bu sefer processing ile yapacağım programın nasıl android sistemler üzerinde çalıştırıldığını göstereceğim. Processing çok ileri programlama bilgisi gerektirmeyen bir dil. Bu sayede aklınıza gelen uygulamarı hızlı bir şekilde tasarlayabilir ve Android üzerinde çalıştırabilirsiniz. Ayrıca bu yazı karşılaşılan sorunlar için çözüm yollarını gösteren tek türkçe kaynak olacak :) (bence)
Ek not : Android + Arduino + Processing bu üçü bir araya gelirse neler olur neler yapılabilir. "yakında" :)

Daha önce android için uygulama geliştirmiş iseniz java, sdk, emulator vb.terimlere uzak değilsinizdir. Emülatöre derleyici üzerinde yazıp derlediğimiz yazılımları test ettiğimiz sanal cihazlar diyebiliriz. Bir nevi programı telefona kurmadan önce neler olacağını ekranınızda görebiliyorsunuz. Bu sayede bir çok model ve versiyon için elinizde cihaz bulunmasada uygulama geliştirebiliyorsunuz. Ben burada android için hazırlanan sdk yı kullanacağım ve kendi sanal cihazımı oluşturacağım. 

İlk olarak processing indirip kuruyorsunuz.
İkinci adım sdk manager indiriyorsunuz ve kuruyorsunuz.
Üçüncü adım sdk manager ile android tools ve apı 10 indirmeniz gerekli. Dikkat : Android api 10 olmak zorunda çünkü processing derleyicisi diğer api için şuanda hata veriyor. Ayrıca extras bölmündeki araçları da kurun.
Dördüncü adım Android AVD manager kontrol etmeniz gerekli. Eğer kendiliğinden herhangi bir sanal cihaz oluşturulmuş ise hepsini silin. Processing kendisi için gerekli sanal cihazı otomatik olarak oluşturacaktır. Aşağıdaki resimde benim kullandığım sanal cihazlar görülmektedir.
 
Beşinci adım sıra geldi işin processing üzerinde yapılması gereken kısmına. Derleyiciyi çalıştırın ve sağ üstte bulunan Java butonuna tıklayın. Ardından bir pencere açılacak ve size Android SDK'yı kurmanız gerekdiğini söylecek. Tamam seçeneğini ile devam edin. Sonraki pencerede sizden SDK yı kurduğunuz dizin yolunu isteyecek. Arayüzü kullanarak sdknın bulunduğu adrese gidin ve open butonuna tıklayın. Android klasörü genelllikle program files dizini içersinde bulunur. Eğer herşey sorunsuz tamamlanırsa derleyicinin rengi değişecek ve yeşil olacak. Ayrıca yukarıdaki alana android sekmesi eklenecek.

Son adım artık denem yapma zamanı geldi. Herşey yolunda giderse ilk uygulama emulator penceresinde görülecek. File->exemples yolunu izleyerek denemek için bir yugulama seçin. Çok spesifik bir şey olmasın (gps, cam, 3d) kütüphane indirmeniz ve eklemeniz gerekebilir. Başlangıç için makul bir uygulama seçin. Yeni bir pencere açılacak. Bu pencere üzerinde Sketch -> Run in emulator yolunu izleyin. Biraz beklemeniz gerekcek. Derlenme ve emulatorün açılması kurulması biraz zaman alıyor. Sonunda aşağıdaki resime benzer bir emulator penceresi gelmeli. Şimdi projenizi bir daha derleyin büyük ihtimalle port meşgul olduğunda ve sanal cihaz hazır olmadığından derleme aşamasında hata almışsınızdır.



 Tekrar derledikten sonra derleyici ekranında uygulamanın gözükmesi gerekli. Örnek aşadığıdaki ekran görüntüsü. Bir sonraki yazıda görüşmek üzere. Artık kendim bir uygulama yazıp onu telefon üzerinde çalıştıracağım.


Karşılaşılacak muhtemel sorunlar ve çözüm yolları : 

- Önce sabır
- SDK güncelleyin
- Google Andorid API 10 kurun
- Processing güncel sürümünü indirin
- Processing File-> Preferences yolunu izleyerek preferences.txt dosyası içersinde port numarasını ayarlayın. Örneğin benim emulatorumün port numarası 5554. Bunu yukarıdaki resimde sol üste bakarak görebilirsiniz. Her kullanıcı için bu numara farklı olabilir ! Port numarasını öğrendikten sonra android.emulator.port=5554 şeklinde değeri dosya içinde kaydedin.
- SDK için dopru yolu gösterdiğinizden emin olun. Bunu preferences.txt içerisindeki  android.sdk.path=C:\Program Files\Android\android-sdk değerini kontrol ederek yapabilirsiniz.
- Eğer hala daha sorun alıyorsanız ya da derledikten sonra emulator çalışmıyorsa AVD Manager aracılığı ile Processing'in kendi oluşturuduğu AVD ismini Processing-Android-10 olarak değiştirin ve yeni bir AVD olarak kaydedin. 
 - Önce emulatorun tam olarak krulmasınıı bekleyin. Ardından projeyi tekrar derleyin.
- Bilgisayarınızı yeniden başlatın.











13.07.2012

Arduino Project 13 - Laser Alarm

      Herkese yeniden merhaba. Uzun bir süredir burada paylaşmaya yönelik herhangi bir çalışma yapamıyorum ya da yazı yazamıyorum. Tabi bu sürede boş durmadım yazılarımın çeşitleneceği ve yarım kalanlarının tamamlanacağını bende ümit ediyorum. Neyse basit bir iki çalışma ile kaldığım yerden devam etmek hemde arduinonun pas tutmasını önlemek istedim :) Bundenle daha önceden benzer bir çalımada kullandığım LDR yi ve yeni olarak hoparlör kullarak basit, hılzıca gerçekleştirilebilir ve çeşitlendirilebilir bir başlangıç projesi yaptım. Öncelikle benimde daha önce hiç kullanmadığım bir cihaz olan hoparlör ile bir iki melodi çaldım ve onu deneyim ettim. Daha sonrasında başka bir amaç için kullancağım lazeride bu çalışmaya katınca basit bir alarm devresi ortaya çıktı.
Diğer Arduino projelerime de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino

Lafı uzatmadan balayalın projeye ve gelelim gerekliler listesine

- 1 Adet LDR
- 1 Adet Lazer
- 1 Adet Hoparlör
- 1 Adet Arduino Mega 2560 ya da diğer Arduino boardlarından biri
- 1 Adet Breadboard
- Arduino Yazılımı


Dikkat : Lazer ışığı göze kesinlikle tutulmamalıdır. Aksi takdirde kalıcı şekilde hasara sebebiyet verir. Herhangi bir şekilde zarar görmemek için projeyi dikkatli bir şekilde gerçekleştirin. Yaşı küçük olan ya da bilinçsiz kişilerden lazeri uzak tutun ve kullanmamaları konusunda uyarın.

Arduino Kod :

İlk olarak proje derlenemeden önce pitches isimli kütüphane eklenmelidir. Bu çalışmada hoparlörü kontrol etmek için tone isimli fonkiyonu kullanırken bu kütüphane içerisindeki değerler çağrılacaktır.

Aşağıdaki kod ile test yapma işlemi gerçekleştirilebilir. Bir alarmdan beklenen asıl davranış ise bir defa tetiklendiğinde özel bir durum gerçekleşene kadar alarm durumunu korumasıdır.

#include "pitches.h" // kütüphane ekleniyor.
int sensorPin = 6; // ldr bağlı olan bacak numarası
boolean alarm=false; // alarm durumunu kontrol etmek için değişken tanımlıyorum
void setup() {
  analogReference(DEFAULT);
  pinMode(sensorPin, INPUT); // analog olarak değer alacağım bacağı tanımlıyorum
}
void loop() {
// eğer okuduğum değer benim belirlediğim eşik değerinin altında ise tone fonksiyonunu kullarak 2 numaralı bacağa bağladığım hoparlör ile bir notayı çalıyorum.
if(analogRead(sensorPin) <1010){
  tone(2, NOTE_A7);
}
noTone(2); // noTone foksiyonu ile 2 numaralı bacağa bağladığım hoparlörü pasif hale getiriyorum.
}

Aşağıdaki kod alarm devresini tam olarak kurduktan sonra kullanabilirsiniz. Ben bu devrede resetlemek için buton kullanmadım. Fakat isterseniz siz kullanabilirsini. Bunun içinde aşağıdakini benzer bir algoritma ve kod ile devrenizi çalışır halegetirebilirsiniz.

#include "pitches.h" // kütüphane ekleniyor.
int sensorPin = 6; // ldr bağlı olan bacak numarası
ibt buttonPin= 5; // buton bağlı olan bacak numarası
boolean alarm=false; // alarm durumunu kontrol etmek için değişken tanımlıyorum
void setup() {
  analogReference(DEFAULT);
  pinMode(sensorPin, INPUT); // analog olarak değer alacağım bacağı tanımlıyorum
  pinMode(buttonPin, INPUT);
}
void loop() {
// eğer okuduğum değer benim belirlediğim eşik değerinin altında ise tone fonksiyonunu kullarak 2 numaralı bacağa bağladığım hoparlör ile bir notayı çalıyorum.
if ( analogRead ( sensorPin < 1010 )

alarm=true;
}
if(alarm == true) {  // busayede alarm değişkeni false olmadığı  sürece alarm öter.
 tone(2, NOTE_A7); // iki numaralı pinde, frekans derinde pwm üret
else((alarm == false){
 noTone(2); // alarm durdurulur.
}
//alarmın false yapmak için bir buton kontrolü yapılabilir. Bunun aşağıdakine benzer şekilde butona basıldığı durumda alarm durumu false olarak değiştirilmelidir.
if(digitalRead(buttonPin) == HIGH){
 alarm=false;
}
}
}

Kullanılan nota kütüphanesi :

Bu linkten kopyalaya bilrsiniz http://arduino.cc/en/Tutorial/Tone?action=sourceblock&num=2

yada kendiniz .h uzantılı bir dosya oluşturup içerisine aşağıdaki kısımı kopyalabiliriniz. .h uzuntılı dosya ismi ile kod içersinsde bildiirdiniz referans ismi aynı olmalıdır. Ayrıca yol belirtilmemişse aynı dizindede bulunması gereklidir.

Tone fonksiyonu bu kütüphaneden çağırdımız değlere bağlı olarak kare dalgarla üretir. Farklı frekans değerleri ile hoplarörden farklı nota sesleri üretilir. Bu fonksiyon hakkında ayrıntılı bilgi için http://arduino.cc/en/Reference/Tone adresine bakabilirsniz.

/*************************************************
 * Public Constants
 *************************************************/

#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978

Devre Şeması :

Devre şeması aşağıdaki şekildeki gibidir. 


Proje Ekran Görüntüleri :

LDR üzerine düşen lazer ışığının görünümü aşağıdaki fotoğraftadır.


Lazer çalışırkenki görünümü


Çalışmayı karanlık bir ortamda test ettim bu sayade ldr ile çok daha hassas bir şekilde ölçüm yapabildim.


Devrenin tamamının görünümü aşağıdaki fotoğraftadır.


Kullandığım lazer. Üzerinde silik bir şekilde yazdığı gibi lazer ışığı göze tutulmamalıdır.


Arduino bağlantıları


Projenin test için yapılamış çalışan halini aşağıdaki videodan izleyebilrsiniz. Video çekimi sırasında ses kayıt işlemi çok iyi olmamış. Bu nedenle test aşamasındaki görüntülerde sesi sonuna kadar açanız gereklidir. Herkese iyi seyirler bir sonraki çalışmada görümek üzere :)




Diğer Arduino projelerine de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino



14.04.2012

Arduino Project 12 - Stepper Motor

Uzun bir aradan sonra tekrardan herkese merhaba

Bu hafta sonu projesi olarak bitirme projemde de temeli oluşturan bir çalışma yapacağım. Step motor kontrolü. Step motor nedir ? Step motor çalışma mantığı ? ile ilgili wikipedia üzerinden ön bir bilgi alabilirsiniz. Genel olarak dım adım kontrol edilen motor olarak denebilir. Her adım (ör; motor 200 adım - devir ise 360/200 = 1.8) belirli derece ile döndüğü için adım sayılarını ve yönlerini belirleyerek motoru istediğimiz açıya getirebiliriz. Bu adım aralıkları değişik tekniklerle bir adımı 2,4,8,16 ya bölerek çok daha hasas bir şekilde kontrol yapılabiliyor. Ben bu çalışmada güç kaynağım çok iyi olmadığı için tam adım olan (bir tam deviri 200 adımda dönüyor) yöntemi kullacağım. 

Projede kullanıdığım motor sürücü A4988. Özelliklerine buradan bakabilrsiniz. Projede kullandığım step motor ise hybrid bipolar bir step motor. Nema 14 şafta sahip. Motorun özelliklerine burdan bakabilirsiniz. Motor sürücüye yön ve adım bilgisi göndererek motoru kontrol etmeye çalışacağım. Adım bilgisini kare dalgalar üreterek göndereceğim. Her bir darbe bir adım anlamına geliyor.

En baştan olarak gerekli olanları listelersek

Malzeme listesi

Gerekliler litesi :

- 1x A4988
- 1x Bioplor Hybrid Step Motor
- 1x Breadboard
- Arduino Mega 2560 ya da diğer Arduino boradlarından biri
- Arduino Yazılımı
- Processing Yazılımı
Diğer Arduino projelerine de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino

Arduino Kod :
 /*
*****************
H.Melih ERDOĞAN
*****************
Project 12
Name : Stepper Motor
*/
    #define stepPin 3 // bağlantı yaptığım uçlar
    #define dirPin 2
    int dir;
    int time;
    String inputString = "";   // seri port üzerinde göndereceğim veri 
    boolean stringComplete = false;
    // ayarlar
    void setup(){
      Serial.begin(9600);
      inputString.reserve(200);
      pinMode(stepPin, OUTPUT);
      pinMode(dirPin, OUTPUT);
    }
    void loop(){
    if (stringComplete){ // eğer veri varsa
    if (inputString.substring(0,3) == "dir") { // veri etiketi yön ise
    motor_dir(); // yön fonksiyonunu çağır
    }
    else if (inputString.substring(0,5) == "speed") { // veri etiketi hız ise
    motor_speed(); // hız fonksiyonunu çağır
    }
    inputString = "";
    Serial.println("Motor Set");
    stringComplete = false;
    }
    for (int i=0;i<200;i++){ // kare dalga oluştur ve 200 adım at
           digitalWrite(stepPin, HIGH);
           delayMicroseconds(time);
           digitalWrite(stepPin, LOW);
           delayMicroseconds(time);
    }
    }
    // motor speed
    void motor_dir(){
    if(inputString.substring(3,4) == "r"){ // sağa dön
    digitalWrite(dirPin, LOW);
    }
    else if(inputString.substring(3,4) == "l"){ // sola dön
    digitalWrite(dirPin, HIGH);
    }
    else{
    Serial.println("Error");
    }
    }
    // motor speed // hızı ayarla
    void motor_speed(){
    if(inputString.substring(5,6) == "1"){
    time = 300;
    }
    else if(inputString.substring(5,6) == "2"){
    time = 500;
    }
    else if (inputString.substring(5,6) == "3"){
    time = 1000;
    }
    else if (inputString.substring(5,6) == "4"){
    time = 2000;
    }
    else{
    Serial.println("Error");
    }
    }
    // Serial Com.
    void serialEvent() { // seri port üzerinden haberleşme
    while (Serial.available()) {
    char inChar = (char)Serial.read(); // gönderilen veriyi oku
    inputString += inChar;
    if (inChar == '\n') {
    stringComplete = true;
    }
    }
   }

 

Devre Şeması

MS1,MS2,MS3 uçlarını  toprağa bağladım. Bu uçlar adım çözünrlüğünü ayarlamak için kullanılıyor. Sleep ucu reset ucuna bağlı. Vmot ve GND uçlarına ise harici güç kaynağımı bağlıyorum. Kullanıdığım güç kaynağı 12V ve en fazla 500 ma kadar çıkış veriyor.




Proje Ekran Görüntüleri :

hız bilgisini gönderioyrum speed1 -> 1 yani time 300 olacak


yön bilgisi gönderiyorum dirl yani directory left motor yön değiştiriyor.


hatalı bilgi yolluyorum error alıyorum. Motor varsayılan ayarlarında kalıyor.
 

Devrenin kurulmuş halinin fotoğrafları 



Projenin çalıştırılmış şeklinin videosu aşağıdadır iyi seyirler. Bir sonraki projede görüşmek üzere.


Diğer Arduino projelerine de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino

17.03.2012

Arduino Project 11 - Temperature Sensor

Herkese merhaba bu çalışmada ısı sensöründen aldığım ölçüm değerlerini processing ile hazırladığım bir grafik arayüz üzerinde göstereceğim. Başlamadan önce kısa bir not. Bu aralar yoğun olduğum için yaptığım projelerin yazıları çok gecikiyor. Tabikide bu yazdığım bir bahane ve bunun gerçek adı tembellik ;) Daha sırada düzenlenmeyi bekleyen bir çok yazı  ve proje var :/ (pic, opencv ve lua vs.). Gelelim projeye, bu çalışmada kullanılan sensörün adı LM35DZ basit, ucuz, bulması kolay kullanması çok çok kolay bir sıcalık sensörü. Analog değerler üretiyor ve analog değerleri değerlendirip Celsius ve Fahrenheit cinsinden değerlerndirmek bize düşüyor. 

Programda özen göstermediğim bazı konular var bunları baştan bildireyim ;P İlk olarak grafiksel gösterim çok yeterli değil, ikincisi grafiksel çizimde yuvarlamalar yapıldığı için değerde küçük sapmalar söz konusu. Ayrıca algoritmanın çok da iyi olduğu söylenemez bir iki denemede hatalı ölçümler aldım :). Tabiki öyle bir durumda programı yeniden derlemek en iyi çözüm oldu :) Peki sen neyi düzgün yaptın derseniz ilk olarak gerekliler listesine bakarak başlayalım.

Gerekliler litesi :

- 1x LM35dz
- 1x Breadboard
- Arduino Mega 2560 ya da diğer Arduino boradlarından biri
- Arduino Yazılımı
- Processing Yazılımı

Arduino Kod :

int lm35Pin =0;
// sensörü bağladığım pin numarası
float temperature = 0; 
void setup (){
 analogReference(DEFAULT);
 Serial.begin(9600);
}
void loop(){

// Anlık sapmaların etksini azaltmak için sensörden okuduğum on değeri topluyorum.
// Sonra ortalamasını alacağım.
 for(int i=0; i<=10 ; i++)
{
 temperature = temperature + analogRead(lm35Pin);
 delay(10);
// Her ölçüm arasına 10 ms lik zaman dilimi koyuyorum
 }
 temperature = temperature / 10;
// Topladığım değerin aritmetik ortalamasını alıyorum
 temperature = (5 * temperature * 100)/1024; 

 // Elde ettiğim değeri celsiusa çeviriyorum. Açıkcası gelen analog değeri voltaj değerine çeviriyorum.
 // Referans değerim 5V. 10 bitlik ADC kullanıyorum. Sensöründe her 1 C için 10mV yolldığını biliyordum.
 Serial.println(temperature);
// Seri port üzerinden veriyi gönderiyorum
 temperature = 0;
// Değişkeni yeniden toplamda kullanılması için sıfırlıyorum
}
-------------------------------------------------------------------------------------------------------------------------
Processing Kod :


/*
*****************
H.Melih ERDOĞAN
*****************
Project 11

Name : Temperature Sensor
*/


import processing.serial.*;
// Gerekli değişkenler tanımlandı
Serial port;
int rect_length= 420;
float temperature;

// sıcaklık değerlerini atacağım değişkenler.
int[] x1 = new int[500];
int[] y1 = new int[500];
int count=0;

// renkleri tanımladım
color orange = color(204, 102, 0);
color white = color(255, 255, 255);
color fire = color(255,0,0);
color ice = color(0,150,255);
int sec,current_sec;
int mx,my;

// Pencere boyutu, seri bağlantı vs. ayarlar yapıldı.
void setup() {
  sec = second();
  size(640,480);
  port = new Serial(this,"COM11",9600);
  port.bufferUntil('\n');
  x1[0]=120;
  y1[0]=500;
  smooth();
}
void draw (){
background(255); 
// Arka plan beyaz
fill(white);
rect(10, 20, 100, rect_length);
// grafiğin ve sıcaklık barının oladuğu alanları oluştur.
rect(120, 20, 500, rect_length);
//bar renklerini ayarla
if(temperature <= 27 )

{
fill(fire);
}
else if(temperature <=20 )
{
fill(ice);
}
else{
fill(orange);
}

// ekrana yazılacak olan yazıları yaz
text("C",125, 35);
text("Time(2s)",565, 455);
text("Current Temperature : " +temperature+" C", 10, 15);
rect(12, rect_length-int((temperature*4))+20, 96, int(temperature*4));
//
grafiği ekrana çiz
if(count==500){
// eğer ekranda 500 tane nokta varsa değişkeni sıfırla.
count=0;
}
current_sec = second();
// bilgisayarın saatinin saniyesini okuyorum.
if(current_sec == sec+2){

// her iki saniyede bir ölçüm alıyorum bunu yapabilmek için bilgisayarın saatini kontrol ettim.
// gereksiz gelebilir fakat kullanımını öğrenmek için yaptığım bir deneme oldu ;)
x1[count]=120+count;
y1[count]=rect_length-(int(temperature*4))+20;
sec = current_sec;
count++;
}
else if(sec+2 > 59){
if(sec+2==60){
sec = 0;
}
else if(sec+2==61){
sec = 1;
}
}

// grafiği ekrana çiziyorum.
for(int i=0; i <= count ; i++ )

{
point(x1[i], y1[i]);
}

// fare ekranda dolaştıkça bulunduğu yerin kaç derece olduğunu gösteriyorum.
// alanı kısıtlıyorumki fare sadece grafik içerisndeyken dereceyi gösteriyor.
if(( mx < 620 && my <= 440 ) && ( mx >= 120 && my >= 20 )) 

{
text((440-my)/4 +" C",mx+5,my-5);
}
delay(10);
}

// farenin hareketlerini takip ediyorum.
void mouseMoved() {
  mx=mouseX;
  my=mouseY;
}

// seri portda gelen değeri değişken içerisine atıyorum
void serialEvent (Serial port){
temperature=float(port.readStringUntil('\n'));
}


Devre Şeması :


Programın Ekran görüntüleri :






Devrenin kurulmuş halinin görüntüleri :




Projenin çalıştırılmış halinin videosu aşağıdadır. Herkese iyi seyirler.


Diğer Arduino projelerine de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino

5.03.2012

Arduino Project 10 LCD

Herkese merhaba



Bu çalışmada karakter tip LCD ekran kullanacağım ve bu tip LCD lerin nasıl kontrol edildiğini göstereceğim. Projede bilgisayarımın seri portuna bağladığım Arduino'ma veri göndereceğim ve Arduino'da bu verileri LCD ekranda gerekli yerlere yazacak. Ayrıca bir aradan potansiyometre yardımı ile LCD nin kontrastını ayarlayacağım.

Öncelikle gerekliler listesine bir göz atalım ;

Parça Listesi :

- 1x Potansiyometre
- 1x LCD (Karakter Tip)
- 1x Breadboard
- Arduino Mega 2560 ya da diğer Arduino boradlarından biri
- Arduino Yazılımı

Malzemeler ve gerekli kurulumlar tamam ise artık kodlamaya başlayabiliriz.

Kod :



Likit kristal LCD kullanmak için Arduino için hali hazırda bulunan bir kütüphaneyi kullandım. Bu kütüphanenin adı LiquidCrystal.h. Projenin başında bu kütüphaneyi ekliyoruz. LiquidCrystal.h sayesinde fonksiyonlar yarımı ile kolayca LCD ye hükmedebiliyoruz.

/*
  LCD RS pin = pin 50       // LCD nin hangi ucunu nereye bağlayacağım
  LCD Enable pin = pin 52 // Burada hangi pin numaralarını yazdıysam aynı numaralara bağlantı yapmalıyım
  LCD D4 pin = pin 48       // Bu kısım bilgilendirme için yazıldı kodun bir parçası değil !

  LCD D5 pin = pin 46       // D4,D5,D6,D7 ekrana veri göndereceğim pin numaraları

  LCD D6 pin = pin 44   
  LCD D7 pin = pin 42
  LCD R/W pin = GND
*/
#include // gerekli kütüphaneyi ekliyorum
LiquidCrystal lcd(50, 52, 48, 46, 44, 42);
// yaptığım bağlantıları bildiriyoum
void setup() {
  Serial.begin(9600);
// Seri port bağlatı ayarı
  lcd.begin(16, 2);
// Kullandığım LCD türünü belirtiyorum.
  lcd.print("Melih ERDOGAN");
// LCD ye Melih ERDOGAN yazıyorum
  lcd.setCursor(0,1);
// LCD de imleci ikinci satır birinci sütuna getiriyorum. (Sütun, Satır)
  lcd.print("NOT : ");
// LCD ikinci satırına NOT yazıyorum.
}
void loop() {
 if (Serial.available() > 0 )
// Seri portdan  veri gelirse

{
 lcd.write(Serial.read());
// veriyi oku ve LCD ye yaz.
 }
}



Gerekli devre şeması : 



Buradaki bağlantılar zaten kod kısımında vardı. Sadece potansiyometre ve LCD Led bağlantılarından bahsetmedik. Kısaca onlardan da bahsetmek gerekirse. Potansiyometreyi kontrastı ayarlamak için yani yazıların koyuluğunu-silikliğini ayalarmak için kullanıyoruz. Potansiyometreyi aşağıdaki devre şamasında gördünüz şekilde bağlayabilirsiniz. Bunu dışında LDC led + ucuna +5V ve LCD led - ucunuda toprağa bağlıyoruz. LCD led nedir derseniz arka aydınlatma oluyor. Mavi, yeşil, sarı artık LCD niz ne türde bir LCD ise renk değişken olabilir.




Devrenin kurulmuş halinin fotoğrafları aşağıdadır.






Aşağıdaki ekran görüntüsünde seri porttan veri gönderiyorum.

Aşağıdaki fotoğrafta Arduino seri porttan gelen veriyi yazdığımız kod doğrultusunda ekrana yazıyor.



Yaptığım bir çalışmayı daha dilim döndüğünce anlatmaya çalıştım. Aşağıda bu projenin çalıştrılmış halinin videosu bulunmaktadır. Bir sonraki projede görüşmek üzere herkese iyi seyirler :)






Diğer Arduino projelerine de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino

Arduino Project 9 Arduball

Herkese merhaba bu projede daha önceden de projelerimde kullanmış olduğum potansiyometre ile processing programlama dilinde yazdığım oyunu kontrol etmeye çalışacağım. Oyunda yukarıdan aşağıya doğru düşen topları alt kısımda bulunan yüzeyden sektirilerek toplarım yere dokunmaları engelemeye çalışılıyor. Bu çalışma daha çok Arduino ve Processing programlam dili ile ilgili yaptığım örneği peskiştirmek içindi. Bu nedenle herhangi bir kod ya da açıklama koymayacağım.
Diğer Arduino projelerime de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino
Parça Listesi

- 1K Ohm Potansiyometre
- 1x Breadboard
- Arduino Mega 2560 ya da diğer Arduinoboradlarından biri
- Arduino Yazılımı
- Processing Yazılımı

Devre Şeması :


Projenin çalışmış halinin videosu aşağıdadır. İsterseniz sizde bu ve buna benzer farklı kontrol özelliklerine sahip oyunlar hazırlaya bilirsiniz. Bu arada bende denerken fark ettim top sayısı biraz fazla olmuş ve başlangıçta toplar çok hızlı geliyorlar :D İyi eğlenceler.


;

Diğer Arduino projelerine de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino



2.03.2012

Arduino Project 8 Arduino & Processing

Kısa bir aradan sonra tekrar herkse merhaba :)

Daha önceden processing programalam dili ile ilgli bir giriş yapmıştım. Processing programlama dili ile ilgili yazımı okumak isterseniz buyrun link. O yazımda Processing programlama dilini Arduino ile birlikte kullanacağımdan bahsetmiştim. Şimdi ise bu çalışmada basit bir örnekle Arduino ve bilgisayar nasıl bir arada kullanılır onu denyeceğim. Aslında processing sayesinde Arduino'yu tek başına kullanmak yerine işin içine bilgisayarımızı da ekleyerek bir çok sınırları ortadan kaldırıyoruz. Bu çalışmamda Arduino'dan gelen değerler için bir grafiksel arayüz hayırlayacağım. Arduinoya bağladığım dip switchin anahtarının açık-kapalı durumunu grafiksel olarak ekranda gözlemleyeceğim.

Gerekliler Listesi :

- 8x 220 Ohm Direnç
- 1x dip switch

- 1x Breadboard
- Arduino Mega 2560 ya da diğer Arduino boradlarından biri
- Arduino Yazılımı

Arduino Kod :

/*
*****************
H.Melih ERDOĞAN
*****************
Project 8
Name : Arduino & Processing
*/
int value = 0;    
        // Seri portan göndereceği değer
int last_switch1 = 0; 
// Anahtarlama yapabilmek için gerekli olan değişkenler
int last_switch2 = 0;
int last_switch3 = 0;
int last_switch4 = 0;
int last_switch5 = 0;
int last_switch6 = 0;
int last_switch7 = 0;
int last_switch8 = 0;

int switchPin1 = 13;
// Anahtarları bağladığım pin numaralarını bulunduran değişkenler.
int switchPin2 = 12;
int switchPin3 = 11;
int switchPin4 = 10;
int switchPin5 = 9;
int switchPin6 = 8;
int switchPin7 = 7;
int switchPin8 = 6;

void setup(){
Serial.begin(9600);
// USB seri bağlantı ayarı
pinMode(switchPin1,INPUT);
// Anahtarları bağladığım pin leri dijital giriş olarak tanımlıyorum.
pinMode(switchPin2,INPUT);
pinMode(switchPin3,INPUT);
pinMode(switchPin4,INPUT);
pinMode(switchPin5,INPUT);
pinMode(switchPin6,INPUT);
pinMode(switchPin7,INPUT);
pinMode(switchPin8,INPUT);
}
void loop(){
if(digitalRead(switchPin1) == HIGH && last_switch1 == 0 ){ 
// anahtar açık ise
value = value + 128;

// değere 128 değeri ekle ( neden böyle değerler eklediğimi ilerleyen kısımlarda anlaşılacaktır )
last_switch1 = 1;
}
else if(digitalRead(switchPin1) == LOW && last_switch1 == 1 ){
// anahtar kapalı ise
value = value - 128;
// değerden 128 değerini çıkart
last_switch1 = 0;
}

// aynı işlemleri diğer anahtar durumları içinde yapıyorum.
if(digitalRead(switchPin2) == HIGH && last_switch2 == 0 ){ 
value = value + 64;
last_switch2 = 1;
}
else if(digitalRead(switchPin2) == LOW && last_switch2 == 1 ){
value = value - 64;
last_switch2 = 0;
}
if(digitalRead(switchPin3) == HIGH && last_switch3 == 0 ){
value = value + 32;
last_switch3 = 1;
}
else if(digitalRead(switchPin3) == LOW && last_switch3 == 1 ){
value = value - 32;
last_switch3 = 0;
}
if(digitalRead(switchPin4) == HIGH && last_switch4 == 0 ){
value = value + 16;
last_switch4 = 1;
}
else if(digitalRead(switchPin4) == LOW && last_switch4 == 1 ){
value = value - 16;
last_switch4 = 0;
}
if(digitalRead(switchPin5) == HIGH && last_switch5 == 0 ){
value = value + 8;
last_switch5 = 1;
}
else if(digitalRead(switchPin5) == LOW && last_switch5 == 1 ){
value = value - 8;
last_switch5 = 0;
}
if(digitalRead(switchPin6) == HIGH && last_switch6 == 0 ){
value = value + 4;
last_switch6 = 1;
}
else if(digitalRead(switchPin6) == LOW && last_switch6 == 1 ){
value = value - 4;
last_switch6 = 0;
}
if(digitalRead(switchPin7) == HIGH && last_switch7 == 0 ){
value = value + 2;
last_switch7 = 1;
}
else if(digitalRead(switchPin7) == LOW && last_switch7 == 1 ){
value = value - 2;
last_switch7 = 0;
}
if(digitalRead(switchPin8) == HIGH && last_switch8 == 0 ){
value = value + 1;
last_switch8 = 1;
}
else if(digitalRead(switchPin8) == LOW && last_switch8 == 1 ){
value = value - 1;
last_switch8 = 0;
}
Serial.println(value);
delay(100);
}

Processing Kod :

/*
*****************
H.Melih ERDOĞAN
*****************
Project 8
Name : Arduino & Processing
*/
import processing.serial.*;                // Seri bağlantı için gerekli olan kütüphaneyi ekledim
Serial port;                                         // Yapacağım seri bağlantıyı tanımlıyorum
color c_red = color(225,0,0);             // renkleri tanımlıyorum
color c_white = color(255,255,255);
color c_black = color(0,0,0);
float serial_value = 0;
// seri portdan okuyacağım değeri atacağım değişken
int switch_value = 0;
// okuğum float değeri int değere dönüştüreceğim onun için gerekli olan değişken
int x=20;
void setup(){
port = new Serial(this,"COM11",9600);
// seri bağlantıyı kuruyorum
port.bufferUntil('\n');

// Seri bağlantı ile '\n' karakterine kadar gelen dataları dikkate alıyorum
// Yani her '\n' karakterinden sonra yeni bir data geldiğini kabul ediyorum.
size(250,200);
// Pencere boyutunu ayarladım
smooth();
}
void draw(){
background(255);
// Arkaplan artık bembeyaz.
// İşte algoritmanın başladığı yer. Programın en karmaşık yeri :)
/* Basit bir şekilde anlatmam gerekirse seri porttan gelen bir değeri göz önüne alalım. Diyelimki '3' değeri gelmiş olsun. 3 = 0000 0011 dir. Dolayısıyla aşağıdaki algoritma 3 değerini birer yana kaydırarak '1' olan sıradaki yerlerine kırmızı daireler koyar. Toplam 8 defa sağa kaydırma yaparak değeri baştan sona kontrol eder. Zaten değerimiz 1-2-4-8-16-32-64-128 değerlerinden oluşuyor. Bu nedenle ilk kodda değerden (1-2-4-8-16-32-64-128) değerlerini çıkartıp toplama işlemini yapıyordum. Bu sayede isteğim, yani anahtarın değiştiği yerdeki bit "1" değerini alıyor. Anahtarı eski yerine getirincede ekledği değeri geri çıkartarak aynı biti "0" yapıyor. İnşallah anlatabildim :)

*/
for(int i=1;i<=9;i++){
if(switch_value % 2 == 1){
// eğer sayı tek ise yani kontrol etmek istedeğim bit '1' ise
fill(c_red);
// Boya kalemi kırmızı Bu sayede sayece gerektiği zaman kırmızı daire çiziyorum
}
switch_value = switch_value >> 1;
text(i,x,75);
// ekranda  x, 75 noktasına i değerini yaz (başlangıçta x = 20)
ellipse(x, 90, 20, 20);
// ekrana dairelere çiz. ellipse(x,y,çap,çap)
x=x+30;
fill(c_white);
//boya kalemim artık beyaz
}
x=20;
delay(200);
// 200 ms bekleme yap
}
void serialEvent (Serial port){
// Eğer seri porttan veri gelirse
serial_value = float(port.readStringUntil('\n'));
// '\n' karakterine kadar olan kısmı oku değişkene at
switch_value = int(serial_value);
//float değeri  int değere dönüştür.
}


Devre Şeması :

Sekizli anahtar daha önce yaptığım anahtar devreleri ile aynı sekilde Arduino'ya bağlanır.


Devrenin kurulmuş v çalıştırılmış şekli aşağıdaki fotoğraflardadır.




Dip switch ile anahtarların yerlerini değiştirdikten sonra ekranda görünün görüntü. 1. 3. 4. 6. ve 7. anahtarlar yer değiştirmiş. Yani kapalı duruma getirilmiş durumda. Anahtar için kapalı terimi üzerinden akımı geçirdiği anlamına gelir ! :)


Yaptığım çalışmanın videosu aşağıdadır. İlerideki çalışmalarım da görüşmek üzere herkese iyi seyirler :)




Diğer Arduino projelerine de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino

22.02.2012

LUA Programming Language


Uygulama geliştirmek için yine az duyulmuş farklı bir programlama dilini kullanacağım :) Bu dilin adı lua. Peki neden lua ? Çünkü bir PSP'ye sahibim ve artık onunla oynamak kesmiyor :) Kendi yazdığım uygulamalar ve oyunlar ile elimdeki cihazı daha etkin bir şekilde kullanmak istiyorum. Daha önce alel acele de olsa bir heyecanla girişmiştim lua ile programlamaya. Hatta psp ilginç için birkaç oyun bile yazdım. Fakat hiç biri programlama açısından istediğim şekilde değildi. Çünkü o zamanlar nesneye dayalı programlama nedir bilmiyordum. Dolayısıyla yazdığım uygulamalar alıp başını gidiyor karma karşık içinden çıkılmaz bir hal alıyordu. Şimdi ise PSP VITA yavaş yavaş meydanı eline geçirme aşamasındayken emektara (PSP FAT) bir uygulama daha yazmak istiyorum. Aradan uzun bir zaman geçti bu yüzden lua programlama dilini kullanabilmek için yapısına yeniden bir göz geçirmem lazım. Bu ilk baştan göz geçirme sırasında da yaptıklarımı burada yazacağım. Bu sayede PSP için uygulama geliştirmeyi anlatan güzel bir kaynak yaratmayı amaçlıyorum.

Lua ile ilgili olarak ön bilgi edinmek isteyenler http://www.lua.org/ adresini ziyaret edebilirler. İnternette bu konu ile araştırdınız zaman sizde göreceksiniz bir dil için yeterli olabilicek kaynak ve örnek çalışma bulunamıyor. Durum böyle olunca Türkçe ayrıntılı ve düzgün bir kaynak ise neredeyse hiç yok. Lua ile ilgili ilk projede görüşmek üzere. 

print("Olá lua"); // portekizcede "merhaba lua" :) bu arada lua ay anlamına geliyormuş.