3 osý manipulátor bez PC

Odpovědět
Mex
Příspěvky: 10288
Registrován: 6. 2. 2014, 10:29

28. 8. 2014, 10:22

Habešan píše:Já jsem GRBL zvolil už na začátku, takže ho nemůžu porovnávat s machem a spol.
Co tím prosím řídíš, s jakými parametry a praktickými zkušenostmi?
GRBL je často citovaný projekt, je zřejmě základem mnoha dalších (hlavně z oblasti 3D tisku), ale ještě jsem neslyšel/nečetl o žádných praktických zkušenostech s frézováním.
Mohl bys k tomu prosím napsat pár slov (konfigurace, zkušenosti, omezení/výhody atd.)?

Díky.
Uživatelský avatar
Habešan
Příspěvky: 989
Registrován: 12. 12. 2013, 2:25
Bydliště: Plzeňsko
Kontaktovat uživatele:

29. 8. 2014, 12:07

Nemohu.
Habešan píše:Zatím jsem se při frézování nenaučil využít vše co mi umožňuje,
Proxxon MF 70 27110, nejsem první ani poslední, kdo k němu přidělal krokové motory.

Není důvod proč to nevyzkoušet.
Neřeže to o nic hůř než s ručním posuvem.
Nabídněte mi, prosím, formy na PET lahve z limonádoven i pivovarů (i kovošrotu).
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

29. 8. 2014, 11:32

Grbl je jenom překladač g codu pro arduino, neni za tim potřeba hledat nic vic, dělá něco podobnýho jako mach, jenom bez vizualizace, g-code by měl být dokončený a odladěný, protože na arduino neuděláš korekce(na standard arduino, bez dalších doplňků)
Mex
Příspěvky: 10288
Registrován: 6. 2. 2014, 10:29

29. 8. 2014, 11:50

Já za tím ani nic nechci hledat. Jen bych rád od někoho, kdo to praktický používá pro frézování, slyšel zkušenosti. Zejména jak si hoši v praxi poradili s kinematikou atd.
Ovšem jak vidno od Habešana se to nedozvím, když to odbyl jediným slovem "nemohu".
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

30. 8. 2014, 8:47

arduino s grbl ovládá motory stejně jako Mach na PC, každýmu motoru se definují základní hodnoty (zrychlení, max. ot. min, kroky na ot., posuv na ot.), zvládá pohyb víc os najednou, zrychlení i dojíždění (falešnou setrvačnost), program se může nahrát na SD kartu a přenýst do arduina, když to chceš mít připojený k PC pořád, tak to má i vizualizační software a ovládácí obrazovky (jako Mach(funkčně, ne designově)). Koncáky a reakci na ně si každý dělá podle sebe. Pro běžný CNC (osový) je to plnohodnotná alternativa k Machu a PC. Připojuje se k odělovací desce (čína - červená nebo modrá, nebo jakákoli jiná) nebo k arduino shieldům (ty se mi zdaji míň výkonný a zabíraj moc pinů, protože ovládaj motory přímo, ale to záleží co stavíš).
Tady se ale řešil lineární robot, který odebírá výrobky (z dopravníku) a dává je do stroje, robota si představuju jako robo ruku s pojezdem (celá ruka se posouvá např. po kolejnici), a tady už by byl problém s výpočetním výkonem arduina, takže by se buď výpočet pohybů udělal na pc a do arduina by se nahrály pootočení všech motorů po jednotlivých krocích (vlastně by to byl gkód pro rotační osy), v tom případě by nebyla možná interakce s okolím, asi jenom emergency koncáky a tlačítko, nebo by se dělal výpočet úhlů motorů přímo v arduinu, takže by byla možná komunikace (hledání výrobku na stole, hledání místa v krabici, zamezení kolizi odjetím robota), ale při složitých výpočtech by se mohly zpomalit pohyby, protože by byl výpočet prováděn v reálným čase.
Jestli by ale robot byl něco jako router s rukou, tak není co řešit, protože to arduino zvládá, takže potom jasně G-kód, stavba na dva dny a žádný programování, jen pár řádek G-kódu - na druhou stranu ani žádná výzva.
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

5. 9. 2014, 4:17

