Accel Stepper - krokac - rada

JOhny56
Příspěvky: 3
Registrován: 29 říj 2020, 14:47

Accel Stepper - krokac - rada

Příspěvek od JOhny56 » 30 říj 2020, 08:37

zdravím,
chtěl bych vytvořit program, při kterém krokáč akceleruje a dekceleruje po tom jak sepnu tlačítko (switch button) + jeho rychlost bude možné ovladát potenciometrem. Podařilo se mi udělat aby akceleroval a deakceleroval i regulovat rychlost pomocí potenciometru, ale nedaří se mi to rozchodit v jednom programu :D použím driver Dma 860h a Nema 23
Mohly by mi někdo pomoct, už si stím nevím rady ....
díky !

Kód: Vybrat vše

/*
 
*/
 int startTl = 2;
int led = 3;
int StartBt;
int RychlostBt;
int Position;
int speedS;
 
 
#include <AccelStepper.h>
// Knihovna AccelStepper
 
AccelStepper stepper1(AccelStepper::DRIVER, 7, 6);
// STEP (7), DIR (6)
 
// přiřazení pinů
#define  SPEED_PIN 0
// Potentiometr (1-10k) A0
 
// konstanty
#define  MAX_SPEED 4000
#define  MIN_SPEED 0
 
 
// proměnné
float current_speed = 0.0;       
int analog_value = 0;           
 
 
// start prg
void setup()
{
 
    pinMode(3, OUTPUT);
 
  stepper1.setMaxSpeed(MAX_SPEED);
  stepper1.setAcceleration(100);
}
 
void loop()
{
   StartBt = digitalRead(startTl);
      if  (StartBt == HIGH ) {
 
  analog_value = analogRead(SPEED_PIN);
   // read value of potenitometr (0 až 1023)…
 
  current_speed = (((analog_value/1023.0) * (MAX_SPEED - MIN_SPEED)) + MIN_SPEED);
  // convert to stepper speed
 
  stepper1.setSpeed(current_speed);
  // set rotation speed
 
  stepper1.runSpeed();
  // add to driver
 }
 
 else if (StartBt == LOW ) { //deceleration!!!
     stepper1.run();
       digitalWrite(3,HIGH);
 
 }
 
 
 
 
 
 
}

Uživatelský avatar
jrt
Příspěvky: 1752
Registrován: 17 úno 2013, 17:13

Re: Accel Stepper - krokac - rada

Příspěvek od jrt » 30 říj 2020, 16:39

Zkusím pomoct, ale nebude to hned.
jrt
jederobot.cz, hobbyrobot.cz, profirobot.cz
edurobot.cz, robodoupe.cz

DavidO
Příspěvky: 959
Registrován: 01 kvě 2013, 21:27

Re: Accel Stepper - krokac - rada

Příspěvek od DavidO » 01 lis 2020, 09:59

Jak se to má chovat? Potenciometrem nastavím zrychlení, a pak se motor tímhle zrychlením na zmáčknutí tlačítka rozjede a dalším zmáčknutím zastaví? Anebo se má zrychlení regulovat počas rozjíždění / zastavování? Anebo se potenciometrem nastavuje cílová rychlost a když s ním zatočím a motor přitom jede, tak mění rychlost (a to vždycky se stejným zrychlením)?

JOhny56
Příspěvky: 3
Registrován: 29 říj 2020, 14:47

Re: Accel Stepper - krokac - rada

Příspěvek od JOhny56 » 02 lis 2020, 08:31

no ideálně se na potenciometru nastaví nějaká výchozí hodnota rychlosti, po zmáčknutí SWITCH tlačítka (zůstane na hodnotě 1) se motor postupně zvolna ( právě s určitou akcelerací) rozjede na definovanou rychlost potenciometrem. Rychlost se pak dále může regulovat potenciometrem (idedálně aby ji motor dosáhl vždy pozvolna zase, ale to není uplně podmínkou). Po sepnutí SWITCH tlačítka do polohy 0 motor postupně zpomalý, až do úplného zastavení.
Doufám, že to bude stačit takto....
díky za rady

DavidO
Příspěvky: 959
Registrován: 01 kvě 2013, 21:27

Re: Accel Stepper - krokac - rada

Příspěvek od DavidO » 02 lis 2020, 12:05

Pak by mohlo stačit do místa, kde se má brzdit, přidat stepper1.stop();, aby se nastavilo, že chceš zastavit:

Kód: Vybrat vše

  else if (StartBt == LOW ) { //deceleration!!!
     stepper1.stop();
     stepper1.run();
     digitalWrite(3,HIGH);
  }
