31 Aralık 2014 Çarşamba

Android Uygulama Geliştirme Dersleri



Ders 1 : Android Proje Geliştirme - Hesap Makinesi Uygulaması





Ders 2 : Android Proje Geliştirme - Android Activity ve Class Ekleme İşlemi





Ders 3 : Android Proje Geliştirme - Android Uygulamasına İnternet Erişimin Sağlanması





Ders 4/1 : Android Proje Geliştirme - Android Bluetooth Kontrolü





Ders 4/2 : Android Proje Geliştirme - Android Bluetooth Kontrolü




16 Aralık 2014 Salı

Arduino ile Bootloader İşlemi



Merhabalar, bu yazımızda atmel işlemcilerin arduino geliştirme kartı kullanarak nasıl boot edildiğini anlatmaya çalışacağım. Video desteği ile konunun net bir şekilde anlaşılmasını umut ediyorum.

Peki nedir bu bootloader işlemi ?  Boot işlemi tıpkı bilgisayarların biosu gibi düşünülebilir. İşlemcinin temel fonksiyonlarını yerine getirmesi için gereklidir. Yani boot edilmemiş bir işlemci ÇALIŞMAYACAKTIR. Dolayısıyla alınan ve boot edilmeden gönderilen tüm işlemcilere bu yöntem uygulanır. Arduino boot işlemi videoda detaylıca anlatılmaktadır. Pin bağlantıları alttaki resimlerde mevcuttur. 

Bir kere yapılması yeterlimidir ? Boot işlemini, işlemcinize bir kere yapmanız yeterlidir. Tabi bazı özel durumlar yada hata giderme durumları dışında. Çünkü boot kodunuz işlemcinin flash belleğine yüklenir ve silinmez. Flaşh belleğin daima 5492 byte lık alanı boot işlemi için işgal edilmiş olur. Hatırlayacağınız üzere atmega 328 flash kapasitesi 32 kb idi. 


Arduino Uno ile atmega 328 işlemcisini bootloader yapabilmek için gerekli pin bağlantıları

Arduino Uno ile Atmega 328 bootloader devre şeması


atmega 328 pin daigram

Arduino uno pin diagramı




11 Aralık 2014 Perşembe

C# Uygulamaları - C# Seri Port , C# Arduino

C# dili ile yapılmış 2 farklı uygulamanın kurulum linkleri aşağıda mevcuttur.
Bu programlardan ilki seri porttan verilerin okunmasını ve kaydedilmesini sağlamaktadır. Arduino ile yapacağınız projelerde faydalı olabilecektir.
İkinci proje ise seri porttan gönderilen sıcaklık değerinin ekranda bastırılmasını sağlamaktadır. Yani basit bir termometredir.

1- https://drive.google.com/folderview?id=0Byup25DcTDi1enJSM3lqV1VYcDQ&usp=sharing
2- https://drive.google.com/folderview?id=0Byup25DcTDi1NTRsUUJWVXdJckU&usp=sharing


c# seri port programı ile arduino haberleşmesi
1. program ekran görüntüsü


2. program ekran görüntüsü

C# dili ile yapılmış bazı çalışmalara ait videolara şu linklerden ulaşabilirsiniz:


2 Aralık 2014 Salı

5- C Uygulama 5 ( C programlama ile kelimedeki harf sayısı bulan, farklı harfleri bulan ... program )

Çalışma ekran görüntüsü:

c programlama ile kelimedeki harf sayısını bulma


Çalışma kaynak kodu:

4- C Uygulama 4 ( C kodu ile girilen sayıların max min ve modunu bulan program )

Çalışma ekran görüntüsü:

c max min mod bulma code


Çalışma kaynak kodu :

3- C Uygulama 3 ( C kodu ile şekil çizme programı )

Çalışma ekran görüntüsü:



Çalışma kodu:


#include<stdio.h>
#include<conio.h>//getch komutuyla ekranda tutmak için hata vermemesi için kullandim

