Yavaş yavaş kablosuz düzeneklere geçmenin fayda sağlayacağını düşündüm. Bunun için de aralarından en basiti olan kızılötesi haberleşmeyi seçtim. Kısaca bahsetmek gerekirse kızılötesi bizim gözümüzle göremediğimiz ışınlar ve bu ışınları görebilen alıcı ve vericiler sayesinde 2 ayrı bağımsız devre belirli kodlamalar sayesinde haberleşebiliyor.En basitinden telefonunuzun kamerası ile televizyon kumandasının önündeki lede bakarken herhangi bir tuşa bastığınızda led'in yandığını görebilirsiniz. Fakat çıplak gözle kendimiz bu ışınları göremiyoruz.
TV kumandası seçtim çünkü hem bu kumandalardaki kodları çözümlemeyi öğrenmek hem de hazır bir verici olduğu için bizi fazla uğraştan kurtarır diye düşündüm :).
Kısaca yapacağımız projeyi anlatmam gerekirse önce TV kumandamızdaki tuşların kodlarını arduinomuz sayesinde öğreneceğiz ve bu kodları kullanarak sayısal çıkışlara hükmedeceğiz.
Ama önce aşağıdaki linkten arduino sketch kızılötesi kütüphanesini indirmemiz gerekiyor.
http://www.pjrc.com/teensy/arduino_libraries/IRremote.zip
Bunu arduino'nun kurulu olduğu klasördeki libraries içine atıyoruz. Adını sadece IR yaparsanız iyi olur. Bu kütüphane ile kullanacağımız kodları incelememiz gerekirse;
IRrecv irrecv(receivePin) ; // Adını koyabileceğimiz bir IR alıcı oluşturuyoruz.
irrecv.enableIRIn() ; // IR ile veri alma işlemini başlatıyoruz.
irrecv.decode(&results); // Alınan kodu çözme teşebbüsüne girer.
results.value ; // Verinin kodudur. (bu değeri kullanacağız)
irrecv.resume(); // Veri alımından sonra diğer kodu almak için başa döner.
Önce aşağıdaki kodları yazıyoruz ve kullandığımız kumandanın kullanmak istediğimiz herhangi 4 tuşunun kodlarını yazıyoruz..Tabi önce Sketch>Import Library > IR'yi tıklıyoruz ki kütüphanemiz eklensin.
#include <IRremote.h>
int RECV_PIN = 11; //IR'nin 3.bacağını taktığımız pin
IRrecv irrecv(RECV_PIN);
decode_results kod; // dekode sonucu
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Alma başlıyor
}
void loop()
{
if (irrecv.decode(&kod))
{
Serial.println(kod.value, DEC); // Kodun Decimal Değeri
irrecv.resume();} // Yeni kod alımı
}
Benim kumandamda bu değerler çıktı. 1 tuştan 2 farklı değer çıkabilir. Mühim değil, 2 değeri de tek bir değere indirgeyeceğiz bu sorun da ortadan kalkmış olacak. Bunu da aşağıdaki örnekteki gibi yapacağım.
if(k==1874)
return 1; // 1874 değerim 1 oldu
3 Led kullandım, 3 tuş açmak için kullanacağım , 1 tuşu da kapatmak için kullanacağım.
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results kod;
int kumanda(int k)
{
if(k==3922)
return 1;
if(k==3907)
return 2;
if(k==3906)
return 3;
if(k==3911)
return 4;
if(k==1874)
return 1;
if(k==1859)
return 2;
if(k==1858)
return 3;
if(k==1863)
return 4;
return -1;
}
void setup()
{
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&kod)) {
Serial.println(kumanda(kod.value));
if(kumanda(kod.value) == 1)
digitalWrite(9,HIGH);
if(kumanda(kod.value) == 2)
digitalWrite(8,HIGH);
if(kumanda(kod.value) == 3)
digitalWrite(7,HIGH);
if(kumanda(kod.value) == 4){
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
}
irrecv.resume();
}
}
Videomuz ;
microcontroller etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
microcontroller etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
4 Nisan 2014 Cuma
Arduino - Kızılötesi Kullanarak (Infared Receiver) TV Kumandası ile Led Yakma
26 Mart 2014 Çarşamba
Arduino - HC-SR04 Ultrasonik Sensör ile Mesafe Ölçer Uygulaması
Merhaba. Bu yazımda HC-SR04 ultrasonic sensörünü tanıyıp cisim algılama ve de mesafe ölçümü yapacağız. Ses dalgaları sınıflandırılmasında 20 KHz-1 GHz arasındaki ses sinyalleri ultrasonic ses olarak tanımlanmıştır.Bizim sensörümüz ve bir çok ultrasonic sensör 40Khz frekansında ultrasonic ses üretmektedir. Burada önemli olan sesin yüksekliğinde belirleyici olan etken frekanstır.Ses yüksekse frekansta yüksektir.Ultrasonic ses sinyallerini insan kulağı algılayamaz.
Aslında HC-SR04 tüm haliyle bir transdüserdir. Transdüser ile sensör arasındaki fark ise sensör herhangi fiziksel bir değişimi algılayan bir eleman iken, transdüser bu değişimi algılayıp elektrik,ısı vs. bir çok enerji formuna dönüştürebilen bir elektronik devredir.
HC-SR04'te 2 adet araba farını andıran bir tanesi ses iletici diğeri de ses alıcı olan transdüser bulunmakta. Sol taraftan 40 KHz'de üretilen ses sinyal darbesi engele çarpıp sağ tarafa gelir ve biz bu gidiş-geliş arasındaki zamanı, cm'ye çevirerek uzaklığı ölçeceğiz.
T=0 zamanında darbe iletilir(ultrasonic ses sinyali), cisimden yansır, transdüser tarafından algılanır ve tekrar
gönderilir.
Sonraki darbe ilk darbenin ultrasonik enerjisinin hepsi absorbe edildiğinde iletilmelidir.Bu yüzden sensöre bir pals gönderilir sensör okunur ve sensörün datasheetinde yazan süre kadar sensöre tekrar pals gönderilmez.Eğer bekleme yapmaksak sensör saçma değerler döndürür.Çünkü ilk yolladıgımız sinyal bir yerden yansıyarak sensöre geri dönmeye devam eder.
Sensör üzerinde 4 adet pin mevcut.Bunlar;vcc,gnd,trig,echo pinleri.Sensör kendi içerisinde 40khz frekansında bir sinyal üretip 8 pals verici transdüsere gönderiyor.Bu ses dalgası
havada, deniz seviyesinde ve 15 °C sıcaklıkta 340 m/s bir hızla yol alır.Bir cisme çarpar ve geri sensöre yansır.Cismin sensörden uzaklıgı ile doğru orantılı olarak echo pini bir süre lojik 1 seviyesinde kalır ve tekrar lojik 0 olur.Bizim bu mesafeyi ölçmekiçin tek yapmamız gereken echo pininin ne kadar lojik1 oldugunun süresini bulmaktır.Bu yapı yukarıdaki resimden daha iyi görülebilir.Echo pininin lojik 1de kalma süresini mikrodenetleyici timerı ile ölçelim. Klasik yol=hız*zaman dan ve sesin 340m/sn lik hızınıda 34000cm/1000000us (340000/1000000=1/29) olarak düzenlersek formül x=t/29 olarak bulunur.Fakat burada önemli bir nokta sensörün bize döndürdüğü süre, ses sinyalinin gönderilmesi ile alınması arasındaki oluşan süre. Yani yol=zaman/29 ile aradaki mesafeyi iki ile çarpmış oluyoruz.Çünkü ses hem gitti hem geldi.Bu yüzden x=t/58 formulüyle aradaki mesafeyi ölçmüş olacağız . Bazı yerlerde 58 yerine 58.2 veya 59 yazanı da gördüm artık sizin kararınıza kalmış birşey.
Buna ek olarak da 13.pine led bağladım ve mesafe 15 cm altına düştüğünde led yansın istedim.Siz isterseniz bir buzzer koyabilirsiniz. Buyrun kodlar ;
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int trigPin=2; //define trigPin 2
int echoPin=3; //define echoPin 3
int led=13;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led,OUTPUT);
lcd.begin(16,2);
}
void loop() {
int sure, uzaklik;
lcd.clear();
lcd.setCursor(0,0);
digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
sure = pulseIn(echoPin, HIGH);
uzaklik = (sure/58);
if (uzaklik<15)
{digitalWrite(led,HIGH);}
else {digitalWrite(led,LOW);}
lcd.print("Uzaklik = ");
lcd.print(uzaklik);
lcd.print(" cm");
delay(400);
}
Video ;
Not: Resimlerin birçoğu www.mcu-turkey.com adresinden alınmıştır. Aynı programı PIC için yapmak isteyenler aşağıdaki adresi ziyaret edebilirler.
http://www.mcu-turkey.com/hc-sr04-ultrasonic-sensor-ile-cisim-algilama-ve-mesafe-olcumu/
Etiketler:
Arduino,
Arduino Tutorial,
arduinotik,
HC-SR04,
Karadeniz Teknik Üniversitesi,
KTÜ,
LM016,
mcu-turkey,
Microchip,
microcontroller,
pals,
Pulse,
Ses,
Tutorial,
Ultrasonic Censor,
Ultrasonik Sensör
11 Mart 2014 Salı
Arduino - Matematiksel İşlemler
Arduino matematiksel işlemler yapmak için matematiksel operatörleri kullanır. Bu operatörleri birlikte kullanarak karmaşık matematik işlemleri, arduinoya yaptırabilir sensörlerden elde ettiğimiz değerleri(V,mV) istediğimiz değerlere çevirebiliriz (K,C,metre vs.).
Bu operatörlere örnek vermek gerekirse,
c= a + b // a değeri ile, b değerini toplayıp c değerine atar.
c= a - b // a değerinden b değerini çıkartıp c değerine atar.
c= a * b // a değeri ile, b değeriniçarpıp c değerine atar.
c= a / b // a değerini b değerine bölüp c değerine atar.
c = a%b // a değerinin b ye bölümünden kalanı c değerine atar, bu ifadeyi kullanmıştık.
Ledlerin veya butonların hangi pinlere bağlı olduğunu belirtmek için int değerini kullanmıştık.
Bu int değeri bizim belirttiğimiz sayının veya çıkışın tamsayı istendiği anlamına gelmekte.
Eğer bu istenen çıkışın veya girişin ondalık sayı olması isteniyorsa değer int olarak değil float ile girilir. Örneğin ;
int a=5;
float b=5,6;
float c=a+b;
int d= a+b;
Burda sadece olayın nasıl işlediğini anlatmak istiyorum yoksa bu kodlar direkt çalışmaz elbette ki :).
Sonuçlarda float olarak girilen c değeri 10,6, int olarak girilen d değeri de 11 olarak çıkar.
ÜS Alma işlemi x üssü alınacak sayı, n üs olmak üzere;
pow(x,n) olarak alınır.
KAREKÖK alma işlemi x sayısı için de ;
sqrt(x) olarak alınır.
MUTLAK değer alma işlemi yine x sayısı için;
abs(x) olarak alınır.
TRİGONOMETRİK ifadeler de x RADYAN olmak üzere ;
sin(x),cos(x),tan(x) gibi bizim bildiğimiz ifadelerle alınabilir.
NOT : Genellikle radyan değerlerle değil açılarla direktman çalıştığımız için açıları otomatikman radyana çevirebiliriz. Bunun için arduinoda tanımlı DEG_TO_RAD ifadesini kullanabiliriz. Örnek vermek gerekirse açıyı dışardan okuduğumuzu farz edelim ve bunun karesini alalım. aci_d ifadesi dışardan okunuyor olsun.
aci_r = aci_d * DEG_TO_RAD;
y= pow(aci_d,2);
Bu kod ile açı olarak okunulan aci_d ifadesi radyana dönüştürülmüş olur.
BÜYÜK ve KÜÇÜK Olanı Bulma;
x ve y kıyaslanan 2 değer olsun,
max(x,y); // büyük olan hangisiyse çıkış o olur.
min(x,y); // küçük olan hangisiyse çıkış o olur.
Bu operatörlere örnek vermek gerekirse,
c= a + b // a değeri ile, b değerini toplayıp c değerine atar.
c= a - b // a değerinden b değerini çıkartıp c değerine atar.
c= a * b // a değeri ile, b değeriniçarpıp c değerine atar.
c= a / b // a değerini b değerine bölüp c değerine atar.
c = a%b // a değerinin b ye bölümünden kalanı c değerine atar, bu ifadeyi kullanmıştık.
Ledlerin veya butonların hangi pinlere bağlı olduğunu belirtmek için int değerini kullanmıştık.
Bu int değeri bizim belirttiğimiz sayının veya çıkışın tamsayı istendiği anlamına gelmekte.
Eğer bu istenen çıkışın veya girişin ondalık sayı olması isteniyorsa değer int olarak değil float ile girilir. Örneğin ;
int a=5;
float b=5,6;
float c=a+b;
int d= a+b;
Burda sadece olayın nasıl işlediğini anlatmak istiyorum yoksa bu kodlar direkt çalışmaz elbette ki :).
Sonuçlarda float olarak girilen c değeri 10,6, int olarak girilen d değeri de 11 olarak çıkar.
ÜS Alma işlemi x üssü alınacak sayı, n üs olmak üzere;
pow(x,n) olarak alınır.
KAREKÖK alma işlemi x sayısı için de ;
sqrt(x) olarak alınır.
MUTLAK değer alma işlemi yine x sayısı için;
abs(x) olarak alınır.
TRİGONOMETRİK ifadeler de x RADYAN olmak üzere ;
sin(x),cos(x),tan(x) gibi bizim bildiğimiz ifadelerle alınabilir.
NOT : Genellikle radyan değerlerle değil açılarla direktman çalıştığımız için açıları otomatikman radyana çevirebiliriz. Bunun için arduinoda tanımlı DEG_TO_RAD ifadesini kullanabiliriz. Örnek vermek gerekirse açıyı dışardan okuduğumuzu farz edelim ve bunun karesini alalım. aci_d ifadesi dışardan okunuyor olsun.
aci_r = aci_d * DEG_TO_RAD;
y= pow(aci_d,2);
Bu kod ile açı olarak okunulan aci_d ifadesi radyana dönüştürülmüş olur.
BÜYÜK ve KÜÇÜK Olanı Bulma;
x ve y kıyaslanan 2 değer olsun,
max(x,y); // büyük olan hangisiyse çıkış o olur.
min(x,y); // küçük olan hangisiyse çıkış o olur.
7 Mart 2014 Cuma
Arduino - Buton ile Çıkışları Değiştirme
Butonların öneminden daha önceki yazımda bahsetmiştim. Burada da yine bir öncekine benzer bir uygulama yapacağız. Bu uygulamanın yapılış amacını aslında 7 segment display uygulamalarına giriş için yaptığımızı düşünebiliriz.
Kısaca uygulamadan söz etmek gerekirse amacımız burda 1 sayısal giriş ile 2 sayısal çıkışı yönetmek olacak. Butona her bastığımızda çıkışın yeri değişecek. Yani çıkış olarak kullandığımız yeşil ve turuncu ledleri sırayla butona basarak yanmasını sağlayacağız.
Bu uygulamaya geçmeden önce size aritmetik bir operatör olan " mod " almayı anlatacağım.
Arduino'da ve bir çok C tabanlı dilde mod " % " ifadesi ile alınmakta. Yani biz herhangi bir integer değerin herhangi bir sayı modunda almak istersek şu şekilde kullanmamız gerekiyor.
Integer değeri= sayi , mod=5 olsun;
" sayi%5 "
Uygulamamızda bu kavramın daha iyi anlaşılacağını düşünüyorum.
int led1=8; //yeşil led
int led2=7; //turuncu led
int buton=4;
int ledsirasi=0; //modunu alacağımız sayi
void setup () {
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(buton,INPUT_PULLUP);}
void loop () {
int butondurumu=digitalRead(buton);
if (butondurumu==0)
{ledsirasi=ledsirasi+1;}
if (ledsirasi%2==0)
{digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);}
else
{digitalWrite(led2,HIGH);
digitalWrite(led1,LOW);}
delay(100);
}
Programda çıkışları seçmeyi (aslında 1 olanı seçmeyi) mod2ye bağlı olarak ledsirasi integer değerine göre seçtim. ledsirasi 0'dan başlamak üzere her butona basıldığında 1 artacak ve mod2ye göre de ya "1" ya da "0" olacak. Buna göre de ya yeşil led ya da kırmızı led in yanması sağlanmış olacak.
Bir sonraki uygulamamızda 7 segmentli gösterge ile 0-9 arası sayıcı yapacağız. Daha önce CMOS 4026 entegresi ile hazır olarak bunu yapmıştım bu sefer arduinoyu kendimiz programlayarak bunu yapacağız.
Kaydol:
Kayıtlar (Atom)









