Bu yazıda, ADXL345 İvme Ölçer Sensörü kullanarak eksen hareketlerine göre LED’leri yakabileceğiniz bir Arduino projesi oluşturacağız. Proje sırasında ivme ölçer sensöründen gelen verilerle hangi eksen hareketinin gerçekleştiğini algılayacak ve buna göre LED’leri yakacağız.
Proje İçin Gerekli Malzemeler:
- Arduino
- Breadboard
- ADXL345 İvme ölçer sensör
- 4 Adet LED
- 4 Adet 220ohm Direnç
- Jumper kablolar
Gerekli kütüphaneler:
ADXL345 İvme Ölçer Sensör
ADXL345 ivme ölçer sensörü, ufak, düşük güç tüketimi olan açısal ivme ölçer sensörüdür. Hem statik hem de dinamik hızlanma kuvvetlerini ölçebilen 3 eksenli bir ivme ölçerdir.
Sensör üzerindeki pinleri inceleyecek olursak,
Dinamik kuvvetlere titreşimler, hareketler vb. neden olabilirken, yerçekimi kuvveti statik kuvvetin tipik sonuçlarını verebilmektedir. İvme için ölçü birimi metre bölü saniye karedir (m/s^2). Bununla beraber ADXL345 Sensörü, g değerini baz alarak çalışır. “g“, saniyede 9,8 metre kareye eşit olan yerçekimi kuvvetinin değeridir.
Dolayısıyla, Z ekseni yerçekimi kuvvetinin tersine yukarıyı gösterecek şekilde düz yerleştirilmiş bir ivmeölçerimiz varsa, sensörün Z ekseni çıkışı 1g olacaktır. Öte yandan, X ve Y çıkışları sıfır olacaktır, çünkü yerçekimi kuvveti bu eksenlere diktir ve onları hiç etkilemez. Sensörü ters çevirirsek, Z ekseni çıkışı -1 g olacaktır. Bu, yerçekimine yöneliminden dolayı sensörün çıktılarının -1g ile +1g arasında değişebileceği anlamına gelir.
ADXL345 Sensör Pinleri
Pin | Açıklama |
---|---|
GND | Eksi (toprak) pini. |
VCC | Besleme (artı) pini. |
CS | Çip seçimi pini. |
INT1, INT2 | Kesme işlem pini. |
SDO | Seri veri çıkışı pini. |
SDA | Seri veri girişi pini. |
SCL | Seri haberleşme süresi pini. |
Bağlantı Şeması:

- ADXL345 Sensör Bağlantıları
- GND → Arduino GND
- VCC → Arduino 3.3V veya 5V
- SDA → Arduino A4 (I2C veri hattı)
- SCL → Arduino A5 (I2C saat hattı)
- LED Bağlantıları
- LED 1 → Arduino D7
- LED 2 → Arduino D6
- LED 3 → Arduino D5
- LED 4 → Arduino D4
Proje Kodu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | //-------------------------------------------------// //-------------------KODKAMPUSU--------------------// //---Arduino | ADXL345 İvme Ölçer ile LED Yakmak---// //-------------------------------------------------// // Sensör haberleşmesi için wire kütüphanesini tanımlıyoruz #include // ADXL-345 için gerekli olan kütüphaneleri tanımlıyoruz #include #include // Ledlerin pin tanımlamasını yapıyoruz #define led1 7 #define led2 6 #define led3 5 #define led4 4 // Sensörün haberleşmesi için kütüphane değişkeni tanımlıyoruz Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345); // ADXL345 Sensörünün test verilerini almak için kütüphane içerisinde yer alan default kodları okutuyoruz void displaySensorDetails(void) { sensor_t sensor; accel.getSensor(&sensor); // Sensör bilgilerini alıyoruz Serial.println("------------------------------------"); Serial.print("Sensor: "); Serial.println(sensor.name); // Sensör adı Serial.print("Driver Ver: "); Serial.println(sensor.version); // Sürücü versiyonu Serial.print("Unique ID: "); Serial.println(sensor.sensor_id); // Sensörün benzersiz ID'si Serial.print("Max Value: "); Serial.print(sensor.max_value); Serial.println(" m/s^2"); // Maksimum değer Serial.print("Min Value: "); Serial.print(sensor.min_value); Serial.println(" m/s^2"); // Minimum değer Serial.print("Resolution: "); Serial.print(sensor.resolution); Serial.println(" m/s^2"); // Çözünürlük Serial.println("------------------------------------"); Serial.println(""); delay(500); } // Veri hızı ayarını ekrana yazdırıyoruz void displayDataRate(void) { Serial.print("Data Rate: "); // Sensörün veri hızını kontrol ediyoruz ve uygun hız değerini ekrana yazdırıyoruz switch(accel.getDataRate()) { case ADXL345_DATARATE_3200_HZ: Serial.print("3200 "); break; case ADXL345_DATARATE_1600_HZ: Serial.print("1600 "); break; case ADXL345_DATARATE_800_HZ: Serial.print("800 "); break; case ADXL345_DATARATE_400_HZ: Serial.print("400 "); break; case ADXL345_DATARATE_200_HZ: Serial.print("200 "); break; case ADXL345_DATARATE_100_HZ: Serial.print("100 "); break; case ADXL345_DATARATE_50_HZ: Serial.print("50 "); break; case ADXL345_DATARATE_25_HZ: Serial.print("25 "); break; case ADXL345_DATARATE_12_5_HZ: Serial.print("12.5 "); break; case ADXL345_DATARATE_6_25HZ: Serial.print("6.25 "); break; case ADXL345_DATARATE_3_13_HZ: Serial.print("3.13 "); break; case ADXL345_DATARATE_1_56_HZ: Serial.print("1.56 "); break; case ADXL345_DATARATE_0_78_HZ: Serial.print("0.78 "); break; case ADXL345_DATARATE_0_39_HZ: Serial.print("0.39 "); break; case ADXL345_DATARATE_0_20_HZ: Serial.print("0.20 "); break; case ADXL345_DATARATE_0_10_HZ: Serial.print("0.10 "); break; default: Serial.print("???? "); break; } Serial.println(" Hz"); } // Sensörün ölçüm aralığını ekrana yazdırıyoruz void displayRange(void) { Serial.print("Range: +/- "); // Sensörün ölçüm aralığını kontrol ediyoruz ve uygun değeri ekrana yazdırıyoruz switch(accel.getRange()) { case ADXL345_RANGE_16_G: Serial.print("16 "); break; case ADXL345_RANGE_8_G: Serial.print("8 "); break; case ADXL345_RANGE_4_G: Serial.print("4 "); break; case ADXL345_RANGE_2_G: Serial.print("2 "); break; default: Serial.print("?? "); break; } Serial.println(" g"); } void setup(void) { // Ledlerin pin tanımlarını yapıyoruz pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); // Ledleri başlangıçta kapalı olarak tanımlıyoruz digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); #ifndef ESP8266 while (!Serial); // Seri portun hazır olmasını bekliyoruz #endif Serial.begin(9600); // Seri iletişimi başlatıyoruz Serial.println("Accelerometer Test"); Serial.println(""); // Sensörün başlatılmasını sağlıyoruz if(!accel.begin()) { Serial.println("Bir sorun oluştu..."); // Sensör çalışmıyorsa hata mesajı veriyoruz while(1); } // Sensörün ölçüm aralığını ayarlıyoruz accel.setRange(ADXL345_RANGE_16_G); // İvmeölçerin ölçüm aralığını 16G'ye ayarlıyoruz displaySensorDetails(); displayDataRate(); displayRange(); Serial.println(""); } void loop(void) { // Sensör verilerini başlatıyoruz sensors_event_t event; accel.getEvent(&event); // Sensör hareketlerini analiz ediyoruz ve buna göre LED'leri yakıyoruz if(event.acceleration.x < 1 && event.acceleration.y < -1) { // Sensör aşağı doğru hareket ettiğinde led3 ve led4 yanar digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); } else if(event.acceleration.x < 1 && event.acceleration.y > 1) { // Sensör yukarı doğru hareket ettiğinde led1 ve led2 yanar digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, LOW); digitalWrite(led4, LOW); } else if(event.acceleration.x > 1 && event.acceleration.y < 1) { // Sensör sağa doğru hareket ettiğinde led2 ve led4 yanar digitalWrite(led1, LOW); digitalWrite(led2, HIGH); digitalWrite(led3, LOW); digitalWrite(led4, HIGH); } else if(event.acceleration.x < 1 && event.acceleration.y < 1) { // Sensör sola doğru hareket ettiğinde led1 ve led3 yanar digitalWrite(led1, HIGH); digitalWrite(led2, LOW); digitalWrite(led3, HIGH); digitalWrite(led4, LOW); } // Herhangi bir hareket olmadığında LED'ler söner else { digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); } // Seri port üzerinden hareket verilerini yazdırıyoruz Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print(" "); Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print(" "); Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print(" "); Serial.println("m/s^2 "); delay(500); // Her 500 milisaniyede bir güncelleme yapıyoruz } |
Açıklamalar ve Dikkat Edilmesi Gereken Noktalar:
- Setup Aşaması:
- ADXL345 sensörü başlatılır.
- Sensör hassasiyeti, ölçüm aralığı (±2g) olarak belirlenir.
- Loop Aşaması:
- Sensör eksen değerleri okunur.
- Hangi eksene hareket varsa, ona uygun LED’ler yanar.
- X, Y ve Z eksen hareketleri seri monitörde gösterilir.
Hata Ayıklama:
- Sensör algılamıyor: GND, VCC, SDA ve SCL bağlantılarını kontrol edin.
- LED’ler yanmıyor: LED’lerin ve dirençlerin doğru bağlandığından emin olun.
- Sensör verileri Wire protokolü ile okunur.
- Hangi eksene doğru hareket olduğunu tespit etmek için sensör verileri kontrol edilir.
- Hareket edilen eksene göre ilgili LED’ler yakılır.
- Sensör verileri seri portta izlenebilir.
- Sensör ve LED’ler: ADXL345 ivmeölçer sensörü ile LED’leri kontrol etmek için bir arayüz kuruyoruz. Sensörün hareketlerine göre belirli LED’ler yanacak şekilde ayarlanmıştır.
displaySensorDetails()
: Sensör hakkında temel bilgileri (isim, versiyon, ID, maksimum ve minimum değerler) seri port üzerinden yazdırır.displayDataRate()
: Sensörün veri hızını (Hz cinsinden) ekrana yazdırır.displayRange()
: Sensörün ölçüm aralığını (±2g, ±4g, ±8g, ±16g) ekrana yazdırır.setup()
: LED’ler için pinleri ayarlar, sensörü başlatır, ve sensör bilgilerini seri port üzerinden yazdırır.loop()
: Sensörün verilerini alır, buna göre LED’leri yakar ve verileri seri port üzerinden
Bağlantı ve kodlama sırasında karşılaştığınız hataları; aşağıda ki yorum bölümünden belirtebilirsiniz :)