Arduino - riadenie KM (TB6560 driver)

arduino, teensy, atmega, pic a jine (software, hardware)
Odpovědět
Uživatelský avatar
WatchManiac
Příspěvky: 522
Registrován: 23. 1. 2010, 12:56
Bydliště: Bernolákovo
Kontaktovat uživatele:

31. 3. 2016, 1:01

Ahojte, potreboval by som trochu nakopnúť: mám arduino a na ňom napr.

na pin1 button1(input)
na pin2 button2(input)

na pin3 CLK+ (output)
na pin4 CW+ (output)

CLK- a CW- na GND

Ako bude vyzerať sekvencia LOW/HIGH (???) na pin3 a pin4 ak - keď button1 je HIGH tak by sa motor točil jedným smerom a ak button2 = HIGH tak opačne?
Dajme tomu, že impulz každých 200ms.

nejako sa s toho neviem vysomáriť, už mám spravené časovanie impulzov podľa posuvu a aj vypisovanie prejdenej dráhy, akurát mi chýba maličkosť - pohnúť motorom :(

V podstate "pulse generator" asi...

ďakujem za radu.
Naposledy upravil(a) WatchManiac dne 1. 4. 2016, 4:41, celkem upraveno 2 x.
„Když něčemu věnuješ dostatek času, budeš v tom mistr. Pokud nejsi blb.“
Obrázekwatchmania.skObrázekAmateur WatchmakingObrázekYouTube kanál
Uživatelský avatar
WatchManiac
Příspěvky: 522
Registrován: 23. 1. 2010, 12:56
Bydliště: Bernolákovo
Kontaktovat uživatele:

1. 4. 2016, 5:38

Po prebdenej neuspesnej noci sa skusim s dovolenim spytat inac, pretoze velmi pravdepodobne nechapem ako driver funguje:

Na driveri su svorky CLK+ CLK- CW+ CW- EN+ EN-, CLK je asi step, CW je asi dir a EN enable.

Ten driver funguje tak, ze
- ak je na dir napatie tak ide jednym smerom a ked nieje, tak ide opacnym smerom... Dobre si to myslim???
- ak sa na step posiela pulz, tak po kazdom sa pohne v smere ako je napisane vyssie, podla nastavenia mikrokrokovania na driveri, Cize ak poslem z arduina pri kroku 1/1 pulz kazdych dajme tomu 100 ms, tak sa mmi za sekundu pohne o 10 krokov... Dobre si to myslim?
- naco je enable? Na niektorych schemach nie je zapojene, niekde je... Neviem...

Ja so si to povodne predsavoval nejako takto:

Kód: Vybrat vše

const int buttonPin_dolava = 2;     // modry
const int buttonPin_doprava = 3;     // cerveny
const int digitalPin_step = 4;     // step
const int digitalPin_dir = 5;     // dir
const int digitalPin_enable = 6;  // enable 

const int ledPin =  13;      // LED na arduine - pre overenie

int trvanieImpulzu = 20;      // milisekundy
int pauzaMedziImpulzom = 200; // milisekundy

int buttonState_dolava = LOW;         // status
int buttonState_doprava = LOW;         // status
int jeStlacenyButton;             // premenná len pre kontrolu

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin_dolava, INPUT_PULLUP);
  pinMode(buttonPin_doprava, INPUT_PULLUP);
  
  digitalWrite(digitalPin_enable, HIGH);   // ????????????? NEVIEM CO TO ROBI
  
  Serial.begin(9600);
}

