Сбой программы иногда

Sergey112
Offline
Зарегистрирован: 01.12.2020

Исходные данные:

плата - MEGA, плата с 4 реле, 5 сенсорных кнопок, 3 светодиода, 1 ШД с драйвером DM556. Питание на МЕГУ - с БП 12В, питание на реле - с того же БП 24В.

МЕГА управляет 2 пневмоцилиндрами, 1 вакуумным генератором и 1 ШД с драйвером DM556. В определённой последовательности включает/выключает ШД, пневмоцилиндры, вакуум. В среднем в программе 22 этапа. Иногда программа выполняется без сбоев, иногда 3 этапа проходит и программа останавливается, иногда 8-12 этапов проходит. Отчего зависит - не понятно.

Может кто сталкивался с таким чудом? Подскажите куда копать...

 

rkit
Offline
Зарегистрирован: 23.11.2016

плохая сборка ловит помехи

Sergey112
Offline
Зарегистрирован: 01.12.2020

rkit пишет:

плохая сборка ловит помехи

Что делать, как пересобирать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Зеленый провод не туда припаян. А также в строке №48 скетча чушь какая-то написана.

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

Сергей, выкладывайте схему сборки и код программы. Без этого и разговор начинать не стоило.

Программа откуда взялась? - вряд ли вы ее писали сами, иначе таких вопросов бы не было...

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Больше...больше надо конденсаторов и дросселей. Чую...чую наводку в схеме от двигателей...

Дайте на водку.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Sergey112 пишет:

Что делать, как пересобирать?

Как минимум повесить ферритовый дроссель на питание ардуины. Для это берем ферритовое кольцо (можно добыть из сгоревшей CFL лампочки), пропускаем через него провода питания идущие непосредственно к ардуино, и делаем несколько витков (чем больше тем лучше)

То же самое желательно проделать с питанием всего остального. Если намотать не получается, можно просто продеть провод через кольцо. Так же можно поставить дросселя на низкоскоростные цепи идущие от/к ардуино.

Sergey112
Offline
Зарегистрирован: 01.12.2020

b707 пишет:

Сергей, выкладывайте схему сборки и код программы. Без этого и разговор начинать не стоило.

Программа откуда взялась? - вряд ли вы ее писали сами, иначе таких вопросов бы не было...

Схему нарисую чуть позже.

Программу писал сам :)



void piezo(int cN = 3);

void setup() {
  // режим для STEP и DIR как OUTPUT
  pinMode(PIN_STEP, OUTPUT);
  pinMode(PIN_DIR, OUTPUT);
  // начальные значения
  digitalWrite(PIN_STEP, 1);
  digitalWrite(PIN_DIR, 0);
  bWork = 1;
  st = 0;

  pinMode(piezoPin, OUTPUT);    //  пищалка
  pinMode(ledStatusDigger, OUTPUT);
  pinMode(ledStatusSeeder, OUTPUT);
  pinMode(ledStatusVakuum, OUTPUT);


  pinMode(ledPinDebug, OUTPUT);     //  светодиод DEBUG
  digitalWrite(ledPinDebug, LOW);

  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);

  pinMode(inDigger, OUTPUT);
  digitalWrite(inDigger, HIGH);

  pinMode(inVakuum, OUTPUT);
  digitalWrite(inVakuum, HIGH);

  pinMode(inSeed, OUTPUT);
  digitalWrite(inSeed, HIGH);

  pinMode(ledPin264, OUTPUT);
  pinMode(ledPin288, OUTPUT);
  pinMode(ledPin405, OUTPUT);

  pinMode(buttonPin264, INPUT);
  pinMode(buttonPin288, INPUT);
  pinMode(buttonPin405, INPUT);

  pinMode(buttonPinStart, INPUT);
  pinMode(buttonPinFinish, INPUT);
  pinMode(buttonPinInit, INPUT);

  iTypeWork = 0;    //  тип выполняемой программы 0 - не задано

  digitalWrite(ledPin264, HIGH);   // зажигаем светодиод тип 264
  digitalWrite(ledPin288, HIGH);   // зажигаем светодиод тип 288
  digitalWrite(ledPin405, HIGH);   // зажигаем светодиод тип 405
  delay(500);
  digitalWrite(ledPin264, LOW);   // гасим светодиод тип 264
  digitalWrite(ledPin288, LOW);   // гасим светодиод тип 288
  digitalWrite(ledPin405, LOW);   // гасим светодиод тип 405

  Serial.begin(9600);
  piezo(1);
}

