Arduino Güncel

Sensörler – İvme Ölçer Sensörü Nedir ? Nasıl Çalışır ?

Günümüzün akıllı telefonlarının en havalı özelliklerinden biridir. Hepsinde, bir yandan diğer yana eğdiğinizde algılayabilen, devreye yerleştirilmiş İvmeölçer adlı küçük bir cihaz var. Akıllı telefonunuz, ekran düzenini dikeyden yataya ne zaman değiştireceğini bu şekilde otomatik olarak bulur.

İvmeölçerler, Mobil cihazlar, Oyun sistemleri, Disk sürücüsü koruması, Görüntü sabitleme ve Spor ve sağlık cihazları gibi maliyete duyarlı, düşük güç, hareket ve eğim algılama uygulamalarında yaygın olarak kullanılmaktadır.

Ne olduklarına, ne yaptıklarına ve nasıl çalıştıklarına daha yakından bakalım.

İvmeölçer Nasıl Çalışır?

İvmeölçerlerin nasıl çalıştığını anlayabilmek için, 3 boyutlu bir küpün içinde bir top hayal edelim.

İvmeölçer Çalışma İllüstrasyonu - Ağırlıksız Durum

Küpün, her şeyin ağırlıksız durumda olduğu uzayda olduğunu varsayalım, top basitçe küpün ortasında yüzecektir.

Şimdi her duvarın belirli bir ekseni temsil ettiğini düşünelim.

Kutuyu aniden 1g ivmesi ile sola hareket ettirirsek(Tek bir G kuvveti 1g, 9.8 m/s 2 ‘ lik yerçekimi ivmesine eşittir ), şüphesiz top X duvarına çarpacaktır. Topun uyguladığı kuvveti ölçersek X duvarına, X ekseninde 1g kuvvet uyguladığını görürüz.

İvmeölçer Çalışma İllüstrasyonu - Ani Hareket

O küpü Dünya’ya koyarsak ne olur ? . Top basitçe Z duvarına düşecek ve aşağıdaki resimde gösterildiği gibi 1g’lik bir kuvvet uygulayacaktır.

İvmeölçer Çalışma İllüstrasyonu - Yerçekimi Kuvveti

Bu durumda kutu hareket etmiyor olacaktır ancak yine de Z ekseninde 1g okuma aldığımızı görürüz. Bunun nedeni, yerçekimi kuvvetinin topu 1g kuvvetiyle aşağı çekmesidir.

MEMS İvmeölçer Nasıl Çalışır?

MEMS (Mikro Elektro Mekanik Sistemler) ivmeölçer, silikon bir levha üzerine inşa edilmiş mikro-işlenmiş bir yapıdan oluşur.

ADXL335 MEMS İvmeölçer Dahili Çalışma

Bu yapı polisilikon yaylar tarafından askıya alınır. Belirli bir eksende ivme uygulandığında yapının sapmasına izin verir.

Sapma nedeniyle, sabit plakalar ile asılı yapıya bağlı plakalar arasındaki kapasitans değişir. Kapasitedeki bu değişiklik, o eksendeki ivme ile orantılıdır.

Sensör, kapasitansta bu değişikliği işler ve onu analog çıkış voltajına dönüştürür.

ADXL335 İvmeölçer Donanımına Genel Bakış

Modülün merkezinde, Analog Cihazlardan son derece düşük gürültülü ADXL335 olan küçük, düşük güçlü üç eksenli MEMS ivmeölçer bulunur . Sensörün tam algılama aralığı ±3 g’dır. Eğim algılama uygulamalarında yerçekiminden kaynaklanan statik ivmenin yanı sıra hareket, şok veya titreşimden kaynaklanan dinamik ivmeyi ölçebilir.

ADXL335 İvmeölçer Modülü Donanımına Genel Bakış

Sensör, 1.8V ile 3.6VDC (3,3V optimal) arasındaki güçle çalışır ve sadece 350µA akım tüketir. Bununla birlikte, yerleşik bir 3.3V regülatör, Arduino gibi 5V mikrodenetleyicilerle çalışmak için uygun bir seçimdir.

Analog çıkışlar Radiometrik’tir, yani 0g ölçüm çıkışı nominal olarak 3,3V besleme voltajının (1,65V) yarısına eşittir, -3g ölçüm de (0v) ve 3g ölçümde 3,3V’dur ve aralarında tam ölçekleme vardır.

ADXL335 İvmeölçer IC’nin tam özellikleri.

