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
}

