I2C Komunikací, Část 1 – Arduino Arduino

Úvod

I2C komunikace se staly de facto způsob komunikace mezi mikroprocesory, mikropočítače a různé integrované obvody a senzory. To bylo asi od roku 1982 a byl původně vyvinut pro použití v televizních přijímačích.

ačkoli jsme v předchozích článcích použili mnoho senzorů a displejů I2C, ve skutečnosti jsme se nezabývali tím, jak funguje I2C a jak jej lze použít ke komunikaci mezi mikrokontroléry.

Dnes budeme opravit to a dozvědět se více o I2C. Uvidíme také, jak to může být použit k výměně informací mezi dvěma Arduinos a jak to může být použit k umožňuje Arduino ovládat další.

I2C Část 1-Pomocí 2 Arduinos

Toto bude první ze čtyř článků, na I2C. V budoucích článcích se budeme vidět, jak můžeme budovat náš vlastní I2C zařízení, jak rozhraní Raspberry Pi a Arduino pomocí I2C a jak to udělat některé pokročilé I2C konfigurace, včetně použití více mistrů na jedné I2C sběrnici.

začněme!

I2C komunikace

I2C je sériový protokol používaný na nízkorychlostním 2vodičovém rozhraní. Původně byl vyvinut Phillipsem v roce 1982, aby umožnil integrovaným obvodům v televizních přijímačích vzájemnou komunikaci.

časy se změnily, Phillips je nyní NXP a I2C se stal komunikačním standardem, který podporuje prakticky každý hlavní výrobce polovodičů.

I2C je zkratka pro „Inter-integrovaný obvod“. Nazývá se také “ IIC „nebo“ i na druhou C“.

Použití a Omezení

I2C je použit s mikroprocesorů jako Arduino a s mikropočítačů, jako je Raspberry Pi. Mnoho displejů a senzorů se připojuje k hostitelskému řadiči pomocí I2C.

I2C má však několik omezení. Není to nijak zvlášť rychlé, i když pro většinu zamýšlených použití je dostatečně rychlé.

I2C lze používat pouze na krátké vzdálenosti, koneckonců to bylo původně určeno pro komunikaci mezi integrovanými obvody na stejné desce s plošnými spoji. Maximální vzdálenost spolehlivého přenosu klesá se zvyšující se rychlostí, při nejpomalejší rychlosti (100 Kbaud nebo taktovací frekvence 100 KHz) je maximální vzdálenost asi metr.

rychlosti I2C

původní sběrnice I2C měla maximální rychlost 100 KHz. Většina běžných aplikací stále používá tuto rychlost, protože je dostačující pro přenos dat ze senzorů a na jednoduché displeje.

I2C a má některé režimy vyšší rychlosti. Ne všechna zařízení I2C podporují tyto režimy:

  • Rychlý režim-To má maximální rychlost hodin 400 KHz.
  • Hi-Speed Mode – maximální taktovací frekvenci fo 3.4 MHz
  • Ultra Rychlý Režim – Maximální taktovací frekvenci 5 MHz

Na I2C sběrnici je master, který určuje rychlost hodiny.

jak funguje I2C

sběrnice I2C má dva signály, spolu s připojením napájení a země.

I2C Komunikací

dvě signální linky jsou následující:

  • SDA – To je obousměrné datové linky.
  • SCL-to je hodinový signál.

ke každému signálnímu vedení jsou připojeny dva pull-up rezistory, které táhnou sběrnici až na napájecí napětí, když je neaktivní.

Všimněte si, že napájecí napětí není standardní, může být buď 3,3 nebo 5 voltů. Může to být také nižší napětí pro některé vysokorychlostní implementace I2C.

tento rozdíl v napájecím napětí může způsobit problémy při propojení zařízení I2C, která používají různé logické úrovně. Budeme o tom diskutovat více v budoucím článku, když vám ukážu, jak propojit Raspberry Pi (3 .3-voltová logika) s Arduino Uno (5-voltová logika).

existují dva typy zařízení, která mohou být propojena se sběrnicí I2C-Masters a Slaves.

hlavní zařízení řídí sběrnici a dodává hodinový signál. Požaduje data od otroků jednotlivě. Tam může být více než jeden master zařízení na sběrnici, ale pouze jeden může být aktivní master v daném okamžiku.

hlavní zařízení nemají přiřazenou adresu.

Slave zařízení mají adresu a tato adresa musí být na sběrnici jedinečná. Používají 7bitové adresovací schéma, takže na jedné sběrnici I2C může být až 128 otroků. V reálném životě se tato velká sbírka zařízení nikdy nepoužívá, je vzácné vidět více než tucet zařízení I2C na jedné sběrnici.

bylo implementováno novější 10bitové adresovací schéma, které je zpětně kompatibilní se stávající 7bitovou adresovací metodou.

komerčním zařízením I2C je přidělena adresa I2C společností NXP, která udržuje SPECIFIKACE sběrnice. Přestože I2C je open source od roku 2006, je za získání slave adresy od NXP účtován poplatek. Za hlavní zařízení nebo zařízení, která nejsou určena pro komerční výrobu, se nevyžaduje žádný poplatek.

některým I2C zařízením je přiděleno více adres, obvykle odchylky v dolních adresových bitech. Tato zařízení lze ručně konfigurovat pro různé adresy, což umožňuje použití více zařízení stejného typu na jedné sběrnici I2C.

Ostatní I2C deriváty

existují i jiné sběrnice, které byly odvozeny ze sběrnice I2C a které jsou v mnoha ohledech kompatibilní s I2C.

  • TWI-dvouvodičové rozhraní je prakticky totožné se sběrnicí I2C. Je to vlastně autobus, že Arduino používá, TWI byl vyvinut při I2C není open source a Atmel nechtěl riskovat obchodní jméno porušení. Jediný hlavní rozdíl mezi TWI a I2C je, že TWI nepodporuje pokročilou techniku zvanou „protahování hodin“.
  • SMBus je další ekvivalentní sběrnice I2C vyvinutá společností Intel. Stejně jako TWI podporuje většinu funkcí I2C.

V dalším článku vysvětlím, jak jsou strukturována data na sběrnici I2C. Ale teď máme několik základních informací I2C, dost na to, abychom mohli začít experimentovat.

Arduino Wire Library

Arduino má vestavěnou knihovnu pro práci s I2C nazvanou Wire Library. Díky tomu je velmi snadné komunikovat na sběrnici I2C a může nakonfigurovat Arduino tak, aby se stalo buď mistrem, nebo otrokem.