int main(){

 int a,b,c,d,e,f,g;//degiskenleri tanimladim
 char z=0;
 
 while (z!='q'){//bu döngüyü q yani çýkýþ girilene kadar çýkmamasý için kullandým  
  fflush(stdin);//enter etkisini yok etmek yani program hata verdikten sonra hafýzayý sifýirlamak hatayýi bir kez verdirmek için kullandým
 
  printf("\n\n\t##########################################################\n");//ekranda gözüken seçim seçeneklerini burada yazdým
  printf("\t>>>>>>                                              <<<<<<\n");
  printf("\t>>>>>>      DRAWING MATHEMATICAL SIGNALS SHAPE      <<<<<<\n");
  printf("\t>>>>>>                                              <<<<<<\n");
  printf("\t>>>>>>      a : Draw a summation shape              <<<<<<\n");
  printf("\t>>>>>>      b : Draw a division shape               <<<<<<\n");
  printf("\t>>>>>>      c : Draw a multiplication shape         <<<<<<\n");
  printf("\t>>>>>>      q : Terminate the program               <<<<<<\n");
  printf("\t>>>>>>                                              <<<<<<\n");
  printf("\t##########################################################\n\n");

  printf("\tChoose one of them,please:\n");//burada seçilecek seçimi istedim ve aldýrdým
  scanf("%c",&z); 
  
  while((z=='a')||(z=='b')||(z=='c')){//seçim bu koþullar içinde olduðu sürece devamlýlýðý saðlamak için bunun sebebi a deðiþkenine rakam yerine karakter girince döngüyü saðlamak için
  
  if (z=='a'){//z karakteri a olunca toplama iþlemini seçtirmek için
   printf("\nEnter width of the summation shape(as an odd number):\n");//burada toplamýn boyutunu istiyor ve alýyor
   scanf("%d",&a);
   
   if (0==a%2){//girilen sayý çiftse hata vermemesi için koydum tek sayý girilmezse yanlýþ çýktý vermesin diye
    b=a/2;//integerýn yarýsýný alýp
    f=b-1;//integerin yarýsýndan 1 çýkardýk ki aþaðýdaki for döngüsü için o kadar boþluk býraksýn diye
    
    for (d=0;b>d;){//bu döngü de alttaki döngünün ayný integer deðeri kadar tekrarlanmasý için koydum
     for(c=0;f>c;){//bu döngü sayýnýn yarýsý kadar boþluk býraktýrýr ve sonuna  * koyar
      printf(" ");
      c=c+1;}
     printf("*\n");//boþluklardan sonra yýldýzý koyup yeni satýra geçer
     d=d+1;}
    
    for(e=0;a>e;){//artý iþaretinin orta kýsmýndaki uzun iþareti girilen deðer kadar girmesini saðladým
     printf("*");
     ++e;}
    printf("\n");//artýnýn orta kýsmý tamamlanýnca yeni satýra geçip üstteki döngünün aynýsýný oluþturmasýný saðladým
  
    for (d=1;b>d;){//bu döngü de alttaki döngünün ayný integer deðeri kadar tekrarlanmasý için koydum d nin üstte 3 for döngüsünden farklý deðil ama d=1 olmasýnýn sebebi orta kýsýmda 1 tane * kullanýlmýþ olmasý
     for(c=0;f>c;){//bu döngü sayýnýn yarýsý kadar boþluk býraktýrýr ve sonuna  * koyar
      printf(" ");
      c=c+1;}
     printf("*\n");//boþluklardan sonra yýldýzý koyup yeni satýra geçer
     d=d+1;}}
   else {//girilen sayý tekse toplam sembolünü ona göre yaptým
    e=a-1;//sayýnýn tek olmasý durumunda 1 çýkarark float olmasýný engellemek istedim geri kalan kýsým üstteki artý iþareti döngüsünün ayný daha net anlatmak için ayrý ayrý yazdým
    b=e/2;
    for (d=0;b>d;){
     for(c=0;b>c;){
      printf(" ");
      c=c+1;}
   
     printf("*\n");
     d=d+1;}
  
    for(e=0;a>e;){
     printf("*");
     ++e;}
  
    printf("\n");
  
    for (d=0;b>d;){
     for(c=0;b>c;){
      printf(" ");
      c=c+1;}
   
     printf("*\n");
     d=d+1;}}}
 
  if (z=='b'){//burada bölme sembolünü yaptým aþaðýda geniþliðini istiyor ve ona göre yerleþtiriyor üstteki ve alttaki yýldýzlarý
   printf("\nEnter width of the division shape(as an odd number):\n");
   scanf("%d",&a);
   printf("\n");

   if(0==a%2){//sayýnýn çift girilince hata vermemesi amacýyla koydum
    b=a/2;//sayý çiftse 2 ye böler ve o kadar boþluk verir ve yýldýz koyarak orta kýsýma geçer
    
    for(c=0;b>c;){//boþluk verir ve yýldýz koyarak orta kýsýma geçer
     printf(" ");
     ++c;}
    printf("*\n");
    
    for(d=0;a>d;){//bölme iþleminin orta kýsmý yani burada girilen sayý kadar * iþareti koyuyor
     printf("*");
     ++d;}
    printf("\n");
    
    for(c=0;b>c;){//boþluk verir ve yýldýz koyarak orta kýsýma geçer
     printf(" ");
     ++c;}
    printf("*\n");}

 else{//integer a tek olursa yerleþtirme iþleminde hata olmasýn diye 2. bir seçenek koydum
  e=a-1;//sayý tekse 1 çýkarýr ki float olmasýn
  b=e/2;
  for(c=0;b>c;){//boþluk verir ve yýldýz koyarak orta kýsýma geçer
   printf(" ");
   ++c;}
  printf("*\n");
  
  for(d=0;a>d;){//bölme iþleminin orta kýsmý yani burada girilen sayý kadar * iþareti koyuyor
   printf("*");
   ++d;}
  printf("\n");
  
  for(c=0;b>c;){//boþluk verir ve yýldýz koyarak orta kýsýma geçer
   printf(" ");
   ++c;}
  printf("*\n");}}
 
  if (z=='c'){//burada çarpma iþlemi için a yý istiyor ve ona göre çarpma iþaretini yazýyor
  
   printf("\nEnter width of the multiplication shape(as an odd number):\n");
   scanf("%d",&a);
   
   b=a;//a yý ve b yi ayrý ayrý kullanacaðýmdan çoðalttým da denilebilir
   e=a-1;//burada orta kýsým hariç bulunan deðerin yarýsý kadar V þeklinde * iþareti koyar
   e=e/2;//sayýnýn yarýsýný da burada alýyor
   for(d=0;e>d;){
    printf("*");//ilk baþta * koyar
    b=b-2;//burada saynýn her seferinde 2 azaltarak orta kýsýma gelecek boþluk sayýsýný bulurlar
    
    for(c=0;b>c;){//boþluk bu döngüde konulur
     printf(" ");
     ++c;}
    printf("*");// boþluk konulduktan sonra * iþareti koyarlar
    ++d;
    printf("\n");//yeni satýra geçerler
    
    for(f=0,g=((a-b)+1)/2;g>f;){//bu döngüde orta kýsma gelecek olan boþluk sayýsýný bulup tekse veya çiftse ona göre * iþareti koyuyor
     printf(" ");
     ++f;}}
   if (1==a%2){//çarpma iþleminin orta kýsýmýna eðer girilen deðer tekse tek yýldýz 
    printf("*\n");}
   
   else{//girilen deðer çiftse orta kýsma 2 tane yýldýz koyuyor ki kayma belli olmasýn yani sayý çift girerse hatayý gizlesin diye
    printf("**\n");
    
    for(f=0,g=((a-b)+1)/2;g>f;){//orta kýsýma gelecekboþluðu tekrar koyuyor ve alttaki döngüde X in kalan kýsmý olan ters V yi çiziyor burada o orta kýsmýný yaptým
     printf(" ");
     ++f;}
    printf("**\n");}
   
   for(d=0;e>d;){//burada üstteki iþlemi her defasýnda 2 arttýrarak tam tersini yaptým
    for(f=0,g=((a-b)-1)/2;g>f;){
     printf(" ");
     ++f;}
    printf("*");//birinci kýsma ayni * karakterine kadar ki boþluk sayýsýný bulup o kadar boþluk koydum ve * ý koydum
    b=b+2;
    
    for(c=2;b>c;){//burada da * iþaretinden sonraki 2. yýldýzýn konulacaðý yere kadar olan boþluk miktarýný girdim
     printf(" ");
     ++c;}
    printf("*");//ve * iþaretini koyup
    ++d;
    printf("\n");}}//yeni satýra geçtim
  a=0;//burada iþlem yapýlýnca a yý sýfýrlayýp hafýzada kalan kýsmýný sonraki iþlemde karakter girerse hafýzada kalaný yazmasýn diye yaptým
  break;}

  if (z=='q'){//eðer z karakterine q deðeri girilirse çýkýþ yaparken bunu belirtmesi için koydum ve breakle de döngü dýþýna attým gerçi döngü koþulu z!='q' ama garantiye almak için
   printf("\n\n\t##########################################################\n");
   printf("\t<<<<<                program terminates              >>>>>");
   printf("\n\t##########################################################\n");
   break;}
  
  if (((z!='a')&&(z!='b')&&(z!='c')&&(z!='q'))||((a==0)&&(b==0))){//bunlarýn koþullarýn dýþýnda hata vermesi için kullandým yani z nin 'a','b','c','q' olmadýðýnda ve a ya sayý harici giriþlerde iþlem yapmaz ve hata verir
   printf("\t----------------------------------------------------------------\n");
   printf("\t!!!<<<<<           you assign wrong try again           >>>>>!!!\n");
   printf("\t----------------------------------------------------------------\n");}}
 
   getch();//programýn açýk kalmasý için kullandým çýkýþtan sonra
}

