// Вход драйвера «STEP» (он же «PULSE») - предназначен для получения тактовых импульсов. За один импульс ротор двигателя поворачивается на один микрошаг.
// Чем выше частота импульсов, тем выше скорость вращения ротора.
// Вход драйвера «DIR» - предназначен для выбора направления вращения двигателя («0» - в одну сторону, «1» - в другую сторону).
// Смена состояния вывода «DIR» должна осуществляться при отсутствии импульсов на выводе «STEP».
// Вход драйвера «ENABLE» - разрешает работу двигателя. У большинства драйверов данный вход является инверсным, работа двигателя разрешена при отсутствии напряжения на входе.
// Некоторые драйверы позволяют вообще не подключать этот вход. Если работа двигателя запрещена, то его обмотки электрически отключаются и вал двигателя не удерживается.
// Двигатель отключён если на входе «ENABLE» есть напряжение.
// Сигналы на входах «STEP» и «DIR» игнорируются драйвером. Вал двигателя освобождён.
// Вал поворачивается на один микрошаг с каждым импульсом на входе «STEP», при условии что на входе «ENABLE» нет напряжения.
// Направление поворота вала зависит от состояния на входе «DIR».
// Вал двигателя удерживается в неподвижном состоянии если на входе «ENABLE» нет напряжения и на вход «STEP» не подаются импульсы.
// t1: После снятия напряжения со входа «ENABLE» должно пройти не менее 5мкс до изменения уровня на входе «STEP» или «DIR».
// t2: После изменения состояния на входе «DIR» должно пройти не менее 5мкс до подачи импульса на входе «STEP»
// t3, t4: Длительность импульса или паузы на входе «STEP» не должна быть меньше 2,5мкс.
//для управления двигателем
const uint8_t pin_ENA = 2; // Вывод 2 Arduino подключённый к входу драйвера ENA+.
const uint8_t pin_DIR = 6; // Вывод 3 Arduino подключённый к входу драйвера DIR+.
const uint8_t pin_PUL = 4; // Вывод 4 Arduino подключённый к входу драйвера PUL+.
// Вывод GND Arduino соединён с входами драйвера ENA-, DIR-, PUL-.
const uint8_t pin_EDatchik_1 = 8; // Вывод 9 Arduino подключённый к переключателю (емкостному датчику1) - прямой ход
const uint8_t pin_EDatchik_2 = 10; // Вывод 10 Arduino подключённый к переключателю (емкостному датчику2) - обратный ход
const uint8_t pin_ODatchik = 12; // Вывод 8 Arduino подключённый к переключателю (оптическому датчику).
//для световой индакации состояния датчика
const uint8_t pin_SDiod = 13; // Вывод 13 Arduino подключённый к светодиоду.
//int spd = A0; // потенциометр - регулирует скорость вращения двигателя
// Чем выше частота, тем выше скорость вращения вала.
// LOW - низкое
// HIGH - высокое
boolean Pologenie = HIGH; // Для определения первоначального положения каретки
// Если каретка не в начале , то состояние HIGH , если в начале то состояние LOW
boolean Dwijenie = LOW; // Для движения каретки в прямом или обратном направлении
// LOW - прямое , HIGH - обратное
boolean ODatchikState; // создаем глобальную переменную состояния оптического датчика ODatchikState
boolean OD_p = LOW; // Переменная для сохранения предыщущего состояния оптического датчика
//boolean OD_t = LOW; // Переменная для сохранения текущего состояния оптического датчика
boolean EDatchikState_1; // создаем глобальную переменную состояния емкостного датчика EDatchikState
boolean ED_1_p = LOW; // Переменная для сохранения предыщущего состояния емкостного датчика
//boolean ED_1_t = LOW; // Переменная для сохранения текущего состояния емкостного датчика
boolean EDatchikState_2; // создаем глобальную переменную состояния емкостного датчика EDatchikState
boolean ED_2_p = LOW; // Переменная для сохранения предыщущего состояния емкостного датчика
//boolean ED_2_t = LOW; // Переменная для сохранения текущего состояния емкостного датчика
boolean SDiod_on = false; // Теукущее состояние светодиода
boolean nach = LOW; // Флаг для проверки начала (LOW или HIGH)
//Функция подавления дребезга контактов
boolean debounce (boolean datchik, boolean last)
{
boolean current = digitalRead(datchik); // Считываем состояние датчика
if(last != current) // Если состояние изменилось
{
delay(5); // Ждем пока состояние стабилизируется - игнорируем дребезг
current = digitalRead(datchik); // Считываем стабильное значение
}
return current; // Возвращаем результат
}
// void setup() – функция, которая выполняется единожды, при загрузке программы
void setup()
{
pinMode( pin_ENA, OUTPUT ); // Конфигурируем вывод 2 Arduino как выход.
pinMode( pin_DIR, OUTPUT ); // Конфигурируем вывод 3 Arduino как выход.
pinMode( pin_PUL, OUTPUT ); // Конфигурируем вывод 4 Arduino как выход.
pinMode( pin_SDiod, OUTPUT ); // Конфигурируем вывод 13 Arduino как выход (pin13 светодиод)
pinMode( pin_ODatchik, INPUT_PULLUP ); // Конфигурируем вывод 8 Arduino как вход (pin8 датчик)
pinMode( pin_EDatchik_1, INPUT_PULLUP ); // Конфигурируем вывод 9 Arduino как вход (pin9 датчик)
pinMode( pin_EDatchik_2, INPUT_PULLUP ); // Конфигурируем вывод 9 Arduino как вход (pin10 датчик)
EDatchikState_1 = digitalRead(pin_EDatchik_1);
EDatchikState_2 = digitalRead(pin_EDatchik_2);
ODatchikState = digitalRead(pin_ODatchik);
// digitalWrite(pin_SDiod, LOW);
} //void setup()
// void loop() – соответственно функция, которая выполняется постоянно, когда плата подключена к источнику питания
void loop()
{
// Функция map пропорционально переносит значение (analogRead(spd)) из текущего диапазона
// значений (0,1023) в новый диапазон (500,2000), заданный параметрами.
// int t = map((analogRead(spd)),0,1023,1,20);
int t = 5;
// Условие1 при первом включении,
// если каретка станка стоит не в начальном положении - датчик 1 и датчик 2 не сработали
if (EDatchikState_1 == HIGH)
{
ED_1_p = HIGH;
}
else
{
ED_1_p = LOW;
}
if (EDatchikState_2 == HIGH)
{
ED_2_p = HIGH;
}
else
{
ED_2_p = LOW;
}
if (ODatchikState == HIGH)
{
OD_p = HIGH;
}
else
{
OD_p = LOW;
}
if (ED_1_p == HIGH && ED_2_p == HIGH && OD_p == HIGH && Pologenie == HIGH ) //Pologenie = HIGH - каретка не в начале
{
// Устанавливаем движение вала в обратном направлении:
digitalWrite( pin_ENA, 0 ); // Разрешаем работу двигателя.
delayMicroseconds(5); // Выполняем задержку t1 (5мкс)
digitalWrite( pin_DIR, 1 ); // Указываем валу вижение в обратном направлении
delayMicroseconds(5); // Выполняем задержку t2 (5мкс)
// Вал движетсяв обратную сторону пока не сработает емкостной датчик 2
for(int i=0; i<1000 ; i++)
{ // Выполняем 100 проходов цикла (1 оборот = 400 тактов).
digitalWrite( pin_PUL, 1 ); // Устанавливаем на выводе PUL состояние логической «1».
delayMicroseconds(1); // Выполняем задержку t3.
digitalWrite( pin_PUL, 0 ); // Устанавливаем на выводе PUL состояние логического «0».
delayMicroseconds(1); // Выполняем задержку t4.
EDatchikState_2 = digitalRead(pin_EDatchik_2); // Считываем показания датчика
if (EDatchikState_2 != EDatchikState_2) // если показания датчика изменились
{
ED_1_p == HIGH;
ED_2_p = LOW; // Фиксируем, что Датчик2 сработал
Pologenie = LOW ; // Каретка находится в начале
Dwijenie = LOW; // Движение в прямом направлении
nach = LOW;
break; // Оператор break позволяет выйти из цикла
}
}
}
// Условие2 при первом включении,
// если каретка станка стоит в противоположном положении и датчик 1 сработал
if (ED_1_p == LOW && ED_2_p == HIGH && OD_p == HIGH && Pologenie == HIGH ) //Pologenie = LOW - каретка не в начале
{
// Устанавливаем движение вала в обратном направлении:
digitalWrite( pin_ENA, 0 ); // Разрешаем работу двигателя.
delayMicroseconds(5); // Выполняем задержку t1 (5мкс)
digitalWrite( pin_DIR, 1 ); // Указываем валу вижение в обратном направлении
delayMicroseconds(5); // Выполняем задержку t2 (5мкс)
// Вал движетсяв обратную сторону пока не сработает емкостной датчик 2
for(int i=0; i<1000 ; i++)
{ // Выполняем 100 проходов цикла (1 оборот = 400 тактов).
digitalWrite( pin_PUL, 1 ); // Устанавливаем на выводе PUL состояние логической «1».
delayMicroseconds(1); // Выполняем задержку t3.
digitalWrite( pin_PUL, 0 ); // Устанавливаем на выводе PUL состояние логического «0».
delayMicroseconds(1); // Выполняем задержку t4.
EDatchikState_2 = digitalRead(pin_EDatchik_2); // Считываем показания датчика
if (EDatchikState_2 != EDatchikState_2) // если показания датчика изменились
{
ED_1_p == HIGH;
ED_2_p = LOW; // Фиксируем, что Датчик2 сработал
Pologenie = LOW ; // Каретка находится в начале
Dwijenie = LOW; // Движение в прямом направлении
nach = LOW;
break; // Оператор break позволяет выйти из цикла
}
}
}
// Если Условие1 и Условие2 не сработали и каретка находится в начале (Датчик 2 сработал)
// Считываем состояние датчиков Датчик2
if (ED_1_p == HIGH && ED_2_p == LOW && Pologenie == LOW && Dwijenie == LOW) // Pologenie = LOW - каретка в начале Dwijenie == LOW - прямое
{
ODatchikState = digitalRead(pin_ODatchik);
// Каретка ждет команды от срабатывания оптического датчика для движения вперед
if (ODatchikState == LOW)
{
OD_p = LOW; // Фиксируем, что датчик поступления сработал
if (OD_p == LOW && ED_1_p == HIGH && ED_2_p == LOW && Pologenie == LOW && Dwijenie == LOW )
{
// Начинаем движение каретки вперёд
// Устанавливаем движение вала в обратном направлении:
digitalWrite( pin_ENA, 0 ); // Разрешаем работу двигателя.
delayMicroseconds(5); // Выполняем задержку t1 (5мкс).
digitalWrite( pin_DIR, 0 ); // Указываем валу вижение в прямом направлении
delayMicroseconds(5); // Выполняем задержку t2 (5мкс).
// Вал движется в прямом направлении пока не сработает емкостной Датчик1
for(int i=0; i<1000 ; i++)
{ // Выполняем 100 проходов цикла (1 оборот = 400 тактов).
digitalWrite( pin_PUL, 1 ); // Устанавливаем на выводе PUL состояние логической «1».
delayMicroseconds(1); // Выполняем задержку t3.
digitalWrite( pin_PUL, 0 ); // Устанавливаем на выводе PUL состояние логического «0».
delayMicroseconds(1); // Выполняем задержку t4.
EDatchikState_1 = digitalRead(pin_EDatchik_1); // Считываем показания датчика
if (EDatchikState_1 != EDatchikState_1) // если показания датчика изменились
{
OD_p = HIGH; // Сбрасываем флаг с датчика поступления
ED_2_p = HIGH; // Снимаем фиксацию сработки Датчика2
ED_1_p = LOW; // Фиксируем, что Датчик1 сработал
Dwijenie = HIGH; // Изменяем флаг на движение в обратную сторону
Pologenie == HIGH ; // Изменяем флаг каретка не в начале
break; // Оператор break позволяет выйти из цикла
}
}
}
}
}
// Если Условие1 и Условие2 не сработали и каретка находится в другом конце начале (Датчик 1 сработал)
// Считываем состояние датчиков Датчик1
if (ED_1_p == LOW && ED_2_p == HIGH && Pologenie == HIGH && Dwijenie == HIGH) // Pologenie = HIGH - каретка не в начале Dwijenie == HIGH - обратное
{
ODatchikState = digitalRead(pin_ODatchik);
// Каретка ждет команды от срабатывания оптического датчика для движения вперед
if (ODatchikState != ODatchikState)
{
OD_p = LOW; // Фиксируем, что датчик поступления сработал
if (OD_p == LOW && ED_1_p == LOW && ED_2_p == HIGH && Pologenie == HIGH && Dwijenie == HIGH)
{
// Начинаем движение каретки назад
// Устанавливаем движение вала в обратном направлении:
digitalWrite( pin_ENA, 0 ); // Разрешаем работу двигателя.
delayMicroseconds(5); // Выполняем задержку t1 (5мкс).
digitalWrite( pin_DIR, 1 ); // Указываем валу вижение в обратном направлении
delayMicroseconds(5); // Выполняем задержку t2 (5мкс).
// Вал движется в прямом направлении пока не сработает емкостной Датчик1
for(int i=0; i<1000 ; i++)
{ // Выполняем 100 проходов цикла (1 оборот = 400 тактов).
digitalWrite( pin_PUL, 1 ); // Устанавливаем на выводе PUL состояние логической «1».
delayMicroseconds(1); // Выполняем задержку t3.
digitalWrite( pin_PUL, 0 ); // Устанавливаем на выводе PUL состояние логического «0».
delayMicroseconds(1); // Выполняем задержку t4.
EDatchikState_2 = digitalRead(pin_EDatchik_2); // Считываем показания датчика
if (EDatchikState_2 != EDatchikState_2) // если показания датчика изменились
{
OD_p = HIGH; // Сбрасываем флаг с датчика поступления
ED_2_p = LOW; // Фиксируем сработку Датчика2
ED_1_p = HIGH; // Снимаем фиксацию сработки Датчика1
Dwijenie = LOW; // Изменяем флаг на движение в прямом направлении
Pologenie == LOW; // Изменяем флаг каретка в начале
break; // Оператор break позволяет выйти из цикла
}
}
}
}
}
} // void loop()