Birden fazla i2c çıkış alınan sensör nasıl kullanılır?

Selamun aleyküm Arduino da i2c çıkışı alınan birden fazla sensörü nasıl kullanabilirim?Biraz araştırma yaptım ancak Türkçe olarak kayanak az var bu konuda , bilgisi olan varsa cevaplarsa sevinirim.

Merhaba,
Sadece bir i2c pinleriyle(SDA-SCL) 1024 sensörden veri okuyabilirsiniz. Arduino uno da bu pinler SDA=A4, SCL=A5; Arduino mega da SDA=20, SCL=21’dir. Tüm sensörlerin i2c pinlerini aynı pinlere bağlayabilirsiniz. Daha fazla bilgi için i2c’nin çalışma mantığını araştırabilirsiniz. Örneğin yazdığım kodda BMP085 ve MPU6050 sensörlerinden gelen verileri seri monitöre yazdıracağım.

#include <Wire.h>
int ADXLAddress = 0x53; //8. Bittin cihaz adresi
#define X_Axis_Register_DATAX0 0x32  //DATAX0 için adres
#define X_Axis_Register_DATAX1 0x33  //DATAX1 için adres
#define Power_Register 0x2D
int X0,X1,X_out;
void setup() {
  Wire.begin();  //Wire kütüphanesini başlattık
  Serial.begin(9600); //Seri monitör hızını ayarladık
  delay(100); //100 milisaniye bekle bi gardaş
  
  Wire.beginTransmission(ADXLAddress); //Okumayı başlat
  Wire.write(Power_Register);
  Wire.write(8);
  Wire.endTransmission();
 
}

void loop() {
 Wire.beginTransmission(ADXLAddress);  //Veri iletimini başlat
 Wire.write(X_Axis_Register_DATAX0);
 Wire.write(X_Axis_Register_DATAX1);

 Wire.endTransmission();               //Veri iletimini durdur
 Wire.requestFrom(ADXLAddress,2);      //2 veriyi de isteyelim siz kaç tane adres kullanacaksanız o sayıyı yazın

 if(Wire.available()<=2);
 {
  X0 = Wire.read();   //Verileri oku
  X1 = Wire.read();
 }
 Serial.print("X0= ");       //Serial monitöre yazdır artık bundan sonrası ne yapıyorsan yap değerleri
 Serial.print(X0);
 Serial.print("  X1= ");
 Serial.println(X1);
}

Umarım anlatabilmişimdir. Kolay gelsin. :slightly_smiling_face:

1 Beğeni

Teşekkür ederim aslında benim kullanmayı planladığım sensörler de hemen hemen aynı biri MPU6050 diğeri BMP180 ancak i2c tarayıcıdan baktığımda MPU6050 için 0x68
BMP180 için 0x77 değerlerini okudum. alıntıladığım bölümdeki 0x32 ve 0x33 kısımlarına bu değerleri mi girmeliyim? Birde bağlantı yaparken direkt olarak sensörlerin scl ve sda pinlerini birbirine bağlayıp Arduino üzerindeki ilgili yerlere bağlantısını yapmam yeterli midir?Sensörlerden biri 5v diğeri 3.3v ile çalıştırıldığı için bir sorun olur mu? Sorularım saçmaysa kusura bakmayın bu konuda acemiyim.

Merhaba,
Hayır o değerler sensörlerin değerlerinin yazıldığı adrestir. BMP085 sensörün X değerini 0x32 ve 0x33 adreslerinde okuyabiliyoruz. Bunların adreslerini datasheeden bakabilirsiniz. Aslında burda yanlış bir şey söylemişim. Her ne kadar BMP085 desemde aslında GY-80 sensör modülünden bahsediyorum. Bu modülde MC5883L, L3G4200D, ADXL345 ve BMP085 sensörlerini içeriyor ve bu sensörlerinde adresleri farklı. Bu adreslere göre veri çekiyoruz. Bu adresi kodda int ADXLAddress = 0x53; şeklinde belirttim. Ancak bu adres ADXL345 sensörünün adresi. Siz de bu şekilde sensörlerinizden veri alabilirsiniz. İyi günler dilerim. :slightly_smiling_face:

Teşekkür ederim gönderdiğiniz kodu dediğiniz gibi GY-80 olan bir sitede de gördüm,sanırım datasheet e göz atmam gerekecek…

1 Beğeni

Aynı adrese sahip birden fazla sensör olursa nasıl yapmalıyız. Teşekkürler.

Adresler bir kaç sensör de değişebiliyor hangi sensörleri bağlayacaksınız?

VL53L0X lazer mesafe sensörü den 4 ila 8 sensnsör kullanabilir miyiz aynı I2c hattında.

Araştırmama göre birkaç seçenek mevcutmuş.
1. Vl53l0x üzerinde bulunan xshut pinini bağlayarak her seferinde bir sensörü açık diğerlerinin Kapalı olmasıymış.

  1. SoftI2cMaster uygulaması ile arduino üzerindeki sda, scl pinleri haricindeki pinleri i2c hattına çevirmek. Yani birden fazla i2c hattı kullanmak gerekiyor.

  2. Tca9548a ile I2c hattını çoğaltmakmış. Her İ2c hattının farklı voltajı olabiliyormuş.
    https://youtu.be/vV42fCpmCFg
    https://youtu.be/FgCYcOrQnho

  3. Sensörleri üzerinde adres değişikliği için jumperlar olabiliyormuş (vl53l0 da yok. )

Her koşulda kablolar çoğalıyor. Hangisi seçmek mantıklı olur bilemiyorum.

1 Beğeni