Вопрос. ШВП по концевикам.
- Войдите на сайт для отправки комментариев
Здравствуйте, занимаюсь разработкой проекта шлифовального станка. Ранее с ардуино не сталкивался.
Суть заключается в передвижении ШВП (вверх-вниз) по концевым индуктивным датчикам. При нажатии клавиши "Пуск" включается ШД (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; но тут нужно аккуратно, т.к. есть вероятность неверно указать датчики и уехать не в ту сторону.
вращение можно сделать так
for(int i=0; i<шагов нужно сделать; i++) { PUL=!PUL; delay(скорость шага); }Разобрался с проблемой, выкладываю схему и скетч, вдруг кого-то заинтересует. Всё прекрасно работает.
unsigned long previousMillis = 0; //пройденное время; unsigned long previousMillisTimeout = 0; unsigned long currentMillis = 0; unsigned long currentMillisTimeout = 0; const long interval = 2; //количество импульсов; int sensor1; //сенсор 1; int sensor2; //сенсор 2; int start; // кнопка "Пуск"; int tozero; //к первому циклу; bool motorState = false; bool motorPulse = false; bool motorDirect = false; bool keyState = false; bool sensorState = false; int delaykey = 500; int startcounter = 0; int sensorcounter = 0; void setup() { // назначение пинов; pinMode(13, OUTPUT); //13-импульсы движение pinMode(12, OUTPUT); //12-направление pinMode(7, INPUT_PULLUP); //7- сенсор 1 pinMode(6, INPUT_PULLUP); //6- сенсор 2 pinMode(5, INPUT_PULLUP); //5- кнопка старт pinMode(4, INPUT_PULLUP); //4- на начало } void loop() { //считываем информацию с выводов sensor1 = digitalRead(7); sensor2 = digitalRead(6); start = digitalRead(5); tozero = digitalRead(4); currentMillis = millis(); //текущее время в мс; //посылаем импульсы согласно заданному интервалу if (currentMillis - previousMillis >= interval && motorPulse == true) { previousMillis = currentMillis; motorState = !motorState; MotorMove(); } //Нажали старт if (start == LOW && !keyState) { startcounter = startcounter + 1; motorPulse = true; keyState = true; previousMillisTimeout = millis(); } //сигнал на начало if (tozero == LOW && !keyState) { motorState = false; motorDirect = false; motorPulse = false; sensorcounter = 0; startcounter = 0; keyState = true; previousMillisTimeout = millis(); } //Меняем направление if (sensor1 == LOW && !sensorState) { sensorcounter = sensorcounter + 1; motorDirect = true; sensorState = true; previousMillisTimeout = millis(); } if (sensor2 == LOW && !sensorState) { motorDirect = false; sensorState = true; previousMillisTimeout = millis(); } //Нажата кнопка или сработал датчик sensorState=true или keyState=true if (keyState || sensorState) { timeout(); } // условия if (startcounter == 1 && sensorcounter == 2) { sensorcounter = 0; motorPulse = false; } if (startcounter == 2 && sensorcounter == 4) { sensorcounter = 0; motorPulse = false; } if (startcounter == 3 && sensorcounter == 6) { sensorcounter = 0; startcounter = 0; motorPulse = false; } } void MotorMove() { digitalWrite(13, motorState); digitalWrite(12, motorDirect); } void timeout() //защита от дребезга { currentMillisTimeout = millis(); //текущее время в мс; if (currentMillisTimeout - previousMillisTimeout >= delaykey) { keyState = false; sensorState = false; } }Остался вопрос - как установить скорость вращения двигателя?
Остался вопрос - как установить скорость вращения двигателя?
Получите ответ -переписать программу.
//to_4dp_v2.ino /* импульсы движение -> 13 (Step_pin) направление -> 12 (DIR_pin) сенсор 1 -> 7 сенсор 2 -> 6 кнопка старт -> 5 кнопка Домой -> 4 */ // шаговой двигатель #include "Cl_Motor_SD" const byte Step_pin = 13; const byte DIR_pin = 12; Cl_Motor_SD Motor(Step_pin, DIR_pin); void Do_sens_start() { Motor.sens_start(); } void Do_sens_end() { Motor.sens_end(); } void Do_Btn_Start() { Motor.endcounter=2; // сделать 2 хода Motor.Speed = 500; // время шага 0.5 сек Motor.Start(); } void Do_Btn_Home() { Motor.Home(); } #include "Cl_do_btn.h" Cl_do_btn Sens_start (7, 0, Do_sens_start); //пин 7, 0 уров наж.кнопки , выполнить функцию Cl_do_btn Sens_end (6, 0, Do_sens_end ); //пин 6, 0 уров наж.кнопки , выполнить функцию Cl_do_btn Btn_Start (5, 0, Do_Btn_Start ); //пин 5, 0 уров наж.кнопки , выполнить функцию Cl_do_btn Btn_Home (4, 0, Do_Btn_Home ); //пин 4, 0 уров наж.кнопки , выполнить функцию void setup() { Sens_start.setup(); Sens_end .setup(); Btn_Start .setup(); Btn_Home .setup(); } void loop() { Sens_start.loop(); Sens_end .loop(); Btn_Start .loop(); Btn_Home .loop(); }