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 }