jeykey píše:arduino s grbl ovládá motory stejně jako Mach na PC, každýmu motoru se definují základní hodnoty (zrychlení, max. ot. min, kroky na ot., posuv na ot.), zvládá pohyb víc os najednou, zrychlení i dojíždění (falešnou setrvačnost), program se může nahrát na SD kartu a přenýst do arduina, když to chceš mít připojený k PC pořád, tak to má i vizualizační software a ovládácí obrazovky (jako Mach(funkčně, ne designově)). Koncáky a reakci na ně si každý dělá podle sebe. Pro běžný CNC (osový) je to plnohodnotná alternativa k Machu a PC. Připojuje se k odělovací desce (čína - červená nebo modrá, nebo jakákoli jiná) nebo k arduino shieldům (ty se mi zdaji míň výkonný a zabíraj moc pinů, protože ovládaj motory přímo, ale to záleží co stavíš).
Tady se ale řešil lineární robot, který odebírá výrobky (z dopravníku) a dává je do stroje, robota si představuju jako robo ruku s pojezdem (celá ruka se posouvá např. po kolejnici), a tady už by byl problém s výpočetním výkonem arduina, takže by se buď výpočet pohybů udělal na pc a do arduina by se nahrály pootočení všech motorů po jednotlivých krocích (vlastně by to byl gkód pro rotační osy), v tom případě by nebyla možná interakce s okolím, asi jenom emergency koncáky a tlačítko, nebo by se dělal výpočet úhlů motorů přímo v arduinu, takže by byla možná komunikace (hledání výrobku na stole, hledání místa v krabici, zamezení kolizi odjetím robota), ale při složitých výpočtech by se mohly zpomalit pohyby, protože by byl výpočet prováděn v reálným čase.
Jestli by ale robot byl něco jako router s rukou, tak není co řešit, protože to arduino zvládá, takže potom jasně G-kód, stavba na dva dny a žádný programování, jen pár řádek G-kódu - na druhou stranu ani žádná výzva.

Máš pravdu, bude to jednoduchý manipulátor. Pohyby opakovat dokola. Na spuštění jedno tlačítko. A případně jedno tlačítko na najetí referenčních bodů. Zkoušel jsem to programovat přes grbl a chodilo to, ale nevím jak to udělat aby to chodilo na ty G kódy bez zapnutého počítače. Na začátek by mi stačilo kdyby mi někdo pomohl jak naprogramovat jen jednu osu aby chodila a spouštěl se program jedním tlačítkem. Moc informací to nebude, takže pokud se to vejde do paměti arduina bude to fajn. Nějaké věci jsem našel, ale v jazyku C++ neumím programovat. G kód je jednoduchý na programování.

Řekněme že by nyní stačila osa X aby mi chodila a dalo se to naprogramovat bez G kódu.
Popis posuvů:
Rychloposuv + 5000 kroků
posuv + 6000 kroků
rychloposuv - 6000 kroků
rychloposuv + 5500 kroků
posuv + 4500 kroků
rychloposuv - 10000 kroků
Konec
Ovládání: tlačítko start, stop, najetí na referenčí bod do mínusu (koncový spínač).

Díky za pomoc.
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

5. 9. 2014, 5:10

tarvisio píše:Zkoušel jsem to programovat přes grbl a chodilo to, ale nevím jak to udělat aby to chodilo na ty G kódy bez zapnutého počítače.
OK, teď přesně nevim jaká je situace, takže teď máš grbl v arduinu a když je připojený k PC tak provádí G-kod?
A ty teď chceš zase grbl vymazat a udělat program kterej posílá impulzy přímo driveru?
A máš ten 8A driver(na slony :)) z toho odkazu, takže pobere STEP a DIR?

tlačítka nejsou problém, dál je potřeba znát max. rychlost a zrychlení který snese motor než ztratí kroky (udělá se nižší, potom si donastavíš co potřebuješ) to samý rychloposuv, jestli máš arduino dvojku, tak se to vejde určitě, jestli jedničku, tak záleží jak se rozepíšeš, osy někdy běhaj současně (nevim jestli je to potřeba u tvého stroje, zefektivní to práci) takže to co teď uděláš pro osu X budeš muset doplnit o další dvě osy, ale ne po sobě, ale do toho samýho cyklu.