void loop() {
  buttonState_dolava = digitalRead(buttonPin_dolava);
  buttonState_doprava = digitalRead(buttonPin_doprava);
  

  if ((buttonState_dolava == LOW) && (buttonState_doprava == HIGH)) {   // ak je stlaceny LEN gombik dolava
    digitalWrite(ledPin, HIGH);
    digitalWrite(digitalPin_step, HIGH);
    delay(trvanieImpulzu);
    digitalWrite(ledPin, LOW);
    digitalWrite(digitalPin_step, LOW);
    delay(pauzaMedziImpulzom);
    digitalWrite(digitalPin_dir, HIGH);
    jeStlacenyButton = 2;
  } else {
    digitalWrite(ledPin, LOW);
  }
  if ((buttonState_dolava == HIGH) && (buttonState_doprava == LOW))  { // ak je stlaceny LEN gombik doprava
    digitalWrite(ledPin, HIGH);
    digitalWrite(digitalPin_step, HIGH);
    delay(trvanieImpulzu);
    digitalWrite(ledPin, LOW);
    digitalWrite(digitalPin_step, LOW);
    delay(pauzaMedziImpulzom);
    digitalWrite(digitalPin_dir, LOW);
    jeStlacenyButton = 3;
  } else {
    digitalWrite(ledPin, LOW);
  }
  if ((buttonState_dolava == LOW) && (buttonState_doprava == LOW))  {  //ak su stlačené obidva gombiky - mozno pouzijem ako stopku
    digitalWrite(ledPin, HIGH);
    jeStlacenyButton = 1;
  } 
if ((buttonState_dolava == HIGH) && (buttonState_doprava == HIGH))  {  //ak nie je stlaceny ani jeden - ASI NETREBA
    digitalWrite(ledPin, LOW);
    jeStlacenyButton = 0;
  }

// TOTO LEN PRE OVERENIE TLACIDIEL
if (jeStlacenyButton == 2) {
  Serial.println("DOLAVA");
}
else if (jeStlacenyButton == 3) {
  Serial.println("DOPRAVA");
} 
else if (jeStlacenyButton == 1) {
  Serial.println("OBIDVA");
} 
else if (jeStlacenyButton == 0) {
  Serial.println("ZIADNY");
} 
 
  
}
Ale len predstavoval :) :) :) Nic to nerobi.

A este jedna vec: napajam driver cca 13V (nemam 24V zdroj) ale po pripojeni motora, resp. drivera k zdroju sa motor toci tak isto lahko ako bez napatia, na velkej frezke s 2Nm motormi ked zapnem driver, tak s motorom skoro nepohnem. Ze ci neni zly driver, malo voltov alebo len blbo zapojene...
Je to tento driver: http://img.dxcdn.com/productimages/sku_217142_3.jpg


Ak by niekto vedel aspon trochu pomoct, bol by som rad. Zatial dik, P.
Naposledy upravil(a) WatchManiac dne 1. 4. 2016, 5:56, celkem upraveno 1 x.
„Když něčemu věnuješ dostatek času, budeš v tom mistr. Pokud nejsi blb.“
Obrázekwatchmania.skObrázekAmateur WatchmakingObrázekYouTube kanál
Uživatelský avatar
slezak77
Příspěvky: 1152
Registrován: 1. 6. 2012, 6:45

1. 4. 2016, 5:52

Sice nevím nic o tom programování, ale k tomu driveru. Když odpojíš enable tak se taky dá motorem točit volně? Nemělo by, a 12V by jej mělo taky roztočit bez problému. Tedy pokud je to nějaký klasický Nema 17 nebo 23.
Uživatelský avatar
WatchManiac
Příspěvky: 522
Registrován: 23. 1. 2010, 12:56
Bydliště: Bernolákovo
Kontaktovat uživatele:

1. 4. 2016, 6:09

Je to rovnake, ziadna zmena...
Je to tento motor, NEMA 17.

Cisto teoreticky, ked na driver pripojim len 12V a motor, malo by sa to prejavit na "tazsom" chode/otoceni osky motora alebo treba aj arduino pripojit? By som tak zistil ci nie je ten driver zly...
„Když něčemu věnuješ dostatek času, budeš v tom mistr. Pokud nejsi blb.“
Obrázekwatchmania.skObrázekAmateur WatchmakingObrázekYouTube kanál
Uživatelský avatar
azamo
Příspěvky: 604
Registrován: 11. 4. 2014, 7:43
Bydliště: Zlín

1. 4. 2016, 6:27

Nemáš špatně připojený motor ?
Pokud máš zapojený k driveru jen motor a napájení tak by měl držet polohu .
Uživatelský avatar
jova
Příspěvky: 2509
Registrován: 2. 11. 2007, 1:40
Bydliště: Chýnov to je kousek od Tábora
Kontaktovat uživatele:

