Bu yazımda TCRT5000 kızılötesi sensörün kullanımından bahsedeceğim. HC-SR04 ultrasonik sensör ile mesafe ölçmüştük. HC-SR04 ses dalgası kullanıyordu. TCRT5000 ise kızılötesi dalgaları kullanıyor. TCRT5000 ile sadece mesafe ölçümü değil ayrıca lojik-1 lojik-0 düzeyinde de kullanabilir bunun yanı sıra siyah-beyaz bant ayrımı da yaptırtabilirsiniz. Bu sayede çizgi izleyen bir robot yapabilirsiniz.
Ben bu yazımda sensörün analog çıkışını okuyacağım ve bunu LCD ekrana yazdıracağım. Sensörü soldaki şemaya göre oluşturup, siyah gözü 5v'a çektiğimiz yeri Arduino'nun A0 pinine bağlıyoruz. Siyah gözü 10K ile Mavi Gözü 100ohm ile 5V'a çekiyoruz. Ben 20K-100 ohm ikilisini kullandım, siz aldığınız ölçümlere göre en optimum ikiliyi seçip kullanabilirsiniz.
Merhabalar... Bu yazımda hareket algıladığında dijital çıkış veren PIR Sensörü uygulaması yapacağız. Amacımız hareket algılandığında çıkış olarak led yakılması. Fritzing devre şeması için kusura bakmayın, herşeyler var bi'tek PIR yok.
PIR SENSÖRÜ NEDİR ? Orjinal ismi Passive InfraRed Sensor yani Pasif Kızılötesi Sensör olan bu ekipman objelerden yayılan kızılaltı (IR) ışın değişimini tespit etmek için bir Fresnel lens ve IR’ye duyarlı sensör yardımıyla, 6 metreye kadar mesafedeki hareketleri algılayabilir; ucuzdur, kullanımı kolaydır; alarm sistemleri, hareketle aktif olan ışıklar gibi uygulamalar için idealdir.
Sensörün başlığını açarsak üzerinde bulunan 3 bacağın ne ile alakalı bacaklar olduğunu görebiliriz. Üstten baktığımızda en soldaki pin TOPRAK, en sağdaki pin +VCC, ortadaki pin de DATA çıkışıdır.Hareket varken DATA çıkışı '1', yokken '0' olmaktadır.
PIR sensörleri bir mikrodenetleyiciye bağlı olmadan kendi başlarına çalışabilen elemanlardır. Bu sayede satın aldığımız PIR sensörünü önce kendimiz test edebiliriz. Sensörümüze verdiğimiz besleme ile DATA çıkışının ucuna bir LED bağlayarak çalışıp çalışmadığına bakabiliriz. Sensörün arkasında 2 adet trimer var ve bu test aşamasında trimerlerin değerlerini küçük bir tornavida ile değiştirerek istenilen hassasiyete ve DATA çıkışının istenilen zaman kadar '1' olmasını sağlayabiliriz. Uygulamamızın kodlarına bakacak olursak...
int pirPin = 3; // PIR pin int ledPin = 4; // LED pin int deger = 0;
void setup() { pinMode(pirPin, INPUT); // PIR Pin'i giriş yapılıyor pinMode(ledPin, OUTPUT); // LED Pin'i çıkış yapılıyor Serial.begin(9600); //Serial Porttan veri göndermek için baundrate ayarlanıyor. }
void loop(){ deger = digitalRead(pirPin); // Dijital pin okunuyor Serial.println(deger); // Okunan değer seri porttan okunuyor. if (deger == HIGH) { digitalWrite(ledPin, HIGH); } else{ digitalWrite(ledPin,LOW); // Eğer okunan değer 0 ise LED söndürülüyor. }
} Programımızı bu şekilde bırakırsak trimerlerin ayarlarına bağlı olarak çalışır sensörümüz. Bu haliyle bırakırsak Arduino kullanmamızın bir mantığı olmaz. O yüzden sizler "digitalWrite (ledPin,HIGH)" olan kısmın altına "delay(istenilen zaman)" kodunu ekleyerek hareket algılandıktan sonra ledin 1 olma süresini kendiniz ayarlayabilirsiniz. Bu da videomuz ;
Bu uygulamada yardımcı olan arkadaşım Aykut KELEŞ'e teşekkür ederim.
Kaynak olarak kullandığım ve daha detaylı bilgi edinmek isteyenler için bu sitelerin linkleri;
Darbe genişlik modülasyonu (PWM) ile ilgili uygulama gerçekleştirmiştik. Bu yazımda ise bu konuyu biraz daha aralayacağız ve bu modülasyon ile transistörün anahtarlama özelliğinden faydalanarak DC motor hızını kontrol edeceğiz. PWM'den bahsetmeden önce gerekli olan malzemelerden bahsetmek istiyorum.
2N2222 Transistör
1N4001 Diyot
5K ya da 10K Pot
DC Motor (9V'luk ya da daha küçük)
470 Ώ direnç
PWM NEDİR ? PWM en basit haliyle bir sinyal modülasyon tekniği olarak tanımlanabilir. Sinyal bilgisinin aktarım için uygun hale çevirilmesi amacının yanı sıra güçkontrolü sağlamak ve elektrik makineleri,güneş pili şarj üniteleri gibi özel devrelere destek olmak amacı da taşır.
Bu kontrol de tamamen anahtarlama ile sağlanır. Anahtarlama ne kadar hızlı yapılırsa, PWM ile aktarılan sinyalin gücü o kadar da artar. Örneğin bir lambaya gönderilen sinyalde PWM tekniğine ihtiyaç duyuluyorsa, bu teknik 120 Hz frekans değerinde uygulandığında maksimum verim elde edilebilir.
"Duty Cycle" yani görev döngüsü olarak tanımlanan bir kavram bulunuyor ve PWM tekniğinde de sıkça karşımıza çıkıyor. Görev döngüsü kavramı aslında yapılan işlemin periyodunu belirtiyor. Bu döngü düşük seviyelerde ise aktarılan güç düşük olurken, döngünün yüksek seviyelerinde yüksek güç aktarılıyor.
Basitçe soldaki Duty Cycle grafikleri ile PWM'i şu şekilde anlatabiliriz. 10 bitlik bir ADC ile analog değerimiz 0-255 arasında değer alır. Bu yeni dijital değer ile anahtar olarak kullanacağımız transistörün bazına bu sayısal değerler ile PWM uygularız. Sayı ne kadar büyük ise "Pulse Width" yani "Darbe Genişliği" o kadar büyük olur. Bir pervaneyi elimizle çevirdiğimizi düşünelim. Ne kadar çok çevirip az dinlenirsek pervanemiz o kadar çok dönecektir. Çevirim kısmını 1,dinlenme kısmını da 0 olarak düşünürsek 1'ler ne kadar çoksa pervane de o kadar çok hızlı dönecektir. İşte bu 1'ler transistörümüzün bazına uyguladığımız PWM sinyalinin Darbe Genişliği demek oluyor. DC MOTOR SÜRMEK
Edindiğimiz bilgiler ile DC Motor sürmek artık kolay. İhtiyacımız yüksek akım kapasiteli bir transistör, PWM üretecimiz ki biz bunu Arduino'muz ile yapacağız ve 1 motor ile diyot.
Soldaki devreyi Arduino'muz ile kuracağız.Transistörün 2N2222 veya muadili olmasına dikkat etmekte fayda var hakeza BC547 vs. gibi transistörler ile bu iş mümkün değil.Çünkü motoru döndüren güç akımdır ve yüksek akım geçiremeyen transistörler ile motor süremeyiz. Direnç olarak 1k Ώ da kullanabilirsiniz fakat ben 470 Ώ kullandım, bu konuda sıkıntı yok.
Çok kısa da olsa kullanacağımız transistörden de bahsetmek istiyorum. Tüm transistörlerin C,B,E bacakları standart değildir. O yüzden devreyi tamamlerken sağdaki resme bir göz atmanızda fayda görüyorum. Ben ilk seferde transistörü ters taktım ne yazık ki :D ve transistör o kadar çok ısındı ki elimi yaktım. O yüzden dikkat ! ARDUINO ile DEVRE BAĞLANTISI Arduino ile sadece motoru yavaşlatıp hızlandırmayacağız. Analog girişe taktığımız potansiyometre değerine göre motorumuzu süreceğiz ve bu işi en kısa yoldan yapmamızı sağlayan birkod da öğrenmiş olacağız,map. "map" komutu ile istediğimiz bir çıkış değerini, bağlı olan giriş değerine göre anında değiştirebiliriz.Örnek vermek gerekirse ki bu kodu motor sürme devremizde de kullandık; motordegeri = map(potdegeri, 0, 1023, 0, 255); Bu yukardaki kod ile "motordegeri" isimli değerimizi, potun durumuna bağlı kıldık ve okunan analog değeri 10 bit ile sayısal değere çevirdik ve bunu da çıkışa 8 bit olarak yansıttık. Bu sayede motorumuzun hızını potansiyometrenin değeri ile kontrol edebiliyoruz. Devreyi kurarken motoru harici bir pil ya da adaptör ile sürmenizde fayda var yoksa motoru arduino üzerinden süremezsiniz. Kodlarımız ; int potPin = A0; int motorPin = 3; int potDegeri = 0; int motorDegeri = 0; void setup() { Serial.begin(9600); } void loop() { potDegeri = analogRead(potPin); motorDegeri = map(potDegeri, 0, 1023, 0, 255); analogWrite(motorPin, motorDegeri); Serial.print("Potansiyometre = " ); Serial.print(potDegeri); Serial.print("\t motor = "); Serial.println(motorDegeri); delay(2);
} Devreyi çalıştıtırken Seri Haberleşme Monitörüne bakmayı da ihmal etmeyin :). Bu da devremizin son halinin resmi ve videosu.
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.