Передача данных через HC-05, переключение режимов с помощью тумблера

Здравствуйте, у меня в проекте появилась необходимость, что, если нужно загружать код в МК, то нужно постоянно отсоединять порты 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);
    
  }
 }

видимо надо рвать оба

коль для программирования МК все равно надо лезть внутрь, мой совет - купите программатор и забудьте про эти переключения.

2 лайка

+100 про программатор. Зачем тут прошивка через USB ?

HC-05 по воздуху шьет, если правильно выставить бодрейт и перезагружать контроллер кнопкой.

1 лайк

еще как вариант, если устроит понизить скорость в два раза, можно повесить HC на Software Serial.

1 лайк