2 Акселерометра
- Войдите на сайт для отправки комментариев
Пнд, 25/02/2019 - 22:19
Доброго времени суток. Имеется 2 акселерометра. Реально ли включить в работу сразу 2 одновременно? Нужно чтобы значения угла в градусах одного вычитались из другого. Ардуино УНО.
Реально.
#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 входных пина? (имею в виду вместо тех двух которые прописаны в библиотеке)
Какие 4 пина...
The pin "AD0" selects between I2C address 0x68 and 0x69. That makes it possible to have two of these sensors in a project.
Connect AD0 to GND or 3.3V for the other I2C address.
Получается нужно подключить AD0 (второго датчика) к 3.3V, а SCL и SDA параллельно первому?
Да. AD0 у одного датчика на землю, у второго к Vcc. А SDA/SCL параллельно.
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? (чтобы получить данные второго датчика)
Выходит что теперь нужно запросить данные с адреса 0х69? (чтобы получить данные второго датчика)
Естественно
получается мы запросили данные с первого датчика... но не совсем понимаю как вытащить данные со второго?
Прежде, чем запрашивать данные со второго датчика, его нужно объявить.
В этом собственно моя беда. Я не понимаю как заставить программу различать 2 разных датчика. У нас ведь есть библиотека. Благодаря ей программа понимает эту accel.initialize(); строчку. А как инициализировать второй?
В библиотеке https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050 есть пример: MPU6050/examples/IMU_Zero/IMU_Zero.ino.
А как инициализировать второй?
в библиотеку посмотреть, иннициализатор датчика принимает адрес в качестве параметра
#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); }но когда включаешь сразу два адреса - ругается
а так - да, сейчас заработал второй датчик
#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); }но когда включаешь сразу два адреса - ругается
а так - да, сейчас заработал второй датчик
а так
- оба :
но когда включаешь сразу два адреса - ругается
пипец :)
Имена обьектов для разных датчиков должны быть РАЗНЫЕ!
пипец :)
Имена обьектов для разных датчиков должны быть РАЗНЫЕ!
Сей предмет...
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); }Море благодарностей)
Море благодарностей)
достаточно