• Kabelová knihovna pro Arduino pro práci se sběrnicí I2C. Připojení LCD I2C modulu k Arduinu

    I2C je sériová asymetrická sběrnice pro komunikaci mezi sebou integrované obvody uvnitř elektronických zařízení. To znamená tento protokol komunikace byla navržena pro interkomovou komunikaci uvnitř zařízení nebo uvnitř štítu. Neměl za úkol předávat data dlouhé vzdálenosti, takže o maximálním komunikačním dosahu panuje spousta mýtů - někomu to nefunguje dobře už na 50cm, někomu na 2m.

    Na sběrnici I2C může být umístěno až 128 zařízení. Adresy od 0 do 127.

    Ovladače Arduino mají fyzickou I2C komunikaci, která vám umožňuje připojit se k nim pomocí dvou datových vodičů jako různé senzory, expandéry diskrétních vstupů-výstupů, digitálně-analogové a analogově-digitální převodníky a další ovladače.

    Na stránkách výrobce se o přenosové rychlosti nepíše. Ale podle obecné dokumentace k protokolu by to mělo být alespoň 100 kbps


    Nyní bych chtěl otestovat, jak dobrá je skutečně sběrnice I2C a jak obtížné je na ní vyměňovat data mezi několika řadiči Arduino

    Vezmu tři ovladače, propojím je s I2C sběrnicí a vymyslím, jak si přes ni vyměňovat data. První ovladač bude master a další dva budou slave.

    Pro zobrazení dat použiji LCD indikátor 1602 s I2C modulem, který bude připojen na stejnou komunikační sběrnici.

    Hlavní ovladač se bude ptát druhého a třetího ovladače v pořadí. První ovladač by měl zobrazovat přijatá data na indikátoru. Podřízené jednotky Arduino Nano budou dotazovány s frekvencí 1 čas/s.

    Elektrické schéma

    Čtyři vodiče z každého ze 4 zařízení musí být zapojeny paralelně. Závěr A4 desky arduino Nano je sběrnice SDA protokolu I2C a A5 je SCL.

    Pro snadné připojení budu používat montážní štíty pro ovladače Nano.

    Napájení bude napájeno jednoduše prostřednictvím jednoho z ovladačů mini USB vchod.

    Adresa LCD v síti I2C je standardně 27. Pro druhý řadič nastavíme adresu 2 a pro třetí 3. U předního prvního řadiče adresa není potřeba.

    Program regulátoru - průvodce.

    #zahrnout #zahrnout // Nastavte adresu LCD na 0x27 pro 16znakový a 2řádkový displej LiquidCrystal_I2C lcd(0x27, 16, 2); int nano1=0; int nano2; int nano3; void setup() ( Serial.begin(9600); // inicializace LCD lcd.begin(); // Zapněte černé světlo a vytiskněte zprávu. lcd.backlight(); ) void loop() ( lcd.setCursor( 0, 0); lcd.print(nano1); Wire.requestFrom(2, 2); // požadavek 6 bajtů z podřízeného zařízení #8 int i=0;nano2=0; while (Wire.available()) ( / / slave může odeslat méně než požadovaný bajt c = Wire.read(); // přijmout bajt jako znak Serial.print(c); 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); }

    První regulátor změní svou proměnnou typu integer a zobrazí její hodnotu na indikátoru. Postupně také vyslýchá slave s 2. a 3. adresou. Zeptá se jich na dva bajty informací, převede je na celočíselnou proměnnou. Výsledkem je, že v prvním ovladači se točí tři proměnné ze tří Nano a může je zobrazit na indikátoru.

    Druhý program ovladače

    #zahrnout int nano2=0; byte high; void setup() ( Wire.begin(2); // připojení ke sběrnici i2c s adresou #8 Wire.onRequest(requestEvent); // registrace události ) void loop() ( delay(1000); nano2--; ) // funkce, která se spustí, kdykoli jsou data požadována masterem // tato funkce je registrována jako událost, viz setup() void requestEvent() ( high = (nano2 >>

    Třetí program Arduino Nano

    #zahrnout int nano2=0; byte high; void setup() ( Wire.begin(3); // připojení ke sběrnici i2c s adresou #8 Wire.onRequest(requestEvent); // registrace události ) void loop() ( delay(1500); nano2--; ) // funkce, která se spustí, kdykoli jsou data požadována masterem // tato funkce je registrována jako událost, viz setup() void requestEvent() ( high = (nano2 >> 8); high = (nano2 & 0xff); Wire.write(high ); // odpovězte zprávou o velikosti 2 bajtů Wire.write(high); )

    Poslední dva programy se liší jednoduše adresou ve funkci Wire.begin(3); a rychlost změny proměnné.

    Tyto programy neustále mění celočíselnou proměnnou a čekají na požadavek od mastera. Na vyžádání je tato proměnná rozložena na dva bajty a odeslána jako odpověď na požadavek do hlavního regulátoru.

    Tímto způsobem lze sledovat provoz komunikace I2C pomocí měnících se hodnot tří proměnných na LCD.

    závěry

    Vše funguje v pořádku – čísla na displeji se mění. Zkusil jsem prodloužit kabel mezi druhým a třetím Arduino ovladače. Zkontroloval jsem činnost komunikační sběrnice o délce 3 m - bez předpětí. Nezkoušel jsem to déle, ale mnoho lidí mi řeklo, že I2C nefunguje nad 0,5 ... 2 m a inspiroval jsem se délkou 3 m.

    Sám za sebe už vidím, kde takové spojení mezi třemi Nano uplatním.

    Přenos dat z mastera na slave jsem zatím nezkoušel. Pokud to zkusíte, přihlaste se k odběru.

    Nevýhody zde krátké vzdálenosti znatelně menší než převaha.

    Arduino podporuje mnoho rozhraní pro přenos dat, jedním z nich je I2C, které je dnes poměrně populární. Kdysi byl tento komunikační protokol vynalezen společností Philips a registrován pod patentovaným názvem „I2C“, můžete se s ním setkat i pod názvy TWI, 2 line interface, ale všechny fungují na stejném principu.

    Celý smysl sběrnice I2C je v tom, že můžete zavěsit velké množství (128). různá zařízení od teplotních senzorů po mikrokontroléry.

    Ale zároveň je I2C v rychlosti nižší než UART a SPI, kvůli základním principům fungování, protože. dvě čáry jsou vždy vytaženy k rezistorům (Vcc), což znamená, že na grafu dostaneme č obdélníkové impulsy, ale lichoběžníkový, na rozdíl od výše uvedeného.

    SDA - zodpovědný za přenos informací (počátek přenosu, adresa, data)
    SCL - autobusové hodiny

    V I2C zařízení mohou být dva typy Master a Slave

    Nyní si rozeberme základní principy programování pomocí standardní knihovny Wire.h:

    Wire.begin(uint8_t adresa) - slouží k inicializaci zařízení, v režimu slave je potřeba zadat adresu, v režimu master Wire.begin() . Místo drátu lze použít jakékoli jiné slovo.

    Wire.requestFrom(adresa uint8_t, množství uint8_t) - požadavek na přijetí určitého počtu bajtů z konkrétního zařízení (7bitová adresa). Vrátí počet přečtených bajtů.

    Wire.beginTransmission(uint8_t adresa) - začátek přenosu

    Wire.endTransmission() - konec přenosu, vrátí číslo chyby nebo úspěch(0)

    Wire.write(uint8_t data) - může mít hodnotu jednoho bajtu (hodnota), několika bajtů (řetězec), pole určité délky (data, délka). Nachází se mezi: beginTransmission a endTransmission. Vrátí počet zapsaných bajtů.

    Wire.available() – Vrátí počet bajtů dostupných pro zpracování. Volán velitelem po požadavkuFrom.

    Wire.read() – Přečte bajt z podřízeného zařízení. Napsáno po žádostiOd.

    Připojení knihoven k Arduino IDE není obtížné, protože je dodáváno se standardním editorem.

    Existuje několik dalších funkcí, ale myslím, že tento základ pro začátek stačí, kromě toho můžete najít knihovnu pro téměř každou periferii.

    Zvažte například připojení a provoz akcelerometru a gyroskopu Gy-521.

    Zapojíme podle schématu (v modulu jsou zabudovány pull-up rezistory):

    Modul může pracovat jak od 3,3 V, tak od 5.

    #zahrnout // připojení knihovny pro práci s rozhraním i2c const int MPU_addr = 0x68; // I2C adresa GY-521 int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ; // proměnné pro zápis hodnot​void setup() ( Wire.begin(); // inicializace sběrnice i2c Wire.beginTransmission(MPU_addr); // zahájení přenosu Wire.write(0x6B); // zápis určitých registrů pro inicializaci the Wire module. write(0); // odeslání null pro probuzení modulu Wire. endTransmission(true); Serial. begin(9600); ) void loop() ( Wire. beginTransmission(MPU_addr); Wire. write(0x3B) ; // začátek od tohoto registru Wire.endTransmission(false); Wire.requestFrom(MPU_addr, 14, true); // čtení všech registrů 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 displej umožňuje vizuálně zobrazovat data ze senzorů. Řekneme si, jak správně připojit LCD monitor k Arduinu přes I2C a podíváme se na základní příkazy pro inicializaci a ovládání LCD 1602. Podíváme se také na různé funkce v programovacím jazyce C++ pro zobrazení textových informací na displeji , který je často vyžadován pro použití v projektech Arduino.

    Video. Arduino LCD displej I2C 1602

    LCD 1602 I2C připojení k Arduinu

    I2C je sériová dvouvodičová sběrnice pro připojení integrovaných obvodů uvnitř elektronických zařízení, známá jako I²C nebo IIC (anglicky Inter-Integrated Circuit). I²C vyvinula společnost Philips na počátku 80. let jako jednoduchou 8bitovou sběrnici pro vnitřní komunikaci mezi obvody v řídicí elektronice (jako jsou počítače na základní desce, mobilní telefony atd.).

    V jednoduchém systému I²C může být více podřízených zařízení a jedno hlavní zařízení, které spouští přenos dat a časuje signál. K linkám SDA (datová linka) a SCL (hodinová linka) lze připojit několik podřízených zařízení. Hlavním zařízením je často ovladač Arduino a podřízenými zařízeními jsou hodiny reálného času nebo LCD displej.

    Jak připojit LCD 1602 k Arduinu přes I2C

    LCD displej 1602 s I2C modulem je k desce Arduino připojen pouze 4 vodiči – 2 datovými vodiči a 2 napájecími vodiči. Displej 1602 je standardně připojen pro sběrnici I2C: výstup SDA připojuje se k portu A4, výstup SCL– do portu A5. LCD displej je napájen z +5V portu na Arduinu. Další podrobnosti viz schéma připojení LCD monitoru 1602 na fotografii níže.

    Pro lekci potřebujeme následující podrobnosti:

    • deska Arduino Uno / Arduino Nano / Arduino Mega;
    • LCD monitor 1602;
    • 4 dráty "otec-matka".

    Po připojení LCD monitoru k Arduinu přes I2C budete muset nainstalovat knihovnu LiquidCrystal_I2C.h pracovat s LCD displejem přes I2C rozhraní a knihovnu Wire.h(k dispozici ve standardním programu Arduino IDE). Pracovní knihovnu LiquidCrystal_I2C.h pro LCD 1602 s modulem I2C si můžete stáhnout na stránce Arduino Libraries na našem webu prostřednictvím přímého odkazu z Google Drive.

    Skica pro displej 1602 s I2C

    #zahrnout // knihovna pro ovládání zařízení přes I2C#zahrnout // připojte knihovnu pro LCD 1602 LiquidCrystal_I2C lcd(0x27,20,2); // přiřazení názvu lcd k displeji 20x2 void setup() // procedura setup( lcd.init(); // inicializace LCD displeje lcd.backlight(); // zapnutí podsvícení displeje lcd.setCursor(0,0); // umístí kurzor na 1 znak prvního řádku lcd.print("MILUJI"); // vytiskne zprávu na první řádek lcd.setCursor(0,1); // umístí kurzor na 1 znak druhého řádku lcd.print("ARDUINO"); // vytiskne zprávu na druhý řádek) void loop () // procedura loop ( /* toto je víceřádkový komentář // zpočátku není v náčrtu použita procedura void loop() lcd.noDisplay(); // vypnutí zpoždění podsvícení LCD(500); // pauza lcd. display(); // zapnutí zpoždění podsvícení LCD(500); // pauza */ }

    Vysvětlení ke kódu:

    1. knihovna LiquidCrystal_I2C.h obsahuje mnoho příkazů pro ovládání LCD displeje přes I²C sběrnici a umožňuje značně zjednodušit skicu;
    2. skica obsahuje víceřádkový komentář /* ... */ , který umožňuje komentovat několik řádků v programu najednou.
    3. před zobrazením informací na displeji je nutné nastavit pozici kurzoru příkazem setCursor(0,1), kde 0 je číslo znaku v řádku, 1 je číslo řádku.

    Rozhodl jsem se udělat textový operátorský panel (HMI) a připojit jej přes "čtvercovou" I2C sběrnici k Arduinu. K tomu jsem vyvinul desku klávesnice s 5 tlačítky založenou na čipu PCF8574P.

    PCF8574P je expandér portů, balíček DIP, pracuje na sběrnici I2C. Koupil jsem dávku dvou těchto čipů za 0,94 $ s dopravou zdarma z Číny, takže jeden kus stojí 0,47 $. Nákup je ziskový, protože v místních obchodech stojí stejné mikroobvody více než 2 $ za kus.

    Displej HMI bude standardní obrazovka 1602, která funguje i na čtvercové sběrnici přes šátek FC-113.

    PCF8574P bylo odesláno, dali číslo stopy a po 2 týdnech jsem je již obdržel poštou.


    Vyjmeme ho z plastové tuby, vše se zdá být v pořádku.


    Na dně pouzdra jednoho z mikroobvodů jsou však stopy tajemných termomechanických vlivů.


    Povaha těchto škod mi není jasná, ale je zřejmé, že se při převodu objevit nemohly.

    Dlouho jsem o této hádance přemýšlel, až mi to došlo.
    Prostě Luke Skywalker se dostal do skladiště prodejce, náhle zmenšený na mikroskopickou velikost. Tam si všiml jednoho z přístavních expandérů, spletl si ho s imperiálním chodcem a začal do něj sekat světelným mečem. Pak přišel sběrač, uviděl tento obrázek a řekl: „Přestaň, Luku Skywalkere! Tohle není imperiální chodec, to je čip PCF8574P, za který už má zaplaceno ze Záporoží.“

    Přinejmenším se během kontroly ukázalo, že oba mikroobvody fungují.

    Začněme vytvářet samotnou klávesnici podle tohoto schématu.


    V Layout 6.0 jsem nakreslil jednostrannou desku.


    Soubor s tabulí si můžete stáhnout.

    Desku jsem otrávil peroxidem vodíku a kyselinou citronovou.

    Receptů na leptání desky peroxidem je na netu spousta.
    Připravil jsem tento roztok: 100 ml peroxidu vodíku 3%, 50 g kyseliny citrónové, 3 lžičky soli. Zahříval sklenici peroxidu v hrnci s vodou.

    Desku ponoříme do roztoku vzorem dolů, jak se doporučuje při leptání peroxidem.

    Pshhhhhh! Zpočátku je proces turbulentní.


    Ps ... Pak to znatelně odezní. Otočte se, podívejte se na obrázek.


    Krása.


    Hotová deska vypadá takto.




    Adresní piny mikroobvodu jsou připojeny k GND, takže adresa desky na sběrnici bude 0x20.

    Píšeme program pro Arduino.

    #zahrnout
    #zahrnout

    #define led 13
    #define ADDR_KBRD 0x20
    #define ADDR_LCD 0x27

    String str;
    byte dio_in;
    bool b;
    boolkey;

    LiquidCrystal_I2C lcd(ADDR_LCD,16,2); // Nastavení zobrazení

    Void setup()
    {
    pinMode(13, OUTPUT);
    lcd.init();
    lcd.backlight();// Zapne podsvícení displeje
    Wire.begin();

    Wire.beginTransmission(ADDR_KBRD);
    Wire.write(B11111111);
    Wire.endTransmission();
    Serial.begin(9600);
    }
    void loop()
    {
    Wire.requestFrom(ADDR_KBRD,1);
    while(!Wire.available());
    byte dio_in = Wire.read(); //přečtení stavu portů PCF8574P
    bytemask=1;
    for(int i=0; i<5;i++)
    {
    key[i]=!(dio_in & mask);
    maska ​​= maska<<1;
    }

    Str=String(dio_in, BIN); //
    Serial println(str);

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

    //
    lcd.setCursor(0, 0);
    lcd.print(Řetězec(klávesa)+" "+
    Řetězec(klávesa)+" "+
    Řetězec(klávesa)+" "+
    Řetězec(klávesa)+" "+
    Řetězec(klávesa)+" "
    );
    zpoždění(100);
    }


    Program nahrajeme do Arduina a připojíme k vytvořené desce klávesnice a displeji.

    Zapněte to, funguje to!


    Moje HMI nebude fungovat pouze s Arduinem, ale s PLC kompatibilním s Arduino. Pokud bude inspirace a zájem čtenářů, tak o tom nějak napíšu.

    Výhody PCF8574P:
    1. Minimální páskování.
    2. Snadná práce.

    Nevýhody PCF8574P:
    Samotný mikroobvod jsem nenašel, i když vám doporučuji koupit od jiného prodejce.

    Tím končí recenze čipu PCF8574P.
    Ale jako zkušený pozorovatel, dopředu Odpovím na otázky, které budou položeny:

    Proč v DIP balíčku? SOIC je lepší.
    Ostatní věci jsou stejné, preferuji DIP, je to pro mě snazší.

    DIP a výstupní prvky instalují pouze lameři, všichni specialisté používají SOIC a SMD. Pájím tedy výhradně SMD a obecně mám hotovo.
    máte to dobře.

    Proč si rovnou nekoupit hotový modul na aliexpress s displejem 1602 a 5tlačítkovou klávesnicí? Funguje to i na I2C.
    Jeho cena je od 11 dolarů.
    Strávil jsem:
    Displej 1602 – 1,3 USD
    Deska FC-113 - 0,55 $
    Čip PCF8574P - 0,47 $
    Knoflíky a čepice - 0,7 $
    Činidla pro leptání desek - 0,3 $
    Textolit, rezistory a další drobnosti - zdarma, ze starých zásob.
    Celkem: 3,32 $
    Ale hlavní je, že jsem si na desku dal knoflíky s hranatým zatlačovačem, abych na ně dal krásné barevné krytky.

    Páni, jen jeden čip PCF8574P stojí téměř tolik jako celá deska FC-113!
    To jo…

    Všechno jsi udělal špatně. Špatně nalakované, špatně vyleptané ve špatném roztoku a nasazená špatná tlačítka. Být tebou, udělal bych všechno správně.
    máte to dobře.

    Proč je páté tlačítko tak daleko od ostatních?
    To je konkrétně tak, že jsou funkčně odlišné. Tyto čtyři jsou vlevo, vpravo, zrušit, zadat a pátý bude SETUP.

    Čekal jsem napínavější příběh o Luku Skywalkerovi, oklamal jsi mě!
    Jsem hotov.

    Protokol pro výměnu dat I2C byl kdysi vyvinut společností Philips. Název I2C pochází z anglického Iner-IC control nebo jinými slovy inter-chip control, Inter-IC, IIC (I2C) je název stejného protokolu.

    Tento protokol nebo rozhraní zajišťuje kvalitní příjem a přenos informací (dat) z více různých zařízení, např. můžete měřit teplotu a současně ovládat digitální potenciometr. Komunikace probíhá programově, algoritmus pro komunikaci se senzorem přes I2C protokol je zapsán do programu (sketch) Arduino.

    Existují speciální adaptéry, které vám umožňují připojit další zařízení, například s adaptérem můžete připojit LCD displej arduino 1602 (16x2) pomocí protokolu i2c přes dva vodiče. Na přání LCD i2c je na internetu spousta informací, zde je ukázka, jak by měl grafický adaptér vypadat http://www.ebay.com/itm/310565362720

    Při práci na tomto rozhraní je jedno zařízení master a druhé slave. Hlavní zařízení zahájí přenos a generuje signály nezbytné pro synchronizaci.

    Vema zase závisí na masteru a spouští přenos dat až po obdržení příkazu od mastera.

    Zařízení připojené ke sběrnici I2C má svou unikátní adresu. Na této adrese se přistupuje k hlavnímu zařízení.

    Příklad připojení senzorů pomocí protokolu I2C

    Připojení je provedeno dvěma vodiči: SCL - hodinový signál nebo hodinový signál a SDA - datový signál. Zároveň lze na sběrnici I2C připojit libovolný počet různých senzorů (slave zařízení) s vlastním unikátním id.

    Seznámení začíná knihovnou speciálně napsanou pro tyto účely, jejíž název je Wire. Před zahájením práce se musí naimportovat do projektu, má speciální příkazy nebo metody pro „komunikaci“ se zařízeními.

    Pro výměnu dat se zařízeními potřebujete znát jejich ID. Různá zařízení mohou mít různé délky adresy (id) 8 nebo 7 bitů.Knihovna Wire používá 7bitové adresování.

    Podřízená zařízení jsou připojena ke kolíkům na desce Arduino. Každá verze Arduina má své vlastní I2C piny

    • UNO - A4(SDA), A5(SCL);
    • Mega - 20 (SDA), 21 (SCL);
    • Leonardo-2(SDA), 3(SCL);
    • Splatnost - 20(SDA), 21(SCL),SDA1,SCL1;

    Ukázkový programový kód pro ovládání digitálního potenciometru pomocí knihovny Wire

    Tento příklad ukazuje, jak nastavit konkrétní hodnotu odporu v digitálním potenciometru pomocí knihovny Wire. Nastavení konkrétní hodnoty se provádí pomocí proměnné val.

    #zahrnout void setup() ( Wire.begin(); // připojení ke sběrnici i2c (adresa je volitelná pro master) ) byte val = 0; void loop() ( Wire.beginTransmission(44); // přenos do zařízení #44 (0x2c) // adresa zařízení je uvedena v datovém listu Wire.write(byte(0x00)); // odešle instrukční bajt Wire.write(val ); // odešle bajt hodnoty potenciometru Wire.endTransmission(); // zastavení přenosu val++; // zvýšení hodnoty if (val == 64) // pokud je dosaženo 64. pozice (max) ( val = 0; // začít znovu od nejnižší hodnota ) zpoždění(500); )

    Video práce I2C a Arduina. Část 1