Introduction
I2C communications he became the de facto method of communications between microcontrollers, microcomputers and a variety of integrated circuits and sensors. Se on ollut olemassa vuodesta 1982 ja alun perin kehitetty käytettäväksi televisiovastaanottimissa.
vaikka olemme käyttäneet monia I2C-antureita ja-näyttöjä aiemmissa artikkeleissamme, Emme ole itse asiassa tutkineet, miten I2C toimii ja miten sitä voidaan käyttää mikrokontrollereiden väliseen viestintään.
tänään korjaamme sen ja opimme lisää I2C: stä. näemme myös, miten sitä voidaan käyttää tiedonvaihtoon kahden Arduinon välillä ja miten sitä voidaan käyttää yhden Arduinon hallitsemiseen.
Tämä on ensimmäinen neljästä I2C-artikkelista. tulevissa artikkeleissa nähdään, miten voimme rakentaa omia I2C-laitteitamme, miten voimme liittää Raspberry Pi: n ja Arduinon I2C: n avulla ja miten tehdä joitakin kehittyneitä I2C-konfiguraatioita, mukaan lukien käyttämällä useita Mastereita yhdessä I2C-väylässä.
Let ’ s get started!
I2C-tietoliikenne
I2C on sarjaprotokolla, jota käytetään hitaassa 2-johdinliitännässä. Sen kehitti alun perin Phillips vuonna 1982, jotta televisiovastaanottimien mikropiirit voisivat kommunikoida keskenään.
ajat ovat muuttuneet, Phillips on nyt NXP ja I2C: stä on tullut viestintästandardi, jota käytännössä jokainen merkittävä puolijohdevalmistaja tukee.
I2C on lyhenne sanoista ”Inter-Integrated Circuit”. Sitä kutsutaan myös nimellä ”IIC” tai”I potenssiin C”.
käyttää ja rajoittaa
I2C: tä käytetään mikrokontrollereiden kuten Arduinon ja mikrotietokoneiden kuten Raspberry Pi: n kanssa. Monet näytöt ja anturit liittyvät isäntäohjaimeensa I2C: n avulla.
I2C: llä on kuitenkin useita rajoituksia. Se ei ole erityisen nopea, vaikka useimpiin käyttötarkoituksiinsa se on riittävän nopea.
I2C: tä voidaan käyttää vain lyhyillä etäisyyksillä, olihan se alun perin tarkoitettu kommunikoimaan samalla piirilevyllä olevien integroitujen piirien välillä. Luotettavan lähetyksen maksimietäisyys pienenee nopeuden kasvaessa, hitaimmalla nopeudella (100 Kbaud tai 100 KHz: n kellotaajuudella) maksimietäisyys on noin metri.
I2C-nopeudet
alkuperäisen I2C-väylän huippunopeus oli 100 KHz. Useimmat tavalliset sovellukset käyttävät tätä nopeutta edelleen, koska se on aivan riittävä tietojen siirtämiseen antureista ja yksinkertaisiin näyttöihin.
I2C ja siinä on joitakin nopeampia moodeja. Kaikki I2C-laitteet eivät tue näitä moodeja:
- Pikatila – tämän maksimikellonopeus on 400 KHz.
- Hi-Speed Mode – maksimikellotaajuus fo 3,4 MHz
- Ultra Fast Mode – Maksimikellotaajuus 5 MHz
I2C-väylällä kellotaajuuden määrää mestari.
miten I2C toimii
I2C-väylässä on kaksi opastinta sekä virta-ja maaliitäntä.
kaksi opastinlinjaa ovat seuraavat:
- SDA-tämä on kaksisuuntainen datalinja.
- SCL – tämä on kellosignaali.
kuhunkin signaalilinjaan on kiinnitetty kaksi vetovastusta, ne vetävät väylää ylös syöttöjännitteelle, kun se on inaktiivinen.
huomaa, että syöttöjännite ei ole vakio, se voi olla joko 3,3 tai 5 volttia. Se voi olla myös pienempi jännite joissakin nopeissa I2C-toteutuksissa.
tämä syöttöjännitteiden ero voi aiheuttaa ongelmia, kun liität eri logiikkatasoja käyttäviä I2C-laitteita. Keskustelemme tästä lisää tulevassa artikkelissa, kun näytän, miten käyttöliittymä Vadelma Pi (3.3 voltin logiikka) Arduino Unolla (5 voltin logiikka).
I2C – väylään voidaan liittää kahdenlaisia laitteita: Masters ja Slaves.
Päälaite ohjaa väylää ja toimittaa kellosignaalin. Se pyytää tietoja orjilta erikseen. Väylässä voi olla useampi kuin yksi päälaite, mutta vain yksi voi olla aktiivinen master kulloinkin.
päälaitteilla ei ole niille osoitettua osoitetta.
Orjalaitteilla on osoite, ja tämän osoitteen on oltava bussissa uniikki. He käyttävät 7-bittistä osoitejärjestelmää, joten jopa 128 orjaa voi olla yhdessä I2C-väylässä. Tosielämässä näin suurta laitekokoelmaa ei koskaan käytetä, on harvinaista nähdä toistakymmentä I2C-laitetta yhdessä väylässä.
uudempi, 10-bittinen osoitejärjestelmä on toteutettu, se on taaksepäin yhteensopiva nykyisen 7-bittisen osoitemenetelmän kanssa.
kaupallisille I2C-laitteille on varattu I2C-osoite NXP: llä, joka ylläpitää väylämäärityksiä. Vaikka I2C on ollut avointa lähdekoodia vuodesta 2006 lähtien, on NXP: ltä perittävä maksu orjaosoitteen hankkimisesta. Päälaitteista tai laitteista, joita ei ole tarkoitettu kaupalliseen valmistukseen, ei peritä maksua.
joillekin I2C-laitteille on annettu useita osoitteita, yleensä variansseja alempiin osoitebitteihin. Nämä laitteet voidaan konfiguroida manuaalisesti eri osoitteisiin, jolloin useita samantyyppisiä laitteita voidaan käyttää yhdellä I2C-väylällä.
muut I2C-johdannaiset
on muitakin I2C-väylästä johdettuja väyliä, jotka ovat monin tavoin yhteensopivia I2C: n kanssa.
- TWI – Kaksoisjohdinliitäntä on käytännössä identtinen I2C-väylän kanssa. Tämä on itse asiassa Arduinon käyttämä väylä, TWI kehitettiin, kun I2C-väylä ei ollut avointa lähdekoodia eikä Atmel halunnut riskeerata kauppanimirikkomusta. Ainoa merkittävä ero TWI: n ja I2C: n välillä on se, että TWI ei tue kehittynyttä tekniikkaa nimeltä ”kellovenytys”.
- SMBus on toinen Intelin kehittämä I2C: tä vastaava väylä. TWI: n tavoin se tukee useimpia I2C: n ominaisuuksia.
kerron tulevassa artikkelissa, Miten I2C-väylän tiedot on jäsennetty. Mutta nyt meillä on I2C: n perustietoa sen verran, että voimme aloittaa kokeilut.
Arduino Wire Library
Arduinossa on I2C: n kanssa työskentelyä varten sisäänrakennettu kirjasto nimeltä Wire Library. Sen avulla on erittäin helppo kommunikoida I2C-väylällä, ja se voi määrittää Arduinon joko isännäksi tai orjaksi.
Wire-kirjastolla on useita hyödyllisiä toimintoja I2C: n kanssa työskentelyyn.
- begin() – Tämä käynnistää kirjaston ja asettaa Arduinon joko isännäksi tai orjaksi.
- requestFrom() – tätä toimintoa isäntä käyttää pyytääkseen tietoja orjalta.
- beginTransmission() – tätä toimintoa isäntä käyttää datan lähettämiseen määrätylle orjalle.
- endTransmission() – tätä toimintoa päällikkö käyttää beginsmission-funktiolla aloitetun lähetyksen lopettamiseen.
- write() – jota sekä isäntä että orja käyttävät I2C-väylän tietojen lähettämiseen.
- käytettävissä() – sitä käyttävät sekä isäntä että orja määrittääkseen saamiensa tietojen tavumäärän.
- read() – lukee tiedon tavun I2C-väylästä.
- SetClock() – päällikön käyttämä tietty kellotaajuus.
- onreceive() – käyttää orjaa määrittelemään funktiota, jota kutsutaan, kun tieto saadaan isännältä.
- onRequest() – jota Orja käyttää määrittääkseen funktion, joka kutsutaan, kun isäntä on pyytänyt tietoja.
käytämme joitakin näistä funktioista luonnoksissamme.
Arduino I2C-yhteydet
I2C: n SDA-ja SCL-yhteydet ovat erilaiset Arduino-mallien välillä. Kokeilut olen aikeissa näyttää tehtiin käyttämällä kahta Arduino Unos, mutta voit käyttää muita malleja Arduino tarjoamalla voit muuttaa nastat vastaavasti.
olen koonnut kaavion, jonka avulla se selviää. Se sisältää joitakin yhteisiä Arduino levyt, sekä muutamia diskreetti pelimerkkejä. Sirujen I-listan pinoutit (ATTiny ja ATmega328P) ovat DIP-paketilla, eivät pinta-asennettavilla.
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 |
joillakin Arduino Uno-klooneilla on erilliset SDA-ja SCL-nastat ja niitä voi halutessaan käyttää kahden analogisen nastojen sijaan. Ne ovat sisäisesti yhteydessä samaan paikkaan.
huomaa, että Arduino erossa on itse asiassa kaksi I2C-porttia.
huomaa myös, että on olemassa joitakin vääriä kytkennät kaaviot internetissä Pro Mini. Käytä kahta analogista pinniä, A4 ja A5, kuten yllä olevassa taulukossa on esitetty.
I2C välillä 2 Arduino ’ s
meidän ensimmäinen kokeilu me hoo kaksi Arduinos yhdessä ja vaihtaa tietoja niiden välillä. Toinen Arduino on isäntä, toinen Orja.
käytän kahta Arduino-Unoa, mutta voit korvata muut Arduino-Unot, jos sinulla ei ole kahta Unoa. Käytä edellistä kaaviota yhteydet.
Hooking up 2 Arduino ’ s
Here is how I connected my two Arduino Unos together:
se on melko yksinkertainen kytkennät, periaatteessa vain sitoa maahan ja kaksi I2C nastat yhteen.
yksi tieto on, että kaaviossani ei näy vetovastusten käyttöä, huomasin, että kaikki tuntui toimivan oikein ilman niitä. Kuitenkin, kannattaa sisällyttää ne, varsinkin jos koet virheitä tai ajoittaista toimintaa.
kytkeä joitakin vetovastuksia attache pari 10k vastukset SDA ja SCL linjat. Kiinnitä toinen pää 5 voltin lähtöön yhdellä Arduino ’ s.
Master Demon sketsi
tässä on sketsi, jota käytetään Arduinossa, jonka olet määrännyt mestariksi.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
kuten kaikissa I2C-sketseissä, aloitamme ottamalla mukaan Lankakirjaston.
seuraavaksi määrittelemme muutaman vakion, jotka kuvaavat orjan I2C-osoitetta ja sitä, kuinka monta tavua dataa siitä odotetaan saatavan.
asetuksissa alustamme I2C-viestinnän masteriksi. Tiedämme, että se on master, koska ei ole osoiteparametria alkaa funktio. Asetamme myös sarjamonitorin ja tulostamme siihen tekstirivin.
nyt luuppiin.
aloitamme pienellä aikaviiveellä, lähinnä hidastaaksemme asioita sen verran, että voimme lukea sarjamonitorin näyttöä.
seuraavaksi käytämme begintransmission-toimintoa datan lähettämiseen orjalle. Tässä tapauksessa lähettämämme data on vain numero nolla. Lopetamme lähettämisen puhelulla end transmission-funktioon.
seuraavaksi pyydämme joitakin tietoja takaisin slavelta käyttäen requestFrom-funktiota.
tämän jälkeen muodostetaan vastausmerkkijono lukemalla data, tavu kerrallaan, orjalta.
tulostamme tiedot tekemisistämme ja sarjamonitorille saamistamme tiedoista. Sitten Lopettelemme silmukan ja teemme sen uudestaan.
Slave Demon sketsi
nyt orjan käyttämään sketsiin.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
59
60
div>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>
Define Slave I2C Address #define SLAVE_ADDR 9
// Define Slave answer size
#define ANSWERSIZE 5
// Define string answer = ”Hello”;
Void setup () {
//initialize I2C communications as slave
Wire.begin (SLAVE_ADDR);
// funktio suoritetaan, kun tietoja pyydetään päälliköltä
Wire.onRequest (requestEvent);
// funktio suoritetaan, kun tieto on vastaanotettu Masterilta
Wire.onReceive (receiveEvent);
/ /Setup Serial Monitor
Serial.begin (9600);
sarja.println (”I2C Slave Demonstration”);
}
void receivent () {
// Read while data received
while (0 < Wire.saatavilla ()) {
byte x = Wire.read ();
}
// Print to Serial Monitor
Serial.println (”Receive event”);
void requestEvent () {
/Setup byte variable in the right size
byte response;
/ /Format the answer as array
for (tavu i=0;i<ANSWERSIZE;i++) {
response = (tavu)answer.charAt (i);
}
// Send response back to the Master
Wire.write(response,sizeof (response));
// Print to Serial Monitor
Serial.println(”Request event”);
void loop () {
/ / Time delay in loop
delay(50);
}
|
jälleen kerran aloitetaan laskemalla mukaan wire-kirjasto. Kuten edellisessä luonnoksessa, määrittelemme myös orjan I2C-osoitteen sekä niiden tavujen määrän, jotka aiomme lähettää takaisin isännälle.
seuraavaksi määrittelemme merkkijonon, jonka aiomme lähettää takaisin mestarille, tässä tapauksessa vain sanan ”Hei”. Jos päätät muuttaa tätä varmista, että säädät VASTAUSKOKOVAKION molemmissa luonnoksissa oikeaksi.
asetuksissa alustamme yhteyden I2C-väylään begin-toiminnolla. Ota huomioon eri tavalla teemme tämän, koska tämä on orja määritämme I2C osoite aiomme käyttää. Tekemällä näin Wire-kirjasto tietää, että haluamme toimia orjatilassa.
nyt on määriteltävä niiden funktioiden nimet, joille soitamme kahden tapahtuman sattuessa – Masterilta saadun tietopyynnön ja päälliköltä saadun tiedon. Me myös setup ja tulostaa sarjamonitori.
funktion vastaanottoeventiä kutsutaan, kun saamme tietoa päälliköltä. Tässä funktiossa luemme tietoja, kun tiedot ovat saatavilla, ja määritämme ne tavulle (muista, että tiedot otetaan vastaan yksi tavu kerrallaan).
requestEvent-funktio kutsutaan aina, kun saamme tietopyynnön päälliköltä. Meidän täytyy lähettää ”Hei” takaisin mestarille. Koska meidän täytyy lähettää tiedot yksi tavu kerrallaan, jaamme ”Hello”-merkit yksittäisiin kohteisiin ja lähetämme ne sitten yksitellen.
raportoimme kaikki edistymisemme molemmissa toiminnoissa sarjamonitorille.
tämän sketsin Silmukka lisää vain aikaviiveen, joka vastaa master-sketsissä käytettyä.
Demon sketsien ajaminen
näiden sketsien suorittaminen edellyttää, että jokaisen Arduinon sarjamonitorin voi katsoa. Jos sinulla on kaksi tietokonetta, joissa Arduino IDE on asennettu, se tekee siitä paljon helpompaa.
Microsoft Windowsissa on mahdollista avata kaksi Arduino IDE: n ilmentymää. Jos näin tehdään, voit näyttää molemmat sarjamonitorit vierekkäin samalla näytöllä.
vuorotellen pystyi käyttämään yhtä tietokonetta ja käynnistämään toisen Arduinon omalla virtalähteellään. Sinun pitäisi vaihtaa tietokone ja virta kahden Arduino: n välillä. näin voit seurata molempia näyttöjä yksitellen.
Arduino kauko käyttäen I2C
seuraavassa demonstraatiossa koukkaamme potentiometrin mestari Arduinoon ja johdin orjaan. Käytämme potentiometriä ohjaamaan ledin vilkkumisnopeutta.
Tämä on toinen yksinkertainen demonstraatio, jonka päälle voi rakentaa jotain käytännöllisempää.
Remote Demo Hookup
näin tämä koe kootaan.
se on periaatteessa sama kytkennät kuin edellisessä kokeessa, jossa on lisätty potentiometri Masteriin ja LED orjaan.
huomaa, että orjassa oleva LED on kiinnitetty tappiin 13. Koska Arduino Uno on sisäänrakennettu LED pin 13 voit poistaa LED ja sen pudottamalla vastus, jos haluat.
huomautukset vetovastuksista pätevät myös tähän kytkennään.
Remote Demo Master Sketch
tämän kokeen master-puolen luonnos on hyvin yksinkertainen, jollain tapaa I2C-puoli on jopa yksinkertaisempi kuin ensimmäisessä demonstraatiossa käytetty. Tämä johtuu siitä, että lähetämme vain tietoja orjalle, emmekä odota saavamme niitä takaisin.
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
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 () {
/ /Initialize I2C communications as Master
Wire.begin ();
void loop () {
delay(50);
/ / Read pot value
/ / Map to range of 1-255 for flash rate
val = map(analogRead (analogPin), 0, 1023, 255, 1);
// Write a charatre to the Slave
Wire.beginTransmission (SLAVE_ADDR);
Wire.write (val);
Wire.loppulähetys();
|
kuten aina, Johdinkirjasto on sisällytettävä luonnoksen alkuun. Määrittelemme myös vakio pitää Orja osoite.
koska käytämme potentiometriä, meidän on määriteltävä sekä se pin, johon se on liitetty, että muuttuja, joka pitää sen arvon.
asetuksissa ei tehdä muuta kuin alustaa I2C-yhteys masteriksi.
silmukassa luetaan potentiometrin arvo ja kartoitetaan se välille 01-255. Meidän on tehtävä se, koska lähetämme tietoja yhdellä tavulla ja voimme säilyttää vain näin monta arvoa yhdellä tavulla.
huomaa, että käännämme Arduinon Karttafunktion numerointijakson, tämä tehdään niin, että systeemi käyttäytyy odotetulla tavalla – potentiometrin kääntäminen oikealle lisää salamanopeutta. Koska ”salamanopeus” määritellään aikaviiveellä, suurempi määrä lähetetään vastaa pidempää salamanopeutta.
huomaa myös, että emme lähetä arvoa 0, joka vain pitäisi ledin yhdessä tilassa. Asetimme kantamamme päättymään 1: een.
nyt kyse on vain tavun lähettämisestä orjalle ja silmukan toistamisesta uudelleen.
Remote Demo Receive Sketch
orjapuolen täytyy vastaanottaa dataa isännältä ja käyttää sitä ledin väläyttämiseen.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
59
60
|
aloitamme tavanomaisella wire-kirjaston sisällyttämisellä, sekä määrittelemällä orjaosoitteen. Määrittelemme myös tappi LED.
määritellään pari lisämuuttujaa, joista toisessa on saatu tieto ja toisessa välähdysnopeuden viivearvo.
Setupissa asetamme I / O-pin-koodin ledille ulostuloksi ja alustamme I2C-väylän. Kun käytämme slave-osoitetta begin funktiossa, Wire-kirjasto tietää, että toimimme orjana.
meidän tarvitsee vain määritellä onReceive-funktio, toisin kuin edellisessä demossa emme odota mitään pyyntöjä mestarilta. Määritämme ja tulostamme myös Sarjamonitoriin, käytämme näyttöä saapuvien tietojen tarkasteluun.
receiveEvent-funktio lukee tulevan tiedon ja määrittää sen I-muuttujalle. Se myös tulostaa arvon sarjamonitorille.
lopuksi silmukassa käytetään saapuvaa dataa ledin räpyttämiseen. Jälleen kerran käytämme Karttafunktiota tämän saavuttamiseksi, muuttaen saapuvat arvot 1-255 laajemmalle alueelle. Voit kokeilla muuttaa tämän alueen tehdä LED vilkkua nopeammin tai hitaammin, jos haluat.
viimeiset lausahdukset ovat lähinnä Arduinon Blink-sketsi in disguise! Kytkemme LED-valot päälle ja pois päältä ajan, jonka määritimme viimeisessä vaiheessa.
ja sitten toistetaan silmukka.
Running the Remote Demon
Load the code and power both Arduino ’ s. you can use your serial monitor on the slave Arduino to view the incoming data.
potentiometrin kääntämisen pitäisi nyt vaihdella ledin välähdysnopeutta slavella.
johtopäätös
Tähän päättyy ensimmäinen yksityiskohtainen tarkastelumme I2C: hen. seuraavassa erässä saamme lisätietoja vaihdettavien tietojen rakenteesta. Otamme myös säännöllisen anturin ja muutamme sen I2C-anturiksi.
onnellista kommunikointia!
resurssit
Sketches – kaikki tässä artikkelissa käytetyt I2C-sketsit.
I2C information – Information regarding the I2C protocol
/ div >