Pages: [1] 2   Go Down
Author Topic: comunicazione I2C  (Read 2893 times)
0 Members and 1 Guest are viewing this topic.
Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

qualcuno può spiegarmi brevemente e chiaramente come funziona la comunicazione I2C e come gestirla con arduino?
io ho questo sensore che funziona come una bussola e che usa la I2C:
http://www.robot-electronics.co.uk/htm/cmps3tech.htm

e ho trovato anche un programma già fatto che è questo:
Code:
#include <Wire.h>

#define address 0x60 //defines address of compass

void setup(){
  Wire.begin(); //conects I2C
  Serial.begin(9600);
}

void loop(){
  byte highByte;
  byte lowByte;
  
   Wire.beginTransmission(address);      //starts communication with cmps03
   Wire.send(2);                         //Sends the register we wish to read
   Wire.endTransmission();

   Wire.requestFrom(address, 2);        //requests high byte
   while(Wire.available() < 2);         //while there is a byte to receive
   highByte = Wire.receive();           //reads the byte as an integer
   lowByte = Wire.receive();
   int bearing = ((highByte<<8)+lowByte)/10;
  
   Serial.println(bearing);
   delay(100);
}

l'ho provato e mi pare che funzioni bene smiley
però a me piacerebbe capire un po' come funziona e non solo copiare ad occhi chiusi, visto che è anche nella tesina d'esame smiley
P.S. ho chiesto anche al mio prof di telecomunicazioni e mi ha guardato male e mi ha risposto di cercare in internet smiley-lol
« Last Edit: November 07, 2011, 04:49:43 pm by er_like_no_other » Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21653
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Intanto ti suggerisco di leggerti bene la libreria Wire:
http://www.arduino.cc/en/Reference/Wire
E la Wikipedia:
http://it.wikipedia.org/wiki/I2C

Poi ti riassumo brevemente.
L'I2C è uno standard di comunicazione creato da Philips per permettere a più dispositivi di comunicare tramite un semplice bus composto da 2 fili.
Ogni dispositivo ha sul bus un indirizzo univoco e può quindi essere contattato in maniera semplice aprendo una connessione specificando il suo ID.
Ogni dispositivo può ricevere dati e spedire dati, a seconda dei comandi.

I commenti nel codice postato spiegano bene la cosa: apri una connessione al sensore dando il suo ID, richiedi dei dati, memorizzi i valori ricevuti.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

si stavo provando a leggere anche questa guida, che mi sembra un po' più tecnica di wikipedia...
http://www.gioblu.com/tutorials/comunicazione/69-il-protocollo-i2c
ma non mi è chiaro cosa sono gli indirizzi, per esempio perchè nel programma mettono l'address 0x60?
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Trieste/Udine
Offline Offline
Sr. Member
****
Karma: 6
Posts: 283
Arduino+Python Qt e un pò di Elettronica
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

semplice nel programma metti l'indirizzo x06 perche quello è lindirizzo del tuto dispositivo.
(ricordo che l'indirizzo di un dispositivo è come l'indirizzo di uan casa x mandare uan lettera)

quello è l'indirizzo che il costruttore imposta a quel determinato congegno.
se ricordo bene alcuni son fissi, quello è quello ti tieni, altri dispositivi hanno 3 bit (mi sembra) che poi deciderli tu e cosi puoi mettere piu dispositivi ugali sullo stesso bus, cambiano un pò l'indirizzo di defaul smiley

Mandi
Logged

Le informazioni date, son suggerimenti, osservazioni, ma come le applicate è a vostro rischio e pericolo!!

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20280
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ogni dispositivo I2C ha un suo indirizzo a 7bit. l' ottavo bit serve per segnalare se viene scritto o letto.

Gli indirizzi possono essere fissi, oppure avere una parte (normalmente i 3 bit inferiori) che possono essere selezionati con 3 piedini. cosí si possono mettere 8 dispositivi uguali sullo stesso bus.
Ancora altri si possono programmare l' indirizzo via programmazone.

