Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° AccelStepper.h β€” это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для управлСния ΡˆΠ°Π³ΠΎΠ²Ρ‹ΠΌΠΈ двигатСлями Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Π½Π° Arduino, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ»Π°Π²Π½ΠΎΠ΅ ускорСниС/Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅, Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Stepper.h, ΠΎΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ нСсколькими двигатСлями Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ основного Ρ†ΠΈΠΊΠ»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ для Ρ€ΠΎΠ±ΠΎΡ‚ΠΎΡ‚Π΅Ρ…Π½ΠΈΠΊΠΈ, 3D-ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€ΠΎΠ² ΠΈ CNC-станков.

Если Π²Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с Ρ€Ρ‹Π²ΠΊΠ°ΠΌΠΈ двигатСля ΠΏΡ€ΠΈ стартС/остановкС ΠΈΠ»ΠΈ Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚Π΅ΡΡŒ Π² слоТных траСкториях двиТСния β€” AccelStepper станСт ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎΠΌ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, A4988, DRV8825, TMC2208) ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌΡ‹ FULL_STEP, HALF_STEP, MICROSTEP. Однако Π΅Ρ‘ настройка Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ понимания ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ максимальная ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ (setMaxSpeed()) ΠΈ ускорСниС (setAcceleration()).

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ:

  • πŸ”§ АрхитСктуру Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Π΅Ρ‘ прСимущСства ΠΏΠ΅Ρ€Π΅Π΄ Π°Π½Π°Π»ΠΎΠ³Π°ΠΌΠΈ
  • πŸ“ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΊΠΎΠ΄Π° для Ρ€Π°Π·Π½Ρ‹Ρ… сцСнариСв
  • βš™οΈ Вонкости настройки ускорСния, скорости ΠΈ ΠΌΠΈΠΊΡ€ΠΎΡˆΠ°Π³ΠΎΠ²
  • ⚠️ Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки ΠΈ способы ΠΈΡ… устранСния

1. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ AccelStepper.h ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½Π° Π½ΡƒΠΆΠ½Π°?

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° AccelStepper.h Π±Ρ‹Π»Π° создана Майком ΠœΠ°ΠΊΠΊΠΎΡƒΠ½ΠΎΠΌ (Mike McCauley) ΠΊΠ°ΠΊ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ограничСния стандартной Stepper.h. Π“Π»Π°Π²Π½ΠΎΠ΅ Π΅Ρ‘ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ β€” ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ»Π°Π²Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π³ΠΎΠ½Π°/тормоТСния, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ пропуск шагов ΠΏΡ€ΠΈ Ρ€Π΅Π·ΠΊΠΈΡ… измСнСниях скорости. Π­Ρ‚ΠΎ особСнно Π²Π°ΠΆΠ½ΠΎ для:

  • πŸ€– Π ΠΎΠ±ΠΎΡ‚ΠΎΡ‚Π΅Ρ…Π½ΠΈΠΊΠΈ: Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ двиТСния манипуляторов
  • πŸ–¨οΈ 3D-ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€ΠΎΠ²: ΠΏΠ»Π°Π²Π½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ экструдСра
  • πŸ”¨ CNC-станков: минимизация Π²ΠΈΠ±Ρ€Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈ Ρ„Ρ€Π΅Π·Π΅Ρ€ΠΎΠ²ΠΊΠ΅
  • πŸŽ›οΈ Автоматизированных систСм: ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹, ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π½Ρ‹Π΅ столы

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ особСнности Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

  • πŸ”„ ΠΠ΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ: Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ управляСтся Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½Π΅ "замораТивая" loop()
  • πŸ“Š ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ускорСния: Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΈΠ»ΠΈ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ (Ρ‡Π΅Ρ€Π΅Π· setAcceleration())
  • πŸ”Œ Π“ΠΈΠ±ΠΊΠΈΠ΅ интСрфСйсы: Ρ€Π°Π±ΠΎΡ‚Π° с Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°ΠΌΠΈ Π½Π° основС STEP/DIR ΠΈΠ»ΠΈ прямым ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ°Ρ‚ΡƒΡˆΠΊΠ°ΠΌΠΈ
  • πŸ”’ ΠœΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ: Π΄ΠΎ 10 Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ (ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ памяти)

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ сСрвоприводы β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡˆΠ°Π³ΠΎΠ²Ρ‹Π΅ Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΠΈ. Для сСрво ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Servo.h ΠΈΠ»ΠΈ ESP32Servo.h.
πŸ“Š Для ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ AccelStepper?
  • 3D-ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€
  • CNC-станок
  • Π ΠΎΠ±ΠΎΡ‚
  • Π”ΠΎΠΌΠ°ΡˆΠ½ΡΡ автоматизация
  • Π”Ρ€ΡƒΠ³ΠΎΠΉ

