// пины для управления Motor Shield #define E1 5 #define E2 6 #define H1 4 #define H2 7 // три режима управления шаговым мотором // однофазный режим #define WAVE_DRIVE 0 // двухфазный режим #define FULL_STEP 1 // полушаговый режим #define HALF_STEP 2 // задержка между переключением обмоток // определяет скорость вращения int delayTime = 10; unsigned long startTime; // функция выставляет значение на пинах void doStep(bool E1State, bool H1State, bool E2State, bool H2State) { digitalWrite(E1, E1State); digitalWrite(H1, H1State); digitalWrite(E2, E2State); digitalWrite(H2, H2State); delay(delayTime); } // определяем комбинации управляющих импульсов в зависимости от режима void rotate(byte rotateMode) { switch (rotateMode) { case WAVE_DRIVE: doStep(1, 1, 0, 0); doStep(0, 0, 1, 1); doStep(1, 0, 0, 0); doStep(0, 0, 1, 0); break; case FULL_STEP: doStep(1, 1, 1, 1); doStep(1, 0, 1, 1); doStep(1, 0, 1, 0); doStep(1, 1, 1, 0); break; case HALF_STEP: doStep(1, 1, 0, 0); doStep(1, 1, 1, 1); doStep(0, 0, 1, 1); doStep(1, 0, 1, 1); doStep(1, 0, 0, 0); doStep(1, 0, 1, 0); doStep(0, 0, 1, 0); doStep(1, 1, 1, 0); break; } } void setup() { // настраиваем ножки на выход for (int i = 4; i < 8; i++) { pinMode(i, OUTPUT); } // запоминаем текущее время startTime = millis(); } void loop() { // узнаём время прошедшее с начала работы в миллисекундах // и переводим его в секунды unsigned long loopTime = (millis() - startTime) / 1000; // меняем режим каждую секунду rotate(loopTime % 3); }