Вопрос. ШВП по концевикам.

4dp
Offline
Зарегистрирован: 13.04.2017

Здравствуйте, занимаюсь разработкой проекта шлифовального станка. Ранее с ардуино не сталкивался. 

Суть заключается в передвижении ШВП (вверх-вниз) по концевым индуктивным датчикам. При нажатии клавиши "Пуск" включается ШД (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);
  }
}

Наведите на мысль пожалуйста!

 

 

4dp
Offline
Зарегистрирован: 13.04.2017

Примерная схема подключения (делитантская) 

BoBo4kA
Offline
Зарегистрирован: 15.01.2016

на драйвер, с мк, стоит закинуть enable, обычно на драйвере есть

Датчики, учитывая, что их 2 шт, я бы повесил на прерывание.

состояние DIR можно менять простым DIR=!DIR; но тут нужно аккуратно, т.к. есть вероятность неверно указать датчики и уехать не в ту сторону.

вращение можно сделать так

for(int i=0; i<шагов нужно сделать; i++) 
{
PUL=!PUL;
delay(скорость шага);
}

 

4dp
Offline
Зарегистрирован: 13.04.2017

Разобрался с проблемой, выкладываю схему и скетч, вдруг кого-то заинтересует. Всё прекрасно работает.

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;
  }
}

 

4dp
Offline
Зарегистрирован: 13.04.2017

Остался вопрос - как установить скорость вращения двигателя?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

4dp пишет:

Остался вопрос - как установить скорость вращения двигателя?

Получите ответ -переписать программу.

//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();
}