Po najetí na koncák se má osa vracet do vypnutí koncáku, schodit celou mašinu, nebo prostě zastavit a držet koncák sepnutej?
možná by bylo lepší kdybys napsal, jak to teď máš pospojovaný, jestli totiž už máš připojenou SD k arduinu, tak programovat přímo impulsy je krok stranou, jestli má ten stroj zůstat programovanej přímo v arduino tak je to OK a má cenu se tím dál zabývat.
Takže teď je potřeba vědět jestli drivery přijímají STEP a DIR impulsy (stačí napsat odkaz na ten driver), potom je možný jít dál.
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

5. 9. 2014, 5:45

jeykey píše:
tarvisio píše:Zkoušel jsem to programovat přes grbl a chodilo to, ale nevím jak to udělat aby to chodilo na ty G kódy bez zapnutého počítače.
OK, teď přesně nevim jaká je situace, takže teď máš grbl v arduinu a když je připojený k PC tak provádí G-kod?
Teď mám napojený driver 4,2 A - na menší slony, napájení 48V. http://cncshop.cz/m542-driver-pro-kroko ... y-50v-4-2a
Motor mám nyní microcon SX-1428, pararelně zapojený - 2,84 A. 2,8Nm.
Po najetí na koncák co se má vrátit na výchozí polohu bych chtěl aby to shodilo mašinu. a pak se mohl spustit normálně další start.

Sehnal jsem si arduino UNO, taky arduino mega a taky 8x Relé modul 5V pro Arduino až můžu něco tvořit. http://www.santy.cz/moduly-rele-c33/ard ... modul-i39/
Nyní mám nahraný obyčejný program na arduinu uno který jsem našel na netu. Chodí mi, ale problém je že sám a pořád dokola.

Pokud máš jiný návrh na ten program tak nejsem proti. Pro vysvětlení: rotate(1600, .05) 1600=kroky .05= rychlost otáčení

Zde je program:

#define DIR_PIN 2
#define STEP_PIN 3

void setup() {
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
}

void loop(){


//rotate a specific number of microsteps (8 microsteps per step)
//a 200 step stepper would take 1600 micro steps for one full revolution
rotate(1600, 1); //rychloposuv, prijeti ke kusu

rotate(1600, .05); //vrtani 1. cast
delay(100);

rotate(-3200, 1); //vyjezd ven - vyplach
delay(100);
rotate(3000, 1); //najezd zpet - vyplach

rotate(1600, .05); //vrtani 2. cast
delay(100);

rotate(-4000, 1); //vyjezd
delay(3000);

}
void rotate(int steps, float speed){
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0)? HIGH:LOW;
steps = abs(steps);

digitalWrite(DIR_PIN,dir);

float usDelay = (1/speed) * 70;

for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
}
}

void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(DIR_PIN,dir);

int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) * 70;

for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
}
}
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

5. 9. 2014, 8:15

tarvisio píše:Řekněme že by nyní stačila osa X aby mi chodila a dalo se to naprogramovat bez G kódu.
Popis posuvů:
Rychloposuv + 5000 kroků
posuv + 6000 kroků
rychloposuv - 6000 kroků
rychloposuv + 5500 kroků
posuv + 4500 kroků
rychloposuv - 10000 kroků
Konec

