// така послідовність підключення характерна тільки для цієї схеми та визначатиме послідовність та значення елементів масиву bitConfig
// якщо підключити інакше, то вигляд масиву bitConfig зміниться (ілюстрація формування масиву bitConfig є в матиеріалі заняття)
int motorPin1 = 11;
int motorPin2 = 10;
int motorPin3 = 9;
int motorPin4 = 8;
// визначення затримки між імпульсами для одного кроку (фактично, задаємо швидкість обертання)
int motorSpeed = 40;
// напрямок обертання
int dir = 1;
// завдання необхідної кількості циклів для виконання одного повного оберту (360 градусів)
// згідно подальшої логіки роботи програми для повного оберту знадобиться 50 циклів
// у півкроковому режимі 50 = 400 кроків для оберту на 360 градусів / 8 тактів керуючої послідовності
int fullRevolution = 50;
// формування масиву 8-тактової керуючої послідолвності (тобто, півкроковий режим)
// масив, у якому зберігаються у двійковому форматі керуючі послідовності для кожного окремого такту
// молодший біт числа - крайній правий, старший біт числа - крайній лівий
int bitConfig[8] = {B0101, B0100, B0110, B0010, B1010, B1000, B1001, B0001};
void oneStepRevolution(int tact)
{
digitalWrite(motorPin1, bitRead(bitConfig[tact], 3)); // старший біт - крайній лівий
digitalWrite(motorPin2, bitRead(bitConfig[tact], 2));
digitalWrite(motorPin3, bitRead(bitConfig[tact], 1));
digitalWrite(motorPin4, bitRead(bitConfig[tact], 0)); // молодший біт - крайній правий
}
// формування керуючої послідовності для обертання вала в одному напрямку
void clockwise() {
for (int i = 0; i <= 7; i++)
{
oneStepRevolution(i);
delay(motorSpeed);
}
}
// формування керуючої послідовності для обертання вала у протилежному напрямку
void counterclockwise() {
for (int i = 7; i >= 0; i--)
{
oneStepRevolution(i);
delay(motorSpeed);
}
}
void setup() {
Serial.begin(9600);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
}
void loop() {
if (dir == 1)
{
Serial.println("Clocwise");
for (int stepCount = 0; stepCount < fullRevolution; stepCount++)
{
clockwise();
}
delay(1000); // зупиняємо вал в крайній позиції на 1 с
}
else
{
Serial.println("Counterclocwise");
for (int stepCount = 0; stepCount < fullRevolution; stepCount++)
{
counterclockwise();
}
delay(1000); // зупиняємо вал в крайній позиції на 1 с
}
dir *= -1;
}