Operating Voltage1.8V – 3.6V
Operating Current350μA (typical)
Sensing Range±3g (Full Scale)
Temperature Range−40 to +85°C
Sensing axis3 axis
Sensitivity270 to 330mV/g (Ratiometric)
Shock ResistanceUp to 10,000g
Dimension4mm x 4mm x 1.45mm

ADXL335 İvmeölçer Pin Çıkışı

ADXL335 İvmeölçer Modülü Pin Çıkışı

VCC: pin Arduino üzerinde 5V’a bağlanabilen ivmeölçer için güç sağlar.

X-Çıkış: pin çıkışı, X eksenine uygulanan hızlanmayla orantılı analog voltaj verir.

Y-Çıkış: pin, Y eksenine uygulanan hızlanmayla orantılı analog voltaj verir.

Z-Çıkış: pin, Z ekseninde uygulanan hızlanmayla orantılı analog voltaj verir.

GND: pin Arduino’da GND’ye bağlı

ST(Self Test): pin kendi kendini test etme özelliğini kontrol eder. Bu özellik yazı sonunda ayrıntılı olarak tartışılmaktadır.

ADXL335 İvmeölçer İle Arduino UNO Kullanımı

Bağlantılar oldukça kolaydır. İvmeölçeri breadboard’unuza yerleştirerek başlayın. VCC pinini Arduino üzerindeki 5V pinine bağlayın ve GND pinini Arduino üzerindeki Ground pinine bağlayın. Ayrıca X, Y ve Z çıkışını Arduino’daki A0, A1 ve A2 analog pinlerine bağlayın.

Doğru sonuçlar için Arduino’nun analog referans(AREF) voltajını değiştirmemiz gerekiyor. Bu, Arduino üzerindeki 3.3V pinini AREF pinine bağlayarak yapılabilir.

ADXL335 İvmeölçer Modülünü Arduino UNO'ya Kablolama

Arduino Kodu – ADXL335 ivmeölçer okuma

Çalışması gayet basit. İvmeölçer sensörün yeri veya yönü değiştiğinde, Analog girişlerden gelen verileri seri ekranda göreceğiz.

const int xInput = A0;
const int yInput = A1;
const int zInput = A2;

// initialize minimum and maximum Raw Ranges for each axis
int RawMin = 0;
int RawMax = 1023;

// Take multiple samples to reduce noise
const int sampleSize = 10;

void setup() 
{
	analogReference(EXTERNAL);
	Serial.begin(9600);
}

void loop() 
{
	//Read raw values
	int xRaw = ReadAxis(xInput);
	int yRaw = ReadAxis(yInput);
	int zRaw = ReadAxis(zInput);

	// Convert raw values to 'milli-Gs"
	long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);
	long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);
	long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);

	// re-scale to fractional Gs
	float xAccel = xScaled / 1000.0;
	float yAccel = yScaled / 1000.0;
	float zAccel = zScaled / 1000.0;

	Serial.print("X, Y, Z  :: ");
	Serial.print(xRaw);
	Serial.print(", ");
	Serial.print(yRaw);
	Serial.print(", ");
	Serial.print(zRaw);
	Serial.print(" :: ");
	Serial.print(xAccel,0);
	Serial.print("G, ");
	Serial.print(yAccel,0);
	Serial.print("G, ");
	Serial.print(zAccel,0);
	Serial.println("G");

	delay(200);
}

// Take samples and return the average
int ReadAxis(int axisPin)
{
	long reading = 0;
	analogRead(axisPin);
	delay(1);
	for (int i = 0; i < sampleSize; i++)
	{
	reading += analogRead(axisPin);
	}
	return reading/sampleSize;
}

Aşağıdaki resim, ivmeölçer çıkışını seri monitörde farklı konumlarda göstermektedir .

ADXL335 Accelerometer Output on +X axis
ADXL335 Accelerometer Output on -Y axis
ADXL335 Accelerometer Output on -X axis
ADXL335 Accelerometer Output on -Z axis
ADXL335 Accelerometer Output on +Z axis

Kod Açıklaması:

Program, sensörün X, Y ve Z çıkış pinlerinin bağlı olduğu Arduino’nun analog giriş pinlerini bildirerek başlar.

Ardından, Arduino’nun sağlayacağı minimum ve maksimum değerleri tanımlarız. Arduino kartı 10-bit analog-dijital dönüştürücü içerdiğinden, sensörün 0 ile 3,3 volt arasındaki çıkış voltaj aralığını 0 ile 1023 arasındaki tamsayı değerlerine eşitler. Bu yüzden RawMin = 0’a ayarlanmıştır ve RawMax = 1023 ayarlanmıştır.

Değişken sampleSize, Arduino’ya daha kesin sonuçlar elde etmek için her dönüşümden 10 adet örnek almasını söyler.

const int xInput = A0;
const int yInput = A1;
const int zInput = A2;

// initialize minimum and maximum Raw Ranges for each axis
int RawMin = 0;
int RawMax = 1023;

// Take multiple samples to reduce noise
const int sampleSize = 10;

Setup fonksiyonunda Arduino üzerindeki AREF pinine 3.3V bağladığımız için analog referansı EXTERNAL olarak ayarlamalıyız. Bu arayarak yapılır analogReference(EXTERNAL).

Arduino’nun resmi web sitesinde fonksiyon hakkında daha fazla bilgi edinebilirsiniz .

analogReference(EXTERNAL);
Serial.begin(9600);

Kurulum fonksiyonunda, her 200 ms’de bir sensörden gelen analog çıkışları okuyoruz. analogRead() Fonksiyonunu çağırmak yerine, ReadAxis()özel fonksiyonu çağırıyoruz . Bu komut yalnızca 10 örnek ADC dönüşümü alır ve ortalamayı döndürür.

ADXL335 Çıkışını İvme Değerine Çevirme

Aşağıdaki kodlar programın en önemli kısmıdır. Sensörden gelen analog çıkış voltajlarını yerçekimi ivmesine (G) eşler ve dönüştürür.

IDE’nin map() komutu bu eşleşmeyi gerçekleştirir. Yani, bu komutu çağırdığımızda map(xRaw, RawMin, RawMax, -3000, 3000), RawMin değerini 3000’e, RawMax değerini 3000‘e ve aradaki değerleri aradaki değerlere eşitler.

-3000 ve 3000 değerleri keyfi değildir. Aslında sensör tarafından ölçülen yerçekimi ivmesini (ag’nin 1/1000’i olan mili-g cinsinden) temsil ederler, yani ±3g (-3000 mili-g ila 3000 mili-g).

Örneğin,

  • Sensör x ekseninde 0 volt verdiğinde, yani xRaw=0 olduğunda, map()fonksiyon -3g’yi temsil eden -3000 değerini gösterir.
  • Sensör x ekseninde 3,3 volt çıkış verdiğinde, yani xRaw=1023, map()fonksiyon + 3g’yi temsil eden 3000’e gösterir.
  • Sensör x ekseninde 1,65 volt verdiğinde, yani xRaw=511 olduğunda, map()işlev 0g’yi temsil eden 0’a gösterir.
// Convert raw values to 'milli-Gs"
long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);
long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);
long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);

Son olarak, sensörün çıkışı, 1000’e bölünerek kesirli Gs’ye indirgenir ve seri monitörde görüntülenir.

// re-scale to fractional Gs
float xAccel = xScaled / 1000.0;
float yAccel = yScaled / 1000.0;
float zAccel = zScaled / 1000.0;

Serial.print("X, Y, Z  :: ");
Serial.print(xRaw);
Serial.print(", ");
Serial.print(yRaw);
Serial.print(", ");
Serial.print(zRaw);
Serial.print(" :: ");
Serial.print(xAccel,0);
Serial.print("G, ");
Serial.print(yAccel,0);
Serial.print("G, ");
Serial.print(zAccel,0);
Serial.println("G");

ADXL335 Kendi Kendini Test Özelliği

ADXL335 İvmeölçer, son uygulamada sensörün çalışmasını kontrol etmenizi sağlayan bir kendi kendini test etme özelliğine sahiptir.

ADXL335 Modül SelfTest Pimi

Modül üzerindeki ST(self-test) pini bu özelliği kontrol eder.

ST pimi 3.3V’a bağlandığında, ivmeölçer ışınına dahili olarak bir elektrostatik kuvvet uygulanır. Kirişin ortaya çıkan hareketi, kullanıcının ivmeölçerin işlevsel olup olmadığını test etmesine olanak tanır.

Çıktıdaki tipik değişiklik,

  • X ekseninde −1,08 g (−325 mV)
  • Y ekseninde +1.08 g (+325 mV)
  • Z ekseninde +1,83 g (+550 mV)

Bu ST pini normal kullanımda açık devre bırakılabilir veya GND’ye bağlanabilir.

Uyarı:

ST pinini 3,6V’den daha yüksek voltajlara maruz bırakmak ivme ölçere kalıcı olarak zarar verebilir.

Kaynak: lastminuteengineers.com

Similar Posts

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir