Bonjour;
J'ai un souci avec un digispak (qui fonctionne). Il a la dernière version du micronucleus. J'ai déjà mis un sketch pour utiliser une des sorties. De ce côté, pas de souci, cela fonctionne. Le blink habituel aussi.
Mon problème arrive lorsque je tente d'utiliser un adxl345 sur bus i2c.
Je tente de lire les valeurs sur le bus avec la librairie Wire.h.
J'utilise softserial afin de lire les résultats, pour le moment, et la seule sortie que j'obltient, ce sont les sorties +/- aléatoires des axes X/Y/Z avec des valeurs à 65534 parfois !!!
Je vois bien que les valeurs changes, mais cela ne correspond à rien. parfois c'est juste X qui change mais Y reste à 0, et Z aussi, puis ce dernier passe à 653534.
Voila mon sketch de test:
#include <SoftSerial.h>
#include <Wire.h>
// Definitions pour le serial-debug
#define rxPin 1
#define txPin 3
SoftSerial mySerial(rxPin, txPin);
#define ADXL345 (0x53) //address of Accelerometer
#define ADXL345_X (0x32) //register for X value from Accelerometer
#define ADXL345_Y (0x34) //register for Y value from Accelerometer
#define ADXL345_Z (0x36) //register for Z value from Accelerometer
byte _buff[6];
char POWER_CTL = 0x2D; //Power Control Register
char DATA_FORMAT = 0x31;
void setup()
{
mySerial.begin(9600);
Wire.begin();
initAccelerometer();
delay (500);
}
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /
void loop()
{
readAccelerometer(ADXL345_X, _buff);
mySerial.print("X= ");
mySerial.println((((int)_buff[1]) << 8) | _buff[0]);
mySerial.print("Y= ");
mySerial.println((((int)_buff[3]) << 8) | _buff[2]);
mySerial.print("Z= ");
mySerial.println((((int)_buff[5]) << 8) | _buff[4]);
delay(500);
}
/- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
void initAccelerometer(){
// writeRegister(ADXL345, POWER_CTL, 0x08);
writeRegister(ADXL345, DATA_FORMAT, 0x01);//set range to +/-4G
writeRegister(ADXL345, POWER_CTL, 0x08); //power up and enable measurements
}
void writeRegister(uint8_t address, uint8_t reg, uint8_t val){
Wire.beginTransmission(address);
Wire.write(reg);
Wire.write(val);
Wire.endTransmission();
}
void readAccelerometer(byte address, byte _buff[]){
Wire.beginTransmission(ADXL345); // start transmission to device
Wire.write(address);
Wire.endTransmission(); // end transmission
Wire.beginTransmission(ADXL345); // start transmission to device
Wire.requestFrom(ADXL345, 6); // request 6 bytes from device
int i = 0;
while (Wire.available())
{
_buff[i] = Wire.read(); // receive a byte
i++;
}
Wire.endTransmission(); // end transmission
}
uint8_t readRegister(uint8_t address, uint8_t reg){
Wire.beginTransmission(address);
Wire.write(reg);
Wire.endTransmission();
Wire.requestFrom(address, 0x01);
return Wire.read();
}
J'alimente l'adxl avec une petite batterie 3.7v. et mon digispark en usb avec un module de sortie usb (on lui fournie une alim, et la sortie usb donne 5v).
Je suspecte un problème de vitesse/synchro du module digispark.
Qu'en pensez vous?
PS: il vat s'en dire que l'adxl fonctionne sur un arduino nano, bien sur.