Добрый день. Имеется ардуино нано, к ней подключено 5 кнопок, маленькая серва, модуль сд карты и динамик. Так как библиотеки сервы и воспроизведения аудио с флешки используют один и тот же таймер приходиться их то подключать, то отключать, но вопрос не в этом. Вот используемые библиотеки Код (Text): #include <SD.h> #include <TMRpcm.h> #include <SPI.h> #include <Servo.h> Суть работы в том, что при нажатии на кнопку воспроизводиться музыка и считывается номер кнопки. В случае введения правильной комбинации музыка отключается и включается серва, поворачивается на 90 градусов, ждем 10 секунд и возвращается в 0 и пин управления отключается. Так вот забавная ситуация, код полностью срабатывает, музыка играет, серва открывается, ждет, закрывается и... ардуинка перезагружается. Есть подозрение что серва отжирает много тока, от того ардуинка и перезагружается, просто не могу понять почему после закрытия и отключения, а не скажем во время поворота. Вот кусочек кода: Код (Text): if(val == 5 && buttonPushCounter == 5) // Тут проверили, что комбинация правильная { tmrpcm.stopPlayback(); tmrpcm.disable(); // Отключили динамик delay(200); myservo.attach(servoPin); // Подключили серву myservo.write(170); // Повернули Serial.println("RIGHT KEY"); digitalWrite(Light, LOW); startTime = millis(); // Запустили таймер door = true; // И активировали проверку таймера } if (door == true) { if (millis() - startTime > time) //Подождали время { digitalWrite(Light, HIGH); myservo.write(90); // Повернули Serial.println("CLOSE"); delay(200); myservo.detach(); //Отключили серву и скорее всего после этого ардуинка перезагружается delay(100); buttonPushCounter = 0; val = 0; workB1 = true; workB2 = true; workB3 = true; workB4 = true; workB5 = false; startTime = 0; door = false; workB5 = false; } }
в код не вникал, но уже тыщи раз писалось - что сервы нужно питать отдельным источником с общей с мк землёй
Кроме того, что сказал vvr. Из моего не большого опыта. Сталкивался с перезагрузками, когда на прерывании была кнопка. И когда, ардуина была соединена с обычными соединительными проводами, в время отладки стояла на станке который сильно вибрировал. После того как перешел на пайку, проблем не было. По коду, не понятно почему Вы используете delay, от него лучше отказаться. Заменив на проверку по millis(), тем более что Вы с ней знакомы. Код (Text): if (millis() - startTime > time) //Подождали время
Просто повесил на вход внешнего прерывания, обычную кнопку. Без дополнительной защиты. Mega 2560 Код (Text): attachInterrupt(0, IntFunction, CHANGE) Прерывание 0, по второму пину, на нем была подключена кнопка, которая генерировала прерывание и вызывала функцию IntFunction. Разумеется подтяжка кнопки на землю меня не спасла. Работала забавно, доходила до определенного момента и перегружалась. Поэтому не сразу нашел проблему.
У меня просто во время срабатывания сервы кнопка остается в нажатом положении (кнопка с фиксацией). Может быть у меня та же проблема...
Да при условии, что Ваша кнопка, как и у меня запускает прерывание, о котором сказал. Но код не полный, не вижу так это или нет. Если кнопка, кнопка с фиксацией, просто подключена к пину, без прерываний, проблем быть не должно. UPD. Так же попробуйте отключать модули, сервы и комментировать код, до тех пор, пока ошибка не исчезнет. После чего по очереди подключать модули и раскомментировать код, для локализации ошибки.
Вод код кнопки Код (Text): if (bS4 == 1 && workB4 == true) { delay(500); workB1 = true; workB2 = true; workB3 = true; workB4 = false; workB5 = true; tmrpcm.pause(); buttonPushCounter = buttonPushCounter + 1; Serial.println("b4"); if(val == 3) val = 4; else buttonPushCounter = 5; }
Тут все нормально. Кроме странных delay о которых говорил. Не пользуюсь ими принципиально, только в функции setup. Данный код, к внешним прерываниям не относится, если у Вас есть в коде строчка attachInterrupt, обычно в функции setup(). То Вы используете внешнее прерывание, если она есть скопируйте и скиньте сюда. Если attachInterrupt нет, то и внешнего прерывания нет.