Акселерометр Arduino с применением C # WF - PullRequest
0 голосов
/ 16 октября 2019

У меня проблема: Arduino сохраняет данные акселерометра MPU-6050 во внешнюю память SRAM. Когда я спрашиваю его, он читает обратно в массив и отправляет его в последовательном порядке на ПК. Он полностью работает с 2 акселерометром, если я не двигаю датчик. Если я перемещу датчик, я получаю кучу нулей. Вот три картинки: Когда все работает - без движения ; Когда это не работает Только последовательный график из необработанных данных

Датчик тестируется с простым последовательным графиком. Работает отлично. Если я измеряю в основном постоянную гравитацию, это работает. Если я начал медленно двигать датчик, я получил что-то похожее на второй картинке.

Если я не использую свою программу на C #, используйте только собственный серийный монитор Arduino. Я прочитал это числа в массив (в следующем называется: буфер). Serial.println всех номеров по одному. Работает все равно я двигаюсь или нет датчик. Что я не понимаю, почему мой код C # и график работает только тогда, когда датчик не движется? Частота дискретизации одинакова, ноль, -2056, 11562 и т. Д. Все числа 16-битные целые числа со знаком.

У кого-нибудь есть идеи? Спасибо: fatzolaa

#include<SRAM_23LC.h> //Copyright (c) 2017, JustinMattair(justin@mattair.net)
#include<Wire.h>
#include<SPI.h>
//Sram settings
#define SPI_PERIPHERAL    SPI
#define CHIP_SELECT_PIN   27
extern TwoWire Wire1;
int16_t b;

SRAM_23LC SRAM(&SPI_PERIPHERAL, CHIP_SELECT_PIN, SRAM_23LCV512);


const int MPU_addr = 0x68;
int16_t Raw1, Raw2;
const int16_t prec = 2048;
byte rl1, rh1, rl2, rh2;
int led1Pin = 50;
int led2Pin = 51;
int led3Pin = 52;
String inputString = "";
boolean stringComplete = false;
String commandString = "";
boolean isConnected = false;
int bite = 16384;
int16_t raw2;
//byte buf2[8192];

void setup() {
  //----------------------------
 pinMode(50, OUTPUT);
 pinMode(51, OUTPUT);
 pinMode(52, OUTPUT);
 //----------------------------
 Wire.begin();
 Wire.setClock(100000);
 Wire.beginTransmission(MPU_addr);
 Wire.write(0x6B);                         //PWR_MGMT_1 register
 Wire.write(0);                            //set to zero in order to wake up MPU6050
 Wire.endTransmission(true);
 Wire.beginTransmission(0b1101000);        // I2C adress of MPU6050
 Wire.write(0x1C);                         //Accelerometer config
 //Wire.write(0b00000000);                   //Setting the accel to +/- 2g
 //Wire.write(0b00001000);                   //Setting the accel to +/- 4g
 //Wire.write(0b00010000);                   //Setting the accel to +/- 8g
 Wire.write(0b00011000);                   //Setting the accel to +/- 16g
 Wire.endTransmission();
 //---------------------------
 Wire1.begin();
 Wire1.setClock(100000);
 Wire1.beginTransmission(MPU_addr);
 Wire1.write(0x6B);                         //PWR_MGMT_1 register
 Wire1.write(0);                            //set to zero in order to wake up MPU6050
 Wire1.endTransmission(true);
 Wire1.beginTransmission(0b1101000);        // I2C adress of MPU6050
 Wire1.write(0x1C);
 //Wire1.write(0b00000000);                     // Setting to +- 2g
 Wire1.write(0b00011000);                   //Setting the accel to +/- 16g
 Wire1.endTransmission();

 SRAM.begin(20000000UL);                    // 10Mhz-el megnyitva az spi max20MHz
 Serial.begin(115200);
 digitalWrite(led3Pin, HIGH);

}

void loop() {
  if (stringComplete) {
    stringComplete = false;
getCommand();
if (commandString.equals("START")) {
  digitalWrite(led3Pin, LOW);
  digitalWrite(led1Pin, HIGH);
  for (int i = 0; i < bite / 4; i++) {
    Raw1 = olvas1();
    Raw2 = olvas2();
    //rl2 = lowByte(Raw2);         //Szetosztas 2 byte-ra
    //rh2 = highByte(Raw2);
    rl1 = Raw1 & 0xff;
    rh1 = (Raw1 >> 8);
    rl2 = Raw2 & 0xff;
    rh2 = (Raw2 >> 8);
    SRAM.writeByte(4 * i, rl1);
    SRAM.writeByte(4 * i + 1, rh1);
    SRAM.writeByte(4 * i + 2, rl2);
    SRAM.writeByte(4 * i + 3, rh2);
  }
  digitalWrite(led1Pin, LOW);
  digitalWrite(led3Pin, HIGH);
}
if (commandString.equals("IMPOR")) {
  digitalWrite(led2Pin, HIGH);
  digitalWrite(led3Pin, LOW);
  byte buf1[8192];
  for (int i = 0; i < bite / 4; i++) {
    byte lb1 = SRAM.readByte(4 * i);
    byte hb1 = SRAM.readByte(4 * i + 1);
    //raw2 = word(hb, lb);
    buf1[2 * i] = lb1;
    buf1[2 * i + 1] = hb1;
  }
  Serial.write(buf1, sizeof(buf1));
  digitalWrite(led2Pin, LOW);
  digitalWrite(led3Pin, HIGH);
}
if (commandString.equals("IMPOT")) {
  digitalWrite(led2Pin, HIGH);
  digitalWrite(led3Pin, LOW);
  byte buf2[8192];
  for (int i = 0; i < bite / 4; i++) {
    byte lb2 = SRAM.readByte(4 * i + 2);
    byte hb2 = SRAM.readByte(4 * i + 3);
    buf2[2 * i] = lb2;
    buf2[2 * i + 1] = hb2;
  }
  Serial.write(buf2, sizeof(buf2));
  digitalWrite(led2Pin, LOW);
  digitalWrite(led3Pin, HIGH);

}
inputString = "";
 }

}


int16_t olvas1() {
  int16_t a;
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3F);
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr, 2, true);
  a = Wire.read() << 8 | Wire.read();
  return a;
}

int16_t olvas2() {
  Wire1.beginTransmission(MPU_addr);
  Wire1.write(0x3F);
  Wire1.endTransmission(false);
  Wire1.requestFrom(MPU_addr, 2, true);
  b = Wire1.read() << 8 | Wire1.read();
  return b;
}

void getCommand() {
  if (inputString.length() > 0) {
  commandString = inputString.substring(1, 6);
  }
}

void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}
...