(píšu to od stolu, tak to ber "baj voko". A ještě detail, ta LED se ti rozsvítí, jakmile má poprvé zastavit, a pak zůstane navěky rozsvícená - tak jsi to chtěl?)

DavidO
Příspěvky: 959
Registrován: 01 kvě 2013, 21:27

Re: Accel Stepper - krokac - rada

Příspěvek od DavidO » 02 lis 2020, 12:38

Jo a tady jsem ti to trochu učesal (zase - od stolu takže s rezervou):

Kód: Vybrat vše

/*
    Točení krokovým motorem rychlostí danou potenciometrem. 
    Motor se točí, jen když je spínač v poloze podle konstanty SPINAC_JEDEME.
*/

// definice pinů pro připojení spínače, LED, motoru, potenciometru
const int spinac_PIN = 2;  // spínač připojit mezi pin a zem!!
const int led_PIN = 3;
const int stepper1_STEP_PIN = 7;
const int stepper1_DIR_PIN = 6;
const int SPEED_PIN = A0;

// konstanty 
const int MAX_SPEED = 4000;  // rychlost motoru v krocích za sekundu
const int MIN_SPEED = 0;
const int ZRYCHLENI = 100;  // zrychlení v krocích za sekundu na druhou

const bool SPINAC_JEDEME = HIGH;  // stav spínače, když motor má jet (HIGH nebo LOW)

#include <AccelStepper.h>
AccelStepper stepper1(AccelStepper::DRIVER, stepper1_STEP_PIN, stepper1_DIR_PIN);
 
void setup()
{
  pinMode(led_PIN, OUTPUT);
  pinMode(spinac_PIN, INPUT_PULLUP);
 
  stepper1.setMaxSpeed(MAX_SPEED);
  stepper1.setAcceleration(ZRYCHLENI);
}
 
void loop()
{
  int potenciometer;  // aktuální poloha potenciometru
  float aktualniRychlost;  // spočítaná aktuální rychlost
  bool spinac = digitalRead(spinac_PIN);  // stav spínače (rovnou ho přečteme)
  
  digitalWrite(led_PIN,spinac==SPINAC_JEDEME);  // LED bude svítit, když motor má jet a nesvítit, když nemá jet
  if(spinac == SPINAC_JEDEME) {  // spínač je v poloze "jedeme" - motor má jet
    potenciometer = analogRead(SPEED_PIN);  // přečíst polohu potenciometru (0 až 1023)
    aktualniRychlost = ((potenciometer/1023.0) * (MAX_SPEED - MIN_SPEED)) + MIN_SPEED;  // přepočítat pro Accel Stepper
    stepper1.setSpeed(aktualniRychlost);  // nastavit rychlost motoru
    stepper1.runSpeed();  // nechat motor točit
  }
  else {  // spínač není v poloze "jedeme" - motor má zastavit
    stepper1.stop();  // nastavit, že chci zastavit (spočítá se pozice, aby to odpovídalo zpomalení)
    stepper1.run();  // nechat motor jet na nastavenou pozici (tj. v našem případě zastavit se zvoleným zpomalením)
  }
}
Nevím, jak máš zapojený ten spínač, tak jsem to udělal tak, jak se to obvykle dělá - mezi pin a zem, a pin se nastaví s interním pull-up odporem. Konstantou SPINAC_JEDEME si pak volíš, v jaké poloze spínače má motor jet.
Trochu zbytečně se to všechno pořád počítá a nastavuje, ale jestli Arduino nemá dělat nic jiného a nemusíš co nejvíc šetřit baterku, tak to nevadí (to by se dalo pořešit, ale program by bylo potřeba překopat a už by nebyl tak srozumitelnej).

Uživatelský avatar
jrt
Příspěvky: 1752
Registrován: 17 úno 2013, 17:13

Re: Accel Stepper - krokac - rada

Příspěvek od jrt » 02 lis 2020, 13:30

Protože mám na stole připravenou sestavu pro tento projekt, neváhal jsem a nahrál zmíněný program. Závěr je, že ač se před tvou moudrostí vše v prach řítí, nyní zdá se, ocitli jsme se v...
Hrál jsem si se zadáním chvilku v sobotu a bohužel to vypadá, že Arduino na tohle nemá dostatečný výkon a rampy nestíhá počítat.
Pomohl by popis projektu, třeba by se to dalo nějak obejít. A nebo se podívat na knihovnu FastAccelStepper, ale na to já teď momentálně nemám čas.
jrt
jederobot.cz, hobbyrobot.cz, profirobot.cz
edurobot.cz, robodoupe.cz

JOhny56
Příspěvky: 3
Registrován: 29 říj 2020, 14:47

Re: Accel Stepper - krokac - rada

Příspěvek od JOhny56 » 02 lis 2020, 13:57

