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 по одному в любом случае. Заранее спасибо за помощь!