1. 4. 2016, 7:29

Těch 12-13V musí být zcela dostatečné.
Vstupy CLK... jsou tak jak píšeš.
Pokud na driver připojíš motor a přivedeš těch 12V , musí se motor "zabrzdit" a držet svou polohu. Jakou budeš muset vyvinout sílu k pootočení závisí na nastaveném proudu. Pokud se tak neděje, přeměřil bych ohmicky cívky a zkontroloval zda jsou správně zapojené. 1.cívka na A+, A- 2. na B+, B-.
Při připojení napětí na ENABLE se odpojí napájení motoru, takže v tom okamžiku s ním jde volně otáčet.
Pokud přivedeš na CLK+ a CLK- napětí 5V ve správné polaritě (může být třeba i 4,5V ze 3 tužkových baterií), musí sebou motor o jeden krok cuknout. Když ho odpojíš a opět připojíš, musí opět udělat krok.
S Arduinem ti taky ještě neporadím, ale na vyzkoušení můžeš zkusit tenhle nejjednodušší program na blikání led. Zkrať tam akorát tu dobu delay z 1s na ms, na výstup 13 připoj CLK+ a CLK- připoj na 0V. Motor se musí roztočit.

Kód: Vybrat vše

/*
Program - Blikani
Zapne LED diodu na 1 sekundu, vypne LED na 1 sekundu, a opakuje.
*/
void setup() { //toto je nastavovaci cast, ta se vykona pouze jednou, po resetu zarizeni
  // inicializujeme si pin 13 jako vystupni
  // na vetsine desek Arduino je na pinu 13 LED dioda.
  pinMode(13, OUTPUT);
}
void loop() { //toto je cast, ktera bezi neustale dokola, dokud nedojde k resetu zarizeni
  digitalWrite(13, HIGH);   // rozsvitime LED
  delay(1000);              // pockame 1000 milisekund(=1 sekundu)
  digitalWrite(13, LOW);    // zhasneme LED
  delay(1000);              // pockame 1000 milisekund(=1 sekundu)
}
Uživatelský avatar
WatchManiac
Příspěvky: 522
Registrován: 23. 1. 2010, 12:56
Bydliště: Bernolákovo
Kontaktovat uživatele:

1. 4. 2016, 4:18

Takže trochu progres: driver bol mŕtvy, nový je v poriadku.
(Skoro) všetko funguje ako treba, tu je prvá verzia programu, ak by niekto nutne okamžite chcel ovládať KM pomocou arduina.
Je to na malé posuvy, treba si to prepísať (r. 52-124) pre vlastnú potrebu.
Zatiaľ len pre jednu osu, nemám viac tlačítok doma :(

Kód: Vybrat vše

/* VSEOBECNE NASTAVENIA */
  int prah=5;                     // citlivost na zmenu vstupu potenciometra na ovladanie rychlosti posuvu
/* ---------- OSA X ---------- */  
  int tlacitko_X_dolava;
  int tlacitko_X_doprava;
  int pot_pin_X = A1;              // potenciometer na analogovom pine A1
  int analog_hodnota_X;            // 0-1023 analog vstup z potenciometra
  int pwm_hodnota_X;               // digital výstup
  float posuv_X;        
  float mikrokrok_X = 16;             // mikrokrok
  float impulzov_na_mm_X = 200 * mikrokrok_X;
  float dlzka_impulzu_X = 0.01;          // milisekundy
  float impulzov_za_sekundu_X;
  float delay_X;
  float pohyb_na_impulz_X = (1 / (200 * mikrokrok_X)) ; // stúpanie / (celokrok * mikrokrok) v mm
  float pociatocne_X;
/* ---------- OSA Y ---------- */
  int tlacitko_Y_hore;
  int tlacitko_Y_dole;

void setup() { 
  pinMode(2, INPUT_PULLUP); // X dolava
  pinMode(3, INPUT_PULLUP); // X doprava
  pinMode(4, OUTPUT); // STEP
  pinMode(5, OUTPUT); // DIR
  pinMode(6, INPUT_PULLUP); // Y dolava
  pinMode(7, INPUT_PULLUP); // Y doprava
  pinMode(13, OUTPUT); // LED na doske
  Serial.begin(250000);

}
void loop() {

  /* ---------- posuv podla potenciometra ---------- */
  analog_hodnota_X = analogRead(pot_pin_X);                  // nacitanie hodnoty z potenciometra X (0-1023)
  pwm_hodnota_X = map(analog_hodnota_X, 0, 1023, 0, 20);  // preskalovanie na 0-20 pre posuv

    if (pwm_hodnota_X == 0) {
       posuv_X = 0;
      impulzov_za_sekundu_X = 0; 
       pociatocne_X = 0;    
    }
    else if ((pwm_hodnota_X > 0) && (pwm_hodnota_X < 11))  {
       posuv_X = pwm_hodnota_X * 0.1; 
       impulzov_za_sekundu_X =  (impulzov_na_mm_X * posuv_X)/ 60;
       delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
          pociatocne_X = pociatocne_X + pohyb_na_impulz_X;    
    }
    else if (pwm_hodnota_X == 11) {
      posuv_X = 1.5;
       impulzov_za_sekundu_X =  (impulzov_na_mm_X * posuv_X)/ 60;
       delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
          pociatocne_X = pociatocne_X + pohyb_na_impulz_X;    
    }
    else if (pwm_hodnota_X == 12) {
      posuv_X = 2;
       impulzov_za_sekundu_X =  (impulzov_na_mm_X * posuv_X)/ 60;
       delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
          pociatocne_X = pociatocne_X + pohyb_na_impulz_X;    
    }
    else if (pwm_hodnota_X == 13) {
      posuv_X = 2.5;
       impulzov_za_sekundu_X =  (impulzov_na_mm_X * posuv_X)/ 60;
       delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
          pociatocne_X = pociatocne_X + pohyb_na_impulz_X;    
    }
    else if (pwm_hodnota_X == 14) {
      posuv_X = 3;
       impulzov_za_sekundu_X =  (impulzov_na_mm_X * posuv_X)/ 60;
       delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
          pociatocne_X = pociatocne_X + pohyb_na_impulz_X;    
    }
    else if (pwm_hodnota_X == 15) {
      posuv_X = 3.5;
       impulzov_za_sekundu_X =  (impulzov_na_mm_X * posuv_X)/ 60;
       delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
          pociatocne_X = pociatocne_X + pohyb_na_impulz_X;    
    }
    else if (pwm_hodnota_X == 16) {
      posuv_X = 4;
       impulzov_za_sekundu_X =  (impulzov_na_mm_X * posuv_X)/ 60;
       delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
          pociatocne_X = pociatocne_X + pohyb_na_impulz_X;    
    }
    else if (pwm_hodnota_X == 17) {
      posuv_X = 5;
       impulzov_za_sekundu_X =  (impulzov_na_mm_X * posuv_X)/ 60;
       delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
          pociatocne_X = pociatocne_X + pohyb_na_impulz_X;    
    }
    else if (pwm_hodnota_X == 18) {
      posuv_X = 6;
       impulzov_za_sekundu_X =  (impulzov_na_mm_X * posuv_X)/ 60;
       delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
          pociatocne_X = pociatocne_X + pohyb_na_impulz_X;    
    }
    else if (pwm_hodnota_X == 19) {
      posuv_X = 8;
       impulzov_za_sekundu_X =  (impulzov_na_mm_X * posuv_X)/ 60;
       delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
          pociatocne_X = pociatocne_X + pohyb_na_impulz_X;    
    }
    else if (pwm_hodnota_X == 20) {
      posuv_X = 10;
       impulzov_za_sekundu_X =  (impulzov_na_mm_X * posuv_X)/ 60;
       delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
          pociatocne_X = pociatocne_X + pohyb_na_impulz_X;    
    }
  tlacitko_X_dolava = digitalRead(2);
  tlacitko_X_doprava = digitalRead(3);
  
  if ((tlacitko_X_dolava == 0) && (tlacitko_X_doprava == 1)) {
  digitalWrite(4, HIGH);   // STEP signal
  delay(dlzka_impulzu_X);              
  digitalWrite(4, LOW);    // STEP pauza
  delay(delay_X);              
  digitalWrite(5, LOW); // DIR CW
  digitalWrite(13, HIGH);
  }
  else if ((tlacitko_X_doprava == 0) && (tlacitko_X_dolava == 1)) {
  digitalWrite(4, HIGH);   // STEP signal
  delay(dlzka_impulzu_X);              
  digitalWrite(4, LOW);    // STEP pauza
  delay(delay_X);              
  digitalWrite(5, HIGH);   // DIR CCW
  digitalWrite(13, LOW);
  }
  else if ((tlacitko_X_dolava == 0) && (tlacitko_X_doprava == 0)) {
  digitalWrite(4, LOW);   // STEP pauza - cize nijaky signal, motor zastavi
  }
  else if ((tlacitko_X_dolava == 1) && (tlacitko_X_doprava == 1)) {
  digitalWrite(4, LOW);   // STEP pauza - cize nijaky signal, motor zastavi
  pociatocne_X = 0;
  }

Serial.print("posuv X: ");
Serial.print(posuv_X, 2);
Serial.print(" mm/min   ");
Serial.print("draha X: ");
Serial.print(pociatocne_X, 3);
Serial.println(" mm");
}
Je to funkčné, ale
- rampy nie sú, myslím že pri týchto rýchlostiach netreba
- pri 0 mm/min sa motor aj tak točí (veľmi pomaly), neviem prečo
- pri štarte treba pohnúť potenciometrom, aby bola nastavená hodnota, ináč sa točí ako sa mu zachce (opravím)
- nedrží hodnotu prejdenej dráhy, pri uvoľnení tlačítka sa vynuluje (opravím)

Ináč - možno je to strašne napísané, ale funguje to tak ako potrebujem...
Je to môj prvý program na Arduino. Učím sa to druhý deň, tak zhovievavosť :) :) :)