DavidO píše:
02 lis 2020, 12:38
Jo a tady jsem ti to trochu učesal (zase - od stolu takže s rezervou):

Kód: Vybrat vše

/*
    Točení krokovým motorem rychlostí danou potenciometrem. 
    Motor se točí, jen když je spínač v poloze podle konstanty SPINAC_JEDEME.
*/

// definice pinů pro připojení spínače, LED, motoru, potenciometru
const int spinac_PIN = 2;  // spínač připojit mezi pin a zem!!
const int led_PIN = 3;
const int stepper1_STEP_PIN = 7;
const int stepper1_DIR_PIN = 6;
const int SPEED_PIN = A0;

// konstanty 
const int MAX_SPEED = 4000;  // rychlost motoru v krocích za sekundu
const int MIN_SPEED = 0;
const int ZRYCHLENI = 100;  // zrychlení v krocích za sekundu na druhou

const bool SPINAC_JEDEME = HIGH;  // stav spínače, když motor má jet (HIGH nebo LOW)

#include <AccelStepper.h>
AccelStepper stepper1(AccelStepper::DRIVER, stepper1_STEP_PIN, stepper1_DIR_PIN);
 
void setup()
{
  pinMode(led_PIN, OUTPUT);
  pinMode(spinac_PIN, INPUT_PULLUP);
 
  stepper1.setMaxSpeed(MAX_SPEED);
  stepper1.setAcceleration(ZRYCHLENI);
}
 
void loop()
{
  int potenciometer;  // aktuální poloha potenciometru
  float aktualniRychlost;  // spočítaná aktuální rychlost
  bool spinac = digitalRead(spinac_PIN);  // stav spínače (rovnou ho přečteme)
  
  digitalWrite(led_PIN,spinac==SPINAC_JEDEME);  // LED bude svítit, když motor má jet a nesvítit, když nemá jet
  if(spinac == SPINAC_JEDEME) {  // spínač je v poloze "jedeme" - motor má jet
    potenciometer = analogRead(SPEED_PIN);  // přečíst polohu potenciometru (0 až 1023)
    aktualniRychlost = ((potenciometer/1023.0) * (MAX_SPEED - MIN_SPEED)) + MIN_SPEED;  // přepočítat pro Accel Stepper
    stepper1.setSpeed(aktualniRychlost);  // nastavit rychlost motoru
    stepper1.runSpeed();  // nechat motor točit
  }
  else {  // spínač není v poloze "jedeme" - motor má zastavit
    stepper1.stop();  // nastavit, že chci zastavit (spočítá se pozice, aby to odpovídalo zpomalení)
    stepper1.run();  // nechat motor jet na nastavenou pozici (tj. v našem případě zastavit se zvoleným zpomalením)
  }
}
Nevím, jak máš zapojený ten spínač, tak jsem to udělal tak, jak se to obvykle dělá - mezi pin a zem, a pin se nastaví s interním pull-up odporem. Konstantou SPINAC_JEDEME si pak volíš, v jaké poloze spínače má motor jet.
Trochu zbytečně se to všechno pořád počítá a nastavuje, ale jestli Arduino nemá dělat nic jiného a nemusíš co nejvíc šetřit baterku, tak to nevadí (to by se dalo pořešit, ale program by bylo potřeba překopat a už by nebyl tak srozumitelnej).
díky vyzkouším a ano spínače mám zapojeny jak píšeš ......

DavidO
Příspěvky: 959
Registrován: 01 kvě 2013, 21:27

Re: Accel Stepper - krokac - rada

Příspěvek od DavidO » 02 lis 2020, 19:26

jrt píše:
02 lis 2020, 13:30
Hrál jsem si se zadáním chvilku v sobotu a bohužel to vypadá, že Arduino na tohle nemá dostatečný výkon a rampy nestíhá počítat.
To je diuný, Arduino toho zvládne... a vloni jsi měl něco velmi podobnýho se dvěma krokáčema a poťákem a šlo to, ne?
Jak se chová to nestíhání? Škube to, nebo co?

DavidO
Příspěvky: 959
Registrován: 01 kvě 2013, 21:27

Re: Accel Stepper - krokac - rada

Příspěvek od DavidO » 02 lis 2020, 20:03

JOhny56 píše:
02 lis 2020, 13:57
DavidO píše:
02 lis 2020, 12:38
Nevím, jak máš zapojený ten spínač, tak jsem to udělal tak, jak se to obvykle dělá - mezi pin a zem, a pin se nastaví s interním pull-up odporem.
ano spínače mám zapojeny jak píšeš ......
Tak to pak nezapomínej nastavovat ten pull-up - ve tvém kódu nahoře ti to chybělo.

Odpovědět

Kdo je online

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