tarvisio píše: void loop(){


//rotate a specific number of microsteps (8 microsteps per step)
//a 200 step stepper would take 1600 micro steps for one full revolution
rotate(1600, 1); //rychloposuv, prijeti ke kusu

rotate(1600, .05); //vrtani 1. cast
delay(100);

rotate(-3200, 1); //vyjezd ven - vyplach
delay(100);
rotate(3000, 1); //najezd zpet - vyplach

rotate(1600, .05); //vrtani 2. cast
delay(100);

rotate(-4000, 1); //vyjezd
delay(3000);
Vybavil ses dobře, takže neni důvod neuspět,
to, že ten program chodí dokola a sám je v pořádku, přesně tak je napsanej,
Nikde tam nevidim zrychlení, to znamená že hned najede na plnou rychlost, to může pěkně hnout strojem, takže nastavená rychlost je nízká a nevyužije potenciál stroje; zejtra sem dám prográmek kterej to ošetří, napíšu ho přehledně abys to mohl snadno editovat


před void setup napiš:
int keyStart = 27; // to je PIN pro připojení tlačítka

do void setup připiš:
pinMode(keyStart, INPUT_PULLUP); // tady připojuješ tlačítko na pullup, takže stačí zapojit jako normální vypínač (ne přes rezistor na GND)

celá void loop je takhle:
void loop(){
rotate(5000, 1.00); //Rychloposuv + 5000 kroků
delay(100);

rotate(6000, 0.5); //posuv + 6000 kroků
delay(100);

rotate(-6000, 1); //rychloposuv - 6000 kroků
delay(100);

rotate(5500, 1); //rychloposuv + 5500 kroků
delay(100);

rotate(4500, 0.5); //posuv + 4500 kroků
delay(100);

rotate(-10000, 1); //rychloposuv - 10000 kroků
delay(100);

STOPKA:
if (digitalRead(keyStart) == HIGH) goto STOPKA; // dokud neni stisknuto tlačítko program se neopakuje - projede jednou a dost
}

*****
tenhle program neni ideální, ale na zkoušení to stačí, koncáky se připojují jako tlačítka, co se děje po sepnutí koncáku se už jenoduše doprogramuje
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

5. 9. 2014, 9:13

Díky za program, trochu jsem v tom plaval než mi to začlo fungovat, ale už to funguje :D
Ještě je trochu malý problém, že hned při přivedení napájení do Arduina se spustí 1x program a pak zastaví.


Tady je aktuální program:

#include <SoftwareSerial.h>

#define DIR_PIN 2
#define STEP_PIN 3
int keyStart = A0; // to je PIN pro připojení tlačítka

void setup() {
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(keyStart, INPUT_PULLUP); // tady připojuješ tlačítko na pullup, takže stačí zapojit jako normální vypínač (ne přes rezistor na GND)
}

void loop() {

//rotate a specific number of microsteps (8 microsteps per step)
//a 200 step stepper would take 1600 micro steps for one full revolution
rotate(5000, 1.00); //Rychloposuv + 5000 kroků
delay(100);

rotate(6000, 0.5); //posuv + 6000 kroků
delay(100);

rotate(-6000, 1); //rychloposuv - 6000 kroků
delay(100);

rotate(5500, 1); //rychloposuv + 5500 kroků
delay(100);

rotate(4500, 0.5); //posuv + 4500 kroků
delay(100);

rotate(-10000, 1); //rychloposuv - 10000 kroků
delay(3000);

STOPKA:
if (digitalRead(keyStart) == HIGH) goto STOPKA; // dokud neni stisknuto tlačítko program se neopakuje - projede jednou a dost

}

void rotate(int steps, float speed) {
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0) ? HIGH : LOW;
steps = abs(steps);

digitalWrite(DIR_PIN, dir);

float usDelay = (1 / speed) * 70;

for (int i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
}
}

void rotateDeg(float deg, float speed) {
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0) ? HIGH : LOW;
digitalWrite(DIR_PIN, dir);

int steps = abs(deg) * (1 / 0.225);
float usDelay = (1 / speed) * 70;

for (int i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
}
}
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

5. 9. 2014, 9:24

tarvisio píše:Díky za program, trochu jsem v tom plaval než mi to začlo fungovat, ale už to funguje :D
Ještě je trochu malý problém, že hned při přivedení napájení do Arduina se spustí 1x program a pak zastaví.
No to je schválně, jak bys to teda potřeboval?
jestli chceš spouštět tlačítkem hned na začátku tak void loop bude:

if (digitalRead(keyStart) == LOW) {
rotate(5000, 1.00); //Rychloposuv + 5000 kroků
delay(100);
rotate(6000, 0.5); //posuv + 6000 kroků
delay(100);
rotate(-6000, 1); //rychloposuv - 6000 kroků
delay(100);
rotate(5500, 1); //rychloposuv + 5500 kroků
delay(100);
rotate(4500, 0.5); //posuv + 4500 kroků
delay(100);
rotate(-10000, 1); //rychloposuv - 10000 kroků
delay(3000);
}
Naposledy upravil(a) jeykey dne 5. 9. 2014, 9:38, celkem upraveno 1 x.
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

5. 9. 2014, 9:37

