Здравствуйте, у меня в проекте появилась необходимость, что, если нужно загружать код в МК, то нужно постоянно отсоединять порты RX,TX, которые связанны с модулем bluetooth HC-05. Тогда я понял, что можно просто припаять тумблер, который бы прерывал связь TX у блютуза, а RX у МК, дабы можно было быстро загрузить код и потом передавать данные, однако появилась ошибка в том, что передача данных идет буквально 1-2сек и все прерывается, хотя светодиод у принимаемого МК мерцает, что говорит о приеме каких-то данных. Буду рад, если кто то напишет свои мысли почему так происходит, спасибо.
Общие сведения:
Арудино 1(изображен на фото): arduino nano; HC-05; MPU6050(аксигироскоп, делает измерения). арудино 1 обрабатывает данные с MPU6050 и передает на арудино 2;
Арудино 2: arduino nano; HC-05; просто получает данные и выводит их
Связь:
MPU–>NANO (VCC → 3V3 ; GND → GND; SCL → A5; SDA → A4)
HC-05–>NANO (+5V → +5V; GND → GND; RX->TX1; TX->Ключ->RX0)
Прикладываю фото схемы, она конечно особо ничего не говорит, но вдруг кому-то нужно будет.
Фото схемы ардуино 1:
Общий код арудино 1:
#include "I2Cdev.h"
#include "MPU6050.h"
#include <EasyTransfer.h>
#define TO_DEG 57.2957f
#define TIME_GYRO 2000 // период опроса mpu6050 в микросекундах
MPU6050 accgyro;
// ------------------------ BLUETOOTH ----------------------------
struct SEND_DATA_STRUCTURE {
float AngleX;
float AngleY;
float MoveGX;
float MoveGY;
};
SEND_DATA_STRUCTURE data;
EasyTransfer ETin, ETout; // 2 объекта ИзиТрансфера 1 для отправки и 1 получения информации
// ----------------------------------------------------
int16_t ax_raw, ay_raw, az_raw, gx_raw, gy_raw, gz_raw; // сырые данные в кодах АЦП (3 ускорения и 3 скорости)
long int time_timer; // переменная таймера для опроса
// ------------------------ АКСЕЛЕРОМЕТР ----------------------------
float ax, ay, az; // значения ускорения в единицах гравитации g
float angle_ax, angle_ax1, angle_ay, angle_az; // углы, рассчитанные по акселерометру
// ------------------------ ГИРОСКОП ----------------------------
float gx, gy, gz; // значения угловой скорости в градусах в секунду
float angle_gx, angle_gy, angle_gz; // углы, рассчитанные по гироскопу
float gyro_x_zero, gyro_y_zero, gyro_z_zero; // калибровочные углы смещения нуля гироскопа
// ------------------------ ФИЛЬТР ----------------------------
float angle_fx, angle_fy, angle_fz; //угол после обработки комплементарным фильтром
void setup() {
Serial.begin(115000);
ETout.begin(details(data), &Serial);
accgyro.initialize();
calibrateMPU();
}
void loop() {
if( time_timer < micros() ){
time_timer = micros() + TIME_GYRO;
accgyro.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw);
getAngleAcsel(); // функция получения углов angle_ax, angle_ay, angle_az по акселерометру
getAngleGyro(); // функция получения углов angle_gx, angle_gy, angle_gz по гироскопу
getAngleFiltr(); // функция получения углов angle_fx, angle_fy, angle_fz с применением фильтра (по сути суммирует углы акселерометра и гироскопа)
////////////////////////////////////////
data.AngleX=angle_gx;
data.AngleY=angle_gy;
data.MoveGX=gx;
data.MoveGY=gy;
ETout.sendData();
}
}
Код арудино 2:
#include <EasyTransfer.h>
struct RECEIVE_DATA_STRUCTURE {
float AngleX;
float AngleY;
float MoveGX;
float MoveGY;
};
RECEIVE_DATA_STRUCTURE data;
EasyTransfer ETin,ETout;
void setup() {
Serial.begin(115000);
ETin.begin(details(data), &Serial);
Serial.flush();
Serial.println("angleGX, angleGY, MGX, MGY");
}
//Serial.println(sqrt(newGX+newGY));
void loop() {
if(ETin.receiveData()) {
float newGX = data.AngleX;
float newGY = data.AngleY;
float newMGX = data.MoveGX;
float newMGY = data.MoveGY;
Serial.print(newGX);
Serial.print(' ');
Serial.print(newGY);
Serial.print(' ');
Serial.print(newMGX);
Serial.print(' ');
Serial.println(newMGY);
}
}