PIR Sensörü Nasıl Çalışır ve Arduino ile Nasıl Kullanılır ?
Bu Arduino Eğitiminde, bir PIR Sensörünün nasıl çalıştığını ve hareketi algılamak için Arduino Board ile nasıl kullanılacağını öğreneceğiz.
Nasıl çalışır
Öncelikle çalışma prensibini açıklayalım. Modül aslında ısıya maruz kaldığında enerji üreten bir Pyroelektrik sensörden oluşur.
Bu, bir insan veya hayvan vücudu sensörün menziline girdiğinde, bir hareketi algılayacağı anlamına gelir çünkü insan veya hayvan vücudu, kızılötesi radyasyon şeklinde ısı enerjisi yayar. Sensörün adının geldiği yer, Pasif Kızılötesi sensördür. Ve "pasif" terimi, sensörün algılama amacıyla herhangi bir enerji kullanmadığı, sadece diğer nesnelerin verdiği enerjiyi algılayarak çalıştığı anlamına gelir.
Modül ayrıca kızılötesi sinyalleri piroelektrik sensöre odaklayan, Fresnel lens adı verilen özel olarak tasarlanmış bir kapaktan oluşur.
HC-SR501 PIR Sensör Modülü
Modülün sadece üç pimi, modüle güç sağlamak için bir Toprak ve bir VCC ve bir nesne algılandığında yüksek mantık seviyesi sağlayan bir çıkış pimi vardır. Ayrıca iki potansiyometreye sahiptir. Biri sensörün hassasiyetini ayarlamak için, diğeri ise nesne algılandığında çıkış sinyalinin yüksek kaldığı süreyi ayarlamak için. Bu süre 0,3 saniyeden 5 dakikaya kadar ayarlanabilir.
Modül, ikisi arasında bir jumper bulunan üç pime daha sahiptir. Bu pimler tetikleme modlarını seçmek içindir. İlki “tekrarlanamayan tetik” olarak adlandırılır ve şu şekilde çalışır: sensör çıkışı yüksek olduğunda ve gecikme süresi bittiğinde, çıkış otomatik olarak yüksekten alçak seviyeye değişecektir. "Tekrarlanabilir tetikleme" olarak adlandırılan diğer mod, algılanan nesne sensörün menzilinde bulunana kadar çıkışı her zaman yüksek tutacaktır.
Devre Şeması
Bu eğitici yazıya örnek olarak, sensör bir nesneyi algıladığında yüksek voltajlı bir lambayı açacak bir devre yapacağım. İşte devre şemaları. Sensörün çıkış pini Arduino Board üzerindeki 8 numaralı pime bağlanacak ve bir nesne tespit edildiğinde 7 numaralı pin röle modülünü aktif hale getirecek ve yüksek gerilim lambası yanacaktır.
/* Arduini PIR Motion Sensor Tutorial
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
int pirSensor = 8;
int relayInput = 7;
voidsetup(){
pinMode(pirSensor, INPUT);
pinMode(relayInput, OUTPUT);
}
voidloop(){
int sensorValue = digitalRead(pirSensor);
if(sensorValue == 1){
digitalWrite(relayInput, LOW); // The Relay Input works Inversly
}
}
Örneğin gösterimi, yukarıda ekli videonun sonunda görülebilir. Sensör modülünü çalıştırdıktan sonra, düzgün çalışması için “ısınması” için yaklaşık 20 - 60 saniye gerektiğine dikkat edin. Şimdi elinizi sensörün önüne koyduğunuzda röle lambayı etkinleştirecektir. Ancak, elinizi sürekli hareket ettirseniz bile, PIR sensörü “tekrarlanamayan tetikleme” modunda olduğundan ayarlanan gecikme süresi bittikten sonra lambanın söneceğini unutmayın. Sensörü atlama teli ile "tekrarlanabilir tetik" moduna değiştirirseniz ve elinizi sürekli hareket ettirirseniz, lamba da sürekli yanar ve hareket bittikten ve ayarlanan gecikme süresi sona erdikten sonra söner.
APDS9960 Yakınlık, Hareket ve Ortam Işığı Sensörü ve Arduino
APDS9960, altı farklı hareketi algılayan, yakınlığı algılayan, ortam ışığını algılayan ve Kırmızı, Yeşil, Mavi veya Şeffaf Renklerin varlığı hakkında bilgi veren bir sensördür. Yerleşik bir UV, IR engelleme filtreleri, I2C uyumlu bir arayüz ve dört ayrı fotodiyottan oluşur. Ayrıca, bir nesneden yansıyan IR ışık dalgalarını algılayarak hareketleri algılar ve bir nesnenin mesafesi, hızı ve yönü hakkındaki bu bilgileri dijital bir değere dönüştürür. Aynı yansıyan IR ışınları, cihaz ile kullanıcı arasındaki mesafeyi ölçer. ALS özelliği kırmızı, yeşil ve mavi ışık içeriğini ölçer. Bu makale, APDS9960'ın çalışması, kullanımı ve uygulamaları hakkında ayrıntılı olarak açıklamaktadır.
APDS9960 Pinout Diyagramı
Bu çok amaçlı APDS9960 sensör koparma kartı 6 pimden oluşur. Pim yapılandırma ayrıntıları bir sonraki bölümde verilmiştir.
Pin Açıklaması
Bu bölüm, APDS9960'ın her piminin ayrıntılarını ve çalışmasını içerir.
Pin1 ve pin7, I2C arayüzü . SDA, bir seri veri adres terminalidir ve Seri saat terminali, bu verilerin iletimi için saat darbesi sağlar.
Pin2, aktif bir düşük kesinti pinidir.
LDR, APDS9960 yakınlık LED'i için bir LED sürücü giriş pinidir. LED sürücüleri için bu pime sabit bir güç kaynağı bağlayın.
LEDK, LED'in katot pinidir. Led sürücünün dahili bir devresini kullanıyorsanız bu pimi LDR'ye bağlayın.
LEDA, LED'in anot pinidir.
Pin6 ve 8, güç kaynağı pinleridir. Pim 6'yı toprağa bağlayın. Pin 8'de 2,4V ila 3,6V aralığında voltaj beslemesi uygulayın.
APDS9960 breakout Özellikler
Hareket algılama, ortam ışığı ve RGB Renk Algılama ve yakınlık algılama özellikleri sağlayan çok işlevli bir sensördür. En önemlisi, UV ve IR engelleme filtreleri ile ortam ışığını ve kırmızı, yeşil, mavi renkleri algılar ve kazancı 1x ile 64x arasında ayarlanabilir.
Yakınlık algılama, kalibrasyon için ekstra bileşenlere ihtiyaç duymadığınız için kırpılmış IR yoğunluğu sağlar. Yakınlık algılama sistemi, ofset telafisi sağlayan ayar dirençleri, doğru ve iyileştirilmiş sonuçlar veren bir ortam ışığı reddi ve bir doygunluk gösterge biti içerir.
Hareket algılama devresi, 32 veri kümesi depolama FIFO, Kesintiye dayalı I2C iletişimi ve IR LED'e akım sağlayan programlanabilir bir sürücü içerir. 400kHz'e kadar veri hızları sağlayan hızlı mod 7-bit I2C uyumlu bir arayüze sahiptir.
LED için gereken maksimum voltaj kaynağı 4,5V'dur.
Gerilim besleme aralığı = 2,4 - 3,6V.
Sıcaklık aralığı = -40 ° C ila 85 ° C
APDS9960 nerede kullanılır?
APDS9960, tek bir modül aracılığıyla renk algılamayı, yakınlık ölçümünü ve hareket algılamayı destekleyen çok işlevli bir sensördür. Sol, sağ, yukarı, aşağı, uzak ve yakın olmak üzere altı adede kadar hareketi algılayabilir. Algılama aralığı yaklaşık 4 ila 8 inçtir.
Koyu cam arkasındaki işlemler için çok uygun hale getiren çok yüksek bir hassasiyete sahiptir. Çeşitli işlevleri gerçekleştirmek için bu sensörü Arduino, mikrodenetleyiciler vb. İle arayüzleyebilirsiniz. Bu sensörü, robotları ve diğer cihazları kontrol etmek için uzaktan kumandalarda kullanabilirsiniz.
APDS9960 ve Arduino
Donanım basit ve kullanımı kolaydır. Sensörün APDS9960 koparma kartı, yerleşik bir voltaj regülatörünün varlığı nedeniyle 3,3V ile çalışır.
APDS9960, farklı yönlere duyarlı dört fotodiyottan oluşur. Algılama aralığı içindeki bir nesne herhangi bir hareket gerçekleştirdiğinde, nesne LED tarafından iletilen IR sinyalini geri yansıtır. Fotodiyotlar bu sinyali algılar ve bir nesnenin hızı ve mesafesi ile ilgili bilgileri bu şekilde elde eder.
Bu bilgiyi kullanarak sensör, hareketin türünü algılar. Sensör, IR ve UV engelleme filtreleri ve bir veri dönüştürücü aracılığıyla açık kırmızı, mavi, yeşil ve net renkleri algılayan farklı kanallara sahiptir. Yapılandırılabilir kesinti, algılama işlevini kontrol eder ve kızılötesi ışığı serbest bırakması veya algılaması için sensörü tetikler.
Bu devre şeması, APDS9960'ın Arduino Nano ile Arabirimini gösterir.
APDS9960 sensörü ile Arduino için Program yazmak için, neyse ki, bu koparma kartının kütüphanesi mevcuttur. Öncelikle bu bağlantıya gidin ve Arduino kütüphanesini indirin:
Bundan sonra APDS9960'ın Arduin ile bağlantısını aşağıdaki tabloya göre yapın:
Arduino Pimi
APDS-9960 Kartı
Fonksiyon
3.3V
VCC
Güç
GND
GND
Zemin
A4
SDA
I2C Verileri
A5
SCL
I2C Saati
2
INT
Kesmek
Bu Arduino kitaplığı, ışık, renk, hareket algılama ve yakınlık sensörü çıkışını ölçmek için örnek kodlar sağlar.
Arduino Ortam Işık Kodu
#include<Wire.h>#include<SparkFun_APDS9960.h>// Pins#defineAPDS9960_INT2// Needs to be an interrupt pin#defineLED_PIN13// LED for showing interrupt// Constants#defineLIGHT_INT_HIGH1000// High light level for interrupt#defineLIGHT_INT_LOW10// Low light level for interrupt// Global variables
SparkFun_APDS9960 apds =SparkFun_APDS9960();uint16_t ambient_light =0;uint16_t red_light =0;uint16_t green_light =0;uint16_t blue_light =0;int isr_flag =0;uint16_t threshold =0;voidsetup(){// Set LED as outputpinMode(LED_PIN, OUTPUT);pinMode(APDS9960_INT, INPUT);// Initialize Serial port
Serial.begin(9600);
Serial.println();
Serial.println(F("-------------------------------------"));
Serial.println(F("SparkFun APDS-9960 - Light Interrupts"));
Serial.println(F("-------------------------------------"));// Initialize interrupt service routineattachInterrupt(0, interruptRoutine, FALLING);// Initialize APDS-9960 (configure I2C and initial values)if( apds.init()){
Serial.println(F("APDS-9960 initialization complete"));}else{
Serial.println(F("Something went wrong during APDS-9960 init!"));}// Set high and low interrupt thresholdsif(!apds.setLightIntLowThreshold(LIGHT_INT_LOW)){
Serial.println(F("Error writing low threshold"));}if(!apds.setLightIntHighThreshold(LIGHT_INT_HIGH)){
Serial.println(F("Error writing high threshold"));}// Start running the APDS-9960 light sensor (no interrupts)if( apds.enableLightSensor(false)){
Serial.println(F("Light sensor is now running"));}else{
Serial.println(F("Something went wrong during light sensor init!"));}// Read high and low interrupt thresholdsif(!apds.getLightIntLowThreshold(threshold)){
Serial.println(F("Error reading low threshold"));}else{
Serial.print(F("Low Threshold: "));
Serial.println(threshold);}if(!apds.getLightIntHighThreshold(threshold)){
Serial.println(F("Error reading high threshold"));}else{
Serial.print(F("High Threshold: "));
Serial.println(threshold);}// Enable interruptsif(!apds.setAmbientLightIntEnable(1)){
Serial.println(F("Error enabling interrupts"));}// Wait for initialization and calibration to finishdelay(500);}voidloop(){// If interrupt occurs, print out the light levelsif( isr_flag ==1){// Read the light levels (ambient, red, green, blue) and printif(!apds.readAmbientLight(ambient_light)||!apds.readRedLight(red_light)||!apds.readGreenLight(green_light)||!apds.readBlueLight(blue_light)){
Serial.println("Error reading light values");}else{
Serial.print("Interrupt! Ambient: ");
Serial.print(ambient_light);
Serial.print(" R: ");
Serial.print(red_light);
Serial.print(" G: ");
Serial.print(green_light);
Serial.print(" B: ");
Serial.println(blue_light);}// Turn on LED for a half a seconddigitalWrite(LED_PIN, HIGH);delay(500);digitalWrite(LED_PIN, LOW);// Reset flag and clear APDS-9960 interrupt (IMPORTANT!)
isr_flag =0;if(!apds.clearAmbientLightInt()){
Serial.println("Error clearing interrupt");}}}voidinterruptRoutine(){
isr_flag =1;}
Arduino Renk Algılama Kodu
#include<Wire.h>#include<SparkFun_APDS9960.h>// Global Variables
SparkFun_APDS9960 apds =SparkFun_APDS9960();uint16_t ambient_light =0;uint16_t red_light =0;uint16_t green_light =0;uint16_t blue_light =0;voidsetup(){// Initialize Serial port
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - ColorSensor"));
Serial.println(F("--------------------------------"));// Initialize APDS-9960 (configure I2C and initial values)if( apds.init()){
Serial.println(F("APDS-9960 initialization complete"));}else{
Serial.println(F("Something went wrong during APDS-9960 init!"));}// Start running the APDS-9960 light sensor (no interrupts)if( apds.enableLightSensor(false)){
Serial.println(F("Light sensor is now running"));}else{
Serial.println(F("Something went wrong during light sensor init!"));}// Wait for initialization and calibration to finishdelay(500);}voidloop(){// Read the light levels (ambient, red, green, blue)if(!apds.readAmbientLight(ambient_light)||!apds.readRedLight(red_light)||!apds.readGreenLight(green_light)||!apds.readBlueLight(blue_light)){
Serial.println("Error reading light values");}else{
Serial.print("Ambient: ");
Serial.print(ambient_light);
Serial.print(" Red: ");
Serial.print(red_light);
Serial.print(" Green: ");
Serial.print(green_light);
Serial.print(" Blue: ");
Serial.println(blue_light);}// Wait 1 second before next readingdelay(1000);}
APDS9960 Hareket Algılama Krokisi
#include<Wire.h>#include<SparkFun_APDS9960.h>// Pins#defineAPDS9960_INT2// Needs to be an interrupt pin// Constants// Global Variables
SparkFun_APDS9960 apds =SparkFun_APDS9960();int isr_flag =0;voidsetup(){// Set interrupt pin as inputpinMode(APDS9960_INT, INPUT);// Initialize Serial port
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));// Initialize interrupt service routineattachInterrupt(0, interruptRoutine, FALLING);// Initialize APDS-9960 (configure I2C and initial values)if( apds.init()){
Serial.println(F("APDS-9960 initialization complete"));}else{
Serial.println(F("Something went wrong during APDS-9960 init!"));}// Start running the APDS-9960 gesture sensor engineif( apds.enableGestureSensor(true)){
Serial.println(F("Gesture sensor is now running"));}else{
Serial.println(F("Something went wrong during gesture sensor init!"));}}voidloop(){if( isr_flag ==1){detachInterrupt(0);handleGesture();
isr_flag =0;attachInterrupt(0, interruptRoutine, FALLING);}}voidinterruptRoutine(){
isr_flag =1;}voidhandleGesture(){if( apds.isGestureAvailable()){switch( apds.readGesture()){case DIR_UP:
Serial.println("UP");break;case DIR_DOWN:
Serial.println("DOWN");break;case DIR_LEFT:
Serial.println("LEFT");break;case DIR_RIGHT:
Serial.println("RIGHT");break;case DIR_NEAR:
Serial.println("NEAR");break;case DIR_FAR:
Serial.println("FAR");break;default:
Serial.println("NONE");}}}
Yakınlık Kesintisi Çizimi
#include<Wire.h>#include<SparkFun_APDS9960.h>// Pins#defineAPDS9960_INT2// Needs to be an interrupt pin#defineLED_PIN13// LED for showing interrupt// Constants#definePROX_INT_HIGH50// Proximity level for interrupt#definePROX_INT_LOW0// No far interrupt// Global variables
SparkFun_APDS9960 apds =SparkFun_APDS9960();uint8_t proximity_data =0;int isr_flag =0;voidsetup(){// Set LED as outputpinMode(LED_PIN, OUTPUT);pinMode(APDS9960_INT, INPUT);// Initialize Serial port
Serial.begin(9600);
Serial.println();
Serial.println(F("---------------------------------------"));
Serial.println(F("SparkFun APDS-9960 - ProximityInterrupt"));
Serial.println(F("---------------------------------------"));// Initialize interrupt service routineattachInterrupt(0, interruptRoutine, FALLING);// Initialize APDS-9960 (configure I2C and initial values)if( apds.init()){
Serial.println(F("APDS-9960 initialization complete"));}else{
Serial.println(F("Something went wrong during APDS-9960 init!"));}// Adjust the Proximity sensor gainif(!apds.setProximityGain(PGAIN_2X)){
Serial.println(F("Something went wrong trying to set PGAIN"));}// Set proximity interrupt thresholdsif(!apds.setProximityIntLowThreshold(PROX_INT_LOW)){
Serial.println(F("Error writing low threshold"));}if(!apds.setProximityIntHighThreshold(PROX_INT_HIGH)){
Serial.println(F("Error writing high threshold"));}// Start running the APDS-9960 proximity sensor (interrupts)if( apds.enableProximitySensor(true)){
Serial.println(F("Proximity sensor is now running"));}else{
Serial.println(F("Something went wrong during sensor init!"));}}voidloop(){// If interrupt occurs, print out the proximity levelif( isr_flag ==1){// Read proximity level and print it outif(!apds.readProximity(proximity_data)){
Serial.println("Error reading proximity value");}else{
Serial.print("Proximity detected! Level: ");
Serial.println(proximity_data);}// Turn on LED for a half a seconddigitalWrite(LED_PIN, HIGH);delay(500);digitalWrite(LED_PIN, LOW);// Reset flag and clear APDS-9960 interrupt (IMPORTANT!)
isr_flag =0;if(!apds.clearProximityInt()){
Serial.println("Error clearing interrupt");}}}voidinterruptRoutine(){
isr_flag =1;}
APDS9960 Uygulamaları
Akıllı telefonlar, TV, Cep telefonlarının Dokunmatik Ekranları vb.
Renk sıcaklığının ölçülmesi
Cihazlarda, LCD ekranlarda ve RGB monitörlerde arka ışık ayarı
Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.