@Pablos:
uhm, forse non hai visto il codice che usa:
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:
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:
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.
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
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)
Seguendo i vari link attraverso il sito della droytek sono approdato qui --> arduino/bma180_demo.pde at master · sodnpoo/arduino · GitHub
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.
paolo, attento a non confondere le inizializzazioni necessarie a far funzionare il sensore con le inizializzazioni di scale di lettura, numero di sample, modalità di funzionamento etc...
allora ho provato a caricare il codice suggeritomi da PaoloP dopo averlo confrontato con il datasheet.devo dire che alcune cose le ho interpretate altre funzioni no comunque ho voluto testare il codice cosi com'è con IDE 0023 e per ora l'unica cosa che ho cambiato è l'indirizzo dell bma180 da 0x40 a 0x64:
Codice allegato...
ora non capisco perchè mi da un errore nel serial monitor:
Id = 104
PROBLEM..... Result code is 2
X:
i collegamenti sono
IMU Arduino
SDA pin4
SCL pin5
+5v 5v
GND gnd
poi ho messo una resistenza da 4.7KOhm tra SDA e 5v e un altra tra SLC e 5v.
L'IDE 1.0 attiva di default le pull-up interne. Non so se devi diminuire il valore di quelle esterne o disattivare le interne.
Per quanto riguarda l'errore, esso deriva dalla funzione twi_writeTo che è richiamata da Wire.EndTrasmission().
/*
* Function twi_writeTo
* Desc attempts to become twi bus master and write a
* series of bytes to a device on the bus
* Input address: 7bit i2c device address
* data: pointer to byte array
* length: number of bytes in array
* wait: boolean indicating to wait for write or not
* Output 0 .. success
* 1 .. length to long for buffer
* 2 .. address send, NACK received
* 3 .. data send, NACK received
* 4 .. other twi error (lost bus arbitration, bus error, ..)
*/
Il codice 2 si riferisce ad una mancata risposta: o hai sbagliato Address oppure ci sono problemi di comunicazione.
Per gli indirizzi c'era uno sketch per elencare tutte le periferiche presenti sul bus. Non trovo il link però.
micky861:
ho trovato questo : http://todbot.com/arduino/sketches/I2CScanner/I2CScanner.pde
...
edit: l'indirizzo 30 è un altro sensore sulla IMU dovevano essere 4 ma dato che fa la scansione fino al 100 gli altri due non li vede il 105 e il 119.
Non so perché quel sketch fa la scansione solo fino al indirizzo 100 e non fino al indirizzo massimo possibile ( 127).
micky861:
allora ho cambiato #define address 0x64 in #define address 64e ora sembrerebbe funzionare,è un pò lento ad aggiornare le letture.
edit:ho abbassato il delay da 1000 a 100 ora è più veloce.
ma ho bisogno di tutto il codice per avere letture sull' asse X?
se hai un delay ci credo che le letture son lente
se vuoi leggere solo l'asse X, allora ti posizioni sul suo indirizzo di partenza e poi leggi tanti byte quanti sono i registri che compongono il valore asse X
Scuate forse non sono stato molto chiaro, volevo dire se è possibile snellire il codice dato che mi serve solo un valore di esso. ho questo dubbio perchè non ho ancora ben capito tutto il suo funzionamento e vorrei eliminare le parti che non mi interessano per la lettura dell'asse X senza peròprovocare dei "danni" al codice..
come vedrai ho gia disabilitato con / ---/ stampa sulla seriale dei valori Y Z,ma è la metà finale che non sò se si può eliminare qualcosa.
per questo codice uso IDE 0023 che poi tra l'altro volevo importarlo nell IDE 1.0.