2 Акселерометра

Mig_1337
Offline
Зарегистрирован: 02.01.2019

Доброго времени суток. Имеется 2 акселерометра. Реально ли включить в работу сразу 2 одновременно? Нужно чтобы значения угла в градусах одного вычитались из другого. Ардуино УНО.

sadman41
Offline
Зарегистрирован: 19.10.2016

Реально.

Mig_1337
Offline
Зарегистрирован: 02.01.2019
#include "I2Cdev.h"
#include "MPU6050.h"

#include <SPI.h>
#include <SD.h>

#define TO_DEG 57.29577951308232087679815481410517033

MPU6050 accel;

float angle_ax;

float clamp(float v, float minv, float maxv){
    if( v>maxv )
        return maxv;
    else if( v<minv )
        return minv;
    return v;
}

const int chipSelect = 4;

void setup(){
  
    Serial.begin(9600);
    accel.initialize();
    Serial.println(accel.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");

  if (!SD.begin(chipSelect)) {
        Serial.println("Card failed, or not present");
        return;
    }
   
        int16_t ax_raw, ay_raw, az_raw, gx_raw, gy_raw, gz_raw;
        float ay,gx;
        accel.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw);
        ay = ay_raw / 16444.0;
        ay = clamp(ay, -4.0, 4.0);
        
         if( ay >= 0){
            angle_ax = 90 - TO_DEG*acos(ay);
        } else {
            angle_ax = TO_DEG*acos(-ay) - 90;
        }
        Serial.println(angle_ax);

        String dataString = String(angle_ax);
        File dataFile = SD.open("test.txt", FILE_WRITE);

    if (dataFile) {
        dataFile.println(dataString);
        dataFile.close();
        Serial.println("Success!");
    } else {
        Serial.println("error opening file");
}
}    
   void loop () {}

я так пономаю нужно отказаться от 26 строчки (условно от 26) и объявлять 4 входных пина? (имею в виду вместо тех двух которые прописаны в библиотеке)

sadman41
Offline
Зарегистрирован: 19.10.2016

Какие 4 пина... 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

The pin "AD0" selects between I2C address 0x68 and 0x69. That makes it possible to have two of these sensors in a project. 

Mig_1337
Offline
Зарегистрирован: 02.01.2019

Connect AD0 to GND or 3.3V for the other I2C address.

Получается нужно подключить AD0 (второго датчика) к 3.3V, а SCL и SDA параллельно первому? 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Да. AD0 у одного датчика на землю, у второго к Vcc. А SDA/SCL параллельно. 

Mig_1337
Offline
Зарегистрирован: 02.01.2019

The I2C-address depends on the AD0 pin of the sensor. If it is connected to ground, the address is 0x68. If it is connected to VLOGIC (+3.3V) it is 0x69

Выходит что теперь нужно запросить данные с адреса 0х69? (чтобы получить данные второго датчика) 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Mig_1337 пишет:

Выходит что теперь нужно запросить данные с адреса 0х69? (чтобы получить данные второго датчика) 

 

Естественно

Mig_1337
Offline
Зарегистрирован: 02.01.2019
accel.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw);

получается мы запросили данные с первого датчика... но не совсем понимаю как вытащить данные со второго?

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Прежде, чем запрашивать данные со второго датчика, его нужно объявить.

Mig_1337
Offline
Зарегистрирован: 02.01.2019

В этом собственно моя беда. Я не понимаю как заставить программу различать 2 разных датчика. У нас ведь есть библиотека. Благодаря ей программа понимает эту accel.initialize(); строчку. А как инициализировать второй? 

Feofan
Offline
Зарегистрирован: 28.05.2017

В библиотеке https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050 есть пример: MPU6050/examples/IMU_Zero/IMU_Zero.ino.

b707
Offline
Зарегистрирован: 26.05.2017

Mig_1337 пишет:

А как инициализировать второй? 

в библиотеку посмотреть, иннициализатор датчика принимает адрес в качестве параметра

Mig_1337
Offline
Зарегистрирован: 02.01.2019
#include "I2Cdev.h"
#include "MPU6050.h"

//MPU6050 accel;
MPU6050 accel(0x69);

void setup() {
    Serial.begin(9600);
    accel.initialize();
    Serial.println(accel.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
}

void loop() {
        int16_t ax_raw, ay_raw, az_raw, gx_raw, gy_raw, gz_raw;
        accel.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw);
        delay (25);
        Serial.println(ay_raw);
    }

но когда включаешь сразу два адреса - ругается

//MPU6050 accel;
MPU6050 accel(0x69);

а так - да, сейчас заработал второй датчик

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Mig_1337 пишет:

#include "I2Cdev.h"
#include "MPU6050.h"

//MPU6050 accel;
MPU6050 accel(0x69);

void setup() {
    Serial.begin(9600);
    accel.initialize();
    Serial.println(accel.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
}

void loop() {
        int16_t ax_raw, ay_raw, az_raw, gx_raw, gy_raw, gz_raw;
        accel.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw);
        delay (25);
        Serial.println(ay_raw);
    }

но когда включаешь сразу два адреса - ругается

//MPU6050 accel;
MPU6050 accel(0x69);

а так - да, сейчас заработал второй датчик

 а так

MPU6050 accel_1;
MPU6050 acce1_2(0x69);

 - оба :
 

b707
Offline
Зарегистрирован: 26.05.2017

Mig_1337 пишет:

но когда включаешь сразу два адреса - ругается

 

//MPU6050 accel;
MPU6050 accel(0x69);

 

пипец :)

Имена обьектов для разных датчиков должны быть РАЗНЫЕ!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

пипец :)

Имена обьектов для разных датчиков должны быть РАЗНЫЕ!

Сей предмет...
 

include "I2Cdev.h"
#include "MPU6050.h"

MPU6050 accel_1;
MPU6050 accel_2(0x69);

void setup() {
    Serial.begin(115200);
    accel_1.initialize();
    accel_2.initialize();
    Serial.println(accel_1.testConnection() ? "MPU6050-1 connection successful" : "MPU6050-1 connection failed");
    Serial.println(accel_2.testConnection() ? "MPU6050-2 connection successful" : "MPU6050-2 connection failed");
}


void loop() {
        int16_t ax1_raw, ay1_raw, az1_raw, gx1_raw, gy1_raw, gz1_raw;
        accel_1.getMotion6(&ax1_raw, &ay1_raw, &az1_raw, &gx1_raw, &gy1_raw, &gz1_raw);
        delay (25);
        Serial.println(ay1_raw);

        int16_t ax2_raw, ay2_raw, az2_raw, gx2_raw, gy2_raw, gz2_raw;
        accel_2.getMotion6(&ax2_raw, &ay2_raw, &az2_raw, &gx2_raw, &gy2_raw, &gz2_raw);
        delay (25);
        Serial.println(ay2_raw);
            }

 

Mig_1337
Offline
Зарегистрирован: 02.01.2019

Море благодарностей)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Mig_1337 пишет:

Море благодарностей)

достаточно