Krokohrátky s Arduinem 3

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í:

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
}