Самопроизвольная перезагрузка Arduino (nano и uno)

mihaluch1993
Offline
Зарегистрирован: 26.06.2022

Добрый день. 

Прошу помощи, совсем недавно начал изучать ардуино. 

Пишу код простой для автоматического обьезда препятствий машинки с помощью ульразвукового датчика hc sr04. Управление машинкой через контролер ps2. Датчик подключен к пинам А4 А5. ПС2 к пинам А0-А3.

Для включения режима автопилота добавил флажок, который меняет свое значение по нажатию кнопки start, что в дальнейшем запускает условие с запуском датчика ультразвука. 

И вот тут столкнулся с проблемой, код просто замера выполняется отлично, но как только срабатывает условие что значение distance<10 происходит сбой, внутреняя часть кода выполниться 1 раз после чего ардуино уходит в сброс и требуется по новой запускать режим автопилота. Иногда код может выполнить 2-5 раз но такое случается редко. Если убрать внутреннюю часть условия на вообще одну строку, может сработать 5-6 раз, но потом ардуинка опять выходит в сброс. Это происходит на 2 разных ардуино и уно и нано. 

Пробывал главное условие if заменить на цикл while (flag == true)  и он работает отлично, за исключением невозможности выхода из него, я просто не знаю как прекратить его по нажатию кнопки. Он не воспринимает нажатие кнопок геймпада в цикле, для смены значения flag.

Я прошу прощения за возможно глупый код и простой вопрос, но пытался по разному и не смог. 

Ниже часть кода именно автопилотной части просто с текстовой прогонкой. 

// КОД РАБОТЫ АВТОПИЛОТА ПО УЛЬТРАЗВУКУ


  if (ps2x.ButtonPressed(PSB_START))
  {
    flag = !flag;
  }
  delay(100);
 if (flag == true)
  {
    unsigned int distance = sonar.ping_cm();
    delay(50);
    Serial.print(distance);
    Serial.println("см");
    if (ps2x.ButtonPressed(PSB_SELECT))
    {
      flag = !flag;
      Serial.println("нажат флаг");
    }
    if (distance<10){
      Serial.println("стоп");
      delay(200);
      Serial.println("повернул налево");
      delay(400);
      Serial.println("повернул направо");
      delay(800);
    }
  

  }

 

 

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Выкладывай весь код.

mihaluch1993
Offline
Зарегистрирован: 26.06.2022

// мин. сигнал, при котором мотор начинает вращение
#define MIN_DUTY 150
// пины драйвера
#define MOT_RA 2
#define MOT_RB 3
#define MOT_LA 4
#define MOT_LB 5



// пины ресивера ps2
#define PS2_DAT A0
#define PS2_CMD A1
#define PS2_SEL A2
#define PS2_CLK A3



// пины ультразвука

#define PIN_TRIG A4
#define PIN_ECHO A5

// ===========================
#include <GyverMotor.h>  // библиотека мотора
// (тип, пин, ШИМ пин, уровень)
GMotor motorR(DRIVER2WIRE, MOT_RA, MOT_RB, HIGH);
GMotor motorL(DRIVER2WIRE, MOT_LA, MOT_LB, HIGH);


#include <PS2X_lib.h>  // библиотека геймпада пс2
PS2X ps2x;

int RY = 0;
boolean flag = false;

#include <NewPing.h>  //подключаем библиотеку ультразвука

#define MAX_DISTANCE 200 // Константа для определения максимального расстояния, которое мы будем считать корректным.

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

NewPing sonar(PIN_TRIG, PIN_ECHO, MAX_DISTANCE);


#define pressures   true
//#define pressures   false
#define rumble      true
//#define rumble      false



void setup() {
  
  
  pinMode(2,  OUTPUT);
  pinMode(3,  OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);


  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
 
  delay(100);  //задержка для настройки
  
  Serial.begin(9600); //открываем порт для проверки


  motorR.setMode(AUTO);
  motorL.setMode(AUTO);


  // НАПРАВЛЕНИЕ ГУСЕНИЦ (зависит от подключения)
  motorR.setDirection(NORMAL);
  motorL.setDirection(REVERSE);


  // мин. сигнал вращения
  motorR.setMinDuty(MIN_DUTY);
  motorL.setMinDuty(MIN_DUTY);


  // плавность скорости моторов
  motorR.setSmoothSpeed(80);
  motorL.setSmoothSpeed(80);



  // подрубаем геймпад
  ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, false, false);
}


void loop() {
  // читаем геймпад
  bool success = ps2x.read_gamepad(false, 0);  // читаем
delay(50);


  
// КОД ШАССИ  
    // преобразуем стики от 0..255 к -255, 255
  int LX = map(ps2x.Analog(PSS_LX), 255, 0, -255, 255);
  int LY = map(ps2x.Analog(PSS_LY), 255, 0, -255, 255);
  if ( LX== -1 && LY== 1 ) {
    LX = 0;
    LY = 0;
    }
    // танковая схема
  int dutyR = LY + LX;
  int dutyL = LY - LX;
  dutyR = constrain(dutyR, -255, 255);
  dutyL = constrain(dutyL, -255, 255);


    // задаём целевую скорость
  motorR.smoothTick(dutyR);
  motorL.smoothTick(dutyL);
   


// КОД РАБОТЫ АВТОПИЛОТА ПО УЛЬТРАЗВУКУ


  if (ps2x.ButtonPressed(PSB_START))
  {
    flag = !flag;
  }
  delay(100);
 if (flag == true)
  {
    unsigned int distance = sonar.ping_cm();
    delay(50);
    Serial.print(distance);
    Serial.println("см");
    if (ps2x.ButtonPressed(PSB_SELECT))
    {
      flag = !flag;
      Serial.println("нажат флаг");
    }
    if (distance<10){
      Serial.println("стоп");
      delay(200);
      Serial.println("повернул налево");
      delay(400);
      Serial.println("повернул направо");
      delay(800);
    }
  

  }
}

 

mihaluch1993
Offline
Зарегистрирован: 26.06.2022

Разобрался сам, заменил условие на цикл while и добавил чтение геймпада в данный цикл. Все заработало. Оставлю код тут, может кому пригодиться. 

// КОД РАБОТЫ АВТОПИЛОТА ПО УЛЬТРАЗВУКУ


  if (ps2x.ButtonPressed(PSB_START))
  {
    flag = !flag;
  }
  delay(100);

  while (flag == true)
  {
    ps2x.read_gamepad(false, 0);
    unsigned int distance = sonar.ping_cm();
    delay(50);
    Serial.print(distance);
    Serial.println("см");
    if (ps2x.ButtonPressed(PSB_SELECT))
    {
      flag = !flag;
      Serial.println("нажат флаг");
    }
    if (distance<10){
      Serial.println("стоп");
      delay(200);
      Serial.println("повернул налево");
      delay(400);
      Serial.println("повернул направо");
      delay(800);
    }

 

b707
Offline
Зарегистрирован: 26.05.2017

вряд ли этот код кому-то интересен, лучше скажите - разобрались почему зависало-то?