Bu yazıda HC-SR04 ultrasonik sensörün nasıl çalıştığını ve Arduino ile nasıl kullanılacağına değineceğiz. Bu sensör, Arduino ile mesafeyi ölçmek ve engellerden kaçınan robotlar yapmak için en popüler sensördür.

HC-SR04 Donanıma Genel Bakış

HC-SR04, 2 cm ila 400 cm (yaklaşık bir inç ila 13 fit) aralığına sahip, uygun fiyatlı ve kullanımı kolay bir mesafe ölçüm sensörüdür.

Sensör, iki ultrasonik dönüştürücüden oluşur. Biri ultrasonik ses darbeleri veren verici, diğeri ise yansıyan dalgaları dinleyen alıcıdır. Temel olarak denizaltılarda su altı nesnelerini tespit etmek için kullanılan bir SONAR'dır.


İşte ana özellikleri:

Operating Voltage5V DC
Operating Current15mA
Operating Frequency40KHz
Min Range2cm / 1 inch
Max Range400cm / 13 feet
Accuracy3mm
Measuring Angle<15°
Dimension45 x 20 x 15mm

HC-SR04 Ultrasonik Sensör Pinleri

İşte sensörün pin çıkışı:



Sensörün 4 pini vardır. VCC ve GND, Arduino'daki 5V ve GND pinlerine, Trig ve Echo ise herhangi bir dijital Arduino pinine gider. Trig pinini kullanarak vericiden ultrason dalgasını göndeririz ve Echo pini ile yansıyan sinyali dinleriz.

HC-SR04 Ultrasonik Sensör Arduino Kodu

İşte HC-SR04 ultrasonik sensör ve Arduino kullanarak mesafeyi ölçmek için bir kod.

// defines pins numbers const int trigPin = 9; const int echoPin = 10; // defines variables long duration; int distance; void setup() { pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input Serial.begin(9600); // Starts the serial communication } void loop() { // Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH); // Calculating the distance distance = duration * 0.034 / 2 ;
// Prints the distance on the Serial Monitor Serial.print("Distance: "); Serial.println(distance); }

Kod Açıklama

Öncelikle Trig ve Echo pinlerini tanımlamamız gerekiyor. Bu durumda Arduino Board üzerindeki 9 ve 10 numaralı pinlerdir ve trigPin ve echoPin olarak adlandırılırlar. Ardından sensörden alacağımız seyahat süresi için “duration” adında bir long deÄŸiÅŸkenine ve mesafe için bir tamsayı deÄŸiÅŸkenine ihtiyacımız var.

// defines pins numbers const int trigPin = 9; const int echoPin = 10; // defines variables long duration; int distance;

Kurulumda trigPin'i çıkış olarak ve echoPin'i Giriş olarak tanımlamalı ve sonuçları seri monitörde göstermek için seri iletişimi başlatmalıyız.

void setup() { pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input Serial.begin(9600); // Starts the serial communication }

Döngüde ilk önce trigPin'in temiz olduğundan emin olmalıyız, bu nedenle bu pimi sadece 2 µs için LOW Duruma ayarlamanız gerekir. Şimdi Ultra ses dalgasını oluşturmak için trigPin'i 10 µs için HIGH Duruma ayarlamamız gerekiyor.

// Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW);

pulseIn() iÅŸlevini kullanarak seyahat süresini okuruz ve bu deÄŸeri “duration” deÄŸiÅŸkenine koyarız. Bu fonksiyonun 2 parametresi vardır, birincisi Echo pininin adı, ikincisi ise okuduÄŸumuz darbenin LOW veya HIGH durumudur.

// Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH);

Mesafeyi bulmak için süreyi 0.034 ile çarpacağız ve daha önce bu denklemi açıkladığımız gibi 2'ye böleceğiz.

// Calculating the distance distance= duration*0.034/2; // Prints the distance on the Serial Monitor Serial.print("Distance: "); Serial.println(distance);

Sonunda mesafenin değerini Seri Monitöre yazdıracağız.


Kaynak:
https://howtomechatronics.com/tutorials/arduino/ultrasonic-sensor-hc-sr04/
https://www.tutorialspoint.com/arduino/arduino_ultrasonic_sensor.htm#


Bu yazıda, programlama dillerinin en önemli veri yapıları olan arrays(diziler) inceleyeceğiz. C programlama dilinde dizi veri yapısının nasıl oluşturulduğunu ve nasıl kullanıldığına değineceğiz.

Adres Kavramı

Adres hem donanıma hem de yazılıma ilişkin bir kavramdır. Donanımsal olarak bellekte yer gösteren bir sayıdan ibarettir. Mikroişlemci bellekte bir bölgeye ancak o bölgenin adres bilgisiyle erişebilir. Oysa yazılımsal olarak adres, yalnızca bellek bölgesinin yerini gösteren bir sayıdan ibaret değildir; aynı zamanda o bellek bölgesinde bulunan bilginin nasıl ele alınacağını belirten bir tür bilgisini de içermektedir.

Bellekteki her byte diÄŸerinden farklı bir adresle temsil edilir. Sıfırdan baÅŸlayarak her byte’a artan sırada bir sayı karşılık getirerek elde edilen adresleme sistemine doÄŸrusal adresleme sistemi, bu sistem kullanılarak elde edilen adreslere de doÄŸrusal adresler (linear address) denilmektedir.

Diziler (Arrays)

Dizi, birden çok değer depolayabilen bir değişkendir. Örneğin 100 tane tamsayı saklamak istiyorsanız bunu dizilerle yapabilirsiniz. Yani bellekte sürekli bir biçimde bulunan aynı türden nesnelerin oluşturduğu kümeye dizi diyoruz. Tanımdan da anlaşılacağı gibi diziyi dizi yapan iki temel özellik vardır:

  •        Elemanlarının bellekte sürekli bir biçimde bulunması
  •        Elemanların aynı türden nesneler olması

Dizi bildirim işleminin genel biçimi aşağıdaki gibidir:

<Tür> <Dizi_İsmi>[<Eleman_Sayısı>]

Örnek dizi bildirimleri:

char s[30];
float real[10];
double max[100];

Dizilere değer eklemek için küme parantezleri içinde virgülle ayrılmış bir liste kullanılır:

int myNumbers[] = {25, 50, 75, 100};

Şimdi dört tamsayıdan oluşan bir dizi tanımladık.


Dizi Elemanlarına Erişim


Dizi elemanlarına erişebilmek için indeks operatörü kullanılır. İndeks operatörü aslında bir gösterici(pointer) operatörüdür.
Dizi indeksleri 0 ile başlar: [0] ilk elemandır, [1] ikinci elemandır vb.

Örnek:

#include <stdio.h>
int main() {
  int myNumbers[] = {25, 50, 75, 100};
  printf("%d", myNumbers[0]);
}

Çıktı:

25

Dizi Elemanının Değiştirilmesi

Belirli bir elemanın değerini değiştirmek için indeks numarasının bilmesi gerekiyor:

myNumbers[0] = 33;

bu şekilde 0. İndeksteki elemanın değeri 33 ile değiştirilir.

Örnek:

#include <stdio.h>
int main() {
  int myNumbers[] = {25, 50, 75, 100};
  myNumbers[0] = 33;
  printf("%d", myNumbers[0]);
}

Çıktı:

33

For döngüsü kullanılarak dizi elemanlarına ulaşılabilir.

#include <stdio.h>
int main() {
  int myNumbers[] = {25, 50, 75, 100};
  int i;
  for (i = 0; i < 4; i++) {
    printf("%d\n", myNumbers[i]);
  }
}

Çıktı:

25
50
75
100

Örnek:

#include <stdio.h>
int main() {
  int myNumbers[4];
  myNumbers[0] = 25;
  myNumbers[1] = 50;
  myNumbers[2] = 75;
  myNumbers[3] = 100;
  printf("%d\n", myNumbers[0]);
}

Çıktı:

25


Çok Boyutlu Diziler

C’de çok boyutlu diziler içsel olarak tek boyutlu dizi biçiminde saklanır. Çok boyutlu dizi bildirimlerinin genel biçimi aÅŸağıdaki gibidir:

<tür> [n1 ],[n2],[n3],…

Boyut uzunluklarını belirten n1,n2,n3,… sabit ifadeler olmak zorundadır. ÖrneÄŸin:

int x[10][20];

Burada x iki boyutlu int türünden bir dizidir. Boyut uzunlukları sırasıyla 10 ve 20’dir.

double n[5] [10] [15];

n üç boyutlu double türünde bir dizidir. Boyut uzunlukları sırasıyla 5,10,15’dir.
Burada x, iki boyutlu bir dizidir. Dizi 12 eleman tutabilir. Diziyi 3 satırlı ve her satırda
4 sütunlu bir tablo olarak düşünebilirsiniz.

float x [3][4];



Çok Boyutlu Bir Diziyi Başlatma

İki boyutlu ve üç boyutlu dizileri şu şekilde başlatabilirsiniz:

int c[2][3] = {{1, 3, 0}, {-1, 5, 9}};
        
int c[][3] = {{1, 3, 0}, {-1, 5, 9}};
               
int c[2][3] = {1, 3, 0, -1, 5, 9};
 
int test[2][3][4] = {
    {{3, 4, 2, 3}, {0, -3, 9, 11}, {23, 12, 23, 2}},
    {{13, 4, 56, 3}, {5, 9, 3, 5}, {3, 1, 4, 9}}};
 
Örnek: 

Değerleri saklamak ve yazdırmak için iki boyutlu dizi:

// C program to store temperature of two cities of a week and display it.
#include <stdio.h>
const int CITY = 2;
const int WEEK = 7;
int main()
{
  int temperature[CITY][WEEK];
 
  // Using nested loop to store values in a 2d array
  for (int i = 0; i < CITY; ++i)
  {
    for (int j = 0; j < WEEK; ++j)
    {
      printf("City %d, Day %d: ", i + 1, j + 1);
      scanf("%d", &temperature[i][j]);
    }
  }
  printf("\nDisplaying values: \n\n");
 
  // Using nested loop to display vlues of a 2d array
  for (int i = 0; i < CITY; ++i)
  {
    for (int j = 0; j < WEEK; ++j)
    {
      printf("City %d, Day %d = %d\n", i + 1, j + 1, temperature[i][j]);
    }
  }
  return 0;
}

Çıktı:

City 1, Day 1: 33
City 1, Day 2: 34
City 1, Day 3: 35
City 1, Day 4: 33
City 1, Day 5: 32
City 1, Day 6: 31
City 1, Day 7: 30
City 2, Day 1: 23
City 2, Day 2: 22
City 2, Day 3: 21
City 2, Day 4: 24
City 2, Day 5: 22
City 2, Day 6: 25
City 2, Day 7: 26

 
Displaying values:
 
City 1, Day 1 = 33
City 1, Day 2 = 34
City 1, Day 3 = 35
City 1, Day 4 = 33
City 1, Day 5 = 32
City 1, Day 6 = 31
City 1, Day 7 = 30
City 2, Day 1 = 23
City 2, Day 2 = 22
City 2, Day 3 = 21
City 2, Day 4 = 24
City 2, Day 5 = 22
City 2, Day 6 = 25
City 2, Day 7 = 26

 


Örnek: 

iki matrisin toplamı:


// C program to find the sum of two matrices of order 2*2
 
#include <stdio.h>
int main()
{
  float a[2][2], b[2][2], result[2][2];
 
  // Taking input using nested for loop
  printf("Enter elements of 1st matrix\n");
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
    {
      printf("Enter a%d%d: ", i + 1, j + 1);
      scanf("%f", &a[i][j]);
    }
 
  // Taking input using nested for loop
  printf("Enter elements of 2nd matrix\n");
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
    {
      printf("Enter b%d%d: ", i + 1, j + 1);
      scanf("%f", &b[i][j]);
    }
 
  // adding corresponding elements of two arrays
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
    {
      result[i][j] = a[i][j] + b[i][j];
    }
 
  // Displaying the sum
  printf("\nSum Of Matrix:");
 
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
    {
      printf("%.1f\t", result[i][j]);
 
      if (j == 1)
        printf("\n");
    }
  return 0;
}

Çıktı:

Enter elements of 1st matrix
Enter a11: 2;
Enter a12: 0.5;
Enter a21: -1.1;
Enter a22: 2;
Enter elements of 2nd matrix
Enter b11: 0.2;
Enter b12: 0;
Enter b21: 0.23;
Enter b22: 23;
 
Sum Of Matrix:
2.2     0.5
-0.9    25.0
 

Örnek:

Üç boyutlu dizi:


// C Program to store and print 12 values entered by the user
 
#include <stdio.h>
int main()
{
  int test[2][3][2];
 
  printf("Enter 12 values: \n");
 
  for (int i = 0; i < 2; ++i)
  {
    for (int j = 0; j < 3; ++j)
    {
      for (int k = 0; k < 2; ++k)
      {
        scanf("%d", &test[i][j][k]);
      }
    }
  }
 
  // Printing values with the proper index.
 
  printf("\nDisplaying values:\n");
  for (int i = 0; i < 2; ++i)
  {
    for (int j = 0; j < 3; ++j)
    {
      for (int k = 0; k < 2; ++k)
      {
        printf("test[%d][%d][%d] = %d\n", i, j, k, test[i][j][k]);
      }
    }
  }
 
  return 0;
}

Çıktı:

Enter 12 values:
1
2
3
4
5
6
7
8
9
10
11
12
 
Displaying Values:
test[0][0][0] = 1
test[0][0][1] = 2
test[0][1][0] = 3
test[0][1][1] = 4
test[0][2][0] = 5
test[0][2][1] = 6
test[1][0][0] = 7
test[1][0][1] = 8
test[1][1][0] = 9
test[1][1][1] = 10
test[1][2][0] = 11
test[1][2][1] = 12
 

C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:

Kaynaklar:
https://www.programiz.com/c-programming/c-arrays
A'dan Z'ye C Kılavuzu 
https://www.w3schools.com/c/c_arrays.php
https://www.programiz.com/c-programming/c-multi-dimensional-arrays