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.
Arduino - riadenie KM (TB6560 driver)
- WatchManiac
- Příspěvky: 522
- Registrován: 23. 1. 2010, 12:56
- Bydliště: Bernolákovo
- Kontaktovat uživatele:
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.“
watchmania.skAmateur WatchmakingYouTube kanál
watchmania.skAmateur WatchmakingYouTube kanál
- WatchManiac
- Příspěvky: 522
- Registrován: 23. 1. 2010, 12:56
- Bydliště: Bernolákovo
- Kontaktovat uživatele:
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:
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.
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");
}
}
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.“
watchmania.skAmateur WatchmakingYouTube kanál
watchmania.skAmateur WatchmakingYouTube kanál
- WatchManiac
- Příspěvky: 522
- Registrován: 23. 1. 2010, 12:56
- Bydliště: Bernolákovo
- Kontaktovat uživatele:
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...
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.“
watchmania.skAmateur WatchmakingYouTube kanál
watchmania.skAmateur WatchmakingYouTube kanál
- jova
- Příspěvky: 2511
- Registrován: 2. 11. 2007, 1:40
- Bydliště: Chýnov to je kousek od Tábora
- Kontaktovat uživatele:
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.
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)
}
- WatchManiac
- Příspěvky: 522
- Registrován: 23. 1. 2010, 12:56
- Bydliště: Bernolákovo
- Kontaktovat uživatele:
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
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...
(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");
}
- 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.“
watchmania.skAmateur WatchmakingYouTube kanál
watchmania.skAmateur WatchmakingYouTube kanál
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.
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.
- WatchManiac
- Příspěvky: 522
- Registrován: 23. 1. 2010, 12:56
- Bydliště: Bernolákovo
- Kontaktovat uživatele:
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čilMex 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.
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.“
watchmania.skAmateur WatchmakingYouTube kanál
watchmania.skAmateur WatchmakingYouTube kanál