Knihovna drátů má několik užitečných funkcí pro práci s I2C.

  • begin() – inicializuje knihovnu a nastaví Arduino být buď master nebo slave.
  • requestFrom () – tuto funkci používá master k vyžádání dat ze slave.
  • beginTransmission () – tuto funkci používá master k odesílání dat zadanému slave.
  • endTransmission() – Tato funkce se používá master ukončit přenos začal s beginTransmission funkce.
  • write () – používá master I slave k odesílání dat na sběrnici I2C.
  • available () – používá master I slave k určení počtu bajtů v datech, která přijímají.
  • read (–- čte bajt dat ze sběrnice I2C.
  • SetClock () – používá master k nastavení konkrétní frekvence hodin.
  • onReceive() – Používá otrok zadat funkci, která je volána, když data obdržel od mistra.
  • onRequest () – používá slave k určení funkce, která je volána, když master požaduje data.

některé z těchto funkcí použijeme v našich náčrtcích.

připojení Arduino I2C

připojení SDA a SCL pro I2C se mezi modely Arduino liší. Experimenty, které se chystám ukázat, byly provedeny pomocí dvou Arduino Unos, ale můžete použít jiné modely Arduina, které vám odpovídajícím způsobem změní kolíky.

sestavil jsem graf, který vám pomůže přijít na to. Zahrnuje některé běžné desky Arduino, stejně jako několik diskrétních čipů. Vývody pro seznam čipů i (ATTiny a ATmega328P) jsou s balíčkem DIP, nikoli s povrchovou montáží.

Arduino Board or Chip SDA SCL
Uno A4 A5
Mega2560 20 21
Nano A4 A5
Pro Mini A4 A5
Leonardo 2 3
Due (has two I2C) 20 + SDA1 20 + SCL1
ATTiny85 & ATTiny45 5 7
ATmega328P 27 28

Některé Arduino Uno klony mají samostatné SDA a SCL kolíky a můžete je použít namísto dvou analogových pinů, pokud si budete přát. Jsou vnitřně spojeny se stejným místem.

Všimněte si, že Arduino Due má ve skutečnosti dva porty I2C.

také si uvědomte, že na internetu Pro Pro Mini existují některé nesprávné diagramy připojení. Použijte dva analogové kolíky, A4 a A5, jak je uvedeno v tabulce výše.

I2C mezi 2 Arduino je

pro náš první experiment budeme hoo dva Arduinos dohromady a vyměňovat si data mezi nimi. Jeden Arduino bude pánem, druhý bude otrokem.

používám dvě Arduino Unos, ale můžete nahradit jiné Arduino, pokud nemáte dvě Uno. Pro připojení použijte předchozí graf.

hákování 2 Arduino je

zde je, jak jsem spojil své dva Arduino Unos dohromady:

I2C Arduino na Arduino

je to docela jednoduché připojení, v podstatě stačí spojit zem a dva I2C kolíky dohromady.

Jedna věc je být si vědom je, že můj diagram neukazuje použití pull-up rezistory, zjistil jsem, že se zdálo, že všechno správně fungovat bez nich. Možná je však budete chtít zahrnout, zejména pokud se vyskytnou chyby nebo přerušovaný provoz.

připojit některé pull-up rezistory připojit pár 10K rezistory na SDA a SCL linky. Připojte druhý konec k 5-voltovému výstupu na jednom z Arduino.

Master Demo Sketch

zde je náčrt, který bude použit na Arduino, které jste označili jako master.

I2C Master Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

/*
I2C Master Demo
i2c-master-demo.ino
Demonstrate use of I2C bus
Master sends character and gets reply from Slave
DroneBot Workshop 2019
https://dronebotworkshop.com
*/
// Include Arduino Wire library for I2C
#include <Wire.h>
// Define Slave I2C Address
#define SLAVE_ADDR 9
// Define Slave answer size
#define ANSWERSIZE 5
void setup() {
// Initialize I2C communications as Master
Wire.begin();
/ / Setup serial monitor
Serial.začátek (9600);
Serial.println („I2C Master Demonstration“);
}
void loop () {
delay (50);
Serial.println („Write data to slave“);
// Write a charatre to the Slave
Wire.začátek přenosu (SLAVE_ADDR);
drát.write (0);
Wire.endTransmission ();
Serial.println („Receive data“);
// Read response from Slave
/ / Read back 5 znaků
Wire.requestFrom (SLAVE_ADDR,ANSWERSIZE);
/ / přidat znaky do řetězce
String response =““;
while (Wire.dostupné()) {
char b = drát.read ();
response += b;
}
// tisk na Sériový Monitor
Serial.println(reakce);
}

stejně Jako u všech I2C skic, začneme tím, včetně Drátu knihovna.

dále definujeme několik konstant, které reprezentují I2C adresu slave a počet bajtů dat, které z ní očekáváme.

v nastavení inicializujeme komunikaci I2C jako master. Víme, že je to master, protože ve funkci begin není žádný parametr adresy. Nastavíme také Sériový monitor a vytiskneme na něj řádek textu.

nyní do smyčky.

začněte s malým časovým zpožděním, většinou zpomalit natolik, že si můžeme přečíst displej na serial monitor.

dále použijeme funkci beginTransmission k odeslání dat do slave. V tomto případě jsou data, která odesíláme, pouze číslem nula. Dokončíme odesílání s voláním na koncfunkce přenosu.

dále požadujeme některá data zpět ze slave pomocí funkce requestFrom.

poté formulujeme řetězec odezvy čtením dat, bajtu najednou, ze slave.

tiskneme podrobnosti o tom, co děláme, a o datech, které dostáváme, na Sériový monitor. A pak dokončíme smyčku a uděláme to znovu.

Slave Demo Sketch

nyní na náčrtek používaný slave.

I2C Slave Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

/*
I2C Slave Demo
i2c-slave-demo.ino
Demonstrate use of I2C bus
Slave receives character from Master and responds
DroneBot Workshop 2019
https://dronebotworkshop.com
*/
// Include Arduino Wire library for I2C
#include <Wire.h>
// Definovat Slave I2C Adresa
#define SLAVE_ADDR 9
// Definovat Otrok odpověď velikost
#define ANSWERSIZE 5
// Definovat řetězec s odpovědí na Master
String odpověď = „Ahoj“;
void setup() {
// Inicializace I2C komunikace jako Otrok
Drát.begin (SLAVE_ADDR);
/ / funkce spustit, když data požadovaná z master
drátu.onRequest (requestEvent);
// funkce spustit, když data přijatá z master
drátu.onReceive (receiveEvent);
/ / Setup Serial Monitor
Serial.začátek (9600);
Serial.system. out. println(„I2C Slave Demonstrace“);
}
void receiveEvent() {
// Čtení, zatímco údaje získané
while (0 < Drát.dostupné ()) {
byte x = Wire.read ();
}
// tisk na Sériový Monitor
Serial.println („Receive event“);
}
void requestEvent () {
// Setup byte proměnná ve správné velikosti
byte response;
// Formát odpověď jako pole
pro (byte i=0;i<ANSWERSIZE;i++) {
response = (byte)odpověď.charAt (i);
}
/ / odeslat odpověď zpět na hlavní
drát.write (response, sizeof (response));
/ / Print to Serial Monitor
Serial.system. out. println(„Požadavek události“);
}
void loop() {
// Čas zpoždění ve smyčce
zpoždění(50);
}

opět jsme se začít tím, včetně Drátu knihovna. Stejně jako u předchozího náčrtu definujeme I2C adresu slave a počet bajtů, které plánujeme poslat zpět veliteli.

dále definujeme řetězec, který chceme poslat zpět veliteli, v tomto případě pouze slovo „ahoj“. Pokud se rozhodnete změnit ujistěte se, že jste nastavit ANSWERSIZE konstantní v obou skic být správné.

v nastavení inicializujeme připojení na sběrnici I2C pomocí funkce begin. Vezměte na vědomí jiný způsob, jak to děláme, protože se jedná o slave, určíme adresu I2C, kterou budeme používat. Tím Knihovna Wire ví, že chceme pracovat v režimu slave.

nyní musíme definovat názvy funkcí, které budeme volat, když se vyskytnou dvě události – požadavek na data přijatý od master a data přijatá od master. Také nastavujeme a tiskneme na Sériový monitor.

funkce receiveEvent je volána, když přijímáme data z master. V této funkci čteme data, když jsou data k dispozici ,a přiřadíme je bajtu (pamatujte, že data budou přijímána po jednom bajtu).

funkce requestEvent je volána vždy, když dostaneme požadavek na data z master. Musíme poslat náš řetězec „Ahoj“ zpět veliteli. Protože potřebujeme poslat data po jednom bajtu, rozdělíme znaky v „Hello“ na jednotlivé položky v poli a poté je pošleme jeden po druhém.

nahlásíme veškerý náš pokrok v obou funkcích sériovému monitoru.

smyčka v tomto náčrtu jen přidává časové zpoždění, které odpovídá tomu, které bylo použito v hlavním náčrtu.

spuštění Demo náčrtů

Chcete-li spustit tyto náčrtky, musíte mít možnost zobrazit Sériový monitor na každém Arduinu. Pokud máte dva počítače s nainstalovaným Arduino IDE, bude to mnohem jednodušší.

I2C Experiment 1

V systému Microsoft Windows je možné otevřít dvě instance Arduino IDE. Pokud tak učiníte, můžete zobrazit oba sériové monitory vedle sebe na stejné obrazovce.

Alternativně můžete použít jeden počítač a napájet druhé Arduino vlastním napájením. Museli byste přepnout počítač a napájení mezi dvěma Arduino. tím byste mohli sledovat obě obrazovky jeden po druhém.

Arduino Remote pomocí I2C

V další ukázce připojíme potenciometr k hlavnímu Arduinu a LED k slave. Potenciometr použijeme k ovládání rychlosti blikání LED.

Toto je další jednoduchá demonstrace, na které můžete stavět a vytvořit něco praktičtějšího.

vzdálené Demo připojení

zde je návod, jak je tento experiment sestaven.

I2C Arduino Control

To je v podstatě stejný úlet jako v předchozím experimentu, s přidáním potenciometru na hlavní a LED na slave.

Všimněte si, že LED na slave byla připojena ke kolíku 13. Jako Arduino Uno má vestavěnou LED na pinu 13 můžete odstranit LED a jeho vrácení odpor, pokud si budete přát.

poznámky o pull-up rezistory platí také pro toto připojení.

Dálkové Demo Mistr Skici

skica na hlavní straně tohoto experimentu je velmi jednoduchá, v některých ohledech I2C straně je ještě jednodušší, než v první demonstrace. Je to proto, že pouze posíláme data slave a neočekáváme, že bychom se dostali zpět.

I2C Master s Potenciometrem

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

/*
I2C Master Control Demo
i2c-master-demo-control.ino
Demonstrate use of I2C bus
Master sends potentimeter position data
DroneBot Workshop 2019
https://dronebotworkshop.com
*/
// Include Arduino Wire library for I2C
#include <Wire.h>
// Define Slave I2C Address
#define SLAVE_ADDR 9
// Analog pin for potentiometer
int analogPin = 0;
// Integer to hold potentiometer value
int val = 0;
void setup () {
// inicializovat I2C komunikaci jako Master
Wire.begin();
}
void loop() {
zpoždění(50);
// Čtení hrnec hodnota
// Mapa rozmezí 1-255 pro flash rychlost
val = map(analogRead(analogPin), 0, 1023, 255, 1);
// Napište charatre s Otroky
Drát.začátek přenosu (SLAVE_ADDR);
drát.write (val);
Wire.endTransmission();
}

Jako vždy, musíme zahrnout Drát knihovna na počátku skici. Budeme také definovat konstantu pro držení slave adresy.

protože používáme potenciometr, budeme muset definovat jak pin, ke kterému je připojen, tak proměnnou, aby udržela jeho hodnotu.

vše, co děláme v nastavení, je inicializace připojení I2C jako master.

ve smyčce čteme hodnotu potenciometru a mapujeme ji na rozsah 01-255. Musíme to udělat, protože posíláme jeden bajt informací a můžeme držet pouze tolik hodnot V jednom bajtu.

Všimněte si, že jsme reverzní číslování pořadí v Arduino Mapa funkce, to se provádí tak, že systém se chová tak, jak očekáváme – otáčením potenciometru doprava se zvyšuje rychlost záblesku. Jako „flash rate“ je zadán čas zpoždění větší počet odesílány bude rovnat delší flash rychlost.

také si všimněte, že neposíláme hodnotu 0, která by pouze držela LED V jednom stavu. Nastavili jsme náš rozsah na konec 1 místo toho.

nyní je to jen otázka odeslání bajtu slave a opakování smyčky znovu.

Remote Demo Receive Sketch

strana slave potřebuje přijímat data z master a používat je k blikání LED.

I2C Slave s LED

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

/*
I2C Slave Control Demo
i2c-slave-demo-control.ino
Demonstrate use of I2C bus
Receives potentimeter position data
Controls LED blink rate
DroneBot Workshop 2019
https://dronebotworkshop.com
*/
// Include Arduino Wire library for I2C
#include <Wire.h>
// Define Slave I2C Address
#define SLAVE_ADDR 9
// Define LED Pin
int LED = 13;
// Variable for received data
int rd;
// Variable for blink rate
int br;
void setup () {
pinMode (LED, výstup);
/ / inicializovat I2C komunikaci jako Slave
Wire.begin (SLAVE_ADDR);
/ / funkce spustit, když data přijatá z master
drátu.onreceive (receiveEvent);
/ / Setup Serial Monitor
Serial.začátek (9600);
Serial.println („I2C Slave Demonstration“);
}
void receiveEvent () {
// číst jeden znak z I2C
rd = Wire.read();
// hodnota tisku příchozích dat
Serial.println (rd);
}
void loop() {
zpoždění(50);
// Výpočet blikat hodnota
br = map(rd, 1, 255, 100, 2000);
digitalWrite(LED, HIGH);
zpoždění(br);
digitalWrite(LED, LOW);
zpoždění(br);
}

začneme s obvyklým zařazení Drát knihovna, stejně jako definování adresu slave. Definujeme také pin pro LED.

je definováno několik dalších proměnných, z nichž jedna drží přijatá data, zatímco druhá nese hodnotu časového zpoždění pro rychlost blikání.

v nastavení nastavíme I / o pin pro LED jako výstup a inicializujeme sběrnici I2C. Když používáme slave adresu ve funkci begin, Knihovna Wire ví, že jednáme jako slave.

potřebujeme pouze definovat funkci onReceive, na rozdíl od posledního dema neočekáváme žádné požadavky od mistra. Také jsme nastavili a vytiskli na Sériový monitor, pomocí monitoru zobrazíme příchozí data.

funkce receiveEvent přečte příchozí data a přiřadí je proměnné I. Také vytiskne hodnotu na Sériový monitor.

nakonec ve smyčce použijeme příchozí data k blikání LED. K tomu opět použijeme funkci mapy a změníme příchozí hodnoty 1-255 na širší rozsah. Můžete experimentovat se změnou tohoto rozsahu, aby LED blikala rychleji nebo pomaleji, pokud si budete přát.

posledních několik prohlášení je v podstatě Arduino Blink skica v přestrojení! Zapínáme a vypínáme LED po dobu, kterou jsme určili v posledním kroku.

a pak opakujeme smyčku.

spuštění Vzdáleného Demo

Načíst kód a napájení Arduino je. Můžete použít serial monitor na slave Arduino pro zobrazení příchozí data.

I2C Experiment 2

otáčením potenciometru by se nyní měla měnit rychlost blikání LED na slave.

závěr

tím se uzavírá náš první podrobný pohled na I2C. v další splátce se dozvíme více o struktuře vyměňovaných dat. Vezmeme také běžný senzor a změníme jej na senzor I2C.

Šťastná komunikace!

zdroje

náčrtky-všechny náčrtky I2C použité v tomto článku.

I2C informace – Informace týkající se protokolu I2C

I2C Komunikací, Část 1 – Arduino Arduino
Shrnutí
I2C Komunikací, Část 1 - Arduino Arduino
Název Článku
I2C Komunikací, Část 1 – Arduino Arduino
Popis
V této první části série článků o I2C dozvíte se, co je I2C. Uvidíte také, jak Knihovna Arduino Wire dělá komunikaci přes I2C velmi jednoduchou.
Autor
DroneBot Workshop
Jméno Vydavatele
DroneBot Workshop
Vydavatele, Logo
DroneBot Workshop

Tagem na: Arduino Tutoriálu

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *