Самопроизвольная перезагрузка Arduino (nano и uno)
- Войдите на сайт для отправки комментариев
Добрый день.
Прошу помощи, совсем недавно начал изучать ардуино.
Пишу код простой для автоматического обьезда препятствий машинки с помощью ульразвукового датчика 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);
}
}
Выкладывай весь код.
// мин. сигнал, при котором мотор начинает вращение #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); } } }Разобрался сам, заменил условие на цикл 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); }вряд ли этот код кому-то интересен, лучше скажите - разобрались почему зависало-то?