Arduino MEGA: использование последовательного программного обеспечения для совместной работы GPS и IMU

Я установил, что мои устройства IMU (коммутационная плата Adafruit Precision NXP 9-DOF - FXOS8700 + FXAS21002) и GPS (Ultimate Breakout v3) работают отдельно, и теперь я пытаюсь заставить их работать вместе, используя ту же Arduino MEGA. Мой единственный критерий заключается в том, что мне нужно будет использовать только один USB-кабель и один Arduino для передачи информации от IMU и GPS на мой ноутбук.

Я использую Software Serial, чтобы попытаться заставить это работать прямо сейчас, но по какой-то причине 2 части кода, которые работают сами по себе, не работают вместе. Вот код, содержащий функции цикла и настройки:

// this software serial code is based off the TwoPortReceive code by Tom Igoe
#include <Adafruit_GPS.h>
#include <Adafruit_FXAS21002C.h>
#include <Adafruit_FXOS8700.h>
#include <Wire.h>
#include <SoftwareSerial.h>

SoftwareSerial IMU(20, 21);
SoftwareSerial GPS(18, 19);

void setup() {
  Serial.begin(9600);
  while (!Serial) {}

  // Start each software serial port
  IMU.begin(9600);
  GPS.begin(9600);
  displaySensorDetails();

}

void loop() {
  IMU.listen();
  Serial.println("Data from port one:");
  while (IMU.available() > 0) {
    char inByte = IMU.read();
    Serial.write(inByte);
  }
  imuloop();

  GPS.listen();
  Serial.println("Data from port two:");
  while (GPS.available() > 0) {
    char inByte = GPS.read();
    Serial.write(inByte);
  }
  gpsloop();
}

Код gpsloop() находится здесь:

#define GPSSerial Serial2
HardwareSerial mySerial = Serial1;

void gpsloop(){
  if (Serial.available()) {
    char c = Serial.read();
    GPSSerial.write(c);
  }
  if (GPSSerial.available()) {
    char c = GPSSerial.read();
    Serial.write(c);
  }
}

Аналогично, моя функция imuloop() находится в этом другом файле (все тот же эскиз) здесь:

Adafruit_FXAS21002C gyro      = Adafruit_FXAS21002C(0x0021002C);
Adafruit_FXOS8700   accel_mag = Adafruit_FXOS8700(0x8700A, 0x8700B);
sensors_event_t aevent, gevent, mevent;

void imuloop(void){
    String readString;
    while (Serial.available()){
      delay(3); //allowing buffer to fill
      if (Serial.available() > 0){
        char c = Serial.read();
        readString += c;
      }
    }
    if (readString.length() > 0){
      printToSerial();
    }
}


void printToSerial(void){
  // Get a new sensor event
  gyro.getEvent(&gevent);
  accel_mag.getEvent(&aevent, &mevent);

  // Display the gyro results [x|y|z] (rad/s)
  Serial.print(gevent.gyro.x); Serial.print("|");
  Serial.print(gevent.gyro.y); Serial.print("|");
  Serial.print(gevent.gyro.z);

  Serial.print(":");

  // Display the accel results [x|y|z] (m/s^2)
  Serial.print(aevent.acceleration.x, 4); Serial.print("|");
  Serial.print(aevent.acceleration.y, 4); Serial.print("|");
  Serial.print(aevent.acceleration.z, 4);

  Serial.println("");

  // Final data format: gX|gY|gZ:aX|aY|aZ
  delay(1);
}

Я просто пытаюсь заставить их работать здесь, и это сводит меня с ума. Я знаю, что TX и RX не работают одновременно с Software Serial, но мне все равно нужно только получать информацию от GPS/IMU по одному в любом случае. Заранее спасибо за помощь!

0 ответов

Другие вопросы по тегам