3- C Uygulama 2 ( Girilen sayının artarak matrisini alan program )

Program Çıktısı :


Çalışma kodu:,


#include<stdio.h>
int main()

{
    int c,n,j;
    char i;
    i=1;
    printf("enter an integer:");
    scanf("%d",&n);

    while(i<=n)
    {
        c=i;
        j=1;

        while(j<=n)
        {
            if(c==0 || c<0)
             printf("0  ");//ekrana 0 yazilacak

            else if(c>0)//k nin sifirdan buyuk olmasi durumunda ekrana
                printf("%d  ",i);//once girilen rakam ve sonra her satir atlayarak sayinin bir fazlasi yazacak
                c--;//k degerini 1 azaltir
                j++;//j degerini 1 artirir

        }
    printf("\n");//new line yapar
    i++;//i degerini 1 artirir

    }
    return 0;
}





2- C Uygulaması 1


Çalışma kodu :

#include <stdio.h>

int main()
{
int i,j,k;
int n;//programýn devamýnda rakam olarak deger girilecek
char c;//inputa 2 degeri verildginde  girilecek harf c dir. input giris.
char input;//bizden istedigi giris
double f=1;//faktoriyel
double z;
i=1;

while( input<'1' || input>'3')//input 1 ve 3 arasýnda olursa program devam edecek eger e girilirse program bitecek
{
printf("1: Constituting a specific structure of numbers\n");
printf("2: Constituting a specific structure of letter\n");
printf("3: Making factorial, division and summation operations\n");
printf("e: Ending the program\n");
printf("Please enter one of these numbers(1,2,3) or enter letter e to exit:\n");
scanf("%s", &input);
if(input=='e')
{
    printf("*************************\n");
    printf("|The program ends        |\n");
    printf("*************************\n");
    break;//programin bitmesi icin yazildi
}
}

if(input=='1')//input 1 oldugunda rakamlarla matrise benzeyen ozel yapý olusacak
{

printf("Please enter a positive integer:");//pozitif bir rakam girilmesini istiyoruz
scanf("%d",&n);

while(i<=n)
{
    k=i;//i sayisini k ya atiyoruz
    j=1;//j degerine 1 atiyoruz

    while(j<=n)
    {
        if(k==0 || k<0)//k nin sifir olmasi yada sifirden kucuk olmasi durumunda
        printf("0  ");//ekrana 0 yazilacak

        else if("k>0")//k nin sifirdan buyuk olmasi durumunda ekrana
        printf("%d  ",i);//once girilen rakam ve sonra her satir atlayarak sayinin bir fazlasi yazacak
        k--;//k degerini 1 azaltir
        j++;//j degerini 1 artirir

    }
    printf("\n");//new line yapar
    i++;//i degerini 1 artirir


}
}

 else if(input=='2')//input degeri 2 girilirse bizden
{
    printf("Enter a character:");//harf ve
    scanf("%s",&c);

    printf("\nEnter an integer:");//rakam girmemizi ister
    scanf("%d",&n);
//girilen harf ve rakami kullanarak özel bir yapi olusturur

    while(i<=n)
    {
        j=1;
        while(j<=n)
        {
            if(j==i)
            putchar(c);//ekrana girilen harfi yazmayi saglar
            else
            printf("  ");

            j++;//j degerini 1 artirir

        }
        c++;//c degerini 1 artirir

        printf("\n");//new line yapar
        i++;//i degerini 1 artirir

    }
}
else if(input=='3')//input degeri 3 girilirse faktoriyel alma bolme ve toplama islemi yapilir
{
    printf("Please enter a positive integer:");//pozitif bir sayi girmemizi ister
    scanf("%d",&n);

    while(i<=n)
    {
        f=1/(f*i);

        i++;

    }

    printf("result:%f",1+f);
}
return 0;
}

1- Klavyeden Girilen Sayı Kadar Yanan Led

Merhaba arkadaşlar,
Bu ve bundan sonraki birkaç çalışmamda sadece kod paylaşımında bulunacağım. Yazılımla ilgilenmeye başladığım zamanlardan bu zamana kadar elimde arşivlediğim, bazıları ders ödevim olan, bazıları çeşitli projelerin belli kısımlarında kullandığım bu kodların sizlere çalışmalarınızda yardımcı olmasını dilerim.

Sadece bu amaç ile paylaşacağım çalışmaların başına sıra numarası ekleyeceğim.


Çalışma videosu :  http://www.youtube.com/watch?v=5QbkOOdJQ0Y&feature=youtu.be

Kaynak Kodu:


void setup(){
 
Serial.begin(9600);
pinMode(13, OUTPUT);
 
}
 
void loop (){
 
if (Serial.available()) { // seri porttan değer girilip girilmediğini anlamak için yazdık
  // eğer değer girilirse bu değer alttaki kod ile okunup ser isimli int
int deger = Serial.read();
 

if(deger >= 48 && deger <= 57) { // girileecek sayi eğer rakam ise if blogu çalışır.
//0-9 arasindaki sayiların ascii karşılıkları 48-57 arasıdır
   int flash = deger - 48;
   Serial.print("Flash sayisi  ");
   Serial.println(flash,DEC);
   TooglePin(13,flash); //toogle devresi diye isimlendirilen devreden aldım fonksiyon ismini
   //bu fonksiyon pinin bir öncekini durumunun zıttını yapmaktadır.
   //Yani pin high (lojik1) ise low (lojik 0) yapar
   }
 }
 
}
 
void TooglePin(int pin,int n){
 
   for (int i = 0; i < n; i++) {
   digitalWrite(pin, HIGH);
   delay(500);
   digitalWrite(pin, LOW);
   delay(500);
  }
}

27 Kasım 2014 Perşembe

Arduino ile Telefon Yapma ( GSM GPRS Shield Arduino )