c'é in internet anche un sketch che ti scanna tuttigli indirizzi attivi di un bus.  cerca "I2C scanner arduino" http://www.kyleisom.net/arduino/sketch/I2C_scanner.pde
Ciao Uwe
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21653
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Gli indirizzi possono essere fissi, oppure avere una parte (normalmente i 3 bit inferiori) che possono essere selezionati con 3 piedini. cosí si possono mettere 8 dispositivi uguali sullo stesso bus.
Un esempio sono i chip EEPROM I2C tipo la serie 24LCxx. Mettendo a massa o a Vcc questi 3 piedini gli possiamo far assumere il valore logico 0 o 1 rispettivamente. Siccome i piedini sono 3, la logica binaria dice che 2^3 sono 8 combinazioni, ecco quindi gli 8 dispositivi uguali che possono essere messi insieme.
I restanti bit dell'indirizzo sono fissi e programmati in HW dal costruttore. L'indirizzo si può leggere dal datasheet del dispositivo.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok mi è un po' più chiaro adesso smiley
ma mi sorge un'altra domanda... questo sistema di comunicazione mi sembra "lento" o sbaglio? a che frequenza va sull'arduino?
per svolgere il programma che ho postato sopra quanti millisecondi ci mettera più o meno? (tolto il delay finale ovviamente)
comunque il codice è giusto no? non ci sono errori vero?
grazie ancora smiley-wink
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20280
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le possibili velocitá sono:
Standard Mode    100 kHz
Fast Mode    400 kHz
Fast Mode Plus    1 MHz
High Speed Mode    3,4 MHz
Il ATmega sopporta:
Up to 400 kHz Data Transfer Speed
vedi pagina 214 di http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf
Ciao Uwe
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21653
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La velocità dell'I2C (100 o 400 kHz) sugli Atmega la stabilisce la corrente di pull-up.
Per avere la max velocità mi pare servano sui 2/3 mA: per ottenerli usa 2 resistenze di pull-up da 1K5-2K2 (una per linea del bus): con 1K5 hai 3 mA, con 2K2 hai 2 mA. Sotto ai 2K2 non scendere, se vuoi la max velocità.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok grazie smiley
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Milan
Offline Offline
Edison Member
*
Karma: 1
Posts: 1128
gioblu.com
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Calamaro ha scritto una guida davvero completa qui:
http://www.gioblu.com/tutorials/comunicazione/69-il-protocollo-i2c
Logged

Community robotica / programmazione Arduino
www.gioblu.com

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

scusate, sto disegnando un pcb e ho il problema che il sensore che comunica in I2C con l'arduino è un po' distante e mi chiedevo quale fosse la posizione migliore per piazzare le resistenze di pull-up? vicino all'arduino o vicino al sensore? non penso che cambi molto perchè non ho una grande distanza, 20/30 cm, è più che altro una curiosità smiley-mr-green
grazie in anticipo smiley-wink
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21653
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mettile dove capita, magari centralmente alle linee, così dai nel mezzo. Un fattore importante è il loro valore. Usa R comprese fra 1K5 e 2K2, per avere come minimo 2mA di corrente di pull-up con tensione a 5V.
Logged


Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 104
Posts: 6617
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Leo
Nel caso di Arduino, le resistenze di pullup per il bus I2C sono interne al micro-controllore oppure vanno messe esterne?
E se non si mettono?

Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21653
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Giorni fa ne abbiamo discusso con Uwe. Il core di Arduino quando si comunica con l'I2C attiva in automatico le pull-up interne sui pin A4 e A5. Ma le pull-up di Arduino sono da 20/30K, quindi danno una corrente molto bassa. L'I2C può lavorare a 2 frequenze, 100 kHz e 400 kHz: per lavorare a 400 kHz necessita di una corrente di pull-up sulle linee di 2/3 mA.

Io uso quelle esterne. Volendo si può modificare il core per togliere l'attivazione delle pull-up interne.
Logged


Pages: [1] 2   Go Up
Jump to: