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

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
Fredy
Příspěvky: 2
Registrován: 04 bře 2020, 00:31
Reputation: 0

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

Příspěvek od Fredy » 04 bře 2020, 02:08

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;
}


Fredy
Příspěvky: 2
Registrován: 04 bře 2020, 00:31
Reputation: 0

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

Příspěvek od Fredy » 04 bře 2020, 14:40

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
}

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 16 hostů