Bu çalışmamızda GSM GSPRS shieldın arduino ile nasıl kullanılacağını, bağlantıların nasıl yapılacağını ve kodun nasıl yazılacağını inceleyeceğiz. GSM GPRS shieldlar AT komutları ile çalışmaktadır. Haberleşme modüllerine göre farklı AT komutları ile farklı işlemler yapılabilir.

Bu çalışmada SIM900 GSM GPRS shieldı kullanılmıştır.SIM 900 haberleşme modülünü kullanan bu sheild sayesinde bir telefonun yaptığı temel görevler yerine getirilebilmektedir. Örneğin arduino ile bir numara aranabilmekte, mesaj atılabilmekte ve internete girilebilmektedir.

GSM GPRS shield ile arduino bağlantısı oldukça basittir. Shield üzerindeki Tx, Rx pinleri sırasıyla arduinonun Rx, Tx pinlerine bağlanır. Haberleşme bu şekilde sağlanmış olur. Ancak birçok GSM GPRS shield 5V üzeri gerilimle ve 200mA - 1.5 A arası çalışma akımı ile çalışabilmektedir. Bu yüzden harici bir kaynaktann beslenmelidir. Bu kaynak ile arduino da aynı zamanda beslenebilir. Ancak arduinonun ve sheildın aynı kaynakla beslenmediği durumlarda groundlar birleştirilir.

arduino gsp/gprs code

Arduino GSM GPRS baglantısı



GSM GPRS Shield                Arduino

RX                                           TX
TX                                           RX
GROUND                            GROUND

Çalışma videosunu buradan izleyebilirsiniz: http://www.youtube.com/watch?v=BfiY58e4OQM&feature=youtu.be

Arduino ile bir telefonun aranması ; 



#include <SoftwareSerial.h> 
 
SoftwareSerial  Sim900Serial(2, 3); // sim900 gprs shield 
//rx-tx sırasıyla 2 ve 3 e takılır
 
void setup()
{
  Sim900Serial.begin(115200);               // GPRS baud rate  
  delay(2000);
  Sim900Serial.println("AT+IPR=19200");  // bu değer tüm gprs 
  //shieldlarında aynı değildir manuellerden bakılmalıdır
  delay(500);
  Sim900Serial.begin(19200);            // bu değer tüm gprs 
  //shieldlarında aynı değildir manuellerden bakılmalıdır   
  delay(1000); 
}
void loop()
{
  Sim900Serial.println("ATD05425420000;"); // aranmasını istediğiniz 
  //numara girlir. ATD komutu sim900'ün AT komut manueli incelendiğinde 
  //arama için kullanıldığı görülür
  //Örnek: Sim900Serial.println("ATD05425420000;"); vodafone müşteri 
  //hizmetlerinin numarası
  while(1);
}


Arduino ile bir telefona mesaj atılması ; 


#include <SoftwareSerial.h>
SoftwareSerial Sim900Serial(2, 3);
void setup()
{
  Sim900Serial.begin(115200);               // GPRS baud rate  
  delay(500);
  Sim900Serial.println("AT+IPR=19200");
  delay(500);
  Sim900Serial.begin(19200);               // GPRS baud rate , Tüm shieldlarda aynı değildir 
  delay(1000);
  Serial.begin(9600);               // bilgisayar seri port baud rate
 Serial.println("SMS gondermek icin g tusuna basiniz: "); 
}
void loop()
{   
   if (Serial.available())
    switch(Serial.read())
   {
     case 'g':
       SendTextMessage();
       break;
    } 
   if (Sim900Serial.available())
    Serial.write(Sim900Serial.read());
}
void SendTextMessage()
{
  Sim900Serial.print("AT+CMGF=1\r");    //SMS text halde gönderilir. Bu komutun ne iş yaptığı sim900 AT komut manuelinden bakılır
  delay(100);
  Sim900Serial.println("AT + CMGS = \"05425420000\"");//mesajın gönderileceği numara
  delay(100);
  Sim900Serial.println("golmuhendis.blogspot.com.tr");//gönderilecek mesaj
  delay(100);
  Sim900Serial.println((char)26);
  delay(100);
  Sim900Serial.println();
}





13 Ekim 2014 Pazartesi

Arduino ile İnternet Üzerinden Led Kontrolü


Bir önceki çalışmamızda  oluşturduğumuz web server üzerine  arduino analog pinlerinin değerlerini yazmıştık. Yani sadece sayfa üzerine veri yazdırdık.

Bu çalışmamızda hem sayfaya veri yazdıracağız hemde sayfadaki komuta göre arduino üzerine takdığımız ledi kontrol edeceğiz.

Aşağıdaki kod üzerinde gerekli açıklamalar mevcut. Bu linkten çalışma videosunu izleyebilirsiniz.

Çalışma kaynak kodu:


#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177); // yerel ağ bağlantısına göre değiştirilmesi gereken ip adresi
EthernetServer server(80);

String HTTP_req;        
boolean led_durum = 0; // ledin ON yada OFF olduğunu tutan değişken

int led=8; // ledin bağlanacağı arduino pini

void setup()
{
    Ethernet.begin(mac, ip);  
    server.begin();           
    Serial.begin(9600);       
    
    pinMode(led,OUTPUT);
}

void loop()
{
    EthernetClient net_alc = server.available();  

    if (net_alc) {  
        boolean satir_kontrol = true;
        while (net_alc.connected()) {
            if (net_alc.available()) {  
                char c = net_alc.read(); 
                HTTP_req += c;  
                
                if (c == '\n' && satir_kontrol) {
                   
                  // Alttaki satrlar HTML programlama ile ilgilidir. 
                  // HTML kaynak kodlarına bakmanızda fayda var.
                    net_alc.println("HTTP/1.1 200 OK");
                    net_alc.println("Content-Type: text/html");
                    net_alc.println("Connection: close");
                    net_alc.println();                    
                    net_alc.println("<!DOCTYPE html>");
                    net_alc.println("<html>");
                    net_alc.println("<head>");
                    net_alc.println("<title>Arduino Internet Led Kontrol</title>");
                    net_alc.println("</head>");
                    net_alc.println("<body>");
                    net_alc.println("<h1>ADUINO ILE INTERNET UZERINDEN LED YAKIP SONDURME</h1>");
                    net_alc.println("<p>Ledi acip kapatmak icin kutucuga tiklayiniz.</p>");
                    net_alc.println("<form method=\"get\">");
                    LedKontrol(net_alc);
                    net_alc.println("<p>Blogu ziyaret ediniz:</p>");
                    net_alc.println("<div style=\"font-size:25px;\">golmuhendis.blogspot.com.tr</div>");
                    net_alc.println("</form>");
                    net_alc.println("</body>");
                    net_alc.println("</html>");
                    Serial.print(HTTP_req);
                    HTTP_req = "";    
                    break;
                }
                
                if (c == '\n') {
                    
                    satir_kontrol = true;
                } 
                else if (c != '\r') {
                   
                    satir_kontrol = false;
                }
            } 
        } 
        delay(1);     
        net_alc.stop(); 
    } 
}

