Tanan bahin sa Arduino I2C bus

Arduino I2C bus

Con Ang Arduino makahimo sa daghang mga proyekto sama sa imong nakita kung gibasa nimo ang Hwlibre, pagprogram sa microcontroller sa usa ka yano nga paagi. Apan taliwala sa mga analog ug digital nga koneksyon sa kini nga libre nga board sa hardware, adunay pipila nga medyo wala pa mailhi sa daghang mga nagsugod, sama sa tinuud nga potensyal sa mga koneksyon sa PWM, ang SPI, ang RX ug TX nga mga pin sa serial port, o tag-iya sa I2C bus. Busa, sa kini nga pagsulud mahimo nimo mahibal-an ang tanan nga kinahanglan nimo gikan sa I2C.

Con ang I2C bus mahimo nimo nga makakonektar ug magamit ang daghang mga aparato sa ikatulo nga partido nga adunay kini nga klase nga protokol aron makigsulti sa Arduino board. Sa taliwala nila, mahimo nimong makakonektar ang mga accelerometro, display, counter, kompas, ug daghan pa nga mga integrated circuit tungod sa kini nga imbento sa Philips.

Unsa ang I2C?

Ang I2C nagtumong sa Inter-Integated Circuit, kana mao, inter-integrated circuit. Kini usa ka serial data bus sa komunikasyon nga naugmad kaniadtong 1982 sa kompanya nga Philips Semiconductors, nga karon NXP Semiconductors pagkahuman nga mawala kini nga seksyon. Sa una gihimo kini alang sa mga telebisyon sa kini nga tatak, aron makigsulti daghang mga sulud nga chip sa usa ka yano nga paagi. Apan gikan sa 1990 ang I2C mikaylap ug gigamit sa daghang mga taggama.

Karon gigamit sa daghang mga chipmaker alang sa daghang mga gimbuhaton. Ang Atmel, ang taghimo sa mga microcontroller alang sa Arduino boards, gipaila ang itudlo sa TWI (Two Wired Interface) alang sa mga hinungdan sa paglilisensya, bisan kung parehas kini sa I2C. Apan kaniadtong 2006, ang orihinal nga patente natapos na ug wala na hilisgutan sa copyright, busa gigamit usab ang termino nga I2C (ang logo ra ang padayon nga gipanalipdan, apan ang pagpatuman niini o ang paggamit sa termino wala gikutuban).

Mga detalye sa teknikal nga I2C bus

I2C bus

El Ang I2C bus nahimo’g us aka standard sa industriya, ug gipatuman kini sa Arduino alang sa komunikasyon sa mga peripheral nga kinahanglan niini. Kinahanglan ra niini ang duha nga linya o kable alang sa operasyon niini, usa alang sa signal sa orasan (CLK) ug ang usa alang sa pagpadala sa serial data (SDA). Maayo kini kon itandi sa ubang mga komunikasyon kung itandi sa SPI bus, bisan kung ang operasyon niini medyo labi ka komplikado tungod sa dugang nga kinahanglan nga circuitry.

Sa kini nga bus ang matag aparato nga konektado niini adunay usa ka adres gigamit aron ma-access kini nga mga aparato nga tagsatagsa. Ang adres nga kini gitakda sa hardware, gibag-o ang katapusang 3 tipik pinaagi sa mga jumper o switch DIPs, bisan kung mahimo usab kini buhaton sa software. Ang matag aparato adunay usa ka talagsaon nga adres, bisan kung daghan sa kanila mahimo adunay parehas nga adres ug ang usa ka segundaryo nga bus mahimong kinahanglan gamiton aron malikayan ang mga panagsumpaki o mabag-o kini kung mahimo.

Dugang pa, ang I2C bus adunay usa ka Master-Slave type nga arkitektura, kana mao, agalon nga ulipon. Kini gipasabut nga kung ang komunikasyon gisugdan sa usa ka agalon nga aparato, makahimo kini magpadala o makadawat datos gikan sa mga ulipon niini. Ang mga ulipon dili makapadayon sa komunikasyon, ang agalon ra ang makahimo niini, ug ang mga ulipon dili direktang makigsulti sa matag usa nga wala ang interbensyon sa agalon.

Kon ikaw adunay daghang mga magtutudlo sa bus, usa ra ang mahimong maglihok isip magtutudlo dungan. Apan dili kini takus niini, tungod kay ang pagbag-o sa magtutudlo nangayo usa ka taas nga pagkakumplikado, busa dili kini kanunay.

Hinumdomi nga ang gihatag sa agalon ang signal sa orasan aron i-synchronize ang tanan nga mga aparato sa bus. Giwagtang kana ang panginahanglan alang sa matag ulipon nga adunay kaugalingon nga relo.

Nakita usab sa I2C bus protocol ang paggamit sa mga pull-up resistor sa mga linya sa boltahe sa suplay (Vcc), bisan kung kini nga mga resistor dili sagad gigamit sa Arduino pagbira tungod kay ang mga librarya sa programa ingon nga gipalihok sa Wire ang mga sulud nga adunay mga kantidad nga 20-30 k. Mahimo kini nga sobra ka hinay alang sa pipila nga mga proyekto, busa ang pagtaas sa mga ngilit sa signal mahimong hinay, busa ang labi ka dali nga tulin ug mas mubo nga gilay-on sa komunikasyon mahimong magamit. Aron matul-id kana mahimo nimo kinahanglan nga magtakda sa gawas nga mga pull-up resistor gikan sa 1k hangtod 4k7.

Ilhanan

I2C signal

 

