Электронный компонент:Плата Xadow с 3-осевым акселерометром
Плата Xadow с 3-осевым акселерометром[1]
Эта плата оснащена цифровым акселерометром высокого разрешения (3.9mg/LSB) с большим диапазоном измеряемых значений (±16 гал), а также интерфейсом I2C для передачи данных о движении платы. Благодаря этой плате в проект можно добавить функцию распознавания движений вроде качания рукой или ногой, чтобы с помощью этого, к примеру, переключать песни на iPhone.
Купить плату Xadow с 3-осевым акселерометром можно по этой ссылке.
Характеристики
Параметр | Значение |
---|---|
Размеры | 25,43 мм х 20,35 мм |
Рабочее напряжение | 3.3 вольта |
Разрешение | 3.9mg/LSB |
Диапазон измеряемых значений | ±16g |
Шина для передачи данных | I2C |
Тестовый проект
Давайте сделаем тестовый проект, считывающий с акселерометра информацию о движениях. Сначала подключите плату Xadow с 3-осевым акселерометром к главной плате Xadow (имеется в виду плата Xadow Main Board; она не совместима с модулями Xadow версии 2 и RePhone). Выглядеть это будет примерно так:
Примечание: Подключая кабель, следите за тем, чтобы одна его сторона была подключена к порту, который находится на стороне со срезанными углами, а другая – к порту, который находится на стороне с целыми углами. Пример показан на картинке выше.
Теперь загрузите на плату тестовый код:
#include <Wire.h>
#define ADXL345_DEVICE 0x00
#define ADXL345_POWER_CTL 0x2D
#define ADXL345_DATAX0 0x32
#define ADXL345_DATAX1 0x33
#define ADXL345_DATAY0 0x34
#define ADXL345_DATAY1 0x35
#define ADXL345_DATAZ0 0x36
#define ADXL345_DATAZ1 0x37
#define ADXL345_ADDRESS 0x53
int X_Read,Y_Read,Z_Read;
double ax,ay,az;
void setup()
{
Wire.begin();
Serial.begin(19200);
delay(100);
// включение ADXL345:
Wire.beginTransmission(ADXL345_DEVICE); // начинаем передачу
// данных на устройство
Wire.write(ADXL345_POWER_CTL);
Wire.write(8); // включаем запись
Wire.endTransmission(); // завершаем передачу
}
void loop()
{
X_Read = readRegister(ADXL345_ADDRESS,ADXL345_DATAX0,ADXL345_DATAX1);
Y_Read = readRegister(ADXL345_ADDRESS,ADXL345_DATAY0,ADXL345_DATAY1);
Z_Read = readRegister(ADXL345_ADDRESS,ADXL345_DATAZ0,ADXL345_DATAZ1);
/*Serial.print("The X,Y,Z Value are:"); // "Значения для X, Y, Z:"
Serial.print(X_Read);
Serial.print(" , ");
Serial.print(Y_Read);
Serial.print(" , ");
Serial.println(Z_Read); */
getAcceleration();
Serial.print("X=");
Serial.print(ax);
Serial.println(" g");
Serial.print("Y=");
Serial.print(ay);
Serial.println(" g");
Serial.print("Z=");
Serial.print(az);
Serial.println(" g");
Serial.println("**********************");
delay(500);
}
int readRegister(int deviceAddress,int address1,int address2)
{
long int value;
int readValue1,readValue2;
Wire.beginTransmission(deviceAddress);
Wire.write(address1); // регистр для считывания
Wire.write(address2); // регистр для считывания
Wire.endTransmission();
Wire.requestFrom(deviceAddress,2); // считываем два байта
if(Wire.available()<=2)
{
readValue1 = Wire.read();
readValue2 = Wire.read();
}
//Wire.endTransmission();
readValue2 = readValue2<<8;
value= readValue1 + readValue2;
delay(100);
return value;
}
void getAcceleration()
{
double gains;
// скучный код для акселерометра:
gains = 0.00390625;
ax=X_Read * gains;
ay=Y_Read * gains;
az=Z_Read * gains;
}
Загрузив код, откройте монитор порта, чтобы увидеть результат. Данные 3-осевого акселерометра будут преобразованы в единицы измерения гравитации – галы (g).
Как понимать выходные данные
Ниже две картинки, которые объясняют, как понимать результаты, показанные в мониторе порта. Первая картинка – это направление каждой оси.
Вторая картинка – это несколько примеров того, как расположение платы влияет на изменение данных.