void LedKontrol(EthernetClient deger)
{
    if (HTTP_req.indexOf("LED=1") > -1) {  
      
        if (led_durum) {
            led_durum = 0;
        }
        else {
            led_durum = 1;
        }
    }
    
    if (led_durum) {    
        digitalWrite(led, HIGH);
        deger.println("<input type=\"radio\" name=\"LED\" value=\"1\" \
        onclick=\"submit();\" checked>LED");
    }
    else {              
        digitalWrite(led, LOW);        
        deger.println("<input type=\"radio\" name=\"LED\" value=\"1\" \
        onclick=\"submit();\">LED");
    }
       
}





12 Ekim 2014 Pazar

Arduino Ethernet Uygulaması

Arduino ile internet üzerinden birşeyleri kontrol etmek fikri son zamanlarda oldukça yaygınlaştı. Bu yazımızda birşeyleri kontrol etmeden önce arduino ile ethernet shieldın nasıl kullanılacağını inceleyeceğiz. Çünkü ilk aşamada ethernet shieldı çalıştırmak kod hazır dahi olsa emek istemektedir. Ne yapacağımızı bilemediğimiz bir durumdur aslında.

Herşeyden önce Ethernet kütüphanesini indirmeniz gerekmektedir. İndirdiğiniz kütüphane dosyasını Library klasörüne attıktan sonra IDE' yi çalıştırabilirsiniz.

Sırasıyla File / Sketchbook yada Examples / Ethernet / Web Server komutlarına tıkladığınızda bu çalışmada yapacağınız uygulamanın kodunu açmış olacaksınız. Yada direk aşağıda göreceğiniz yorum satırları ile yapacağınız işi anlaşılır kılmaya çalışan kodu çalıştırabilirsiniz.

arduino ethernet uygulaması


Şimdi gelelim benim bu işteki katkıma :)

Öncelikle kodun yorum satırlarında da görebileceğiniz gibi kod içerisinde bulunan IP Adresini değiştirmeniz gerekmektedir. Bağlı olduğunuz internet bağlantısı üzerinden bağlantı IPv4 adresinizi öğrenmelisiniz. Bu adresin sadece son hanesini değiştirerek kod içerisindeki ip adresi karşısına yazacaksınız. Örneğin bağlantınızın IP adresi 192.168.1.15 ise siz koda 192.168.1.20 yazmalısınız.

Bir diğer husus ethernet shieldı bağladığınız internet ile kod içerisine yazdığınız IP adresini aratmanızdır. Yani kullandığınız internet hattı bu çalışmada aynı olmalıdır.



Yorum satırları eklenmiş uygulama kodu:
/*
  Web Server = Web sunucusu : Hosting, web sayfalarının internet 
  üzerinde yayınlanması için gerekli alanların kiralanması 
  anlamına gelmektedir. Yani internet üzerinden yayınlanmak istenen
  döküman, resim, sayfa vb. verilerin kullanıcıların erişebileceği
  bir bilgisayarda tutulmasıdır. İşte bu verilerin tutulduğu - 
  saklandığı internete hızlı bağlantısı olan web verilerini tutan
  bilgisayarlara web sunucusu denir.
 
 Bu çalışmada arduino üzerindeki analog pinlerin değerleri 
 basit bir web server da gösterilecektir. Bu çalışmada arduino uno
 ve ethernet shield kullanılmaktadır.
 
 Devre ayak bağlatıları:
 NOT: Eğer ethernet kitiniz shield halinde değilse yani arduino
 kartınız üzerine direk olarak bağlanamıyorsa şu piner 
 kullanılacaktır:
 * Ethernet shieldı arduino üzerindeki bağlanacağı pinler:
 10, 11, 12, 13
 * Analog girişlerinizi (A0...A5) potansiyometre gibi analog
 aygıtlara-sensörlere bağlayabilirsiniz.
 
 */
#include <SPI.h>
#include <Ethernet.h>

// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,89); // IP adresi yerel bağlantınızın
// yani kullandığınız internetin IP adresi ile uyumlu olmalıdır.
// Buna Ağ ve Paylaşım Merkezini Aç/ (İnternete bağlandığınız) Ağ
// Bağlantısı / Ayrıntılar komutlarına tıklayarak IPv4 Adresi linki
//karşısında görebilirsiniz. Burada gördüğünüz IP adresinin sadece
//son hanesini değiştirerek kod içerisindeki kısmı doldurmalısınız.
//Örneğin benim IPv4 adresim 192.168.1.86 idi ancak kod içerisine 
//192.186.1.89 yazdım. Kod içerisine yazdığınız IP adresini web
// browser yani chrome yada Internet Explorer da aratınız. 
//Tabi arduino ya bu kodu yüklemiş ve internet shielda internet
//kablosunu bağlamış olmanız gerekmektedir.

EthernetServer server(80); // HTTP için tanımlanmış port numarası

void setup() {
  Serial.begin(9600); //Seri haberleşme açıldı
   while (!Serial) {
    ; // Seri porta bağlantının yapılmasını bekler
  }


  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
   client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");       
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}




6 Temmuz 2014 Pazar

Arduino ile IR Alıcı Verici Uygulaması

Bu yazımızda birçok uygulamada karşımıza çıkan ve ucuzluğu sayesinde heryerde kullanılabilen ir yani kızılötesi sistemler incelenecektir.

arduino ir range


Kızılötesi sistemler alıcı ve verici kısım olarak iki bölümden oluşur. Bizim inceleyeceğimiz sistemde verici yani ir sinyalin gönderildiği kısım 21 butonlu basit bir kumandadır. Tuşlara basıldığında 38Khz frekans değerinde sinyaller yollar. Aslında bu bir ışıktır. Gönderilen bu ışığı görecek şekilde yerleştirilen ir alıcımız 1838B dir. Alıcı gönderilen sinyali algılar ve sinyal bacağından dijital veri gönderir.

Basılan her butonun kodlandığı farklı bir dijital veri vardır. Bu gönderilen sinyalin sırasıyla lojik 1 yada 0 olması ile alakalıdır.Mesela örnek olarak ard arda 001100 sinyalleri gelmiş olsun bu kumandadaki 1 butonuna karşılık gelsin. Yani kodlamada böyle olduğunu varsayalım. Bu demek oluyor ki siz kumanda da 1 butonuna bastığınızda ışık söner-söner-yanar-yanar-söner-söner. Tabi burada verici ve alıcınızın kaç bitte çalıştığıda önemlidir. Çalışma mantığının anlaşılması için bu şekilde bir örnek vermeyi uygun buldum.

Örneğin bunu daha iyi anlamak için telefon kameranızı kumandanın ön kısmında bulunan ir lede tutun ve herhangi bir tuşa basın ışığın yanıp söndüğünü göreceksiniz.

Bu çalışmada kullanılan kumandanın üzerindeki tuşların hexa değerleri alttaki resimde mevcuttur. Bunların binary karşılığını görmeniz için kod içerisindeki

Serial.println(cikis.value,HEX); satırını şu şekilde değiştirmeniz yeterli olacaktır:

Serial.println(cikis.value,BIN);



Çalışma videosu : http://www.youtube.com/watch?v=LuFK1rI53yo&feature=youtu.be

Uygulama kodu:


#include <IRremote.h>  // arduino ir kütüphanesi
#include <IRremoteInt.h>
#include <LiquidCrystal.h> //okunan mesafe değerinin 16*2 lcd ekrana basıması için
//lcd ekran ktürüphanesi çağrıldı

#define backlight A3 // LCD arka aydınlatmasını kontrol etmek için A3 pini tanımlanıyor

int ir_pin = 10; //ir alıcı pinin bağlanacağı pin numarası
IRrecv irrecv(ir_pin);
decode_results cikis;

LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

void setup()
{
  Serial.begin(9600);
  pinMode (backlight, OUTPUT); 
  lcd.begin(16, 2); //lcd tipi
  digitalWrite (backlight,HIGH);
  lcd.print("golmuhendis.blog");
  lcd.setCursor(0,1); //satır,sütün
  lcd.print("spot.com.tr");
  delay(3000);
  lcd.clear();
  irrecv.enableIRIn(); // ir alıcıyı aktif eder
}

