Вопрос. ШВП по концевикам.
- Войдите на сайт для отправки комментариев
Здравствуйте, занимаюсь разработкой проекта шлифовального станка. Ранее с ардуино не сталкивался.
Суть заключается в передвижении ШВП (вверх-вниз) по концевым индуктивным датчикам. При нажатии клавиши "Пуск" включается ШД (Nema 34) в заданном направление и ШВП движется до срабатывания дачика. Далее меняется направление движения на противоположное до срабатывания второго датчика. Так должно ходить определенное кол-во раз, после чего автоматический "стоп". И при следующем нажатии на "пуск" цикл должен увеличиваться на один проход.
Понял, что необходим конечный автомат, но сообразить как его написать не могу.
Так же предусмотрена кнопка "перезапуск цикла", тоже не знаю как ее реализовать.
С кодом что-то перемудрил и запутался((
В данном случае сенсор срабатывает 4 раза и останавливается.
unsigned long previousMillis = 0; //пройденное время; const long interval = 2; //интервал между изменением направления; int motorState = LOW; //питание двигателя; int sensor1; //сенсор 1; int sensor2; //сенсор 2; int start; // кнопка "Пуск"; int moving; //состояние двигателя; int tozero; //к первому циклу; int sensor1State = 0; //текущее состояние сенсора1; int lastSensor1State = 0; // последнее состояние сенсора1; int flag = 0; //счетчик срабатывания сенсора; void setup() { // назначение пинов; pinMode(13, OUTPUT); // step; pinMode(12, OUTPUT); //dir; pinMode(7, INPUT_PULLUP); pinMode(6, INPUT_PULLUP); pinMode(5, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); } void loop() { sensor1 = digitalRead(7); //считываем информацию с выводов; sensor2 = digitalRead(6); start = digitalRead(5); tozero = digitalRead(4); if (start == LOW) //условия изменения направления движения двигателя; moving = HIGH; if (sensor1 == LOW) digitalWrite(12, HIGH); if (sensor2 == LOW) digitalWrite(12, LOW); unsigned long currentMillis = millis(); //текущее время в мс; if (currentMillis - previousMillis >= interval) { //избавляемся от delay; previousMillis = currentMillis; if (motorState == LOW) { motorState = HIGH; } else { motorState = LOW; } if (moving == HIGH) digitalWrite(13, motorState); } sensor1State = digitalRead(7); //счетчик срабатывания первого сенсора; if (sensor1State != lastSensor1State) { if (sensor1State == HIGH) { flag++; } } lastSensor1State = sensor1State; //количество срабатываний первого сенсора до остановки; if (flag % 5 == 0) { digitalWrite(motorState, LOW); moving = LOW; } else { digitalWrite(motorState, HIGH); } }
Наведите на мысль пожалуйста!
Примерная схема подключения (делитантская)
на драйвер, с мк, стоит закинуть enable, обычно на драйвере есть
Датчики, учитывая, что их 2 шт, я бы повесил на прерывание.
состояние DIR можно менять простым DIR=!DIR; но тут нужно аккуратно, т.к. есть вероятность неверно указать датчики и уехать не в ту сторону.
вращение можно сделать так
Разобрался с проблемой, выкладываю схему и скетч, вдруг кого-то заинтересует. Всё прекрасно работает.
Остался вопрос - как установить скорость вращения двигателя?
Остался вопрос - как установить скорость вращения двигателя?
Получите ответ -переписать программу.