2. Установка ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ AccelStepper.h ΠΌΠΎΠΆΠ½ΠΎ трСмя способами:

  1. Π§Π΅Ρ€Π΅Π· Arduino IDE:
    1. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π‘ΠΊΠ΅Ρ‚Ρ‡ β†’ ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ β†’ Π£ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ
    2. Π’ поискС Π²Π²Π΅Π΄ΠΈΡ‚Π΅ AccelStepper
    3. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π²Π΅Ρ€ΡΠΈΡŽ ΠΎΡ‚ Mike McCauley ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ
  2. Π’Ρ€ΡƒΡ‡Π½ΡƒΡŽ:
    1. Π‘ΠΊΠ°Ρ‡Π°ΠΉΡ‚Π΅ ZIP-Π°Ρ€Ρ…ΠΈΠ² с GitHub
    2. РаспакуйтС Π² ΠΏΠ°ΠΏΠΊΡƒ ~/Documents/Arduino/libraries/ (Windows/Linux) ΠΈΠ»ΠΈ /Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹/Arduino/libraries/ (macOS)
    3. ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚Π΅ Arduino IDE
  3. Π§Π΅Ρ€Π΅Π· PlatformIO:
    lib_deps =
    

    adafruit/AccelStepper @ ^1.61

ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ работоспособности:

#include <AccelStepper.h>

// ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΏΠΈΠ½Ρ‹ для STEP ΠΈ DIR

#define STEP_PIN 2

#define DIR_PIN 3

// Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ двигатСля (интСрфСйс DRIVER для A4988/DRV8825)

AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {

stepper.setMaxSpeed(1000); // Макс. ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, шаг/сСк

stepper.setAcceleration(500); // УскорСниС, шаг/сСк²

}

void loop() {

stepper.moveTo(200); // ЦСлСвая позиция

stepper.run(); // ВыполняСм Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅

}

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Если Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ вращаСтся, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅:
  • ΠŸΠΎΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ DIR (помСняйтС мСстами ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π°, Ссли Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅)
  • Π£Ρ€ΠΎΠ²Π½ΠΈ напряТСния Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, DRV8825 Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ настройки VREF)
  • Π”ΠΎΡΡ‚Π°Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ источника питания (ΡˆΠ°Π³ΠΎΠ²Ρ‹Π΅ Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡŽΡ‚ Π΄ΠΎ 2А Π½Π° Ρ„Π°Π·Ρƒ)

3. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ настройки

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° прСдоставляСт Π±ΠΎΠ»Π΅Π΅ 30 ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½ΠΎ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π·Π°Π΄Π°Ρ‡ достаточно 5–7 ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ…. Рассмотрим ΠΈΡ… с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ:

Ѐункция ОписаниС ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
setMaxSpeed() УстанавливаСт ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ (шаг/сСк). ΠŸΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ значСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ пропуску шагов. stepper.setMaxSpeed(2000);
setAcceleration() Π—Π°Π΄Π°Ρ‘Ρ‚ ускорСниС (шаг/сСк²). ВлияСт Π½Π° ΠΏΠ»Π°Π²Π½ΠΎΡΡ‚ΡŒ старта/остановки. stepper.setAcceleration(1000);
moveTo() УстанавливаСт Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΡƒΡŽ Ρ†Π΅Π»Π΅Π²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ (ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нуля). stepper.moveTo(500);
move() УстанавливаСт ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ (ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ). stepper.move(-100); // На 100 шагов Π½Π°Π·Π°Π΄
run() ВыполняСт ΠΎΠ΄ΠΈΠ½ шаг двиТСния (Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² loop()). stepper.run();

Для слоТных Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ сдСлал 3 ΠΎΠ±ΠΎΡ€ΠΎΡ‚Π° Π²ΠΏΠ΅Ρ€Π΅Π΄ ΠΈ 2 Π½Π°Π·Π°Π΄ с ускорСниСм:

stepper.moveTo(600);  // 3 ΠΎΠ±ΠΎΡ€ΠΎΡ‚Π° (200 шагов/ΠΎΠ±ΠΎΡ€ΠΎΡ‚)

while (stepper.distanceToGo() != 0) {

stepper.run();

}

stepper.moveTo(-400); // 2 ΠΎΠ±ΠΎΡ€ΠΎΡ‚Π° Π½Π°Π·Π°Π΄

while (stepper.distanceToGo() != 0) {

stepper.run();

}

πŸ’‘

Для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ stepper.currentPosition() β€” ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ двигатСля Π² ΡˆΠ°Π³Π°Ρ…, Π΄Π°ΠΆΠ΅ Ссли Ρ†Π΅Π»ΡŒ Π½Π΅ достигнута.

4. Π Π΅ΠΆΠΈΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ интСрфСйсы ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ 4 Ρ‚ΠΈΠΏΠ° интСрфСйсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° AccelStepper:

  • πŸ”Œ AccelStepper::DRIVER β€” для Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² с Π²Ρ…ΠΎΠ΄Π°ΠΌΠΈ STEP/DIR (A4988, DRV8825, TMC2208). Π‘Π°ΠΌΡ‹ΠΉ распространённый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.
  • πŸ”„ AccelStepper::FULL2WIRE β€” для биполярных Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»Π΅ΠΉ с 2 ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π°ΠΌΠΈ Π½Π° ΠΊΠ°Ρ‚ΡƒΡˆΠΊΡƒ (Ρ€Π΅ΠΆΠΈΠΌΡ‹ FULL_STEP ΠΈΠ»ΠΈ HALF_STEP).
  • πŸ”„ AccelStepper::FULL3WIRE β€” для униполярных Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»Π΅ΠΉ с 3 ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π°ΠΌΠΈ (ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚).
  • πŸ”„ AccelStepper::FULL4WIRE β€” для биполярных Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»Π΅ΠΉ с 4 ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π°ΠΌΠΈ (ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для Ρ€Π°Π·Π½Ρ‹Ρ… интСрфСйсов:

// 1. Для DRV8825 (интСрфСйс DRIVER)

AccelStepper stepper1(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

// 2. Для биполярного двигатСля с 4 ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π°ΠΌΠΈ (FULL4WIRE)

AccelStepper stepper2(AccelStepper::FULL4WIRE, IN1_PIN, IN2_PIN, IN3_PIN, IN4_PIN);

// 3. Для униполярного двигатСля (FULL3WIRE)

AccelStepper stepper3(AccelStepper::FULL3WIRE, IN1_PIN, IN2_PIN, IN3_PIN, IN4_PIN);

Для Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² FULL4WIRE ΠΈ FULL2WIRE ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ ΠΌΠΈΠΊΡ€ΠΎΡˆΠ°Π³Π° Ρ‡Π΅Ρ€Π΅Π· setPinsInverted():

stepper.setPinsInverted(false, false, true); // Π˜Π½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ 3-ΠΉ ΠΏΠΈΠ½
Как Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ интСрфСйс?

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ соврСмСнный Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ (A4988, DRV8825, TMC2208), всСгда Π²Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ AccelStepper::DRIVER. Для прямого управлСния ΠΊΠ°Ρ‚ΡƒΡˆΠΊΠ°ΠΌΠΈ (Π±Π΅Π· Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ FULL4WIRE ΠΈΠ»ΠΈ FULL2WIRE, Π½ΠΎ ΡƒΡ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²Π½Π΅ΡˆΠ½ΠΈΡ… транзисторов для управлСния Ρ‚ΠΎΠΊΠΎΠΌ.

5. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ устранСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ

ЧастыС ошибки ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с AccelStepper.h ΠΈ способы ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

  • πŸ”₯ Π”Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ пСрСгрСваСтся:
    • Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ Ρ‚ΠΎΠΊ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° (настройка VREF Π½Π° DRV8825)
    • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ€Π°Π΄ΠΈΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ»ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΎΡ…Π»Π°ΠΆΠ΄Π΅Π½ΠΈΠ΅
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π»ΠΈ Π²Π°Π» мСханичСски
  • 🐒 Π”Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ двиТСтся Ρ€Ρ‹Π²ΠΊΠ°ΠΌΠΈ:
    • Π£Π²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ ускорСниС (setAcceleration())
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅: ΡˆΠ°Π³ΠΎΠ²Ρ‹Π΅ Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΠΈ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΊ просадкам напряТСния
    • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ кондСнсаторы 100–470 ΠΌΠΊΠ€ рядом с Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠΌ
  • πŸ”„ Π”Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ вращаСтся Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ сторону:
    • ΠŸΠΎΠΌΠ΅Π½ΡΠΉΡ‚Π΅ мСстами ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π° DIR ΠΈΠ»ΠΈ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ сигнал: stepper.setPinsInverted(true, false, false);
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΠΎΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΠΌΠΎΡ‚ΠΎΠΊ (для FULL4WIRE)

Для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:

  • πŸ”§ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹: Π—Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ stepper.run() Π½Π° stepper.runSpeedToPosition() для Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ контроля.
  • ⚑ ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ loop(): Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ тяТСлых вычислСний Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° управлСния Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»Π΅ΠΌ.
  • πŸ“‘ Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ: Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ delay(), Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π° millis() для Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ STEP/DIR ΠΊ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρƒ|НастроСн VREF Π½Π° Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π΅|ΠŸΠΈΡ‚Π°Π½ΠΈΠ΅ двигатСля ΠΎΡ‚Π΄Π΅Π»Π΅Π½ΠΎ ΠΎΡ‚ Π»ΠΎΠ³ΠΈΠΊΠΈ Arduino|ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π° ΠΏΠΎΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΠΌΠΎΡ‚ΠΎΠΊ|УстановлСны кондСнсаторы Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°

-->

6. ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ: ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ синхронизация

Одним ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… прСимущСств AccelStepper.h являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ управлСния нСсколькими двигатСлями ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Для этого:

  1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² AccelStepper:
    AccelStepper steppers[] = {
    

    AccelStepper(AccelStepper::DRIVER, STEP1, DIR1),

    AccelStepper(AccelStepper::DRIVER, STEP2, DIR2)

    };

  2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ MultiStepper для синхронизации:
    #include <MultiStepper.h>
    

    MultiStepper multi;

    void setup() {

    multi.addStepper(steppers[0]);

    multi.addStepper(steppers[1]);

    long positions[2] = {100, -100}; // ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ двигатСля

    multi.moveTo(positions);

    }

    void loop() {

    multi.run(); // УправляСт всСми двигатСлями ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ

    }

Для слоТных Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€ΠΎΠ±ΠΎΡ‚Π°-Π‘ΠΊΠΎΡ€ΠΏΠΈΠΎΠ½Π°) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΈΠ½Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ модСль:

  • πŸ“ ΠŸΡ€ΡΠΌΠ°Ρ ΠΊΠΈΠ½Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ°: РассчитываСт ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ инструмСнта ΠΏΠΎ ΡƒΠ³Π»Π°ΠΌ сСрвоприводов.
  • πŸ”„ ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ ΠΊΠΈΠ½Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ°: ВычисляСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ шаги Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»Π΅ΠΉ для достиТСния Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ.

πŸ’‘

Для синхронного двиТСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… осСй всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ MultiStepper β€” это Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΠΈ достигнут Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π±Π΅Π· рассинхронизации.

7. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² с AccelStepper.h

Рассмотрим 3 практичСских ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ схСмами ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1: Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π½ΠΎΠΉ Π»Π΅Π½Ρ‚ΠΎΠΉ

Π—Π°Π΄Π°Ρ‡Π°: Π»Π΅Π½Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ Π²ΠΏΠ΅Ρ€Π΅Π΄ со ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ 500 шаг/сСк, ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ сигналу ΠΎΡ‚ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° (IR-сСнсора).

#include <AccelStepper.h>

#define STEP_PIN 2

#define DIR_PIN 3

#define SENSOR_PIN 4

AccelStepper conveyor(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {

pinMode(SENSOR_PIN, INPUT_PULLUP);

conveyor.setMaxSpeed(500);

conveyor.setAcceleration(200);

conveyor.moveTo(10000); // Π”Π»ΠΈΠ½Π½ΠΎΠ΅ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅

}

void loop() {

if (digitalRead(SENSOR_PIN) == LOW) {

conveyor.stop(); // ЭкстрСнная остановка

}

conveyor.run();

}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: 3D-ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€ (ось X)

Π—Π°Π΄Π°Ρ‡Π°: ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ экструдСра Π½Π° 50 ΠΌΠΌ с ускорСниСм 1000 шаг/сСк² (шаг рСмня 1.8Β° с ΠΌΠΈΠΊΡ€ΠΎΡˆΠ°Π³ΠΎΠΌ 1/16).

#include <AccelStepper.h>

#define STEPS_PER_MM 80 // Π¨Π°Π³ΠΎΠ² Π½Π° ΠΌΠΌ (зависит ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠΈ)

#define DISTANCE 50 // РасстояниС Π² ΠΌΠΌ

AccelStepper xAxis(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {

xAxis.setMaxSpeed(200 * STEPS_PER_MM); // 200 мм/сСк

xAxis.setAcceleration(1000 * STEPS_PER_MM);

xAxis.move(DISTANCE * STEPS_PER_MM);

}

void loop() {

xAxis.run();

}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3: ΠŸΠΎΠ²ΠΎΡ€ΠΎΡ‚Π½Ρ‹ΠΉ стол для Ρ„ΠΎΡ‚ΠΎΡΡŠΡ‘ΠΌΠΊΠΈ

Π—Π°Π΄Π°Ρ‡Π°: ΠΏΠ»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ Π½Π° 360Β° Π·Π° 60 сСкунд с фиксациСй ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ.

#include <AccelStepper.h>

#define STEPS_PER_DEGREE 1600 / 360 // Для двигатСля 1.8Β° с 1/16 ΠΌΠΈΠΊΡ€ΠΎΡˆΠ°Π³ΠΎΠΌ

AccelStepper turntable(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {

turntable.setMaxSpeed(10 * STEPS_PER_DEGREE); // 10°/сСк

turntable.setAcceleration(5 * STEPS_PER_DEGREE);

turntable.move(360 * STEPS_PER_DEGREE); // ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΎΠ±ΠΎΡ€ΠΎΡ‚

}

void loop() {

static bool isMoving = true;

if (isMoving && turntable.distanceToGo() == 0) {

isMoving = false;

delay(2000); // ΠŸΠ°ΡƒΠ·Π° для ΡΡŠΡ‘ΠΌΠΊΠΈ

turntable.move(-360 * STEPS_PER_DEGREE); // ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±ΠΎΡ€ΠΎΡ‚

isMoving = true;

}

turntable.run();

}

Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы (FAQ)

❓ Как Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство шагов Π½Π° ΠΌΠΈΠ»Π»ΠΈΠΌΠ΅Ρ‚Ρ€ для ΠΌΠΎΠ΅Π³ΠΎ 3D-ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€Π°?

Π€ΠΎΡ€ΠΌΡƒΠ»Π°:

шаги_Π½Π°_ΠΌΠΌ = (шаги_Π½Π°_ΠΎΠ±ΠΎΡ€ΠΎΡ‚_двигатСля * ΠΌΠΈΠΊΡ€ΠΎΡˆΠ°Π³) / (шаг_рСмня_ΠΌΠΌ * количСство_Π·ΡƒΠ±ΡŒΠ΅Π²_ΡˆΠ΅ΡΡ‚Π΅Ρ€Π½ΠΈ)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ для GT2-рСмня (шаг 2 ΠΌΠΌ, 20 Π·ΡƒΠ±ΡŒΠ΅Π² Π½Π° ΡˆΠ΅ΡΡ‚Π΅Ρ€Π½Π΅) ΠΈ двигатСля NEMA17 (200 шагов/ΠΎΠ±ΠΎΡ€ΠΎΡ‚, 1/16 ΠΌΠΈΠΊΡ€ΠΎΡˆΠ°Π³):

(200 * 16) / (2 * 20) = 80 шаг/мм
❓ ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ пропускаСт шаги ΠΏΡ€ΠΈ высокой скорости?

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

  • πŸ”Œ НСдостаточноС ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ источник с Ρ‚ΠΎΠΊΠΎΠΌ β‰₯2А Π½Π° Ρ„Π°Π·Ρƒ.
  • ⚑ Блишком высокоС ускорСниС: Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ setAcceleration() Π² 2–3 Ρ€Π°Π·Π°.
  • πŸ”§ ΠœΠ΅Ρ…Π°Π½ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ сопротивлСниС: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ смазку Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΈ ΡΠΎΠΎΡΠ½ΠΎΡΡ‚ΡŒ Π²Π°Π»ΠΎΠ².
  • πŸ“‘ ЭлСктричСскиС ΠΏΠΎΠΌΠ΅Ρ…ΠΈ: Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ кондСнсаторы 100 Π½Π€ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±ΠΌΠΎΡ‚ΠΊΠ°ΠΌ двигатСля.
❓ МоТно Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ AccelStepper.h Π½Π° ESP32?

Π”Π°, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° совмСстима с ESP32, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚:

  1. Установки Ρ‡Π΅Ρ€Π΅Π· PlatformIO ΠΈΠ»ΠΈ Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ (Π² Arduino IDE для ESP32 ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ).
  2. Использования Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ² для Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ управлСния шагами (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, hw_timer_t).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° для ESP32:

#include <AccelStepper.h>

AccelStepper stepper(AccelStepper::DRIVER, 25, 26); // GPIO25=STEP, GPIO26=DIR

void IRAM_ATTR onTimer() {

stepper.run();

}

void setup() {

hw_timer_t *timer = timerBegin(0, 80, true); // Π’Π°ΠΉΠΌΠ΅Ρ€ 0, ΠΏΡ€Π΅Π΄Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ 80

timerAttachInterrupt(timer, &onTimer, true);

timerAlarmWrite(timer, 1000, true); // 1 мс

timerAlarmEnable(timer);

}

❓ Как Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ»Π°Π²Π½ΠΎΠ΅ Ρ‚ΠΎΡ€ΠΌΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄ остановкой?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ setAcceleration() ΠΈ stop() с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ:

stepper.setAcceleration(500); // Π—Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅

stepper.moveTo(stepper.currentPosition() + 50); // ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ для тормоТСния

while (stepper.isRunning()) {

stepper.run();

}

stepper.stop(); // Полная остановка

Для Ρ‚ΠΎΡ‡Π½ΠΎΠΉ остановки Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ runToPosition():

stepper.runToPosition(); // Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ достиТСния Ρ†Π΅Π»ΠΈ
❓ Π“Π΄Π΅ Π½Π°ΠΉΡ‚ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹?

ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ рСсурсы:

Для русскоязычных ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹: