Здравствуйте! Собираю устройство для считывания движений пальцев на основе 10-ти датчиков MPU6050. Необходим код, который будет сохранять значение угла Y девяти датчиков в отдельные переменные типа int. Один датчик должен фиксировать угол Y, угол X и угол Z. Нужно использовать DMP, встроенный в каждый датчик.
8 датчиков адресом 0х68 подключены к 7-ми каналам первого мультиплексора TCA9548 с адресом 0х70.
2 датчика со стандартными адресами 0х68 подключены к первым двум каналам второго мультиплексора TCA9548 с адресом 0х71. Первый канал отведен для датчика, который должен фиксировать все три угла.
Пины 2-10 подключены к контактам INT датчиков: 2-й пин к датчику на нулевом канале первого мультиплексора, 3-й пин к датчику на 1-м канале первого мультиплексора, и так далее.
Пин 11 подключен к датчику (INT) на нулевом канале второго мультиплексора. Пин 12 подключен к датчику на первом канале второго мультиплексора.
Поможет в реализации:
I2Cdev.h
Библиотеки MPU6050 на I2Cdev
Пытался сделать сам, но при попытке считывания значений с каждого канала первого мультиплексора всё рушилось:
#include <Wire.h>
#include <I2Cdev.h>
#include <MPU6050_6Axis_MotionApps20.h>
#define MUX_ADDRESS 0x70
#define NUM_SENSORS 8
Quaternion q;
VectorInt16 aa;
VectorFloat gravity;
float euler[3];
float ypr[3];
uint8_t fifoBuffer[64];
bool dmpReady = false;
uint8_t mpuIntStatus;
uint8_t devStatus;
uint16_t packetSize;
uint16_t fifoCount;
uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };
MPU6050 mpu;
volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high
void dmpDataReady() {
mpuInterrupt = true;
}
void changeChannel (int channel){
Wire.begin();
Wire.beginTransmission(MUX_ADDRESS);
Wire.write(1 << channel);
Wire.endTransmission();
mpu.initialize();
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788);
mpu.CalibrateAccel(6);
mpu.CalibrateGyro(6);
mpu.CalibrateAccel(6);
mpu.CalibrateGyro(6);
mpu.PrintActiveOffsets();
}
void setup() {
Wire.begin();
Wire.setClock(400000);
Serial.begin(115200);
for (int i = 2; i < 11; i++){
pinMode(i , INPUT);
}
for (int i = 0; i < 8; ++i){
changeChannel(i);
}
for (int i = 2; i < 11; i++){
attachInterrupt(digitalPinToInterrupt(i), dmpDataReady, RISING);
}
}
void loop() {
mpu.dmpGetCurrentFIFOPacket(fifoBuffer);
changeChannel(3);
mpu.setDMPEnabled(true);
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
Serial.print("\t");
Serial.print(ypr[1] * 180/M_PI);
}
Бюджет небольшой (<10$)