Перезагрузка ардуино

Тема в разделе "Arduino & Shields", создана пользователем GrizliK91, 19 янв 2015.

  1. GrizliK91

    GrizliK91 Нерд

    Добрый день.

    Имеется ардуино нано, к ней подключено 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;
            }
    }
     
  2. vvr

    vvr Инженерище

    а у вас серва как запитана?
     
  3. GrizliK91

    GrizliK91 Нерд

    от 5в ардуино
     
  4. vvr

    vvr Инженерище

    в код не вникал, но уже тыщи раз писалось - что сервы нужно питать отдельным источником с общей с мк землёй
     
  5. Alex19

    Alex19 Гуру

    Кроме того, что сказал vvr.

    Из моего не большого опыта.
    Сталкивался с перезагрузками, когда на прерывании была кнопка.
    И когда, ардуина была соединена с обычными соединительными проводами, в время отладки стояла на станке который сильно вибрировал. После того как перешел на пайку, проблем не было.

    По коду, не понятно почему Вы используете delay, от него лучше отказаться. Заменив на проверку по
    millis(), тем более что Вы с ней знакомы.
    Код (Text):
    if (millis() - startTime > time)            //Подождали время
     
  6. GrizliK91

    GrizliK91 Нерд

    Немного не понял, что имеется ввиду про прерывании и кнопку. Все распаяно)
     
  7. Alex19

    Alex19 Гуру

    Просто повесил на вход внешнего прерывания, обычную кнопку. Без дополнительной защиты.

    Mega 2560
    Код (Text):
    attachInterrupt(0, IntFunction, CHANGE)
    Прерывание 0, по второму пину, на нем была подключена кнопка, которая генерировала прерывание и вызывала функцию IntFunction. Разумеется подтяжка кнопки на землю меня не спасла.

    Работала забавно, доходила до определенного момента и перегружалась. Поэтому не сразу нашел проблему.
     
  8. GrizliK91

    GrizliK91 Нерд

    У меня просто во время срабатывания сервы кнопка остается в нажатом положении (кнопка с фиксацией). Может быть у меня та же проблема...
     
  9. Alex19

    Alex19 Гуру

    Да при условии, что Ваша кнопка, как и у меня запускает прерывание, о котором сказал. Но код не полный, не вижу так это или нет.

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

    UPD. Так же попробуйте отключать модули, сервы и комментировать код, до тех пор, пока ошибка не исчезнет. После чего по очереди подключать модули и раскомментировать код, для локализации ошибки.
     
    Последнее редактирование: 19 янв 2015
  10. GrizliK91

    GrizliK91 Нерд

    Вод код кнопки
    Код (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; }
     
  11. Alex19

    Alex19 Гуру

    Тут все нормально.
    Кроме странных delay о которых говорил. Не пользуюсь ими принципиально, только в функции setup.

    Данный код, к внешним прерываниям не относится, если у Вас есть в коде строчка attachInterrupt, обычно в функции setup(). То Вы используете внешнее прерывание, если она есть скопируйте и скиньте сюда. Если attachInterrupt нет, то и внешнего прерывания нет.