Pages: [1] 2   Go Down
Author Topic: I2C questo sconosciuto  (Read 1677 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao,dato che ho appena ordinato un IMU 10DOF LLC - ITG3200 + BMA180 + HMC5883 + MS5611 + LLC ,ed ho visto che lavora con protocollo i2c,volevo chiedervi se esiste una guida o tutorial su come usare questo protocollo con arduino.
Googlando (ke termine hhèèè smiley-eek) ho trovato varie documentazioni su cosè il protocollo i2c ma non come usarlo con arduino,ho trovato vari esempi che però si sono dimostrati molto complessi da intepretare compresi quelli del sito di drotek.
grazie
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao

il protocollo i2c è gestito da una libreria Core di Arduino (Wire, http://arduino.cc/it/Reference/Wire): dialogare con dispositivi i2c è quindi decisamente facile con i comandi disponibili.

Tieni conto che i2c è solo il protocollo di comunicazione, quello che i dati significano dipende dal singolo dispositivo i2c, devi quindi guardare il datasheet dei sensori che compongono la tua IMU per capire come leggere (e in quali celle di memoria) i valori disponibili.

bye
Logged

lucadentella.it

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

l'i2c in realtà è abbastanza semplice. prima di tutto ti serve il datasheet del sensore che vuoi usare. esso possiede un indirizzo, tipo 0x2A.
ogli sensore ha un elenco di registri, anche loro con un indirizzo simile a quello di prima.

quindi se vuoi modificare un registro, apri una comunicazione con l'indirizzo del sensore, invii l'indirizzo del registro che vuoi modificare, invii il nuovo valore che il registro deve avere, ed infine chiudi la comunicazione.

per leggere è molto simile: apri la comunicazione con l'indirizzo del sensore, invii il numero di registro da cui PARTIRE a leggere, il numero di byte (ogni registro è un byte) che vuoi leggere, e poi ti metti in ascolto. ricevuti i messaggi chiudi la comunicazione.

molto spesso negli esempi su internet non usano la libreria Wire, perchè ha una grossa limitazione: se qualcosa non funziona bene, essa rimane bloccata. invece altre librerie restano bloccate solo un tot di tempo, dopodiché rilevano il timeout e permettono al programma di andare avanti. molto utile per evitare che se un cavo con la imu si stacca, o un disturbo particolarmente forte, facciano impazzire completamente la tua applicazione.
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

per esempio come faccio a recuperare le info dell'asse x di questo accelerometro per poi scriverle su un servo?
http://omapworld.com/BMA180_111_1002839.pdf
I2C addres: 64
Sò che la risposta sarà complessa ma porta pazienza non l'ho mai fatto..
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

allora ho provato ma senza risultati smiley-cry smiley-cry:
Quote
#include <Wire.h>

#define BMA180              0x64

int x,y,z,temp;

void setup()
{
  Wire.begin();
  Serial.begin(115200);

}

void loop()
{

  Wire.beginTransmission(BMA180);
  x=Wire.requestFrom(2, 6);

}

void printAccel()
{
  Serial.print("X = ");
  Serial.println(x);

}


1: il codice lo compila ma non ricevo niente sulla seriale
2:se includo la sua librerie del bma180 mi da errore di compilazione

C:\Users\Desktop\arduino-1.0\libraries\bma180\bma180.cpp: In member function 'int BMA180::getIDs(int*, int*)':
C:\Users\Desktop\arduino-1.0\libraries\bma180\bma180.cpp:139: error: call of overloaded 'write(int)' is ambiguous
C:\Users\Desktop\arduino-1.0\libraries\Wire/Wire.h:55: note: candidates are: virtual size_t TwoWire::write(uint8_t)
C:\Users\Desktop\arduino-1.0\hardware\arduino\cores\arduino/Print.h:49: note:                 size_t Print::write(const char*)

allego il datasheet per gli indirizzi di registro a pagina 22

* BMA180-DataSheet-v2.5.pdf (1189.85 KB - downloaded 1 times.)
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Così hai inviato la richiesta per leggere dal registro 2 per 6 registri. Però dopo non fai le read!!!!
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

devo fare cosi?
Quote
void loop()
{

  Wire.beginTransmission(BMA180);
  x=Wire.requestFrom(2, 6);
  Wire.read();
}

void printAccel()
{
  Serial.print("X = ");
  Serial.println(x);

}

Logged

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

No, devi assegnare il byte letto con Wire.read ad una variabile.

PS: ti suggerisco di rileggerti per bene qui:
http://arduino.cc/en/Reference/Wire
Logged


Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 102
Posts: 6548
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dagli errori sembra che la libreria non sia aggiornata alla versione 1.0 dell'IDE.
Puoi risolvere o cercando una libreria aggiornata o usando una vecchia versione dell'IDE, ad esempio la 023 -->  http://arduino.cc/en/Main/Software --> Previous IDE Versions.
Logged

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

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

@Pablos:
uhm, forse non hai visto il codice che usa:

Code:
x=Wire.requestFrom(2, 6);
Wire.read();
Non è questione di versione dell'IDE, se non assegna ciò che legge a qualcosa. Al max alla rovescia, ossia Wire.request(ecc) e poi x=Wire.Read().

@micky:
estratto dalle pagine presenti nel link che ti ho suggerito:
Quote
Wire.requestFrom()

Description
Used by the master to request bytes from a slave device. The bytes may then be retrieved with the available() and read() functions.

Ed ancora:
Quote
read()

Description
Reads a byte that was transmitted from a slave device to a master after a call to requestFrom() or was transmitted from a master to a slave.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

allora ho fatto ome mi ha detto leo72 cioè :
Quote
void loop()
{

  Wire.beginTransmission(BMA180);
  Wire.requestFrom(2, 6);
  x=Wire.read();
  Serial.print("X = ");
  Serial.println(x);

}

ora il codice lo compila senza errori però dal segnale ricevo solo:
x=-1
x=-1
x=-1
x=-1
x=-1
ecc..
forse ho sbagliato a richiamare il registro?(requestFrom(2, 6)) è che da sto datasheet non ci capisco una mazza
Logged

0
Offline Offline
Faraday Member
**
Karma: 38
Posts: 5604
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

x iscrizione
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

can la read leggi un registstro (un byte) alla volta.  tu hai fatto richiesta per 6 byte, quindi ci vogliono 6 read.

se non ricordo male, un valore in quel sensore occupa 2 registri, quindi tu stai leggendo i 3 valori X, Y e Z (sempre che l'indirizzo di lettura sia giusto... e dubito)
quindi devi unire i due byte che corrispondono al valore in un valore (int) unico.

Ah, molto sensori non i2c non leggono in automatico, ma prima bisogna scrivere in un registro dei particolari valori (in pratica degli dirgli di partire a leggere)
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

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

Inoltre un tipo byte non può essere negativo, che tipo stai usando? Char o int?
Logged


Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 102
Posts: 6548
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Seguendo i vari link attraverso il sito della droytek sono approdato qui --> https://github.com/sodnpoo/arduino/blob/master/bma180_demo/bma180_demo.pde
Si vede chiaramente che prima di leggere i dati dal sensore questo deve essere inizializzato: initBMA180()
Inoltre, è presente anche una funzione per leggere i valori relativi all'accelerazione. Studiandole insieme al datasheet del sensore si può capirne il funzionamento.
Logged

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

Pages: [1] 2   Go Up
Jump to: