Minule jsme si ukázali, jak plynule řídit otáčky krokového motoru potenciometrem oběma směry. Dnes si ukážeme, že díky knihovně AccelStepper můžeme stejně řídit i více krokových motorů naráz a nezávisle na sobě.
Proti minulému pokusu do zapojení přibyl druhý driver krokového motoru a samozřejmě i motor.
Doporučené vybavení:
- Arduino UNO, doplněné Connector shieldem
- 2x driver SMCB10 s obvodem A3982
- 2x krokový motor velikosti NEMA 17
- knihovna AccelStepper
Program bude samozřejmě fungovat i s libovolným jiným driverem, řízeným signály STEP a DIR a jakýmkoli bipolárním krokovým motorem.
Blokové schéma:

Schéma ve Fritzingu dnes nebude, protože obrázek by byl už hodně nepřehledný.
Připomeňme si, že druhý driver krokového motoru je připojen na piny D4 (STEP) a D5 (DIR) Arduina a druhý potenciometr na analogový vstup A4.
S výhodou je možno pro řízení obou motorů použít miniaturní analogový joystick, podobný tomuto.
Program:
/*
TwoStepperPotControlBidir.ino
Nezávislé obousměrné řízení rychlosti otáčení dvou krokových motorů.
Rychlost otáčení je nastavována potenciometry
JeDe robot s.r.o., říjen 2019
www.edurobot.cz
www.robodoupe.cz
*/
#include <AccelStepper.h>
// Knihovna AccelStepper
AccelStepper stepper1(AccelStepper::DRIVER, 2, 3);
AccelStepper stepper2(AccelStepper::DRIVER, 4, 5);
// Nastavení druhu řídícího rozhraní
// a přiřazení pracovních pinů STEP (2, 4) a DIR (3, 5)
// Viz příručka knihovny AccelStepper
// Přiřazení pinů
#define SPEED_PIN_1 5
// Potenciometr_1 je připojen na vstup A5
#define SPEED_PIN_2 4
// Potenciometr_2 je připojen na vstup A4
//Definice konstant
#define S1_MAX_SPEED 1500
#define S1_MIN_SPEED 0
#define S2_MAX_SPEED 1500
#define S2_MIN_SPEED 0
// Nastavení maxima a minima rychlosti otáčení motoru v krocích za sekundu
// Definice proměnných
float current_speed_S1 = 0.0;
float current_speed_S2 = 0.0;
// Okamžité rychlosti otáčení motoru v krocích za sekundu
int analog_1 = 512;
// Okamžitá hodnota napětí na analogovém vstup A5
int analog_2 = 512;
// Okamžitá hodnota napětí na analogovém vstup A4
// určuje rychlost otáčení motoru.
// ZAČÁTEK PROGRAMU
void setup()
{
// Knihovně AccelStepper se předá maximální rychlost otáčení motorů
stepper1.setMaxSpeed(S1_MAX_SPEED);
stepper2.setMaxSpeed(S2_MAX_SPEED);
}
void loop()
{
// první motor
analog_1 = analogRead(SPEED_PIN_1);
// Přečteme hodnotu z pinu A5 (0 až 1023)
if (analog_1 < 460)
// Je-li přečtená hodnota menší než 460...
{
current_speed_S1 = map(analog_1, 0, 460, S1_MAX_SPEED, S1_MIN_SPEED);
// ... změníme ji z rozsahu 0 až 460 na rozsah
// daný konstantami MAX_SPEED a MIN_SPEED
}
else if (analog_1 > 563)
// Je-li přečtená hodnota větší než 563...
{
current_speed_S1 = (map(analog_1, 563, 1023, S1_MIN_SPEED, S1_MAX_SPEED))* -1;
// ... změníme ji z rozsahu 563 až 1023 na rozsah
// daný konstantami MIN_SPEED a MAX_SPEED
// Vynásobením konstantou -1 se hodnota proměnné current_speed_S1
// stane zápornou a směr otáčení motoru se změní
}
else
// je-li přečtená hodnota mimo výše uvedené rozsahy...
{
current_speed_S1=0;
// ... motor zastavíme
}
stepper1.setSpeed(current_speed_S1);
// Nastavíme novou rychlost otáčení...
stepper1.runSpeed();
// ... a předáme driveru
// Druhý motor
analog_2 = analogRead(SPEED_PIN_2);
// Přečteme hodnotu z pinu A4 (0 až 1023)
if (analog_2 < 460)
// Je-li přečtená hodnota menší než 460...
{
current_speed_S2 = map(analog_2, 0, 460, S2_MAX_SPEED, S2_MIN_SPEED);
// ... změníme ji z rozsahu 0 až 460 na rozsah
// daný konstantami MAX_SPEED a MIN_SPEED
}
else if (analog_2 > 563)
// Je-li přečtená hodnota větší než 563...
{
current_speed_S2 = (map(analog_2, 563, 1023, S2_MIN_SPEED, S2_MAX_SPEED))* -1;
// ... změníme ji z rozsahu 563 až 1023 na rozsah
// daný konstantami MIN_SPEED a MAX_SPEED
// Vynásobením konstantou -1 se hodnota proměnné current_speed_S2
// stane zápornou a směr otáčení motoru se změní
}
else
// je-li přečtená hodnota mimo výše uvedené rozsahy...
{
current_speed_S2=0;
// ... motor zastavíme
}
stepper2.setSpeed(current_speed_S2);
// Nastavíme novou rychlost otáčení...
stepper2.runSpeed();
// ... a předáme driveru
}

