Сбой программы иногда
- Войдите на сайт для отправки комментариев
Втр, 01/12/2020 - 19:06
Исходные данные:
плата - MEGA, плата с 4 реле, 5 сенсорных кнопок, 3 светодиода, 1 ШД с драйвером DM556. Питание на МЕГУ - с БП 12В, питание на реле - с того же БП 24В.
МЕГА управляет 2 пневмоцилиндрами, 1 вакуумным генератором и 1 ШД с драйвером DM556. В определённой последовательности включает/выключает ШД, пневмоцилиндры, вакуум. В среднем в программе 22 этапа. Иногда программа выполняется без сбоев, иногда 3 этапа проходит и программа останавливается, иногда 8-12 этапов проходит. Отчего зависит - не понятно.
Может кто сталкивался с таким чудом? Подскажите куда копать...
плохая сборка ловит помехи
плохая сборка ловит помехи
Что делать, как пересобирать?
Зеленый провод не туда припаян. А также в строке №48 скетча чушь какая-то написана.
Сергей, выкладывайте схему сборки и код программы. Без этого и разговор начинать не стоило.
Программа откуда взялась? - вряд ли вы ее писали сами, иначе таких вопросов бы не было...
Больше...больше надо конденсаторов и дросселей. Чую...чую наводку в схеме от двигателей...
Дайте на водку.
Что делать, как пересобирать?
Как минимум повесить ферритовый дроссель на питание ардуины. Для это берем ферритовое кольцо (можно добыть из сгоревшей CFL лампочки), пропускаем через него провода питания идущие непосредственно к ардуино, и делаем несколько витков (чем больше тем лучше)
То же самое желательно проделать с питанием всего остального. Если намотать не получается, можно просто продеть провод через кольцо. Так же можно поставить дросселя на низкоскоростные цепи идущие от/к ардуино.
Сергей, выкладывайте схему сборки и код программы. Без этого и разговор начинать не стоило.
Программа откуда взялась? - вряд ли вы ее писали сами, иначе таких вопросов бы не было...
Схему нарисую чуть позже.
Программу писал сам :)
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); } }Сергей, выкладывайте схему сборки и код программы. Без этого и разговор начинать не стоило.
Программа откуда взялась? - вряд ли вы ее писали сами, иначе таких вопросов бы не было...
Схема сборки:
Нужна электрическая принципиальная схема, а не это непонятно что. И фото.
Нужна электрическая принципиальная схема, а не это непонятно что. И фото.
Навесил ферритовое кольцо на питание ардуины, на провод питание +24V на реле, который идёт, повесил ферритовый фильтр на защёлках. Стало лучше, циклов 10 прогнал - ниодного сбоя не было :)
Фото того, что внутри:
Вы б хотя бы питание расписали, как оно у Вас организовано.
в мегу вообще похоже дюпоны воткнуты, вы в курсе что там внутри волос а не провод, причем иногда не припаяный а прислонютый :)
Вы б хотя бы питание расписали, как оно у Вас организовано.
в мегу вообще похоже дюпоны воткнуты, вы в курсе что там внутри волос а не провод, причем иногда не припаяный а прислонютый :)
Питание - из БП +12V идёт через выключатель на ардуину, миинус с БП идёт напрямую в ардуину, +24V с БП идёт на реле.
В мегу всё воткнуто стандартными проводами, ничего не пропаивалось не перепаивалось.