Stránka 1 z 1

Pomoc s ovládáním dvou krokových motorů

Napsal: 04 bře 2020, 02:08
od Fredy
Dobrý den, potřeboval bych poradit s ovládáním dvou krokových motorů.......
Moje vize je taková, že bych chtěl jedním Arduinem Nano ovládat dva krokové motory 28BYJ-48
s příslušnými ovladači a to buď dvěma potenciometry na řízení rychlosti otáček a k tomu dvě tlačítka na změnu směru otáčení
a nebo pouze dvěma potenciometry s tím že by polovina dráhy každého potenciometru ovládala
rychlost otáček na jednu stranu a druhá polovina dráhy potenciometru rychlost otáček na druhou
stranu, na internetu jsem našel ovládání které popisuji jako první možnost, ale bohužel je vytvořeno
pouze pro jeden krokový motor a já neumím udělat to aby se stejným způsobem ovládali dva
krokové motory.....Našel by se tu někdo ochotný mi s tím pomoci? Pořídil jsem si astronomický
dalekohled a chtěl bych ho tímto způsobem ovládat ve dvou osách aby bylo možné potenciometry
řídit rychlost natáčení dalekohledu a tlačítky směr, což je nutné k tomu aby byl dalekohled schopen zůstat stále
"namířen" na jeden bod na obloze a svým pomalým natáčením kompenzoval zemskou rotaci.....
Přikládám kód do Arduina který se mi podařilo vypátrat a který mi perfektně vyhovuje, bohužel
je však jen pro jeden motor.......
Přeji pěkný den všem a bastlení zdar ;)




/*
* Unipolar stepper motor speed and direction control with Arduino.
* Full step control.
* This is a free software with NO WARRANTY.
* https://simple-circuit.com/
*/

//Odkaz na návod:
// https://simple-circuit.com/arduino-unip ... r-control/

//Popis zapojení ovladače krokového motoru:
// IN1 k Arduino pin 11
// IN2 k Arduino pin 10
// IN3 k Arduino pin 9
// IN4 k Arduino pin 8
//Potenciometr 10k ohm se používá k řízení rychlosti krokového motoru,
// jeho výstupní pin je připojen k analogovému pinu 0 Arduino.
//Tlačítko, které je spojeno s Arduino pinem 4, se používá ke změně směru otáčení krokového motoru.
//Krokovým motorem, který jsem použil v tomto projektu, je 28BYJ-48 ,
// tento motor je vybaven redukcí rychlosti 1/64. Vnitřní motor má 32 kroků na jednu otáčku,
// což znamená, že vnější hřídel má 2048 kroků na jednu otáčku (64 x 32).
// Počet kroků je definován v kódu, jak je uvedeno níže....
//Použití funkce stepper.step (direction_) krokového motoru se pohybuje v závislosti
// na proměnné direction_ , v tomto případě je tato proměnná může být 1 nebo -1.
// Pokud směr_ = 1, motor se bude pohybovat v prvním směru a pokud směr_ = -1,
// motor se bude pohybovat v opačném směru.
// Při každém stisknutí tlačítka bude proměnný směr_ převrácen (1 nebo -1).


// PROGRAM:

// include Arduino stepper motor library
#include <Stepper.h>

// change this to the number of steps on your motor
#define STEPS 32

// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper(STEPS, 8, 10, 9, 11);

const int button = 4; // direction control button is connected to Arduino pin 4
const int pot = A0; // speed control potentiometer is connected to analog pin 0

void setup()
{
// configure button pin as input with internal pull up enabled
pinMode(button, INPUT_PULLUP);
}

int direction_ = 1, speed_ = 0;

void loop()
{
if ( digitalRead(button) == 0 ) // if button is pressed
if ( debounce() ) // debounce button signal
{
direction_ *= -1; // reverse direction variable
while ( debounce() ) ; // wait for button release
}

// read analog value from the potentiometer
int val = analogRead(pot);

// map digital value from [0, 1023] to [2, 500]
// ===> min speed = 2 and max speed = 500 rpm
if ( speed_ != map(val, 0, 1023, 2, 500) )
{ // if the speed was changed
speed_ = map(val, 0, 1023, 2, 500);
// set the speed of the motor
stepper.setSpeed(speed_);
}

// move the stepper motor
stepper.step(direction_);

}

// a small function for button debounce
bool debounce()
{
byte count = 0;
for(byte i = 0; i < 5; i++) {
if (digitalRead(button) == 0)
count++;
delay(10);
}
if(count > 2) return 1;
else return 0;
}

Re: Pomoc s ovládáním dvou krokových motorů

Napsal: 04 bře 2020, 10:49
od jede_robot

Re: Pomoc s ovládáním dvou krokových motorů

Napsal: 04 bře 2020, 14:40
od Fredy
Velice děkuji, je to přesně to co jsem potřeboval, stačilo malinko poupravit
a už mi to funguje tak jak jsem si představoval, ovládám dva krokové motory
nezávisle na sobě pomocí jednoho Arduino Nano, každý zvlášť jedním potenciometrem
a to jak směr, tak i rychlost, ještě jednou děkuji.
Pro případ že by někdo někdy potřeboval řešit stejný problém sem dávám kód
i s odkazy které vedli k jeho dokončení:



/*
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
http://robodoupe.cz/2019/krokohratky-s-arduinem-1/
http://robodoupe.cz/2019/krokohratky-s-arduinem-2/
http://robodoupe.cz/2019/krokohratky-s-arduinem-3/
http://robodoupe.cz/2015/accelstepper-prvni-ochutnavka/
http://robodoupe.cz/2016/knihovna-accel ... o-arduino/


*/

#include <AccelStepper.h>
// Knihovna AccelStepper

AccelStepper stepper1(4, 8, 10, 9, 11);
AccelStepper stepper2(4, 4, 6, 5, 7);
// 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_1 0
// Potenciometr_1 je připojen na vstup A0
#define SPEED_PIN_2 4
// Potenciometr_2 je připojen na vstup A4

//Definice konstant
#define S1_MAX_SPEED 500
#define S1_MIN_SPEED 0
#define S2_MAX_SPEED 500
#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 A0
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
}