Krokohrátky s Arduinem 2

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

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
}