Pekný deň, Patrik

P.S.: kľudne sa niekto skúsenejší môže pridať :) A všetkým veľmi pekne ďakujem za rady vyššie...
„Když něčemu věnuješ dostatek času, budeš v tom mistr. Pokud nejsi blb.“
Obrázekwatchmania.skObrázekAmateur WatchmakingObrázekYouTube kanál
Mex
Příspěvky: 10288
Registrován: 6. 2. 2014, 10:29

1. 4. 2016, 4:58

Arduino má jednu výhodu, že pro něho existují knihovny pro všechno co si jenom vzpomeneš.
Takže zrovna na to hýbání krokáčem je nejjednodušší použít knihovnu AccelStepper, která tohle všechno včetně ramp atd. řeší, takže jí pak jenom posíláš zadání kam a tak rychle má jet.

Ale pokud je tvým cílem naučit se programovat, tak to pak je něco jiného, a pak jako že jsem nic neřekl.
Uživatelský avatar
WatchManiac
Příspěvky: 522
Registrován: 23. 1. 2010, 12:56
Bydliště: Bernolákovo
Kontaktovat uživatele:

13. 4. 2016, 3:23

Mex píše:Arduino má jednu výhodu, že pro něho existují knihovny pro všechno co si jenom vzpomeneš.
Takže zrovna na to hýbání krokáčem je nejjednodušší použít knihovnu AccelStepper, která tohle všechno včetně ramp atd. řeší, takže jí pak jenom posíláš zadání kam a tak rychle má jet.

Ale pokud je tvým cílem naučit se programovat, tak to pak je něco jiného, a pak jako že jsem nic neřekl.
Jo lenže ja som tam chcel mať hlavne DRO, to bol hlavný dôvod http://www.c-n-c.cz/viewtopic.php?f=15& ... 53#p208453 Ale som sa aj niečo naučil :) :) :)

Možno sa to dá aj s tými knižnicami pripojiť na zobrazovanie údajov o polohe, ale toto bolo relatívne jednoduché... Aj to DRO vo visualstudiu som dal za 3 dni, a dovtedy som o visualbasicu nemal ani potuchy...
„Když něčemu věnuješ dostatek času, budeš v tom mistr. Pokud nejsi blb.“
Obrázekwatchmania.skObrázekAmateur WatchmakingObrázekYouTube kanál
Odpovědět

Zpět na „MCU“