void loop() {

  switch (bWork)
  {
    case 1:
      // вращаем шаговик вперёд на пару витков
      digitalWrite(PIN_DIR, LOW);
      digitalWrite(PIN_STEP, HIGH);
      delayMicroseconds (SPEED);
      digitalWrite(PIN_STEP, LOW);
      st++;
      if  (st == STEP_ROUND) {
        bWork = 2;
        st = 0;
      }
      break;
    case 2:
      //  вращаем назад до концевика на старте
      digitalWrite(PIN_DIR, HIGH);
      digitalWrite(PIN_STEP, HIGH);
      delayMicroseconds (SPEED);
      digitalWrite(PIN_STEP, LOW);
      st++;

      buttonState = digitalRead(buttonPin); // считываем состояние концевика на старте
      //      buttonState = LOW;
      if (buttonState == LOW) {
        // если нажат концевик на старте
        bWork = 4;
        st = 0;
        Serial.println("BtnStart: START");
      }
      break;
    case 4:
      //  ожидаем нажатия кнопки установки типа кассеты
      bState264 = digitalRead(buttonPin264); // считываем состояние кнопки
      bState288 = digitalRead(buttonPin288); // считываем состояние кнопки
      bState405 = digitalRead(buttonPin405); // считываем состояние кнопки
      bStateStart = digitalRead(buttonPinStart); // считываем состояние кнопки СТАРТ/СТОП
      bStateInit = digitalRead(buttonPinInit); // считываем состояние кнопки ИНИЦИАЛИЗАЦИЯ

      if (bState264 == HIGH) {
        //  выбран тип кассеты 264 ячейки
        totalRow = Rows264;  //  22 ряда
        OneStep = Step264;  //  количество шагов ШД для перемещения на 1 ряд
        digitalWrite(ledPin264, HIGH);   // зажигаем светодиод тип 264
        digitalWrite(ledPin288, LOW);   // гасим светодиод тип 288
        digitalWrite(ledPin405, LOW);   // гасим светодиод тип 405
        iTypeWork = 264;
        Serial.println("TYPE: 264");

      }
      if (bState288 == HIGH) {
        //  выбран тип кассеты 288 ячейки
        totalRow = Rows288;  //  22 ряда
        OneStep = Step288;  //  количество шагов ШД для перемещения на 1 ряд
        digitalWrite(ledPin264, LOW);   // гасим светодиод тип 264
        digitalWrite(ledPin288, HIGH);   // зажигаем светодиод тип 288
        digitalWrite(ledPin405, LOW);   // гасим светодиод тип 405
        iTypeWork = 288;
        Serial.println("TYPE: 288");
      }
      if (bState405 == HIGH) {
        //  выбран тип кассеты 405 ячейки
        totalRow = Rows405;  //  22 ряда
        OneStep = Step405;  //  количество шагов ШД для перемещения на 1 ряд
        digitalWrite(ledPin264, LOW);   // гасим светодиод тип 264
        digitalWrite(ledPin288, LOW);   // гасим светодиод тип 288
        digitalWrite(ledPin405, HIGH);   // зажигаем светодиод тип 405
        iTypeWork = 405;
        Serial.println("TYPE: 405");
      }

      if ((bStateStart == HIGH) && iTypeWork) {
        //  запуск основной работы
        bWork = 5;
        buttonStart = 1;
        Serial.print("START: ");
        Serial.println(iTypeWork, DEC);
      }
      if (bStateInit == HIGH) {
        // если нажата кнопка Init
        bWork = 2;
        iTypeWork = 0;
        totalRow = 0;
        digitalWrite(ledPin264, LOW);   // гасим светодиод тип 264
        digitalWrite(ledPin288, LOW);   // гасим светодиод тип 288
        digitalWrite(ledPin405, LOW);   // гасим светодиод тип 405
      }
      break;
    default:
      // основная работа
      if (buttonStart) {
        bWork = 10;   //  шаг 1
        buttonStart = 0;
        countRow = 0;
        myTimer = millis();
      }

      switch (bWork)
      {
        case 10:
          Serial.println("DIGGER: down");
          digitalWrite(inDigger, LOW);   //  вдавить лунки в ряду вдавливатель лунок опустить
          digitalWrite(ledStatusDigger, HIGH);
          bWork = 20;
          delay(500);
          break;
        case 20:
          if  (VacuumOn) {
            Serial.println("Vakuum: OFF Seed to tray");
            digitalWrite(inVakuum, HIGH);  //  выключить вакуум, семена падают
            digitalWrite(ledStatusVakuum, LOW);

            VacuumOn = 0;
            countRow++;
            delay(500);   //  время, чтобы семена упали в лунки
          }

          if  (countRow >= totalRow) {
            Serial.println("WORK: Finished Piezo!!!");
            //  кассета высеяна, закончить этот цикл
            workFinish = 1;   //  флажок что кассета закончилась
            timeOfWork = (millis() - myTimer) / 1000;
            Serial.println("WORK TIME, sec: " + String(timeOfWork));
            piezo(1);
          } else Serial.println("WORK #: " + String(countRow));
          bWork = 30;
          delay(200);
          break;
        case 30:
          Serial.println("DIGGER: up");
          digitalWrite(inDigger, HIGH);   //  вдавливатель лунок поднять
          digitalWrite(ledStatusDigger, LOW);
          bWork = 40;
          delay(200);

          break;
        case 40:
          // ШАГ 4 вращаем шаговик вперёд на CELL_STEP витков

          if  (workFinish == 1) {
            //  кассета закончилась, семена сброшены
            workFinish = 0;
            bWork = 4;
            Serial.println("WORK: Finished");
            break;
          }

          digitalWrite(PIN_DIR, LOW);
          digitalWrite(PIN_STEP, HIGH);
          delayMicroseconds (SPEED);
          digitalWrite(PIN_STEP, LOW);
          st++;
          if  (st == OneStep) {
            st = 0;
            delay(100);
            bWork = 50;
          }

          bStateFinish = digitalRead(buttonPinFinish); // считываем состояние концевика на финише
          if (bStateFinish == LOW) { // suda ne popadaem
 
            workFinish = 1;   //  флажок что кассета закончилась
          }

          break;
        case 50:
          Serial.println("Vakuum: ON");
          digitalWrite(inVakuum, LOW);  //  включить вакуум
          digitalWrite(ledStatusVakuum, HIGH);

          VacuumOn = 1;
          bWork = 60;
          delay(200);
          break;
        case 60:
          Serial.println("SEED: ON");
          digitalWrite(inSeed, LOW);  //  передвинуть сопла за семенами
          digitalWrite(ledStatusSeeder, HIGH);
          bWork = 70;
          delay(800);   //  подбор времени чтобы выдвинулся весь цилиндр и сгладилось биение
          break;
        case 70:
          Serial.println("SEED: OFF");
          digitalWrite(inSeed, HIGH);  //  передвинуть сопла c семенами на позицию сброса семян в лунки
          digitalWrite(ledStatusSeeder, LOW);
          bWork = 10;
          delay(300);   //  время, чтобы сгладилось биение
          break;
      }
  }
}