La frame sa komunikasyon diin ang usa ka sinyales sa bus nga I2C naglangkob sa mga tipik o estado (kana nga gigamit sa Arduino, tungod kay ang sukaranan sa I2C nagtugot sa uban):

  • 8 tipik, 7 sa kanila sa direksyon sa aparato sa ulipon nga gusto nimo nga ma-access aron mapadala o makadawat datos gikan niini. Uban sa 7 nga tipik, hangtod sa 128 nga lainlaing mga adres ang mahimo, mao nga 128 nga mga aparato mahimong ma-access sa teoretikal, apan 112 ra ang ma-access, tungod kay ang 16 gitagana alang sa mga espesyal nga gamit. Ug ang dugang nga gamay nga nagpaila kung gusto nimo ipadala o madawat kasayuran sa aparato sa ulipon.
  • Adunay usab gamay nga panghimatuud, kung dili kini aktibo ang komunikasyon dili mahimong balido.
  • Unya ang data bytes nga gusto nila ipadala o madawat sa mga ulipon. Ang matag byte, sama sa imong nahibal-an, gihimo sa 8-bit. Hinumdomi nga alang sa matag 8-bit o 1 byte nga datos nga gipadala o nadawat, usa ka dugang nga 18 tipik nga pagpanghimatuud, adres, ug uban pa ang gikinahanglan, nga nagpasabut nga ang bus limitado kaayo sa katulin.
  • Usa ka katapusan nga pag-validate sa comunication.

Ingon kadugangan, ang kadaghan sa orasan alang sa transmisyon mao ang 100 Mhz ingon standard, bisan kung adunay usa ka dali nga mode sa 400 Mhz.

Mga bentaha ug disbentaha sa I2C bus

ang mga kaayohan Sila mao:

  • Ang kayano pinaagi lang sa paggamit sa duha ka linya.
  • Kini adunay mga mekanismo aron mahibal-an kung miabut na ang signal kumpara sa uban pang mga protokol sa komunikasyon.

ang disadvantages Sila mao:

  • Dali medyo mubu ang transmission.
  • Dili kini usa ka tibuuk nga duplex, sa ato pa, dili ka makapadala ug makadawat dungan.
  • Dili mogamit paridad ni bisan unsang lahi nga mekanismo sa panghimatuud aron mahibal-an kung husto ang nadawat nga mga tip sa datos.

 

 

I2C sa Arduino

Arduino I2C bus

En Arduino, depende sa modelo, lainlain ang mga lagdok nga mahimong magamit aron magamit kini nga I2C bus. Pananglitan:

  • Arduino UNO, Nano, MiniPro: Ang A4 gigamit alang sa SDA (datos) ug A5 alang sa SCK (orasan).
  • Arduino Mega: pin 20 alang sa SDA ug 21 alang sa SCK.

Hinumdomi nga aron magamit kini kinahanglan nimo paggamit sa librarya Wire.h alang sa imong Arduino IDE code, bisan kung adunay uban pa nga gusto I2C y I2Cdevlib. Mahimo nimong mabasa ang mga dokumento sa kini nga librarya o sa among mga artikulo sa mga proyekto nga gusto nimo makuha ang mga code kung giunsa kini giprograma.

Giunsa mahibal-an ang address sa usa ka aparato aron magamit kini sa I2C?

Usa ra ka katapusang pasidaan, ug kana kung mopalit ka mga IC gikan sa mga tiggama sa Europa, Hapon o Amerikano, ikaw ipakita ang direksyon kinahanglan nimo gamiton alang sa aparato. Sa laing bahin, ang mga Insek usahay dili kini idetalye o kini dili tama, busa dili kini molihok. Dali kana nga masulbad sa usa ka scanner sa address aron mahibal-an kung unsang direksyon ang kinahanglan nimo nga makita sa imong sketch.

La komunidad sa arduino gibuhat kini code aron ma-scan ang adres ug maila kini Sa usa ka yano nga paagi. Bisan kung gipakita ko kanimo ang code dinhi:

#include "Wire.h"
 
extern "C" { 
    #include "utility/twi.h"
}
 
void scanI2CBus(byte from_addr, byte to_addr, void(*callback)(byte address, byte result) ) 
{
  byte rc;
  byte data = 0;
  for( byte addr = from_addr; addr <= to_addr; addr++ ) {
    rc = twi_writeTo(addr, &data, 0, 1, 0);
    callback( addr, rc );
  }
}
 
void scanFunc( byte addr, byte result ) {
  Serial.print("addr: ");
  Serial.print(addr,DEC);
  Serial.print( (result==0) ? " Encontrado!":"       ");
  Serial.print( (addr%4) ? "\t":"\n");
}
 
 
const byte start_address = 8;
const byte end_address = 119;
 
void setup()
{
    Wire.begin();
 
    Serial.begin(9600);
    Serial.print("Escaneando bus I2C...");
    scanI2CBus( start_address, end_address, scanFunc );
    Serial.println("\nTerminado");
}
 
void loop() 
{
    delay(1000);
}


Ang sulud sa artikulo nagsunod sa among mga prinsipyo sa pamatasan sa editoryal. Aron magreport usa ka pag-klik sa sayup dinhi.

Himoa ang una nga makomentaryo

Biyai ang imong komentaryo

Ang imong email address dili nga gipatik. Gikinahanglan kaumahan mga gimarkahan sa *

*

*

  1. Responsable sa datos: Miguel Ángel Gatón
  2. Katuyoan sa datos: Kontrolaha ang SPAM, pagdumala sa komento.
  3. Legitimation: Ang imong pagtugot
  4. Komunikasyon sa datos: Ang datos dili ipahibalo sa mga ikatulong partido gawas sa ligal nga obligasyon.
  5. Pagtipig sa datos: Ang database nga gidumala sa Occentus Networks (EU)
  6. Mga Katungod: Sa bisan unsang oras mahimo nimong limitahan, bawion ug tanggalon ang imong kasayuran.