Robotik Kodlama

Robotik Kodlama
Ana Sayfa

İLGİNİZİ ÇEKEBİLECEK LİNKLER :

28 Nisan 2021 Çarşamba

APDS9960 Yakınlık, Hareket ve Ortam Işığı Sensörü ve Arduino

 

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 Yakınlık, Hareket ve Ortam Işığı Sensö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.

APDS9960 Yakınlık, Hareket ve Ortam Işığı Sensörü Pin Çıkışı

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 Yakınlık, Hareket ve Ortam Işığı Sensörü Arduino ile Arayüz

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 PimiAPDS-9960 KartıFonksiyon
3.3VVCCGüç
GNDGNDZemin
A4SDAI2C Verileri
A5SCLI2C Saati
2INTKesmek

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
#define APDS9960_INT    2  // Needs to be an interrupt pin
#define LED_PIN         13 // LED for showing interrupt

// Constants
#define LIGHT_INT_HIGH  1000 // High light level for interrupt
#define LIGHT_INT_LOW   10   // 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;

void setup() {
  
  // Set LED as output
  pinMode(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 routine
  attachInterrupt(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 thresholds
  if ( !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 thresholds
  if ( !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 interrupts
  if ( !apds.setAmbientLightIntEnable(1) ) {
    Serial.println(F("Error enabling interrupts"));
  }
  
  // Wait for initialization and calibration to finish
  delay(500);
}

void loop() {
  
  // If interrupt occurs, print out the light levels
  if ( isr_flag == 1 ) {
    
    // Read the light levels (ambient, red, green, blue) and print
    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("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 second
    digitalWrite(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");
    }
    
  }
}

void interruptRoutine() {
  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;

void setup() {
  
  // 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 finish
  delay(500);
}

void loop() {
  
  // 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 reading
  delay(1000);
}

APDS9960 Hareket Algılama Krokisi

#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Pins
#define APDS9960_INT    2 // Needs to be an interrupt pin

// Constants

// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {

  // Set interrupt pin as input
  pinMode(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 routine
  attachInterrupt(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 engine
  if ( apds.enableGestureSensor(true) ) {
    Serial.println(F("Gesture sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during gesture sensor init!"));
  }
}

void loop() {
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
    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
#define APDS9960_INT    2  // Needs to be an interrupt pin
#define LED_PIN         13 // LED for showing interrupt

// Constants
#define PROX_INT_HIGH   50 // Proximity level for interrupt
#define PROX_INT_LOW    0  // No far interrupt

// Global variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
uint8_t proximity_data = 0;
int isr_flag = 0;

void setup() {
  
  // Set LED as output
  pinMode(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 routine
  attachInterrupt(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 gain
  if ( !apds.setProximityGain(PGAIN_2X) ) {
    Serial.println(F("Something went wrong trying to set PGAIN"));
  }
  
  // Set proximity interrupt thresholds
  if ( !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!"));
  }
}

void loop() {
  
  // If interrupt occurs, print out the proximity level
  if ( isr_flag == 1 ) {
  
    // Read proximity level and print it out
    if ( !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 second
    digitalWrite(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");
    }
    
  }
}

void interruptRoutine() {
  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ı
  • Robotik
  • Tıbbi malzeme

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


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.

İki Arduino Kartı Arasında Seri / UART İletişimi

İki Arduino Kartı Arasında Seri / UART İletişimi

Bu eğitimde, Arduino IDE'nin UART yazılım kitaplığını kullanarak iki Arduino kartı arasında UART veya seri iletişim gerçekleştireceğiz Arduino'yu bir USB bağlantı noktası kullanarak hata ayıklamak ve programlamak için Evrensel Asenkron Alıcı / Verici ( UART ) İletişimi olarak bilinen seri bağlantı noktası kullanılır. Çoğu sensör ve sistem için ana iletişim yöntemi UART olarak kabul edilir. İş yükü, bilgi paylaşımı ve farklı görevleri gerçekleştirmek için; bazen Arduino ile iletişim gereklidir.

Yazılım Seri kullanarak iki Arduino kartı arasında iletişim

Arduino IDE'de bulunan bir seri yazılım kitaplığı kullanacağız. Ancak Arduino Uno'nun D0 ve D1 pinlerinde bulunan bir UART portu varken neden Arduino'nun yazılım UART kütüphanesini kullanmak istediğimizi sorduğumuz sorular. Arduino'nun yalnızca bir UART portu olduğundan ve bazen gömülü projelerde, GSM , GPS, Bluetooth , Xbee , vb. Gibi farklı sensör ve modülleri arayüzlemek için birden fazla UART iletişim portuna ihtiyacımız var 

Arduino Seri UART Pinleri

Uart yazılım kitaplığını kullanmanın diğer önemli nedeni, Arduino'nun UART portunun yerleşik USB bağlantısı tarafından kullanılmasıdır. Bu USB bağlantısı, verileri Rx ve Tx pinlerini kullanarak Arduino IDE seri monitöre aktarır. 

Arduino Mega'nın dörde kadar seri iletişim portu olmasına rağmen. Ancak, maksimum Ardiuno uyumlu kartların birden fazla seri bağlantı noktası yoktur. Bu durumda, Arduino'nun diğer dijital giriş çıkış pinlerinde UART iletişim davranışını simüle etmek için özel olarak uygulanan bir yazılım kitaplığı kullanılır. Seri UART iletişimini simüle etmek çok kolaydır, ancak herhangi bir özel donanıma sahip olmadığı ve önceden verilen Arduino Board'un bellek ve yürütme süresi gibi kaynaklarını kullanacağı unutulmamalıdır. Bununla birlikte, genellikle donanım seri bağlantı noktalarında bulunan tüm işlevler, yazılım seri bağlantı noktaları kullanılarak simüle edilebilir ve kullanılabilir. 

Arduino Yazılımı Seri Kitaplığı

Arduino IDE, diğer dijital giriş-çıkış pinlerini kullanarak seri iletişim gerçekleştirmeyi sağlayan yerleşik bir yazılım seri kitaplığına sahiptir. SoftwareSerial kitaplığını kullanarak, UART arayüzü üzerinden birden fazla cihaz veya sensörle iletişim kurabiliriz. 

Bu kitaplığı kullanmak için, önce bu satırı kullanarak yazılım seri kitaplığının başlık dosyasını ekleyin:

#include <SoftwareSerial.h>

Bundan sonra, kendi seçtiğiniz bir adla yazılım seri kitaplığının bir anını veya nesnesini oluşturun. Örneğin, bu satır UART0 adında bir nesne oluşturur. Argüman olarak seri iletişim için kullanmak istediğimiz dijital pinlerin ismini veriyoruz. İlk argüman bir alıcı pimi (RX) ve ikinci argüman bir iletim pimidir (TX). Bu nedenle, bu çizgi pin2'yi bir Rx pini ve pin3'ü UART0 için bir Tx pini olarak ayarlar. 

SoftwareSerial UART0(2, 3); // RX, TX

Seri Pimlerle İki Arduino Kartı Arasında Bağlantı Şeması

Aşağıdaki şekil, önceden oluşturulmuş bir kitaplık kullanarak bir UART iletişim bağlantı noktasını simüle etmek için dijital pinler kullanan iki Arduino kartı arasındaki bir bağlantı şemasını göstermektedir.

Seri iletişim için iki Arduio kartı arasındaki bağlantı şeması

Her iki Arduino kartı için Tx ve Rx olarak dijital pin 11 ve pin 10 kullandığımızı düşünün. 

  • İlk Arduino kartının sanal pin Tx'ini ikinci Arduino kartının Rx pinine bağlayın.
  • İlk Arduino kartının sanal pin Rx'ini ikinci Arduino kartının pin Tx'ine bağlayın.
  • Arduino 1'in sanal Tx pini, alıcı Arduino 2'nin gerçek tamponuna veri iletir ve bu veriler, "Received Data" adlı sanal terminalde gösterilen alıcı Arduino 2'nin sanal Tx pinine yazılır. 
  •  Verici ve alıcı Arduino'nun durumunu izlemek için sanal terminaller kullanılmıştır.
  • Her iki Arduino kartının GND pinini birbirine bağlayın (gerçek Arduino Kartları kullanıyorsanız)
  • Her iki Arduino'nun USB portu kullanılarak çalıştırılmaması durumunda, her iki Arduino'nun 5V pinlerini bağlamak ve USB portu ile bir Arduino'yu çalıştırmak gerekir. (gerçek Arduino Kartları kullanılıyorsa)

Seri İletişim Kodu

Bilgisayar Master Arduino'ya komutlar gönderir, master kodda tanımlandığı gibi soft seri pinler üzerine yazılır ve resim 1'de yapılan donanım bağlantıları ile ikinci Arduino'ya gider ve Slave Arduino ile haberleşir.

Master Arduino için Kod


#include <SoftwareSerial.h>
SoftwareSerial softSerial(10, 11);

void setup()  
{
  softSerial.begin(9600);
} 
void loop()  
{ 
  softSerial.write("UART Communication");
  delay (100);
}

Code for Master Arduino açıklaması

Şimdi yukarıdaki kodun nasıl çalıştığını görelim.

 İlk olarak, #include dosyalarını kullanarak yazılım seri kitaplığını içerir. Bu satır, SoftwareSerial.h kitaplığını içerir.

#include <SoftwareSerial.h>

Burada "softSerial" olarak adlandırılan bir seri nesne bildirilmiştir. Pin 10 Rx pin olarak kullanılacak ve pin 11 Tx pin olacaktır. Bu "softSerial" nesnesini kullanarak, normal bir seri bağlantının tüm fonksiyonları okuma, yazma vb. Kullanılabilir. 

SoftwareSerial softSerial (10, 11);

Burada, yukarıda tanımlanan softSerial nesnesi için 9600 baud hızı ayarlanmaktadır. Burada dikkat edilmesi gereken önemli bir nokta, master ve slave gibi her iki Arduino kartının da baud hızının aynı olması gerektiğidir. 

softSerial.begin (9600);   

Burada “UART İletişimi” ifadesi, diğer Arduino'ya iletmek için Arduino 1'in Tx pimi 11 üzerine 0.1 saniye gecikme ile tekrar tekrar yazılıyor.

softSerial.write("UART Communication");

Şimdi 100ms'lik bir gecikme ekleyin ve bu Arduino master her 100ms sonra gönderme pinine bir “UART İletişimi” dizisi göndermeye devam edecektir. 

delay(100);

Slave Arduino için Kod

#include <SoftwareSerial.h>
SoftwareSerial softSerial(10, 11);
char ip;
void setup()  
{
  softSerial.begin(9600);
} 
void loop()  
{ 
  if (softSerial.available())
  {
    ip=softSerial.read();
    softSerial.print(ip);
  }
}

Code for Slave Arduino açıklaması

  Bu satır, SoftwareSerial.h kitaplığını içerir.

#include <SoftwareSerial.h>

SoftwareSerial softSerial () burada açıklanan "softSerial" adlı bir seri nesne oluşturur. Pin 10 Rx pin olarak kullanılacak ve pin 11 Tx pin olacaktır. Bu "softSerial" nesnesini kullanarak, normal bir seri bağlantının tüm fonksiyonları okuma, yazma vb. Kullanılabilir.

SoftwareSerial softSerial (10, 11);

 Bundan sonra, bu hat, yumuşak seri ve seri iletişim için baud'u 9600'e ayarlar.

softSerial.begin(9600);

Daha sonra arabellekte verilerin varlığı kontrol edilir. bazı veriler mevcutsa, “ip” değişkeninde saklanır ve ardından Arduino'nun 11. pini olan yazılımsal iletim pinine yazılır.

ip=softSerial.read();
softSerial.print(ip);

Proteus Simülasyonu

Yukarıdaki şekil, bu iletişimi simüle etmek için devre şemasını göstermektedir.

Aşağıdaki şekil Ana cihaz tarafından Arduino 1'in Tx pimi 11 üzerinden gönderilen verileri göstermektedir.

Seri iletişim proteus simülasyonu için iki Arduio kartı arasındaki bağlantı şeması

Aşağıdaki şekil Ana cihaz tarafından gönderilen verileri ve Arduino 2'nin 11. pininde Slave cihazı tarafından alınan verileri göstermektedir.

Seri iletişim proteus simülasyon çıkışı için iki Arduio kartı arasındaki bağlantı şeması

Böylece veriler, Arduino'nun seri iletişim ve yumuşak seri kitaplığı kullanılarak başarıyla iletiliyor.

Simüle edilmiş seri iletişim gerçekleştirilirken en önemli üç nokta akılda tutulmalıdır.

  • Bir Arduino kartının Tx pini diğer Arduino kartının Rx'ine bağlanmalıdır. Zıt bağlantılar yapılırsa Arduino kartı zarar görebilir.
  • Her iki Arduino kartı, sup ile aynı toprak bağlantısını paylaşmalıdır.
  • Ayrıca, her iki Arduino kartı aynı hızda çalışmalıdır, bu da her iki kartın baud hızının aynı olması gerektiği anlamına gelir.

Yazılım Seri Kitaplığının Sınırlamaları

Yazılım seri iletişimi kullanılırken, gerekli verilerin başarıyla iletilmesi ve alınması için aşağıdaki sınırlamalar akılda tutulmalıdır.

Arduino Board üzerindeki her pin bir Tx ve Rx pin olarak kullanılamaz. Tx için genel olarak mevcut dijital pinlerden herhangi biri kullanılabilir, ancak Rx için sadece interrupt etkinleştirilmiş pinler kullanılabilir.

  •  Arduino Micro ve Leonardo için pin 8, 9, 10, 11, 14, 15, 16 Tx ve Rx olarak kullanılabilir.
  • Arduino Mega pinleri için ise 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69 TX ve Rx olarak kullanılabilir.

Simüle edilmiş yazılım seri iletişimi, aynı donanımın kaynaklarını kullanır. Diğer bazı kütüphaneler tarafından kullanılan aynı zamanlayıcıyı kullanır. Bu nedenle, simüle edilmiş seri bağlantı noktası kullanılırsa diğer bazı işlevler etkilenebilir. Bilinen en iyi engel Servo Kitaplığı'dır.

Bu kitaplığı kullanarak, birden fazla yazılım simülasyonlu seri bağlantı noktasına sahip olabiliriz. Ancak bu durumda bir seferde yalnızca bir bağlantı noktası veri alabilir. Bu, veri kaybına neden olabilir. Ancak, bu sorunu çözen başka bir yazılım seri kitaplığı mevcuttur.

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


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.