Необходимое Оборудование
Плата Arduino UNO * 1
Датчик ADXL345 * 1
Перемычки * 1
USB - кабель * 1
Спецификация
Источник питания 2.0-3.6V DC • Ультранизкое энергопотребление 40 мкА в режиме измерения, 0.1 мкА в режиме ожидания при 2.5V • Обнаружение удара/двойного удара • Обнаружение свободного падения • Интерфейсы SPI и I2C
Подключение Схемы
Пример Кода
//////////////////////////////////////////////////////////
//ADXL345
#include <Wire.h>
// Регистры для ADXL345
#define ADXL345_ADDRESS (0xA6 >> 1) // адрес устройства 8 бит, сдвинутый
// вправо на 1 бит, чтобы сделать его 7-битным,
// так как библиотека Wire принимает только 7-битные адреса
#define ADXL345_REGISTER_XLSB (0x32)
int accelerometer_data[3];
// Функция только указывает чипу отправить данные в его регистр вывода
// записывает данные в буфер ведомого
void i2c_write(int address, byte reg, byte data) {
// Отправить адрес регистра вывода
Wire.beginTransmission(address);
// Подключиться к устройству
Wire.write(reg);
// Отправить данные
Wire.write(data); // младший байт
Wire.endTransmission();
}
// Использование указателей
// Микроконтроллер читает данные из входного регистра датчика
void i2c_read(int address, byte reg, int count, byte* data) {
// Чтение количества полученных данных
int i = 0;
// Отправить адрес входного регистра
Wire.beginTransmission(address);
// Подключиться к устройству
Wire.write(reg);
Wire.endTransmission();
// Подключиться к устройству
Wire.beginTransmission(address);
// Запросить данные от ведомого
// Count - количество байтов для запроса
Wire.requestFrom(address, count);
while(Wire.available()) // ведомый может отправить меньше, чем запрошено
{
char c = Wire.read(); // получить байт как символ
data[i] = c;
i++;
}
Wire.endTransmission();
}
void init_adxl345() {
byte data = 0;
i2c_write(ADXL345_ADDRESS, 0x31, 0x0B); // 13-битный режим +_ 16g
i2c_write(ADXL345_ADDRESS, 0x2D, 0x08); // Регистр питания
i2c_write(ADXL345_ADDRESS, 0x1E, 0x00); // X
i2c_write(ADXL345_ADDRESS, 0x1F, 0x00); // Y
i2c_write(ADXL345_ADDRESS, 0x20, 0x05); // Z
// Проверка, работает ли!
i2c_read(ADXL345_ADDRESS, 0X00, 1, &data);
if(data == 0xE5)
Serial.println("Работает успешно");
else
Serial.println("Работает неудачно");
}
void read_adxl345() {
byte bytes[6];
memset(bytes, 0, 6);
// Чтение 6 байтов из ADXL345
i2c_read(ADXL345_ADDRESS, ADXL345_REGISTER_XLSB, 6, bytes);
// Распаковка данных
for (int i = 0; i < 3; ++i) {
accelerometer_data[i] = (int)bytes[2 * i] + (((int)bytes[2 * i + 1]) << 8);
}
}
// Инициализация и запуск всего
void setup() {
Wire.begin();
Serial.begin(9600);
for(int i = 0; i < 3; ++i) {
accelerometer_data[i] = 0;
}
init_adxl345();
}
void loop() {
read_adxl345();
Serial.print("ACCEL ");
Serial.print(float(accelerometer_data[0]) * 3.9 / 1000); // масштабный коэффициент 3.9 мг/LSB в 13-битном режиме
Serial.print("\t");
Serial.print(float(accelerometer_data[1]) * 3.9 / 1000);
Serial.print("\t");
Serial.print(float(accelerometer_data[2]) * 3.9 / 1000);
Serial.print("\n");
delay(100);
}
//////////////////////////////////////////////////////////
После подключения согласно приведенной выше схеме и включения питания, загрузите код и откройте серийный монитор, он будет отображать трехосевое ускорение датчика и его состояние, как показано на графике ниже.