Данные в мониторе порта перестают отображаться

Добрый день! Реализую проект на Arduino Uno и столкнулся со следующей проблемой. У меня есть модуль MPU6050, и я с него считываю данные и вычисляю угол (по оси Y). Ещё у меня в схеме присутствует микро вибромоторчик, который срабатывает, когда значения угла попадают в нужный мне диапазон:

if ((angle_fy > -20) && (angle_fy < 20)) 
{
  digitalWrite(motorPin, HIGH); 
} 
else 
{ 
  digitalWrite(motorPin, LOW);
}

И все бы хорошо, но появилась проблема. Угол программа вычисляет правильно и моторчик срабатывает в нужно время, но иногда возникает проблема отображения данных угла в мониторе порта. То есть я меняю ориентацию модуля MPU6050, угол меняется в мониторе порта, и в один прекрасный момент данные перестают обновляться в мониторе порта, данные замирают. И, например, если это произошло в диапазоне: (angle_fy > -20) && (angle_fy < 20), то моторчик постоянно продолжает вибрировать, даже если я поменяю ориентацию макета. С чем это может быть связано?

В коде вообще нет вывода в сериал

Зависает ардуинка, к бабке не ходи ))

Я просто не указал здесь вывод в порт, а так в коде все есть

Вот там и ищите. От нас-то чего нужно? Гадание на хрустальном шаре?

3 лайка

Ну, первый раз же вставил правильно. А чего сейчас то сплоховал?

#include “I2Cdev.h”
#include “MPU6050.h”

#define TO_DEG 57.2957f
#define TIME_GYRO 2000 // период опроса mpu6050 в микросекундах
MPU6050 accgyro;

int16_t ax_raw, ay_raw, az_raw, gx_raw, gy_raw, gz_raw; // сырые данные в кодах АЦП
long int time_timer; // переменная таймера для опроса
int motorPin = 3; //motor transistor is connected to pin 3
boolean isCrash;

// ------------------------ АКСЕЛЕРОМЕТР ----------------------------
float ax, ay, az; // значения ускорения в единицах гравитации g
float angle_ax, angle_ax1, angle_ay, angle_az; // углы, рассчитанные по акселерометру

// ------------------------ ГИРОСКОП ----------------------------
float gx, gx0, gy, gz; // значения угловой скорости в градусах в секунду
float angle_gx, angle_gx0, 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(9600);
isCrash = true;
// 115200
pinMode(motorPin, OUTPUT);
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();
getAngleGyro();
getAngleFiltr();
Serial.println(angle_fy);

if ((angle_fy > -20) && (angle_fy < 20)) 
{
  digitalWrite(motorPin, HIGH); 
} 
else 
{ 
  digitalWrite(motorPin, LOW);
}

}

}

#define FK 0.99 // коэффициент комплементарного фильтра

void getAngleFiltr() { / вычисление угла
angle_fx = angle_fx + gx * TIME_GYRO/1000000.0;
angle_fy = angle_fy + gy * TIME_GYRO/1000000.0;
angle_fz = angle_fz + gz * TIME_GYRO/1000000.0;

angle_fx = angle_fx*FK + angle_ax*(1-FK);
angle_fy = angle_fy*FK + angle_ay*(1-FK);
angle_fz = angle_fz*FK + angle_az*(1-FK);

}

строка 35 - расскажите, что там делается и зачем?

Произвожу опрос mpu6050 в микросекундах с периодом TIME_GYRO 2000

Ерунда. Это условие будет выполняться ВСЕГДА, т.е. при каждом проходе loop()

Проблема у меня видимо кроется в микро моторчике. Без него проблем никаких нет. Данные непрерывно отображаются в мониторе порта, а вот как подключаю моторчик, то сразу такая проблема возникает

может быть и моторчик помехи сыплет

Здесь должен быть unsigned long.

Что-то часто эта ошибка попадаться стала

А к моторчику конденсатор и диод подключите

Конденсатор и диод я не подключал. Использую стандартную схему с транзистором и резистором. Нарушение работы программы происходит, когда данные попадают в этот диапазон

if ((angle_fy > -20) && (angle_fy < 20))

Данные перестают обновляться и моторчик постоянно вибрирует.

Включается моторчик, начинает сыпать помехи, ардуинка зависает, мотор остается во включенном состоянии. Ставьте конденсатор на моторчик

Изменил схему. Всё заработало. Спасибо!
Вопрос закрыт