void loop()
{
  
  if (irrecv.decode(&cikis)) //cikis deiskenin olduğu edresi decode eder
    {
      
      Serial.println(cikis.value,HEX);       
      translateIR();  //gelen veriyi hexadecimal olarak ifade etmek için tanımlanan fonksiyon
      irrecv.resume();
          
    }
}
     
     
void translateIR() // gelen digital veriyi hex haline donusturur
{
  switch(cikis.value)
  {
    case 0xFFA25D: // vericideki tuşların karşılık geldiği hexa değerleri
    lcd.clear(); 
    Serial.println(" CH-            "); 
    lcd.print ("Basilan tus ");
    lcd.print("CH-");
    break;
  
    case 0xFF629D: 
    lcd.clear(); 
    Serial.println(" CH             ");
    lcd.print ("Basilan tus ");
    lcd.print("CH"); 
    break;
  
    case 0xFFE21D: 
    lcd.clear();  
    Serial.println(" CH+            "); 
    lcd.print ("Basilan tus ");
    lcd.print("CH+");
    break;
  
    case 0xFF22DD:  
    lcd.clear(); 
    Serial.println(" PREV           "); 
    lcd.print ("Basilan tus ");
    lcd.print("PREV");
    break;
  
    case 0xFF02FD:  
    lcd.clear(); 
    Serial.println(" NEXT           "); 
    lcd.print ("Basilan tus ");
    lcd.print("NEXT");
    break;
  
    case 0xFFC23D:  
    lcd.clear(); 
    Serial.println(" PLAY/PAUSE     "); 
    lcd.print ("Basilan tus ");
    lcd.print("PLAY/PAUSE");
    break;
  
    case 0xFFE01F:  
    lcd.clear(); 
    Serial.println(" VOL-           "); 
    lcd.print ("Basilan tus ");
    lcd.print("VOL-");
    break;
  
    case 0xFFA857:  
    lcd.clear(); 
    Serial.println(" VOL+           "); 
    lcd.print ("Basilan tus ");
    lcd.print("VOL+");
    break;
  
    case 0xFF906F:  
    lcd.clear(); 
    Serial.println(" EQ             "); 
    lcd.print ("Basilan tus ");
    lcd.print("EQ");
    break;
  
    case 0xFF6897:  
    lcd.clear(); 
    Serial.println(" 0              "); 
    lcd.print ("Basilan tus ");
    lcd.print("0");
    break;
  
    case 0xFF9867:  
    lcd.clear(); 
    Serial.println(" 100+           "); 
    lcd.print ("Basilan tus ");
    lcd.print("100+");
    break;
  
    case 0xFFB04F:  
    lcd.clear(); 
    Serial.println(" 200+           "); 
    lcd.print ("Basilan tus ");
    lcd.print("200+");
    break;
  
    case 0xFF30CF:  
    lcd.clear(); 
    Serial.println(" 1              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("1");
    break;
  
    case 0xFF18E7:  
    lcd.clear(); 
    Serial.println(" 2              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("2");
    break;
  
    case 0xFF7A85:  
    lcd.clear(); 
    Serial.println(" 3              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("3");
    break;
  
    case 0xFF10EF:  
    lcd.clear(); 
    Serial.println(" 4              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("4");
    break;
  
    case 0xFF38C7:  
    lcd.clear(); 
    Serial.println(" 5              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("5");
    break;
  
    case 0xFF5AA5:  
    lcd.clear(); 
    Serial.println(" 6              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("6");
    break;
  
    case 0xFF42BD:  
    lcd.clear(); 
    Serial.println(" 7              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("7");
    break;
  
    case 0xFF4AB5:  
    lcd.clear(); 
    Serial.println(" 8              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("8");
    break;
  
    case 0xFF52AD:  
    lcd.clear(); 
    Serial.println(" 9              "); 
    lcd.print ("Basilan tus: ");
    lcd.print("9");
    break;
  
    default: 
    Serial.println(" Yanlis sinyal, isik etkisi olabilir   ");

  }
     

5 Temmuz 2014 Cumartesi

Arduino ile Park Sensörü

Bu yazımızda SR04 sensörü ile park sesnörü yapımına çalışacağız. Daha önceki yazımızda SR04 sensörü hakkında ve nasıl kullanılacağı hakkında detaylı bilgiyi vermiştir. Bu çalışmada sadece ek olarak 1 adet korna kullanılmıştır.

Çalışma videosu :  http://www.youtube.com/watch?v=Ft0ERHyXEuQ&feature=youtu.be



Çalışma kodu:


//ultrasonik sensör ile mesafe ölçümü

#include <LiquidCrystal.h> //okunan mesafe değerinin 16*2 lcd ekrana basıması için
//lcd ekran ktürüphanesi çağrıldı
#define backlight A3 // LCD arka aydınlatmasını kontrol etmek için A3 pini tanımlanıyor

#define trigPin 3 //sensör üzerindeki pinlerin arduino üzerine takıldığı pin numaraları
#define echoPin 2
#define korna 11

LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

void setup() {
  
  pinMode (backlight, OUTPUT); 
  lcd.begin(16, 2); //lcd tipi
  Serial.begin (9600); //seri haberleşme hızı=baud rate
  pinMode(trigPin, OUTPUT); //sinyalin gönderildiği pin
  pinMode(echoPin, INPUT); //yansıyan sinyalin alındığı pin
  digitalWrite (backlight,HIGH);
  lcd.print("golmuhendis.blog");
  lcd.setCursor(0,1); //satır,sütün
  lcd.print("spot.com.tr");
  
  analogWrite(korna,0);
  delay(3000);
}

void loop() {
  
  lcd.clear();
  analogWrite(korna,0);
  long duration, distance;
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH); //SR04 sensörü için 10 us lik lojik 1 sinyali trigger a gönderilir.
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  Serial.println(duration);
  distance = (duration/2) / 29;  //29*2=58
  //340 m/sn yani 34000cm/1000000us = 1/29
    
  Serial.print(distance);
  Serial.println(" cm");
    
  lcd.print ("Mesafe: ");
  lcd.print(distance);
  lcd.print("  cm");
  lcd.setCursor(1,1);
  lcd.print("golmuhendis");
  
  if(distance<=20 && distance>=10)
  {
    analogWrite(korna,100);
  }
    
  if(distance<10)
  {
    analogWrite(korna,200);
  }
   
  delay(500);
}

Arduino ile Ultrasonik Sensör Kullanımı

Bu yazımızda arduino ile HC-SR04 ultrasonik sensörünü kullanmayı ve mesafe ölçmeyi öğreneceğiz. Ultrasonik sensörler ultrasonik ses dalgaları yayan ve bunların engellere çarpıp geri dönmesine kadarki geçen süreyi hesaplayıp aradaki mesafeyi bulan sensörlerdir.

arduino ultrasonic sensor


Yaydığı ses dalgalarının tüm katı ve sıvı  cisimlerden yayılması SR04 sensörünün mesafe ölçümü, cisim agılama gibi birçok uygulamada kullanılmasını sağlamaktadır. İnsan kulağı teoride 20 Hz ile 20000 Hz arasındaki frekans aralığını işitir. Ultrasonik ses dalgaları ise 20 kHz ile 500kHz frekansları arasındadır. Frekansların yüksek olması yayılan sinyallerin enerjilerinin yüksek olmasını ve yüzeylerden daha iyi yansımasını sağlamak içindir. Ayrıca bu sayede uygulamalarda insanları rahatsız etmeyecek şekilde kullanılabilir. SR04 sensörünün çalışma frekansı ise 40Khz dir. Yani 40 Khz frekans değerinde ses dalgası üretir.



SR04 sensörü üzerinde 4 pin mevcuttur. Bunlar sırasıyla VCC, Trig, Ecgo, GND . Trig üretilen sinyalin sensöre uygulanması, Echo yansıyan sinyalin işlemciye iletilmesi için kullanılır. Sinyallerin sensör tarafından iletilmesi ve algılanması transduser tarafından sağlanır. Trig bacağına sensör datasheetine göre 10 us lojik 1 uygulanır. Bu sinyal sensöre uygulandığında sensör 40 Khz lik sinyali üretir ve gönderir.

Ses sinyallerinin boşlukta yayılma hızı 340 m/sn' dir. Sensörden ilk olarak bir ses dalgası gönderilir, yansıyan ses dalgası transducer tarafından algılanır ve tekrar gönderilir ancak gönderilmeden önce biraz beklenir. Çünkü bir önceki ses dalgasının cisim yada ortam tarafından tam anlamıyla emilmiş olması gerekir. Yansıyan sinyal echo bacağından okunur ve bu sayede mesafe ölçümü yapılabilir. Önemli olan nokta echo pininin ne kadar süre lojik 1 de kaldığıdır. Ölçülmesi gereken değer budur. Çünkü mesafenin bulunması için öncelikle zamanın hesaplanması gerekir. Ses dalgası 340 m/sn de hareket ediyorsa ve biz ölçüm aralığını 1 us de yapıyorsak 34000 cm /1000000 = 1/29 yan, zaman/29 olması gerekir. Ancak sinyalin gidiş ve gelişi göz ard edilmemelidir. Yani zaman/(29*2) =zaman/58 olur. Kod içerisinde de hesap bu şekilde yapılmıştır.

Çalışma videosu : http://www.youtube.com/watch?v=sc-hUGIu2tA


Uygulama kodu:

//ultrasonik sensör ile mesafe ölçümü

#include <LiquidCrystal.h> //okunan mesafe değerinin 16*2 lcd ekrana basıması için
//lcd ekran ktürüphanesi çağrıldı
#define backlight A3 // LCD arka aydınlatmasını kontrol etmek için A3 pini tanımlanıyor

#define trigPin 13 //sensör üzerindeki pinlerin arduino üzerine takıldığı pin numaraları
#define echoPin 12

LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

void setup() {

  pinMode (backlight, OUTPUT);
  lcd.begin(16, 2); //lcd tipi
  Serial.begin (9600); //seri haberleşme hızı=baud rate
  pinMode(trigPin, OUTPUT); //sinyalin gönderildiği pin
  pinMode(echoPin, INPUT); //yansıyan sinyalin alındığı pin
  digitalWrite (backlight,HIGH);
  lcd.print("golmuhendis.blog");
  lcd.setCursor(0,1); //satır,sütün
  lcd.print("spot.com.tr");
  delay(3000);
}

void loop() {

  lcd.clear();
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); //SR04 sensörü için 10 us lik lojik 1 sinyali trigger a gönderilir.
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  Serial.println(duration);
  distance = (duration/2) / 29.;  //29*2=58
  //340 m/sn yani 34000cm/1000000us = 1/29
 
  Serial.print(distance);
  Serial.println(" cm");
 
  lcd.print ("Mesafe: ");
  lcd.print(distance);
  lcd.print("  cm");
  lcd.setCursor(1,1);
  lcd.print("golmuhendis");
 
  delay(500); //500 ms de 1 ölçüm yapılır
}


2 Haziran 2014 Pazartesi

Leap Motion Arduino Sevo Kontrol

Bu yazımızda Leap Motion ve arduino uno ile 4 adet servonun el hareketlerine simetrik olarak kontrol edilmesini inceleyeceğiz. Leap Motion üzerinde 2 adet IR kamera 3 adet kızılötesi led bulunmaktadır. Kızılötesi ledlerden yayılan kızılötesi sinyaller leap motion görüş alanı içerisinde bir cisimden yansıdığında bunlar kameralar vasıtası ile tespit edilmektedir. Yani sinyalin yansıma özelliğinden ve giden sinyal ile gelen sinyal arasındaki süre ölçülerek mesafenin tespit edilmesi yönteminden yararlanılmaktadır. Radar sistemlerine oldukça benzemekteler aslında (Şekil 1).


arduino leap motion servo
Şekil 1. Infrared Led Yansıma Prensibi


Leap motion sensörünü kullanmak için çeşitli platformlar, geliştirme ortamları mevcuttur. Ancak Arduino ile benzerliği açısından biz bu çalışmada Processing-Wiring dilini kullanacağız. 

Processing kurulumunu arduino ide kurulumu gibi basit bir şekilde bilgisayarınıza yaptıktan sonra, Projessing klasörü içerisindeki "lib" klasörüne LeapMotionP5 kütüphanesini kopyalıyorsunuz. Bu sayede Leap Motion kütüphanesi' ni Projessing' e yüklemiş olacaksınız. 

Leap Motion bilgisayara USB kablosu ile bağlanmaktadır. Servolar arduino kartına bağlı olduğu için Processing içerisinde arduino seri portunu tanıtmak gerekmektedir. Bu Processing içerisinde setup bloğu içerisine "new Serial(this, portName, 9600); " kodunu ekleyerek yapılmaktadır.

Arduino çıkış akımı kullanılan servoları besleyemeyeceği için, 5V ile çalışan servolara harici kaynaktan enerji sağlamalısınız. Bunu arduino ve servoları aynı pilden beslemek isterseniz 5V regulatör devresi kullanarak yapabilirsiniz. Ancak servolarınızın toplam çekeceği akım 1A üstünde ise farklı elemanlar kullanmanız gerekmektedir. Çünkü 7805 entegresi üzerinden maksimum 1A akım geçirebilmektedir.

Bu çalışmada arduino ile uzaktan haberleşme için Xbee modemleri kullanılmıştır. Siz direk arduino kartınızı bilgisayara bağlayarak da bu çalışmayı yapabilirsiniz. İleriki günlerde Xbee modemlerinin arduino ile nasıl kullanılacağı konusunda yazı paylaşacağım.

Çalışma videosu :  http://www.youtube.com/watch?v=ysL_c9gI2Os

Processing Kodu:

//Leap motion ve arduino ile servo kontrolü

import com.onformative.leap.LeapMotionP5; //Leap Motion kütüphanesi
import com.leapmotion.leap.Finger;
LeapMotionP5 leap;

int aci;
int deger;
float deger1;

import processing.serial.*;
Serial port;

public void setup() {

  size(720, 720, P3D);  //ekran boyutu
  noFill();
  stroke(255); //parmakların modellemesi beyaz olarak ekranda gösterilecek

  leap = new LeapMotionP5(this);  //leap motion usb portu

  println("Seri porta baglanti var:"); //leap motion bağlantısının durumunu ekrana yansıtır

  String portName = Serial.list()[0]; //arduino yada kablosuz modemin bağlı olduğu porta bağlanır
  port = new Serial(this, portName, 9600);
}

public void draw() {
  background(0);
  fill(255);
  for (Finger f : leap.getFingerList())
  {
    PVector position = leap.getTip(f);
 
    ellipse(position.x, position.y, 10, 10);
 
    deger1=map(position.x,250,400,0,180); //leap motion x ekseninde okunan değerler 0-180 arasına //maplenir

    deger=int(deger1); //float deger1 deskeni integer a donusturulur
    port.write(deger); //Seri porttan arduino ya gönderilen deger
    print("deger:  ");
    println(deger); //100-400 arasi

 
  }
}

  public void stop() {
  leap.stop();
}



Arduino Kodu:

#include<Servo.h>

Servo s;
Servo s1;
Servo s2;
Servo s3;

int deger=0;

void setup()
{
  Serial.begin(9600);
  s.attach(5);
  s1.attach(6);
  s2.attach(7);
  s3.attach(8);
}

void loop()
{
   if(Serial.available())
  {
 
    deger=Serial.read();
 
    s.write(deger);
    s1.write(deger);
    s2.write(deger);
    s3.write(deger);
 
  }


}

10 Mayıs 2014 Cumartesi

RC Receiver Değerlerinin Arduino ile Okunması

Multikopter sistemleri yada modelcilikte kumanda alıcı verici sistemleri yaygın olarak kullanılmaktadır. Çeşitli frekans değerlerinde çalışan bu sistemlerden en yaygın kullanılanı 2.4 GHz frekans değerine sahip olanlardır. Kumandalar pwm (pulse width modulation) yada ppm (pulse position modulation)  modülasyon özellikleri ile çalışmaktadır. PWM yada PPM sistemlerini ileriki çalışmalarda detaylı bir şekilde inceleyeceğiz. Bu çalışmada kumandanın nasıl bir sinyal gönderdiğini ve bu sinyalin hangi değerler arasında olduğunu inceleyeceğiz.

Kumanda üzerinde bulunan joystick yada switchler kanallara atanmıştır. Bazılarında ise kanallara atama olayını kullanıcılar yapar. Bir multikopterin kontrol edilebilmesi için en az 4 kanallı kumandaya ihtiyaç vardır.

Kanallardan gelen sinyallere çoğu çalışmada ihtiyaç duyulmaktadır. Multikopterin farklı kontrol çalışmalarında, android kontrollerinde bu verilere ihtiyaç duyulmaktadır. Bu veriler basit bir şekilde arduino kartları ile okunabilmektedir. İlgili kod aşağıda bulunmaktadır. Receiverdan gelen değer analogRead fonksiyonu ile okunamaz. Çünkü PWM yada PPM sinyali ile çalışılır. Yani okunması gereken sinyalin HIGH yada LOW olma süresi okunmalıdır. Bunu okuyabilmek için arduino da özel bir fonksiyon vardır. Aşağıdaki kodda "pulseIn" fonksiyonu sinyalin HIGH olduğu durumları saymaktadır.

Kod:

int pin = 7;     // değeri okunmak istenen receiver pini
unsigned long duration;

void setup()
{
  Serial.begin(9600);
  pinMode(pin, INPUT);
}

void loop()
{
  duration = pulseIn(pin, HIGH);   // pulse' in HIGH olması durumunda sayar
  Serial.println(duration);
}