void piezo(int cN = 3)  {
  for (int i = 0; i < cN; i++) {
    analogWrite(piezoPin, 20);
    delay(1000);
    analogWrite(piezoPin, 0);
    delay(500);
  }
}

 

 

Sergey112
Offline
Зарегистрирован: 01.12.2020

b707 пишет:

Сергей, выкладывайте схему сборки и код программы. Без этого и разговор начинать не стоило.

Программа откуда взялась? - вряд ли вы ее писали сами, иначе таких вопросов бы не было...

Схема сборки:

rkit
Offline
Зарегистрирован: 23.11.2016

Нужна электрическая принципиальная схема, а не это непонятно что. И фото.

Sergey112
Offline
Зарегистрирован: 01.12.2020

rkit пишет:

Нужна электрическая принципиальная схема, а не это непонятно что. И фото.

Навесил ферритовое кольцо на питание ардуины, на провод питание +24V на реле, который идёт, повесил ферритовый фильтр на защёлках. Стало лучше, циклов 10 прогнал - ниодного сбоя не было :)

Фото того, что внутри:

inspiritus
Offline
Зарегистрирован: 17.12.2012

Вы б хотя бы питание расписали, как оно у Вас организовано.

в мегу вообще похоже дюпоны воткнуты, вы в курсе что там внутри волос а не провод, причем иногда не припаяный а прислонютый :)

Sergey112
Offline
Зарегистрирован: 01.12.2020

inspiritus пишет:

Вы б хотя бы питание расписали, как оно у Вас организовано.

в мегу вообще похоже дюпоны воткнуты, вы в курсе что там внутри волос а не провод, причем иногда не припаяный а прислонютый :)

Питание - из БП +12V идёт через выключатель на ардуину, миинус с БП идёт напрямую в ардуину, +24V с БП идёт на реле.

В мегу всё воткнуто стандартными проводами, ничего не пропаивалось не перепаивалось.