Minule jsme si ukázali, jak plynule řídit otáčky krokového motoru potenciometrem. Dnes program vylepšíme o obousměrné řízení s nulou (tedy zastaveným motorem) uprostřed dráhy potenciometru.
Proti minulému pokusu se v zapojení nic nezměnilo, ale pro pořádek si ho zopakujme:
Doporučené vybavení:
- Arduino UNO, doplněné Connector shieldem
- driver SMCB10 s obvodem A3982
- 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:
Pokud nemá váš driver k dispozici výstup pro napájení externích zařízení s napětím 5 V, je nutno zjistit samostatné napájení Arduina napětím velikosti 7 až 12 V nebo ho trvale napájet z USB portu.
Názorný obrázek zapojení:
Program:
/* StepperPotControlBidir.ino Obousměrné řízení rychlosti otáčení krokového motoru potenciometrem Driver STEP / DIR (SMCB10), motor MEMA 17 generic JeDe robot s.r.o., říjen 2019 www.edurobot.cz www.robodoupe.cz */ #include <AccelStepper.h> // Knihovna AccelStepper AccelStepper stepper1(AccelStepper::DRIVER, 2, 3); // STEP (2), DIR (3) // Nastavení druhu řídícího rozhraní a přiřazení pracovních pinů // Viz příručka knihovny AccelStepper // přiřazení pinů #define SPEED_PIN 5 // Potenciometr (1-10k) je připojen na vstup A5 // konstanty #define MAX_SPEED 2000 #define MIN_SPEED 0 // Nastavení maxima a minima rychlosti otáčení motoru v krocích za sekundu // proměnné float current_speed = 0.0; // Okamžitá rychlost otáčení motoru v krocích za sekundu int analog_value = 0; // Okamžitá hodnota napětí na analogovém vstup A5 // určuje rychlost otáčení motoru. // ZAČÁTEK PROGRAMU void setup() { // Knihovně AccelStepper se předá maximální rychlost otáčení motoru stepper1.setMaxSpeed(MAX_SPEED); } void loop() { analog_value = analogRead(SPEED_PIN); // Přečteme hodnotu z pinu A5 (0 to 1023) if (analog_value < 460) // Je-li přečtená hodnota menší než 460... { current_speed = map(analog_value, 0, 460, MAX_SPEED, MIN_SPEED); // ... změníme ji z rozsahu 0 až 460 na rozsah // daný konstantami MAX_SPEED a MIN_SPEED } else if (analog_value > 563) // Je-li přečtená hodnota větší než 563... { current_speed = (map(analog_value, 563, 1023, MIN_SPEED, 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 current_speed 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=0; // ... motor zastavíme } stepper1.setSpeed(current_speed); // Nastavíme novou rychlost otáčení... stepper1.runSpeed(); // ... a předáme driveru }