Arduino’da, ADXL345 İvme ölçer sensörünü kullanarak, eksen hareketlerine göre tanımlı olan ledleri yakan devreyi aşağıda inceleyelim.
Proje için gerekli malzemeler:
- Arduino
- Breadboard
- ADXL345 İvme ölçer sensör
- 4 Adet LED
- 4 Adet 220ohm Direnç
- Jumper kablolar
Gerekli kütüphaneler: (İndirmek istediğiniz kütüphaneye tıklayın)
İçindekiler
Proje önizleme
Sensörü hangi yöne doğru eğersek, o yöndeki ledler yanmakta. Hiçbir hareket olmadığı zaman yani Z ekseni -1 olduğu zaman hiçbir led yanmayacak.
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,
– GND: Eksi pin.
– VCC: Artı pin.
– CS: Chip Select, çip seçim pini olarak geçmektedir.
– INT1 – INT2: Tanınmış olan fonksiyonel işlemi yapmayı kesip başka bir fonksiyonu çalıştırarak işlemi devam ettiren pinlerdir.
– SDO: Seri veri çıkışı pini.
– SDA: Seri veri girişi pini.
– SCL: Seri haberleşme süresi pini.
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.
Bağlantı şeması
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 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | //-------------------------------------------------// //-------------------KODKAMPUSU--------------------// //---Arduino | ADXL345 İvme Ölçer ile LED Yakmak---// //-------------------------------------------------// //Sensör haberleşmesi için wire kütüphanesini tanımlıyoruz #include <Wire.h> //ADXL-345 için gerekli olan kütüphaneleri tanımlıyoruz #include <Adafruit_Sensor.h> #include <Adafruit_ADXL345_U.h> //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); Serial.println("------------------------------------"); Serial.print ("Sensor: "); Serial.println(sensor.name); Serial.print ("Driver Ver: "); Serial.println(sensor.version); Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id); Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" m/s^2"); Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" m/s^2"); Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" m/s^2"); Serial.println("------------------------------------"); Serial.println(""); delay(500); } void displayDataRate(void) { Serial.print ("Data Rate: "); 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"); } void displayRange(void) { Serial.print ("Range: +/- "); 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ımlamasını yapıyoruz pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); //Ledlerin, ivmeye göre yanması için default modda kapalı olarak tanımlıyoruz digitalWrite(led1,LOW); digitalWrite(led2,LOW); digitalWrite(led3,LOW); digitalWrite(led4,LOW); #ifndef ESP8266 while (!Serial); #endif Serial.begin(9600); Serial.println("Accelerometer Test"); Serial.println(""); //Sensör verilerinin okunması için sensörü başlatıyoruz if(!accel.begin()) { //Sensör verilerinin okunmaması durumunda, hata yazısı yazdırıyoruz. Serial.println("Bir sorun oluştu..."); while(1); } //Sensör verilerinin sayısal aralığını belirliyoruz. Sayısal aralığı kendi ivmeölçerinize göre seçebilirsiniz. accel.setRange(ADXL345_RANGE_16_G); // accel.setRange(ADXL345_RANGE_8_G); // accel.setRange(ADXL345_RANGE_4_G); // accel.setRange(ADXL345_RANGE_2_G); displaySensorDetails(); displayDataRate(); displayRange(); Serial.println(""); } void loop(void) { //Sensör verilerini başlatıyoruz sensors_event_t event; accel.getEvent(&event); //Sensörün hareketlerine göre, hangi eksene doğru çevirirsek o tarafta ki ledlerin yanması için, //if koşulları içerisinde ledlerin açılmasını sağlıyoruz. //Sensörü aşağı, alta doğru hareket ettirdiğimiz zaman led3 ve led4 yanmasını belirtiyoruz if(event.acceleration.x < 1 && event.acceleration.y < -1) { digitalWrite(led1,LOW); digitalWrite(led2,LOW); digitalWrite(led3,HIGH); digitalWrite(led4,HIGH); } //Sensörü yukarıya, ileriye doğru hareket ettirdiğimiz zaman led1 ve led2 yanmasını belirtiyoruz else if(event.acceleration.x < 1 && event.acceleration.y > 1) { digitalWrite(led1,HIGH); digitalWrite(led2,HIGH); digitalWrite(led3,LOW); digitalWrite(led4,LOW); } //Sensörü sağ tarafa doğru hareket ettirdiğimiz zaman led2 ve led4 yanmasını belirliyoruz else if(event.acceleration.x > 1 && event.acceleration.y < 1) { digitalWrite(led1,LOW); digitalWrite(led2,HIGH); digitalWrite(led3,LOW); digitalWrite(led4,HIGH); } //Sensörü sol tarafa doğru hareket ettirdiğimiz zaman led1 ve led3 yanmasını belirliyoruz else if(event.acceleration.x < 1 && event.acceleration.y < 1) { digitalWrite(led1,HIGH); digitalWrite(led2,LOW); digitalWrite(led3,HIGH); digitalWrite(led4,LOW); } //Herhangi bir hareket olmadığı zaman ledlerin sönmesini sağlıyoruz else if(event.acceleration.x > -0.08 && event.acceleration.y < -0.43) { digitalWrite(led1,LOW); digitalWrite(led2,LOW); digitalWrite(led3,LOW); digitalWrite(led4,LOW); } else { digitalWrite(led1,LOW); digitalWrite(led2,LOW); digitalWrite(led3,LOW); digitalWrite(led4,LOW); } //Seri konsolda hareketleri görmemiz için eksenleri 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); } |
Bağlantı ve kodlama sırasında karşılaştığınız hataları; aşağıda ki yorum bölümünden belirtebilirsiniz :)