• Arduino denetleyicilerine fiziksel olarak yerleştirilmiş en uygun iletişime bakalım

    10 Ohm'dan 1 MOhm'a kadar derecelendirmelerle);

  • 4,7 kOhm'luk 2 direnç (aynı setten);
  • kabloları bağlamak (örneğin, burada iyi bir set var);
  • Arduino IDE'li bilgisayar.
  • 1 Tanım I2C arayüzü

    Seri IIC (I2C - Inter-Entegre Devreler olarak da bilinir), verileri iletmek için seri veri yolu adı verilen iki çift yönlü iletişim hattını kullanır. SDA (Seri Veri) ve saatli otobüs SCL (Seri Saat). Ayrıca iki adet elektrik hattı bulunmaktadır. SDA ve SCL veri yolları dirençler aracılığıyla güç veriyoluna çekilir.

    En az bir tane çevrimiçi var ana cihaz Veri aktarımını başlatan ve senkronizasyon sinyalleri üreten. Ağ aynı zamanda bağımlı cihazlar liderin isteği üzerine veri ileten. Her bir köle aygıtının, ana aygıta erişmek için kullanılan benzersiz bir adresi vardır. Cihaz adresi veri sayfasında belirtilmiştir. Bir I2C veriyoluna birkaç master dahil olmak üzere 127'ye kadar cihaz bağlanabilir. Cihazlar çalışma sırasında veri yoluna bağlanabilir; çalışırken takmayı destekler.

    I2C protokolü üzerinden değişimin zamanlama şemasına bakalım. Birkaç farklı seçenek var, en yaygın olanlardan birine bakalım. SCL ve SDA veri yollarına bağlı bir mantık analizörü kullanalım.

    Master değişimi başlatır. Bunu yapmak için saat darbeleri üretmeye başlar ve bunları 9 parçalık bir paket halinde SCL hattı boyunca gönderir. Aynı zamanda SDA veri hattında cihaz adresi, ilk 7 saat darbesi ile saatlenen iletişimin kurulmasının gerekli olduğu (bu nedenle adres aralığındaki kısıtlama: 2 7 = 128 eksi sıfır adres). Mesajın bir sonraki kısmı şu: işlem kodu(oku veya yaz) ve bir bit daha - teşekkür biti(ACK) bağımlı cihazın isteği kabul ettiğini gösterir. Onay biti gelmezse değişim sona erer. Veya master tekrarlanan istekler göndermeye devam ediyor.

    Bu, aşağıdaki şekilde gösterilmektedir.Örneğin, ilk durumda, köle cihazın veriyolundan bağlantısını keselim. Master'ın 0x27 adresli cihazla iletişim kurmaya çalıştığı ancak onay (NAK) almadığı görülüyor. Değişim sona erer.


    Şimdi bağımlı cihazı I2C veri yoluna bağlayın ve işlemi tekrarlayın. Durum değişti. Adresi içeren ilk paket, köleden bir onay (ACK) aldı. Değişim devam etti. Bilgiler ayrıca 9 bitlik paketler halinde iletilir, ancak artık 8 bitlik kısım işgal edilmektedir veri ve 1 bit - teşekkür biti köle verinin her baytını alır. Herhangi bir anda bağlantı kesilirse ve onay biti gelmezse master iletimi durduracaktır.

    2 I2C uygulaması Arduino'da

    Arduino, I2C arayüzü üzerinden çalışmak için iki bağlantı noktası kullanır. Örneğin, Arduino UNO'su ve Arduino Nano'yu analog bağlantı noktası A4, SDA'ya karşılık gelir, analog bağlantı noktası A5, SCL'ye karşılık gelir.


    Diğer kart modelleri için pin yazışmaları aşağıdaki gibidir:

    3 Kütüphane "Tel" IIC ile çalışmak için

    I2C veri yolu üzerinden cihazlarla veri alışverişini kolaylaştırmak için Arduino için standart bir kütüphane yazılmıştır. Tel. Aşağıdaki işlevlere sahiptir:

    İşlevAmaç
    başlangıç(adres) kitaplığın başlatılması ve I2C veri yoluna bağlanma; adres belirtilmezse bağlı cihaz ana cihaz olarak kabul edilir; 7 bitlik adresleme kullanılır;
    requestFrom() master tarafından köleden belirli sayıda bayt talep etmek için kullanılır;
    İletime başla(adres) belirli bir adresteki köle cihaza veri aktarımının başlatılması;
    endTransmission() köleye veri aktarımının durdurulması;
    yazmak() bir talebe yanıt olarak ikincil cihazdan verilerin kaydedilmesi;
    mevcut() köleden alınabilecek bilginin bayt sayısını döndürür;
    Okumak() bir köleden efendiye veya bir efendiden bir köleye iletilen bir baytın okunması;
    onReceive() köle, yöneticiden bir iletim aldığında çağrılması gereken bir işlevi belirtir;
    istek üzerine() Master, Slave'den bir iletim aldığında çağrılması gereken bir fonksiyonu belirtir.

    4 Bir I2C cihazını bağlama Arduino'ya

    I2C veri yolu ile nasıl çalışılacağını görelim Arduino'yu kullanma.

    Öncelikle şekildeki gibi bir devre kuralım. LED'in parlaklığını, I2C veriyoluna bağlı 64 konumlu dijital potansiyometre AD5171'i (teknik açıklamaya bakın) kullanarak kontrol edeceğiz. Potansiyometreye ulaşacağımız adres 0x2c'dir (ondalık sistemde 44).


    5 Cihaz yönetimi IIC veriyolu aracılığıyla

    Şekilde sunulan AD5171 dijital potansiyometre ile bilgi alışverişi şemalarını göz önünde bulundurun. Teknik Açıklama:


    Kayıt defterine veri yazma şemasıyla ilgileniyoruz RDAC. Bu kayıt potansiyometrenin direncini kontrol etmek için kullanılır.

    "Wire" kütüphanesinin örneklerinden bir çizim açalım: Dosya Örnekleri Wire digital_potentiometer. Arduino hafızasına yükleyelim.

    #katmak // "Wire" kütüphanesini bağlayın byte val = 0; // potansiyometreye aktarılacak değer geçersiz kurulum() ( Wire.begin(); // I2C veri yoluna master olarak bağlanın } geçersiz döngü() ( Wire.beginTransmission(44); // I2C adresi "44" (0x2C) olan bir cihazla alışverişi başlatalım Wire.write(byte(0x00)); // RDAC kaydına bir yazma talimatı gönder Wire.write(val); // 64 konumlu potansiyometrenin konumunu ayarlayın Wire.endTransmission(); // I2C aktarımını tamamla val++; // değeri 1 artır if (val == 63) ( // potansiyometre maksimum değerine ulaştığında val = 0; // değeri sıfırla ) gecikme(500); }

    Açtıktan sonra LED'in parlaklığının döngüsel olarak nasıl arttığını ve sonra söndüğünü görüyorsunuz. Bu durumda I2C bus üzerinden Arduino kullanarak potansiyometreyi kontrol ediyoruz.

    Arduino birçok veri aktarım arayüzünü desteklemektedir, bunlardan biri de günümüzde oldukça popüler olan I2C'dir. Bir zamanlar bu iletişim protokolü Philips tarafından icat edilmiş ve patentli “I2C” adı altında tescil edilmiştir, siz de TWI, 2 hatlı arayüz isimleri altında bulabilirsiniz ancak hepsi aynı prensipte çalışır.

    I2C veriyolunun asıl amacı, çok sayıda (128) sayıda veri yolunu asabilmenizdir. çeşitli cihazlar sıcaklık sensörlerinden mikrokontrolörlere kadar.

    Ancak aynı zamanda I2C, temel çalışma prensipleri nedeniyle hız açısından UART ve SPI'den daha düşüktür, çünkü iki çizgi her zaman dirençlere (Vcc) doğru çekilir, bu da grafikte hiçbir sonuç elde edemeyeceğimiz anlamına gelir. kare darbeler ancak yukarıdakinin aksine yamuk şeklindedir.

    SDA - bilgilerin iletilmesinden sorumludur (iletimin başlangıcı, adres, veriler)
    SCL - veri yolu zamanlaması

    I2C'de cihazlar iki tipte olabilir: Master ve Slave

    Şimdi standardı kullanarak programlamanın temel prensiplerine bakalım. Tel kütüphaneleri.H:

    Wire.begin(uint8_t adresi) - cihazı başlatmak için kullanılır, köle modunda adresi girmeniz gerekir, ana modda Wire.begin() . Wire yerine başka herhangi bir kelimeyi kullanabilirsiniz.

    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ını veya başarıyı döndürür (0)

    Wire.write(uint8_t data) – tek bir bayt (değer), birkaç bayt (dize), belirli uzunlukta bir dizi (veri, uzunluk) değerini alabilir. Şunun arasında bulunur: beginTransmission ve endTransmission. Yazılan bayt sayısını döndürür.

    Wire.available() – işlenmek üzere mevcut bayt sayısını döndürür. Talepten sonra usta tarafından çağrıldı.

    Wire.read() – bağımlı cihazdan bir bayt okur. requestFrom'dan sonra yazılır.

    Kitaplıkları Arduino IDE'ye bağlamak, standart bir düzenleyiciyle birlikte geldiğinden zor değildir.

    Birkaç fonksiyon daha var ama başlangıç ​​için bu temel bilgilerin yeterli olduğunu düşünüyorum, ayrıca hemen hemen her çevre birimi için bir kütüphane bulabilirsiniz.

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

    Diyagrama göre bağlanıyoruz (modülün içine çekme dirençleri yerleştirilmiştir):

    Modül hem 3,3 volt hem de 5 voltta çalışabilir.

    #katmak // i2c arayüzüyle çalışmak için kütüphaneyi bağlayın const int MPU_addr = 0x68; // I2C adresi GY-521 int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ; // değer yazma değişkenleri void setup() ( Wire.begin(); // i2c veriyolunu başlat Wire.beginTransmission(MPU_addr); // aktarımı başlat Wire.write(0x6B); // başlatmak için belirli kayıtları yaz Wire modülü.write(0); // modülü uykudan uyandırmak için sıfır gönder Wire.endTransmission(true); Serial.begin(9600); ) void loop() ( Wire.beginTransmission(MPU_addr); Wire.write( 0x3B); // bu kayıtla başlayın 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); }

    Geliştirilmekte olan mikrodenetleyici tabanlı bir sistemin işlevselliği nasıl genişletilir? Evet, bu soru elektronik cihazların prototipleri üzerinde çalışan birçok devre tasarımcısını ilgilendiriyor. Şaşırtıcı bir şekilde, Philips mühendisleri tarafından 30 yılı aşkın bir süre önce geliştirilen veri yolu, devreyi değiştirmeden sisteme yeni bloklar eklemenize olanak tanıyacak.

    I2C arayüzü sayesinde bir mikrodenetleyiciyi, birkaç yüz mikro devreyi bağlayabileceğiniz basit bir yapı kitine dönüştürebilirsiniz. Sayılarının 400 pF'lik veriyolu kapasitansı ile sınırlı olduğunu hemen belirtmekte fayda var, ancak bu I2C'nin birkaç dezavantajından biridir.

    Dahili iletişim devresi - bugün hemen hemen her elektronik cihazda bulunabilen otobüsün adını bu şekilde çözebilirsiniz. Philips'in böyle pratik bir çözümün patentini aldığını ve diğer üreticilerin I2C'yi başka isimler altında kopyaladığını belirtmekte fayda var.

    Ekranların, kameraların ve cep telefonlarının dış dünyasıyla iletişim kurmak için kurulan bu veri yoludur. I2C kullanan cihazlara bağlanan çevresel cihazların sayısı genellikle sayılamaz. Arayüzün avantajları nelerdir?

    I2C'nin ana avantajları ve dezavantajları

    I2C, elektronik cihazların içindeki entegre devreler arasındaki iletişim için seri asimetrik bir veri yoludur. İki çift yönlü iletişim hattını (SDA ve SCL) kullanır.

    Veri yolu iki iletkenden oluşur ve arayüzü kontrol etmek için bir mikro denetleyici yeterlidir. Şaşırtıcı bir şekilde, bu kadar basitlik, çalışma sırasında mikro devreleri kapatmanıza izin verir. Özel bir yerleşik filtre, patlamalarla baş ederek işlenen bilgilerin güvenliğini sağlar.

    I2C'nin dezavantajları, sınırlı kapasiteye ek olarak, programlamadaki zorluğu ve düşük durum durumunda bir arızayı tanımlamadaki zorluğu içerir.

    Başlangıçta veri yolu hızı yalnızca 100 kbit'ti ve ona yalnızca 120 cihaz bağlanabiliyordu. 90'lı yıllarda standartlar değişti ve veri aktarım hızı 4 kat arttı ve 1000'e kadar mikro devreyi bağlamak mümkün hale geldi.

    Ancak çoğu arayüz üreticisi 120 cihazın bağlı olduğu 400 kbps hızında takılıp kalıyor.

    Bağlantı ve çalışma prensibi

    Bus iletkenleri 1-10k dirençlerle pozitife bağlanır, iletkenlerden biri veri yolu, diğeri ise saattir. Bu şema basit bir şekilde çalışır: hatta bir ana cihaz (mikrodenetleyici) ve birkaç çevresel cihaz vardır. Hatlar pozitif kutuptan beslendiğinden bağlı olan kölenin (slave elemanının) kabloyu yere bastırarak 0 iletmesi yeterlidir.

    Bir çevresel cihaz bir kabloyu serbest bıraktığında, kablo boyunca 1 iletilir Her şey temeldir, ancak ortak çalışma sırasında bağımlılardan biri 0 verirse, veri yoluna bağlı cihazların geri kalanının beklemesi gerekecektir. Mikrodenetleyici, hattın boş olup olmadığını önceden kontrol ettikten sonra saat ölçümü ve iletimi gerçekleştirir. Bunu yapmak için SCL ve SDA'ya 1 iletilir, ardından bir başlangıç ​​​​koşulu oluşturulur - SCL değeri 1'e eşit olduğunda SDA satırına basılır.

    Bir sonraki adım, erişilmesi gereken cihazın adresini aktarmaktır.

    Verilerin SCL = 1'de okunduğu ve iletimin en anlamlı bit ile ileri olduğu unutulmamalıdır.

    İlk 7 bit cihaz adresidir, 8 bit ise yazma (0) veya okuma (1) komutudur.

    Slave sekiz sinyalin tümünü alacak ve her şey onun için açıksa dokuzuncu SCL döngüsünde SDA hattına basacaktır. Aksi takdirde bir durdurma sinyali üretilir ve veriler tekrar iletilir. İş tamamlandığında SCL'ye dokunulmadan SDA satırı serbest bırakılır.

    Bağlı çip sinyali yavaş işlese bile SCL'yi tutmaya devam edecektir.

    Çoklu ana çalışma modu

    Devre tasarımında demokrasi konuları düzenlenmiştir. Ana cihazın işin sonucunu kontrol etme yeteneğine dayanmaktadır. Hattın serbest bırakılıp bırakılmadığını bir kez daha kontrol etmek gerekir; eğer serbest bırakılırsa, o anda master öndedir; değilse, o zaman daha önemli bir şey hala hattı tutuyor demektir. Bu durumda boşluk oluşana kadar beklemeniz ve ortaya çıktığında işinizi yapmanız gerekir.

    Ancak önde gelen tüm cihazların aynı anda meşgul olmaya karar vermesi oldukça olasıdır. Bu durumda şampiyonluk, zamanlamayı ilk başlatan ve bunu hızlı yapan ustanın olacaktır. Eğer iki cihaz süper eşzamanlı çalışıyorsa, rakibinden biraz daha hızlı 0 üreten cihaz ilk önce kazanacak.

    Wire kütüphanesinin açıklaması

    Bu kütüphane I2C/TWI cihazlarıyla etkileşime girmenizi sağlar. R3 düzenine (pin çıkışı 1.0) sahip Arduino kartlarında, SDA (veri hattı) ve SCL (saat hattı), AREF pininin yakınındaki pinlerde bulunur. Arduino Due'nin iki I2C/TWI arayüzü vardır: SDA1 ve SCL1, AREF pininin yakınında bulunur ve ek hatlar 20 ve 21 numaralı pinlerde bulunur.

    Aşağıdaki tablo TWI pinlerinin farklı Arduino kartlarında nerede bulunduğunu göstermektedir.

    Arduino 1.0'dan bu yana, bu kütüphane Stream işlevlerini miras alarak diğer okuma/yazma kütüphaneleriyle uyumlu hale getiriyor. Bu nedenle send() ve get() fonksiyonlarının yerini read() ve write() almıştır.

    Not

    I2C adreslerinin 7 ve 8 bitlik versiyonları bulunmaktadır. 7 bit cihazı tanımlar ve 8. bit cihazın yazıldığını mı yoksa okunduğunu mu belirler. Wire kütüphanesi 7 bitlik adresler kullanır. 8 bitlik bir adres kullanan bir veri sayfanız veya örnek kodunuz varsa, en az anlamlı biti çevirmeniz (yani değeri bir bit sağa kaydırmanız) gerekir, bu da 0'dan 127'ye kadar bir adres elde edilmesini sağlar. Ancak, 0'dan 127'ye kadar olan adresler 7, ayrılmış oldukları için kullanılmaz, dolayısıyla kullanılabilecek ilk adres 8'dir. SDA/SCL pinlerini bağlarken çekme dirençlerinin gerekli olduğunu unutmayın. Daha fazla ayrıntı için örneklere bakın. MEGA 2560 kartının 20 ve 21 numaralı pinlerinde çekme dirençleri vardır.

    Yöntemlerin açıklaması

    Wire.begin()

    Tanım

    Wire kütüphanesini başlatır ve I2C veri yoluna ana veya yardımcı olarak bağlanır. Genellikle yalnızca bir kez çağrılmalıdır.

    Sözdizimi

    Wire.begin(adres)

    Seçenekler

    adres: bağımlı cihazın 7 bitlik adresi (isteğe bağlı); belirtilmediği takdirde kart, veri yoluna master olarak bağlanır.

    Geri dönüş değeri

    Örnek

    Yardımcı cihaz örnekleri için onReceive() ve onRequest() yöntemlerine ilişkin örneklere bakın. Ana cihaz örnekleri için diğer yöntemlerin örneklerine bakın. .

    Wire.requestFrom()

    Tanım

    Master tarafından köleden bayt talep etmek için kullanılır. Bu baytlar, Available() ve Read() yöntemleri kullanılarak elde edilebilir.

    Bu argüman true ise requestFrom(), istekten sonra bir STOP mesajı göndererek I2C veriyolunu serbest bırakır.

    Bu argüman false ise requestFrom(), istekten sonra bir RESTART mesajı gönderir. Veri yolu serbest bırakılmaz, bu da başka bir ana cihazın mesajların arasına girmesini engeller. Bu, bir yöneticinin veri yolunu kontrol ederken birden fazla istek göndermesine olanak tanır.

    Sözdizimi

    Wire.requestFrom(adres, miktar)

    Wire.requestFrom(adres, miktar, durak)

    Seçenekler

    • adres: Baytların talep edildiği cihazın 7 bitlik adresi;
    • miktar: talep edilen bayt sayısı;
    • dur: boolean. true istekten sonra bir STOP mesajı gönderir. false istekten sonra bir YENİDEN BAŞLAT mesajı göndererek bağlantıyı aktif tutar.
    Geri dönüş değeri

    bayt: köleden döndürülen bayt sayısı.

    Örnek

    Wire.beginTransmission()

    Tanım

    Verilen adresle I2C bağımlı cihazına aktarımı başlatır. Bundan sonra iletilecek bayt dizisi write() işlevi kullanılarak kuyruğa alınır ve endTransmission() çağrısı kullanılarak iletilir.

    Sözdizimi

    Wire.beginTransmission(adres)

    Seçenekler

    adres: Verilerin aktarılması gereken cihazın 7 bitlik adresi.

    Geri dönüş değeri

    Örnek

    Wire.endTransmission()

    Tanım

    BeginTransmission() yöntemiyle başlatılan yardımcı öğeye iletimi tamamlar ve write() yöntemi tarafından kuyruğa alınan baytları aktarır.

    Arduino 1.0.1'den bu yana, belirli I2C cihazlarıyla uyumluluk sağlamak amacıyla requestFrom(), davranışını değiştiren bir boolean veri türü argümanını kabul eder.

    Bu argüman true ise, requestFrom() iletimden sonra bir STOP mesajı göndererek I2C veriyolunu serbest bırakır.

    Bu argüman false ise, requestFrom() iletimden sonra bir YENİDEN BAŞLAT mesajı gönderir. Veri yolu serbest bırakılmaz, bu da başka bir ana cihazın mesajların arasına girmesini engeller. Bu, bir master'ın veriyolunu izlerken birden fazla iletim göndermesine olanak tanır.

    Varsayılan olarak bu argüman doğrudur.

    Sözdizimi

    Wire.endTransmission()

    Wire.endTransmission(durdur)

    Seçenekler

    dur: boolean. true iletimden sonra bir STOP mesajı gönderir. false iletimden sonra bir YENİDEN BAŞLAT mesajı göndererek bağlantıyı aktif tutar.

    Geri dönüş değeri

    aktarım durumunu gösteren bayt:

    • 0: başarı;
    • 1: Veriler iletim arabelleğini dolduramayacak kadar uzun;
    • 2: Adres gönderilirken alınan NACK;
    • 3: Veri gönderilirken alınan NACK;
    • 4: diğer hatalar.
    Örnek

    write() yöntemi için örneğe bakın.

    Wire.write()

    Tanım

    Ana birimden gelen bir isteğe yanıt olarak ikincil birimden veri yazar veya ana birimden ikincil öğeye iletim için baytları kuyruğa alır (beginTransmission() ve endTransmission() çağrıları arasında).

    Sözdizimi

    Wire.write(değer)

    Wire.write(dize)

    Wire.write(veri, uzunluk)

    Seçenekler

    • değer: aktarılacak değer, bir bayt.
    • dize: iletilecek dize, bir bayt dizisi.
    • veri: aktarılacak veri dizisi, bayt.
    • uzunluk: aktarılacak bayt sayısı.
    Geri dönüş değeri

    bayt: write() yazılan bayt sayısını döndürür, ancak bu sayının okunması gerekli değildir.

    Örnek #include bayt değeri = 0; void setup() ( Wire.begin(); // i2c veriyoluna bağlanın ) void loop() ( Wire.beginTransmission(44); // cihaz #44'e transfer (0x2c) // cihaz adresi Wire'da belirtildi teknik açıklama. write(val); // değer baytını gönder Wire.endTransmission(); // iletimi durdur val++; // değeri artır if(val == 64) // 64. değere ulaştıysak (max) ( val = 0; // baştan başla ) gecikme(500); )

    Wire.available()

    Tanım

    read() kullanılarak alınabilecek mevcut bayt sayısını döndürür. Bu yöntemin requestFrom() çağrıldıktan sonra ana sunucuda veya onReceive() işleyicisinin içindeki yardımcı sunucuda çağrılması gerekir.

    Sözdizimi

    Wire.available()

    Seçenekler

    Geri dönüş değeri

    Okuma için mevcut bayt sayısı.

    Örnek

    Read() yöntemi için örneğe bakın.

    Wire.read()

    Tanım

    requestFrom() çağrıldıktan sonra ikincil öğeden ana öğeye aktarılan veya ana öğeden ikincil öğeye aktarılan bir baytı okur.

    Sözdizimi

    Seçenekler

    Geri dönüş değeri

    bayt: alınan sonraki bayt.

    Örnek #include bayt değeri = 0; void setup() ( Wire.begin(); // i2c veri yoluna bağlanın (ana adres isteğe bağlıdır) Serial.begin(9600); // seri bağlantı noktasını çıkış için yapılandırın) void loop() ( Wire.requestFrom(2) , 6); // köle #2'den 6 bayt talep ederken(Wire.available()) // köle istenenden daha azını gönderebilir ( char c = Wire.read(); // baytı Serial.print karakteri olarak kabul et ( c); // karakteri yazdır ) gecikme(500); )

    Wire.setClock()

    Tanım

    I2C veri yolu iletişimi için saat frekansını değiştirir. I2C bağımlı birimlerinin minimum çalışma saat frekansı yoktur, ancak genellikle 100 kHz kullanılır.

    Sözdizimi

    Wire.setClock(saatFrequency)

    Seçenekler

    ClockFrequency: Saat sinyalinin frekans değeri (hertz cinsinden). Kabul edilen değerler 100000 (standart mod) ve 400000'dir (hızlı mod). Bazı işlemciler ayrıca 10000'i (düşük hız modu), 1000000'i (hızlı artı modu) ve 3400000'i (yüksek hız modu) destekler. Gerekli modun desteklendiğinden emin olmak için işlemcinize özel teknik belgelere bakın.

    Geri dönüş değeri

    Wire.onReceive()

    Tanım

    İkincil, ana birimden bir iletim aldığında çağrılacak bir işlevi kaydeder.

    Sözdizimi

    Wire.onReceive(işleyici)

    Seçenekler

    işleyici: yardımcı cihaz veri aldığında çağrılması gereken bir işlev; bir parametre int (ana birimden okunan bayt sayısı) almalı ve hiçbir şey döndürmemelidir, yani:

    void myHandler(int numBytes)

    Geri dönüş değeri

    Örnek

    #katmak void setup() ( Wire.begin(8); // #8 adresiyle i2c veri yoluna bağlanın Wire.onReceive(receiveEvent); // bir olay işleyicisini kaydedin Serial.begin(9600); // bunun için seri bağlantı noktasını yapılandırın çıktı ) void loop() ( gecikme(100); ) // ana birimden veri alındığında yürütülecek bir işlev // bu işlev bir olay işleyicisi olarak kaydedilir, bkz. setup() void getEvent(int HowMany) ( iken (1< Wire.available()) // пройтись по всем до последнего { char c = Wire.read(); // принять байт как символ Serial.print(c); // напечатать символ } int x = Wire.read(); // принять байт как целое число Serial.println(x); // напечатать число }

    Wire.onRequest()

    Tanım

    Master, köleden veri istediğinde çağrılacak bir işlevi kaydeder.

    Sözdizimi

    Wire.onRequest(işleyici)

    Seçenekler

    işleyici: çağrılacak işlev, hiçbir parametre almaz ve hiçbir şey döndürmez, yani:

    geçersiz myHandler()

    Geri dönüş değeri

    Örnek

    Slave olarak çalışan Arduino kartının kodu:

    #katmak void setup() ( Wire.begin(8); // #8 adresiyle i2c veriyoluna bağlanın Wire.onRequest(requestEvent); // bir olay işleyicisini kaydedin) void loop() ( gecikme(100); ) // ana // veri istediğinde yürütülecek olan işlev // bu işlev bir olay işleyicisi olarak kaydedildiğinde, bkz. setup() void requestEvent() ( Wire.write("merhaba "); // bir mesajla yanıtla )

    LCD I2C modülü, yalnızca iki sinyal kablosunu kullanarak bir karakter ekranını Arduino kartına bağlamanızı sağlar.

    Kullanılan bileşenler (Çin'de satın alın):

    . Kontrol Paneli

    . Kabloların bağlanması

    Ana teknik özellikler:

    Ekran: Karakter 16x02 veya 20x04
    . Arka ışık: Beyaz karakterli mavi
    . Kontrast: Potansiyometre ile ayarlanabilir
    . Besleme voltajı: 5V
    . Arayüz: I2C
    . I2C adresi: 0x27
    . Boyutlar: 82mm x 35mm x 18mm

    Arduino'ya bağlanma

    Modül dört pimli 2,54 mm konektörle donatılmıştır

    SCL: seri saat hattı (Seri SAAT)

    S.D.A.: seri veri hattı (Seri Veri)

    VCC: "+" gücü

    GND: "-" güç

    Farklı denetleyicilere dayalı Arduino kartlarındaki I2C arayüzünden sorumlu pinler farklılık gösterir

    Bu modülle çalışmak için LiquidCrystal_I2C1602V1 kütüphanesini kurmanız gerekir.

    İndirin, paketini açın ve Arduino klasöründeki kütüphaneler klasörüne koyun. Kütüphane eklendiğinde Arduino IDE açıksa ortamı yeniden başlatın.

    Doğrudan taslağa geçelim. Bu örnekte "Merhaba dünya!" standardının çıktısını alacağız. ve topluluk adresimiz için.

    örnek program kodu:

    #katmak #katmak LiquidCrystal_I2C lcd(0x27,16,2); /* Adresi ve görüntü boyutunu ayarlayın. 20x04 ekranlı LCD I2C modülü kullanırken kodda herhangi bir değişiklik yapmanıza gerek yoktur, sadece doğru boyutu ayarlamanız yeterlidir */ geçersiz kurmak() ( lcd.init(); // LCD'yi başlat lcd.backlight(); // Arka ışığı aç // İmleç 1 satırın başında lcd.print("Merhaba dünya!"); // Metni görüntüle lcd.setCursor (0, 1); // İmleci 2. satırın başına ayarla lcd.print("site"); // Çıkış metni) geçersiz döngü () { }

    Kendi sembollerinizi yaratın

    Metin çıktısını çözdük, İngilizce alfabenin harfleri ekranın içindeki kontrol cihazının belleğine kabloyla bağlandı ve onlarla ilgili herhangi bir sorun yok. Peki gerekli sembol kontrolörün hafızasında değilse ne yapmalı?

    Sorun değil, gerekli sembol manuel olarak oluşturulabilir. Bu yöntem kısmen, 7 karakter sınırıyla, çıktı sorununun çözülmesine yardımcı olacaktır.

    Düşündüğümüz ekranlardaki hücre 5x8 piksel çözünürlüğe sahip. Bir sembol yaratmanın tek amacı, bir bit maskesi yazmak ve noktaların yanması gereken yerlere ve yanmaması gereken yerlere sıfırları yerleştirmektir.

    Aşağıdaki örnekte gülen yüz çizeceğiz.

    örnek program kodu:

    //Arduino IDE 1.0.5'te test edildi //gerekli kütüphaneleri ekliyoruz#katmak #katmak // Gülümseme sembolünün bit maskesi byte smile = ( B00010, B00001, B11001, B00001, B11001, B00001, B00010, ); LiquidCrystal_I2C lcd(0x27,20,4); // Adresi ve ekran boyutunu ayarlayın. geçersiz kurmak() ( lcd.init(); // LCD'yi başlat lcd.backlight(); // Arka ışığı aç // 0 sembol numarasını oluştur lcd.createChar(1, gülümse); lcd.setCursor(0, 0); // İmleci 1 satırın başına ayarla lcd.print("\1"); // Gülen yüz göster (karakter numarası 1) - "\1") geçersiz döngü () { }

    Sembollerin kolay oluşturulması için program

    Yorumlarda bir topluluk üyesi sembol oluşturucuya bir bağlantı gönderdi