• Arduino'nun I2C veri yolu ile çalışması için tel kütüphane. Arduino'ya LCD I2C modülü bağlantısı

    I2C, arasındaki iletişim için seri asimetrik bir veri yoludur. Entegre devreler elektronik cihazların içinde. Yani bu protokol iletişim, bir cihaz kutusu içinde veya bir kalkan içinde interkom iletişimi için tasarlanmıştır. Verileri iletmekle görevli değildi. uzun mesafeler, bu yüzden maksimum iletişim menzili hakkında pek çok efsane var - biri için 50 cm'de, biri için 2 m'de zaten iyi çalışmıyor.

    I2C veriyolunda en fazla 128 cihaz bulunabilir. 0'dan 127'ye kadar adresler.

    Arduino denetleyicileri, onlara iki veri kablosuyla bağlanmanıza izin veren fiziksel I2C iletişimine sahiptir. çeşitli sensörler, ayrık giriş-çıkışların genişleticileri, dijital-analog ve analogdan dijitale dönüştürücüler ve diğer denetleyiciler.

    Üreticinin web sitesi aktarım hızı hakkında yazmıyor. Ancak protokolün genel belgelerine göre en az 100 kbps olmalıdır.


    Şimdi I2C veri yolunun gerçekten ne kadar iyi olduğunu ve üzerindeki birkaç Arduino denetleyicisi arasında veri alışverişinin ne kadar zor olduğunu test etmek istiyorum.

    Üç denetleyici alacağım, onları bir I2C veriyoluna bağlayacağım ve bunun üzerinden nasıl veri alışverişi yapacağımı bulacağım. İlk kontrolör master, diğer ikisi ise slave olacaktır.

    Verileri görüntülemek için, aynı iletişim veriyoluna bağlanacak bir I2C modülü ile 1602 LCD göstergesi kullanacağım.

    Ana denetleyici, ikinci ve üçüncü denetleyicileri sırayla yoklayacaktır. İlk kontrolör alınan verileri göstergede göstermelidir. Arduino Nano köleleri 1 zaman/sn sıklıkta yoklanacaktır.

    Bağlantı şeması

    4 cihazın her birinden dört kablo paralel bağlanmalıdır. Sonuç A4 arduino panoları Nano, I2C protokolü SDA veriyoludur ve A5, SCL'dir.

    Kolay bağlantılar için Nano kontrolörler için montaj kalkanları kullanacağım.

    Güç, denetleyicilerden birine basit bir şekilde sağlanacaktır. küçük USB giriş.

    I2C ağındaki LCD adresi varsayılan olarak 27'dir.İkinci kontrolör için adresi 2, üçüncü kontrolör için 3 olarak ayarladık.Baştaki ilk kontrolör için adrese gerek yoktur.

    Denetleyici programı - sihirbaz.

    #katmak #katmak // 16 karakter ve 2 satırlık bir ekran için LCD adresini 0x27 olarak ayarlayın LiquidCrystal_I2C lcd(0x27, 16, 2); int nano1=0; int nano2; int nano3; void setup() ( Serial.begin(9600); // LCD'yi başlat lcd.begin(); // Siyah ışığı aç ve bir mesaj yazdır. lcd.backlight(); ) void loop() ( lcd.setCursor( 0, 0); lcd.print(nano1); Wire.requestFrom(2, 2); // bağımlı cihaz #8'den 6 bayt iste int i=0;nano2=0; while (Wire.available()) ( / / köle istenen bayttan daha az gönderebilir c = Wire.read(); // Serial.print(c) karakteri olarak bir bayt alır; if (i==0) nano2 = ((c & 0xff)<< 8); else nano2 = nano2 | c; i++; } Serial.println(""); Serial.println(nano2); lcd.setCursor(9, 0); lcd.print(nano2); delay(100); Wire.requestFrom(3, 2); // request 6 bytes from slave device #8 i=0;nano3=0; while (Wire.available()) { // slave may send less than requested byte c = Wire.read(); // receive a byte as character Serial.print(c); if (i==0) nano3 = ((c & 0xff) << 8); else nano3 = nano3 | c; i++; } lcd.setCursor(0, 1); lcd.print(nano3); delay(100); nano1++; delay(800); }

    Birinci denetleyici, tamsayı türü değişkenini değiştirir ve değerini göstergede görüntüler. Ayrıca sırasıyla 2. ve 3. adreslerle köleyi sorgular. Onlardan iki bayt bilgi ister, onları bir tamsayı değişkenine dönüştürür. Sonuç olarak, ilk denetleyicide üç Nano'dan üç değişken dönüyor ve bunları göstergede görüntüleyebilir.

    İkinci kontrol programı

    #katmak int nano2=0; bayt yüksek; void setup() ( Wire.begin(2); // i2c veriyoluna #8 adresiyle katılın Wire.onRequest(requestEvent); // olayı kaydet) void loop() ( delay(1000); nano2--; ) // master tarafından her veri istendiğinde yürütülen işlev // bu işlev bir olay olarak kaydedilir, bkz. setup() void requestEvent() ( high = (nano2 >>

    Üçüncü Arduino Nano Programı

    #katmak int nano2=0; bayt yüksek; void setup() ( Wire.begin(3); // i2c veriyoluna #8 adresiyle katılın Wire.onRequest(requestEvent); // olayı kaydet) void loop() ( delay(1500); nano2--; ) // master tarafından veri istendiğinde yürütülen işlev // bu işlev bir olay olarak kaydedilir, bkz. setup() void requestEvent() ( high = (nano2 >> 8); high = (nano2 & 0xff); Wire.write(high) ); // 2 baytlık mesajla cevap ver Wire.write(high); )

    Son iki program, Wire.begin(3) işlevindeki adrese göre farklılık gösterir; ve değişkenin değişim oranı.

    Bu programlar sürekli tamsayı değişkenini değiştirir ve master'dan bir istek bekler. İstendiğinde, bu değişken iki bayta ayrıştırılır ve ana denetleyiciye isteğe yanıt olarak gönderilir.

    Bu sayede I2C haberleşme işlemi LCD üzerinde üç değişkenin değişen değerleri ile izlenebilir.

    sonuçlar

    Her şey yolunda gidiyor - ekrandaki sayılar değişiyor. İkinci ve üçüncü arasındaki kabloyu uzatmaya çalıştım. Arduino denetleyicileri. 3 m uzunluğundaki iletişim veri yolunun ön gerilim olmadan çalışmasını kontrol ettim. Artık denemedim ama birçok kişi bana I2C'nin 0,5 ... 2 m'nin ötesinde çalışmadığını söyledi ve ben de 3 m uzunluğundan ilham aldım.

    Kendi adıma, üç Nano arasında böyle bir bağlantıyı nereye uygulayacağımı zaten görüyorum.

    Master'dan slave'e veri aktarımını henüz denemedim. Denerseniz lütfen abone olun.

    Buradaki dezavantajlar kısa mesafelerüstünlükten belirgin şekilde daha az.

    Arduino, günümüzde oldukça popüler olan I2C de dahil olmak üzere birçok veri aktarım arayüzünü desteklemektedir. Bir zamanlar bu iletişim protokolü Philips tarafından icat edilmiş ve patentli “I2C” adı altında tescillenmiş, TWI, 2 hatlı arayüz isimleri altında da karşılayabilirsiniz ama hepsi aynı prensipte çalışıyor.

    I2C veri yolunun tüm noktası, büyük (128) miktarda asabilmenizdir. çeşitli cihazlar, sıcaklık sensörlerinden mikrodenetleyicilere.

    Ancak aynı zamanda, I2C, temel çalışma ilkeleri nedeniyle hız açısından UART ve SPI'den daha düşüktür, çünkü. iki çizgi her zaman dirençlere (Vcc) kadar çekilir, bu da grafikte hayır elde ettiğimiz anlamına gelir. dikdörtgen darbeler, ancak yamuk, yukarıdakinin aksine.

    SDA - bilgi aktarımından sorumludur (aktarım başlangıcı, adres, veri)
    SCL - otobüs saati

    I2C cihazlarında Master ve Slave olmak üzere iki tip olabilir.

    Şimdi standart Wire.h kitaplığını kullanarak programlamanın temel ilkelerini inceleyelim:

    Wire.begin(uint8_t adresi) - cihazı başlatmak için kullanılır, bağımlı modda adresi girmeniz gerekir, ana modda Wire.begin() . Tel yerine başka herhangi bir kelime kullanılabilir.

    Wire.requestFrom(uint8_t adresi, uint8_t miktarı) - belirli bir cihazdan (7 bit adres) belirli sayıda bayt alma isteği. Okunan bayt sayısını döndürür.

    Wire.beginTransmission(uint8_t adresi) - iletimin başlangıcı

    Wire.endTransmission() - iletimin sonu, hata numarası veya başarı(0) döndürür

    Wire.write(uint8_t verisi) - tek bir baytın (değer), birkaç baytın (dize), belirli bir uzunluktaki bir dizinin (veri, uzunluk) değerini alabilir. Şunlar arasında yer alır: beginTransmission ve endTransmission. Yazılan bayt sayısını döndürür.

    Wire.available() - İşleme için uygun bayt sayısını döndürür. requestFrom'dan sonra master tarafından çağrılır.

    Wire.read() - Köleden bir bayt okur. requestFrom'dan sonra yazılır.

    Standart bir düzenleyici ile birlikte geldiği için kitaplıkları Arduino IDE'ye bağlamak zor değildir.

    Birkaç işlev daha var, ancak bence bu temel bilgiler başlamak için yeterli, ayrıca hemen hemen her çevre birimi için bir kitaplık bulabilirsiniz.

    Örneğin, ivmeölçer ve jiroskop Gy-521'in bağlantısını ve çalışmasını düşünün.

    Şemaya göre bağlanıyoruz (çekme dirençleri modüle yerleştirilmiştir):

    Modül hem 3,3 volttan hem de 5'ten çalışabilir.

    #katmak // i2c arabirimi ile çalışmak için kitaplığı bağlayın const int MPU_addr = 0x68; // I2C adresi GY-521 int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ; // değerleri yazmak için değişkenler kurulumu geçersiz kılar() ( Wire.begin(); // i2c veri yolunu başlat Wire.beginTransmission(MPU_addr); // iletimi başlat Wire.write(0x6B); // başlatmak için belirli kayıtları yaz Wire modülü.write(0); // modülü uyandırmak için null gönder Wire.endTransmission(true); Serial.begin(9600); ) void loop() ( Wire.beginTransmission(MPU_addr); Wire.write(0x3B) ; // bu kayıttan başla Wire.endTransmission(false); Wire.requestFrom(MPU_addr, 14, true); // tüm kayıtları oku AcX = Wire.read()<< 8 | Wire.read(); // 0x3B AcY = Wire.read() << 8 | Wire.read(); // 0x3D AcZ = Wire.read() << 8 | Wire.read(); // 0x3F Tmp = Wire.read() << 8 | Wire.read(); // 0x41 GyX = Wire.read() << 8 | Wire.read(); // 0x43 GyY = Wire.read() << 8 | Wire.read(); // 0x45 GyZ = Wire.read() << 8 | Wire.read(); // 0x47 Serial.print("AcX = "); Serial.print(AcX); // выводим данные в Serial Serial.print(" | AcY = "); Serial.print(AcY); Serial.print(" | AcZ = "); Serial.print(AcZ); Serial.print(" | Tmp = "); Serial.print(Tmp / 340.00 + 36.53); // выводим температуры по формуле Serial.print(" | GyX = "); Serial.print(GyX); Serial.print(" | GyY = "); Serial.print(GyY); Serial.print(" | GyZ = "); Serial.println(GyZ); delay(333); }

    Arduino LCD ekran, sensörlerden gelen verileri görsel olarak görüntülemenizi sağlar. Size bir LCD monitörü I2C aracılığıyla Arduino'ya nasıl doğru şekilde bağlayacağınızı anlatacağız ve LCD 1602'yi başlatmak ve kontrol etmek için temel komutlara bakacağız. Ekranda metin bilgilerini görüntülemek için C ++ programlama dilindeki çeşitli işlevlere de bakacağız. Arduino projelerinde sıklıkla kullanılması gerekli olan .

    Video. Arduino LCD Ekran I2C 1602

    Arduino'ya LCD 1602 I2C bağlantısı

    I2C, I²C veya IIC (İngiliz Inter-Integrated Circuit) olarak bilinen elektronik cihazların içindeki entegre devreleri bağlamak için seri iki telli bir veriyoludur. I²C, Philips tarafından 1980'lerin başında kontrol elektroniğindeki (ana kart bilgisayarlar, cep telefonları vb.) devreler arasındaki dahili iletişim için basit bir 8 bitlik veri yolu olarak geliştirildi.

    Basit bir I²C sisteminde, birden fazla bağımlı cihaz ve veri aktarımını başlatan ve sinyali izleyen bir ana cihaz olabilir. SDA (veri hattı) ve SCL (saat hattı) hatlarına birkaç bağımlı cihaz bağlanabilir. Genellikle ana cihaz Arduino denetleyicisidir ve bağımlı cihazlar gerçek zamanlı saat veya LCD Ekrandır.

    LCD 1602'yi Arduino'ya I2C aracılığıyla bağlama

    I2C modüllü 1602 LCD ekran, Arduino kartına sadece 4 kablo - 2 veri kablosu ve 2 güç kablosu ile bağlanır. 1602 ekranı, I2C veri yolu için standart olarak bağlanır: çıkış SDA A4 bağlantı noktasına bağlanır, çıkış SCL– A5 bağlantı noktasına. LCD ekran, Arduino'daki +5V bağlantı noktasından beslenir. Daha fazla ayrıntı için aşağıdaki fotoğraftaki 1602 LCD monitör bağlantı şemasına bakın.

    Ders için aşağıdaki ayrıntılara ihtiyacımız var:

    • kart Arduino Uno / Arduino Nano / Arduino Mega;
    • LCD monitör 1602;
    • 4 telli "baba-anne".

    LCD monitörü I2C üzerinden Arduino'ya bağladıktan sonra kütüphaneyi kurmanız gerekecektir. LiquidCrystal_I2C.h I2C arabirimi ve kitaplığı aracılığıyla LCD ekranla çalışmak Wire.h(standart Arduino IDE programında mevcuttur). I2C modülü ile LCD 1602 için LiquidCrystal_I2C.h çalışma kitaplığını Google Drive'dan doğrudan bir bağlantı aracılığıyla web sitemizdeki Arduino Kitaplıkları sayfasından indirebilirsiniz.

    I2C ile 1602 ekranı için taslak

    #katmak // cihazları I2C aracılığıyla kontrol etmek için kütüphane#katmak // LCD 1602 için kitaplığı bağlayın LiquidCrystal_I2C lcd(0x27,20,2); // 20x2 ekrana lcd adı atayın geçersiz kurulum() // prosedür kurulumu( lcd.init(); // LCD ekranın başlatılması lcd.arka ışık(); // ekran arka ışığını aç lcd.setCursor(0,0); // imleci ilk satırın 1 karakterine getirin lcd.print("SEVİYORUM"); // mesajı ilk satıra yazdır lcd.setCursor(0,1); // imleci ikinci satırın 1 karakterine getirin lcd.print("ARDUINO"); // mesajı ikinci satıra yazdır) geçersiz döngü () // prosedür döngüsü ( /* bu çok satırlı bir yorumdur // başlangıçta void loop() prosedürü çizimde kullanılmaz lcd.noDisplay(); // LCD arka ışık gecikmesini kapat(500); // lcd'yi duraklat.ekran(); // LCD arka ışık gecikmesini açın(500); // Duraklat */ }

    Kod için açıklamalar:

    1. LiquidCrystal_I2C.h kitaplığı, LCD ekranı I²C veri yolu aracılığıyla kontrol etmek için birçok komut içerir ve taslağı büyük ölçüde basitleştirmenize olanak tanır;
    2. çizim, programdaki birkaç satırı aynı anda yorumlamanıza izin veren çok satırlı bir açıklama /* ... */ içerir.
    3. bilgileri ekranda göstermeden önce setCursor(0,1) komutu ile imleç konumunu ayarlamalısınız, burada 0 satırdaki karakter numarası, 1 satır numarasıdır.

    Bir metin operatör paneli (HMI) yapmaya ve onu "kare" I2C veri yolu üzerinden Arduino'ya bağlamaya karar verdim. Bunu yapmak için PCF8574P çipini temel alan 5 düğmeli bir klavye kartı geliştirdim.

    PCF8574P, I2C veriyolunda çalışan bir bağlantı noktası genişletici, DIP paketidir. Çin'den ücretsiz kargo ile 0,94 dolara bu çiplerden iki parti satın aldım, yani bir parçanın fiyatı 0,47 dolardır. Yerel mağazalarda aynı mikro devrelerin her biri 2 dolardan fazlaya mal olduğu için satın alma karlı.

    HMI ekranı standart bir 1602 ekran olacaktır ve FC-113 eşarbı aracılığıyla kare bir veri yolu üzerinde de çalışır.

    PCF8574P gönderildi, bir parça numarası verdiler ve 2 hafta sonra onları postayla aldım.


    Plastik tüpten çıkarıyoruz, her şey yolunda görünüyor.


    Bununla birlikte, mikro devrelerden birinin kasasının altında gizemli termomekanik etkilerin izleri var.


    Bu hasarların niteliği benim için net değil ama transfer sırasında ortaya çıkamayacakları açık.

    Aklıma gelene kadar bu bilmeceyi uzun süre düşündüm.
    Sadece Luke Skywalker satıcının deposuna gitti, aniden mikroskobik bir boyuta küçüldü. Orada iskele genişleticilerden birini gördü, onu bir İmparatorluk yürüyüşçüsü zannetti ve ışın kılıcıyla ona saldırmaya başladı. Sonra bir toplayıcı geldi, bu resmi gördü ve şöyle dedi: "Kes şunu, Luke Skywalker! Bu bir emperyal yürüteç değil, bu bir PCF8574P çipi ve ücreti zaten Zaporozhye'den ödenmiş."

    En azından, test sırasında her iki mikro devrenin de çalıştığı ortaya çıktı.

    Bu şemaya göre klavyenin kendisini oluşturmaya başlayalım.


    Düzen 6.0'da tek taraflı bir tahta çizdim.


    Dosyayı pano ile indirebilirsiniz.

    Tahtayı hidrojen peroksit ve sitrik asitle zehirledim.

    İnternette tahtayı peroksitle aşındırmak için birçok tarif var.
    Bu solüsyonu yaptım: 100 ml %3 hidrojen peroksit, 50 gr sitrik asit, 3 çay kaşığı tuz. Bir tencere su içinde bir kavanoz peroksit ısıttı.

    Peroksit ile aşındırırken önerildiği gibi, tahtayı desen aşağı gelecek şekilde çözeltiye daldırıyoruz.

    Pşşşşşşşşşşşşşşşşşşşşşşşşşşşşş İlk başta, süreç çalkantılı.


    Ps ... Sonra fark edilir şekilde azalır. Arkanı dön, resme bak.


    Güzellik.


    Bitmiş tahta böyle görünüyor.




    Mikro devrenin adres pinleri GND'ye bağlı olduğundan veri yolu üzerindeki kart adresi 0x20 olacaktır.

    Arduino için program yazıyoruz.

    #katmak
    #katmak

    # led 13'ü tanımla
    #ADDR_KBRD 0x20'yi tanımla
    #ADDR_LCD 0x27'yi tanımla

    Dizi dizisi;
    bayt dio_in;
    bool b;
    ahmak;

    LiquidCrystal_I2C lcd(ADDR_LCD,16,2); // Ekranı ayarla

    geçersiz kurulum()
    {
    pinMode(13, ÇIKIŞ);
    lcd.init();
    lcd.backlight();//Ekranın arka ışığını aç
    Wire.begin();

    Wire.beginTransmission(ADDR_KBRD);
    Wire.write(B11111111);
    Wire.endTransmission();
    Serial.begin(9600);
    }
    boşluk döngüsü()
    {
    Wire.requestFrom(ADDR_KBRD,1);
    while(!Wire.available());
    bayt dio_in = Wire.read(); //PCF8574P portlarının durumunu oku
    bayt maskesi=1;
    for(int i=0; ben<5;i++)
    {
    key[i]=!(dio_in & mask);
    maske=maske<<1;
    }

    Str=Dize(dio_in, BIN); //
    Seri println(str);

    B=!b;
    digitalWrite(led, b);

    //
    lcd.setCursor(0, 0);
    lcd.print(String(key)+" "+
    Dize(tuş)+" "+
    Dize(tuş)+" "+
    Dize(tuş)+" "+
    Dize(tuş)+" "
    );
    gecikme(100);
    }


    Programı Arduino'ya yükleyip oluşturulan klavye kartına ve ekrana bağlıyoruz.

    Açın, işe yarıyor!


    HMI'm sadece bir Arduino ile değil, Arduino uyumlu bir PLC ile çalışacak. Okurlardan ilham ve ilgi gelirse bir şekilde yazarım.

    PCF8574P'nin Artıları:
    1. Minimum çemberleme.
    2. Çalışması kolay.

    PCF8574P'nin Eksileri:
    Başka bir satıcıdan almanızı tavsiye etmeme rağmen mikro devrenin kendisini bulamadım.

    Bu, PCF8574P çipinin incelemesini sonlandırıyor.
    Ama deneyimli bir gözlemci olarak, peşin Sorulacak soruları cevaplayacağım:

    Neden bir DIP paketinde? SIC daha iyidir.
    Diğer şeyler eşit olduğunda, DIP'i tercih ederim, onlarla benim için daha kolay.

    DIP ve çıkış elemanları yalnızca lamerler tarafından kurulur, tüm uzmanlar SOIC ve SMD kullanır. Bu yüzden sadece SMD'yi lehimliyorum ve genel olarak işim bitti.
    Aferin.

    Neden aliexpress'te 1602 ekran ve 5 düğmeli klavye ile hazır bir modül satın almıyorsunuz? Ayrıca I2C üzerinde çalışır.
    Fiyatı 11 dolardan başlıyor.
    Ben harcadım:
    Ekran 1602 - $1,3
    FC-113 kartı - 0,55 ABD doları
    Çip PCF8574P - 0,47 ABD doları
    Düğmeler ve kapaklar - 0,7 $
    Levha dağlama için reaktifler - 0,3 $
    Textolite, dirençler ve diğer küçük şeyler - eski stoklardan ücretsiz.
    Toplam: 3,32 $
    Ama asıl önemli olan, üzerlerine güzel renkli kapaklar koymak için tahtama kare düğmeli düğmeler koymam.

    Vay canına, sadece bir PCF8574P çipinin maliyeti neredeyse bütün bir FC-113 kartı kadar!
    Evet…

    Her şeyi yanlış yaptın. Yanlış boyandı, yanlış çözüme yanlış kazındı ve yanlış düğmeleri koydu. Senin yerinde olsaydım, her şeyi doğru yapardım.
    Aferin.

    Beşinci düğme neden diğerlerinden bu kadar uzakta?
    Bu özellikle böyledir, işlevsel olarak farklıdırlar. Bu dördü sol, sağ, iptal, giriş ve beşincisi KURULUM olacaktır.

    Luke Skywalker hakkında daha heyecan verici bir hikaye bekliyordum, beni kandırdın!
    Bitirdim.

    I2C veri alışverişi protokolü bir zamanlar Philips tarafından geliştirilmiştir. I2C adı İngilizce Iner-IC kontrolden gelir veya başka bir deyişle inter-chip kontrol, Inter-IC, IIC (I2C) aynı protokolün adıdır.

    Bu protokol veya arayüz, birkaç farklı cihazdan yüksek kaliteli bilgi (veri) alımı ve iletimi sağlar; örneğin, sıcaklığı ölçebilir ve aynı anda bir dijital potansiyometreyi kontrol edebilirsiniz. İletişim programlı olarak gerçekleşir, sensörle I2C protokolü aracılığıyla iletişim kurma algoritması Arduino programına (taslak) yazılır.

    Diğer cihazları bağlamanıza izin veren özel adaptörler vardır, örneğin bir adaptöre sahipseniz, iki kablo aracılığıyla i2c protokolünü kullanarak bir arduino 1602 (16x2) LCD ekran bağlayabilirsiniz. LCD i2c'nin isteği üzerine internette pek çok bilgi var, işte ekran adaptörünün nasıl görünmesi gerektiğine dair bir örnek http://www.ebay.com/itm/310565362720

    Bu arayüz üzerinde çalışırken, bir cihaz master, diğeri ise slave'dir. Ana cihaz iletimi başlatır ve senkronizasyon için gerekli sinyalleri üretir.

    Vema ise master'a bağlıdır ve sadece master'dan bir komut aldıktan sonra veri aktarımını başlatır.

    I2C veriyoluna bağlı cihazın kendine özgü bir adresi vardır. Ana cihaza bu adresten erişilir.

    I2C protokolünü kullanarak sensörleri bağlama örneği

    Bağlantı iki kablo üzerinden yapılır: SCL - saat sinyali veya saat sinyali ve SDA - veri sinyali. Aynı zamanda, kendi benzersiz kimliğine sahip herhangi bir sayıda farklı sensör (bağımlı cihaz) I2C veriyoluna bağlanabilir.

    Tanışma, bu amaçlar için özel olarak yazılmış, adı Wire olan bir kütüphane ile başlar. Çalışmaya başlamadan önce projeye aktarılmalıdır, cihazlarla "iletişim kurmak" için özel komutları veya yöntemleri vardır.

    Cihazlarla veri alışverişi yapmak için kimliklerini bilmeniz gerekir. Farklı aygıtların 8 veya 7 bitlik farklı adres uzunlukları (id) olabilir.Wire kitaplığı 7 bitlik adresleme kullanır.

    Slave cihazlar Arduino kartındaki pinlere bağlanır. Arduino'nun her sürümünün kendi I2C pinleri vardır.

    • UNO - A4(SDA), A5(SCL);
    • Büyük - 20(SDA), 21(SCL);
    • Leonardo- 2(SDA), 3(SCL);
    • Vadesi - 20(SDA), 21(SCL),SDA1,SCL1;

    Wire kitaplığını kullanarak bir dijital potansiyometreyi kontrol etmek için örnek program kodu

    Bu örnek, Wire kitaplığı kullanılarak bir dijital potansiyometrede belirli bir direnç değerinin nasıl ayarlanacağını gösterir. Belirli bir değerin ayarlanması, val değişkeni kullanılarak yapılır.

    #katmak void setup() ( Wire.begin(); // i2c bus'a katılın (master için adres isteğe bağlıdır) ) byte val = 0; void loop() ( Wire.beginTransmission(44); // cihaz #44'e ilet (0x2c) // cihaz adresi veri sayfasında belirtilir Wire.write(byte(0x00)); // talimat baytını gönderir Wire.write(val ); // potansiyometre değeri byte'ı gönderir Wire.endTransmission(); // val++ iletimini durdurur; // artan değer if (val == 64) // eğer 64. konuma ulaşılırsa (max) ( val = 0; // baştan başla en düşük değer ) gecikme(500); )

    I2C ve Arduino çalışmasının videosu. Bölüm 1