To je dobrý, já si s tím teda nějak poradím :wink:

A teda kdyby si chtěl tam mi tam můžeš ještě potom dodělat nějaké ty rozjezdy motoru at to tak nehýbe mašinou, pak na vstup A1 kdyby šlo STOP a na A2 kdyby šlo tlačítko že to najede na ten referenční koncový spínač. A je to celé hotové ta aplikace :D

Jinak si dobrej že to umíš :wink:
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

5. 9. 2014, 9:59

jeykey píše:
tarvisio píše:Díky za program, trochu jsem v tom plaval než mi to začlo fungovat, ale už to funguje :D
Ještě je trochu malý problém, že hned při přivedení napájení do Arduina se spustí 1x program a pak zastaví.
No to je schválně, jak bys to teda potřeboval?
jestli chceš spouštět tlačítkem hned na začátku tak void loop bude:

if (digitalRead(keyStart) == LOW) {
rotate(5000, 1.00); //Rychloposuv + 5000 kroků
delay(100);
rotate(6000, 0.5); //posuv + 6000 kroků
delay(100);
rotate(-6000, 1); //rychloposuv - 6000 kroků
delay(100);
rotate(5500, 1); //rychloposuv + 5500 kroků
delay(100);
rotate(4500, 0.5); //posuv + 4500 kroků
delay(100);
rotate(-10000, 1); //rychloposuv - 10000 kroků
delay(3000);
}
Díky za změnu, je to paráda teď ! :D
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

6. 9. 2014, 11:21

Jako Cental Stop použiju vstup reset :wink:


Našel jsem nějaké řešení rampy na rozjezd motorů které mi nyní chybí v programu, zkoušel jsem to nějak přidat do programu, ale nědaří se mi to.

Odkaz http://electronics.stackexchange.com/qu ... r-movement

Zde je aktuální program který funguje. je tam Tlačítko start, stop a Home - tedy výchozí poloha. Chybí už jen pomalejší rozjezdy. Uměl by mi s tím někdo pomoct ? :D

#include <SoftwareSerial.h>

#define DIR_PIN 2
#define STEP_PIN 3
int keyStart = A0; // PIN pro připojení tlačítka Start
int keyHome = A1; // PIN pro připojení tlačítka Home

void setup() {
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(keyStart, INPUT_PULLUP); // tady připojuješ tlačítko na pullup, takže stačí zapojit jako normální vypínač (ne přes rezistor na GND)
pinMode(keyHome, INPUT_PULLUP); //tlačítko Home
}

void loop() {
if (digitalRead(keyStart) == LOW) {
delay(500);
rotate(15000, 4.00); //Rychloposuv + 5000 kroků
delay(100);
rotate(6000, 0.2); //posuv + 6000 kroků
delay(100);
rotate(-6000, 4.0); //rychloposuv - 6000 kroků
delay(300);
rotate(5500, 4.0); //rychloposuv + 5500 kroků
delay(100);
rotate(4500, 0.2); //posuv + 4500 kroků
delay(100);
rotate(-10000, 4.0); //rychloposuv - 10000 kroků
delay(100);
}
if (digitalRead(keyHome) == LOW) {
delay(100);
rotate(-100000, 1.00); //Hledání výchozí polohy. Při najetí koncáku na výchozí poloze sepne reset
}
}
void rotate(int steps, float speed) {
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0) ? HIGH : LOW;
steps = abs(steps);

digitalWrite(DIR_PIN, dir);

float usDelay = (1 / speed) * 70;

for (int i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
}
}

void rotateDeg(float deg, float speed) {
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0) ? HIGH : LOW;
digitalWrite(DIR_PIN, dir);

int steps = abs(deg) * (1 / 0.225);
float usDelay = (1 / speed) * 70;

for (int i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);

digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);
}
}
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

10. 9. 2014, 11:19

Ahoj, takže ses dostal trochu dál.., ten pomalej rozjezd sem ještě nestih - moc náročnej víkend + navazující povinnosti -
kouknu se na možnosti, jak to tam nejlíp zakomponovat, aby byly funkční koncáky, a Tobě stačí jen jedna osa, nebo jich budeš chtít rozhejbat víc?
Odpovědět

Zpět na „roboti a manipulatory“