Работа с акселерометром ADXL345

Тема в разделе "Arduino & Shields", создана пользователем Ardu_Julia, 31 мар 2017.

  1. Ardu_Julia

    Ardu_Julia Нуб

    Всем привет! Сделала по шине i2c чтение по трем осям акселерометра. Теперь появилась задача добавить реакцию на удар и на падение. Нужно ли как-то подключать оставшиеся 2 выхода? Или придется использовать целиком иную схему? Подключено сейчас схеме с картинки. Код:
    Код (C++):
    #include <Servo.h>
    #include <Wire.h>


    //акселерометр
    #define DEVICE (0x53)    // Адрес ADXL345 на шине - 0x53
    #define TO_READ (6)      // размер буфера, количество байтов которые мы будем читать одновременно(2 байта на каждую ось X Y Z)
    byte buff[TO_READ] ;     // буфер для хранения считываемых с акселерометра данных, максимум
    char str[512];           //строковый буфер чтобы конвертировать данные перед посыланием на монитора порта

    //Здесь смысл такой, что первый байт после начала передачи это всегда адрес регистра, в который мы хотим что-то записать,
    //а второй байт его значение, далее обязательно завершить передачу.
    //Если мы хотим получить данные, то принцип общения похож, но главное отличие что в ответ мы можем получить не 1 байт, а несколько.
    void readFrom(int device, byte address, int num, byte buff[]) {
      Wire.beginTransmission(device); //Начало передачи I2C для ведомого устройства (слейва) с заданным адресом. Затем, нужно вызвать метод write()
                                      //для добавления последовательности байт в очередь предназначенных для передачи, и выполнить саму передачу данных методом endTransmission().
      Wire.write(address);   //Записывает данные от ведомого устройства (слейва) в ответ на запрос мастера, или записывает очередь байт для передачи от мастера
                             //к ведомому устройству (в промежутках между вызовами beginTransmission() и endTransmission()).
      Wire.endTransmission();    //Завершает передачу данных для ведомого устройства(слейва), которое было начато beginTransmission()
                                 //и, фактически, осуществляет перечу байт, которые были поставлены в очередь методом write().
     
      Wire.beginTransmission(device); //опять начинает. так надо
      Wire.requestFrom(device, num);  //Запрос 6 байт от слейва-нашего девайса. (Этот метод используется мастером для запроса байта от ведомого устройства (слейва).
                                      //Байты могут быть получены с помощью методов available() и read().)
     
      int i = 0;
      while(Wire.available())    // пока есть, что читать
      {
        buff[i] = Wire.read(); // получаем байт (как символ)
        i++;
      }
      Wire.endTransmission(); // передача данных
    }

    //функция для передачи настроек
    void writeTo(int device, byte address, byte val) {
       Wire.beginTransmission(device);
       Wire.write(address);      
       Wire.write(val);      
       Wire.endTransmission(); // передача данных
    }

    void setup() {
      //инициализация устройства
      Wire.begin();        // подключение к шине i2c
      Serial.begin(9600);  // start serial for output


      //Для включения нашего ADXL345 необходимо 3 раза поменять значения регистра 0x2D, отвечающего за питание устройства.
      //Т.е. сперва выключить устройство, затем включено, но в standby (AUTO_SLEEP) и только потом включить (Measure).
      //Turning on the ADXL345
      writeTo(DEVICE, 0x2D, 0);    
      writeTo(DEVICE, 0x2D, 16);
      writeTo(DEVICE, 0x2D, 8);

    }

    void loop() {
      //Читаем из адреса regAddress = 0x32 и получаем в буфер 6 байт, где 3 раза по 10 бит
      //(ну вот такое там разрешение, всегда 10 бит), поэтому надо разобрать каждое значение из
      //2-х байт, передать, что получили на комп, небольшая задержка и по новой.
     
      int regAddress = 0x32;    //адрес регистра данных ADXL345
      int x, y, z;
      readFrom(DEVICE, regAddress, TO_READ, buff); //читаем данные с ADXL345
     
       //каждой оси значение 2 байта
       //таким образом мы превращаем оба байта в один int
      x = (((int)buff[1]) << 8) | buff[0];  
      y = (((int)buff[3])<< 8) | buff[2];
      z = (((int)buff[5]) << 8) | buff[4];


      //пишем значения по трём осям в монитор порта
    sprintf(str, "%d %d %d", x, y, z);
      Serial.print(str);
      Serial.write(10);
     
    //Похоже, что задержка необходима для того, чтобы не засорять порт
      //delay(1450);
      }
     

    Вложения:

    • Xur8b692K0A.jpg
      Xur8b692K0A.jpg
      Размер файла:
      21,1 КБ
      Просмотров:
      778
  2. f.cpu

    f.cpu Нуб

    Я на ардуоно не пишу, на С в atmel studio, а вывод внешнего прерывания где?