3 osý manipulátor bez PC

Odpovědět
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

29. 9. 2014, 2:01

tarvisio píše:
melsoft píše:Díky za tohle vlákno! Zaujalo mě to natolik, že jsem si koupil Arduino, připojil jsem driver krokového motoru a začal experimentovat (na jedné z prvních verzí zde uveřejněného kódu).
Bohužel pozoruji takové chování, že pro rychlosti menší nebo rovno 1 je akcelerace plynulá až do maximální rychlosti ale jakmile dám rychlost třeba 1,5, akceleruje to jen do určitého momentu a pak to skočí na maximální rychlost a při rychlostech větších než 1,9 to spolehlivě ztratí kroky.
Nevíte někdo co s tím?
stepper_acc.txt

Ja jsem zacatecnik takze ti asi moc neporadim,ale zalezi jake pouzivas motory, drivery.
Ja nezenu motory na velke rychlosti, protoze to ztraci kroky a taky moment.
Pouzivam motory Microcon a drivery Leadshine.
motor nezvládá rychlost jakou po něm požaduješ, proto ztrácí kroky, musíš po něm chtít menší rychlost a vybalancovat hodnoty pro svůj motor, ten kód neni univerzální, každej motor (typ, ne úplně každej kus) potřebuje svý nastavení,
doporučil bych poslední verzi programu a přes serial monitor uvidíš co se tam děje krok po kroku,
to co popisuješ bude asi pocitový, motor naběhne plynule, ale ve chvíli kdy ztratí kroky se ti zdá že najel skokem, protože udělá takovej divnej zvuk, prověřoval sem tu rovnici v algoritmu a dává správný výsledky i pro tvoje hodnoty, co máš nastavený v programu
rozjezd motoru počítá přestávku mezi krokama takhle:
začátek cyklu:
MKD=1/1,4*70+3000-3000/500*1
MKD = 3044 mikrosekund
konec cyklu:
MKD=1/1,4*70+3000-3000/500*500
MKD = 50 mikrosekund

MKD = pauza mezi krokem
1,4 je koeficient rychlosti nastavenej v programu uživatelem (rotate(4500, 1.40);)
3000 = (float maxDelay = 3000;) nastavení náběhu motoru
500 = počet rozjezdových kroků (0-500) (int zrychleni = 500;) hodnota na konci cyklu musí být stejná jako hodnota v dalším cyklu:

MKD = (1/1,4)*70
MKD = 50 mikrosekund

a dojezd je start jenom opačně, takže v cyklu žádnej problém není
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

29. 9. 2014, 4:53

Měl bych na tebe prosbu jeykey.

Dal jsem nejnovější program co jsi vytvořil na můj malý soustruh.
Mám tam nyní dvě osy. Jedná upíná kus v přípravku pomocí ozubeného kola a hřebenu a druhá hýbe posvuvem na vrtání.

Mám tyto dvě otázky:
1) je možné otočit všechny motory na opačnou stranu ?
Jezdí mi tam zrovna vše opačne.
Potřeboval bych otočit na obou osách směr posuvu normálního programu, směr najíždění na referenční koncáky a taky změnit směr odjetí při dotyku koncáku.

2) Je možné předělat logiku vstupů na zapínaní tlačítek A0 a A1 ?
Namísto GND by tam šlo 5V. Ptám se na to z důvodu že mi to tam nedesí, dělá mi to plno problému.

Díky za pomoc a zde je program.
manipulator.txt
(8.95 KiB) Staženo 186 x
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

30. 9. 2014, 1:32

1) referenční snímače sou u sklíčidla nebo vzadu?
teď to máš tak, že když chceš pohyb do + tak jede vozík doleva?
směr se dá změnit tak, že budeš používat zápornou část souřadnic, to když sou snímače na konci lože, pak by to bylo i správně, doprava je x+, doleva x-
když sou snímače u sklíčidla a dá se jet jenom do mínusu, tak je potřeba změnit směr otáčení
int dir = (steps > 0) ? HIGH : LOW;
na:
int dir = (steps > 0) ? LOW: HIGH;
ale to jen v případě, že to vážně jezdí opačně, jinak to rozhodí počítadla

koncákům se přehodí odjezd, místo toho:
digitalWrite(DIR_X_PIN, HIGH);
tohle:
digitalWrite(DIR_X_PIN, LOW);
u os u kterých je to potřeba
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

30. 9. 2014, 1:40

2) logiku přehodíš buď tak, že vypneš pullups:
pinMode(keyStart, INPUT_PULLUP);
na:
pinMode(keyStart, INPUT);
pak ale musíš udělat zapojení tlačítek přes rezitor na gnd
a přehodit v programu LOW na HIGH

nebo použiješ tranzistor před každým input tlačítkem, kde chceš invertovat logiku, tranzistor na společný gnd, vnější signál HIGH na bázy, tlačítko se bude zkratovat stejně jako doteď, ale vstupní signál je +
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

30. 9. 2014, 2:09

jeykey píše:2) logiku přehodíš buď tak, že vypneš pullups:
pinMode(keyStart, INPUT_PULLUP);
na:
pinMode(keyStart, INPUT);
pak ale musíš udělat zapojení tlačítek přes rezitor na gnd
a přehodit v programu LOW na HIGH

nebo použiješ tranzistor před každým input tlačítkem, kde chceš invertovat logiku, tranzistor na společný gnd, vnější signál HIGH na bázy, tlačítko se bude zkratovat stejně jako doteď, ale vstupní signál je +
Udělal bych to přes rezistor. Přehodím v programu LOW na HIGH a zruším ty PULLUP.
Poradíš mi jak velký rezistor ?
Tedy vodič povede z A0 do tlačítka, dále z tlačítka bude rezistor a dále připojený vývod na GND jestli to dobře chápu ?
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

30. 9. 2014, 2:24

tady je to hezky vysvětlený:
http://robotika.vosrk.cz/guide/arduino/lesson03/cs" onclick="window.open(this.href);return false;
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

30. 9. 2014, 2:36

jeykey píše:1) referenční snímače sou u sklíčidla nebo vzadu?
teď to máš tak, že když chceš pohyb do + tak jede vozík doleva?
směr se dá změnit tak, že budeš používat zápornou část souřadnic, to když sou snímače na konci lože, pak by to bylo i správně, doprava je x+, doleva x-
když sou snímače u sklíčidla a dá se jet jenom do mínusu, tak je potřeba změnit směr otáčení
int dir = (steps > 0) ? HIGH : LOW;
na:
int dir = (steps > 0) ? LOW: HIGH;
ale to jen v případě, že to vážně jezdí opačně, jinak to rozhodí počítadla

koncákům se přehodí odjezd, místo toho:
digitalWrite(DIR_X_PIN, HIGH);
tohle:
digitalWrite(DIR_X_PIN, LOW);
u os u kterých je to potřeba
Díky za pomoc u tohoto. Popřehazoval jsem to a už to jezdí správně.
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

30. 9. 2014, 2:39

Ještě mám jednu otázku ohledně snímačů.
Mám tam na výchozích polohák indukční snímače a když to najede výchozí polohu tak se to od něj oddálí.
Ale problikuje to, protože to jestě asi trochu snímá, takže to dělá nepořádek. Jsou to snímače Balluff, snímání 1,5 mm.
Nešlo by třeba do toho programu vložit nějaký malý časovač, že by zajel od toho koncáku dále ?

děkuji ti za pomoc.
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

30. 9. 2014, 2:40

jeykey píše:tady je to hezky vysvětlený:
http://robotika.vosrk.cz/guide/arduino/lesson03/cs" onclick="window.open(this.href);return false;
Super díky !
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

30. 9. 2014, 2:49

to: metsoft

upozorňuju, že program sem netestoval na motorech, takže sem ani nepřenastavoval žádný hodnoty, doladění je na Tobě
valce.txt
(1.72 KiB) Staženo 277 x
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

30. 9. 2014, 2:53

Aktuálně:
20140930_154546.jpg
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

30. 9. 2014, 5:22

tarvisio píše:Ještě mám jednu otázku ohledně snímačů.
Mám tam na výchozích polohák indukční snímače a když to najede výchozí polohu tak se to od něj oddálí.
Ale problikuje to, protože to jestě asi trochu snímá, takže to dělá nepořádek. Jsou to snímače Balluff, snímání 1,5 mm.
Nešlo by třeba do toho programu vložit nějaký malý časovač, že by zajel od toho koncáku dále ?

děkuji ti za pomoc.
můžeš to hodit do cyklu a nechat zopakovat kolikrát potřebuješ,

if (digitalRead(limit_XL_Refer) == LOW) {
Serial.println("Referencni snimac osy X aktivni");
for (int i = 0; i<=400; i++) {
digitalWrite(DIR_X_PIN, HIGH);
digitalWrite(STEP_X_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(STEP_X_PIN, LOW);
if (view == 1) Serial.println("sjizdeni z refer. snimace X");
delay(10);
}

nebo dát na snímač rezistor aby nepouštěl zbytkovej signál,
nebo vypnout vracení se ze snímače,
nebo dočasně zablokovat limits() a dát moveX(kam potřebuješ);
jeykey
Příspěvky: 114
Registrován: 25. 8. 2014, 8:02

30. 9. 2014, 5:28

koukám, že máš skoro hotovo :)
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

30. 9. 2014, 5:44

jeykey píše:
tarvisio píše:Ještě mám jednu otázku ohledně snímačů.
Mám tam na výchozích polohák indukční snímače a když to najede výchozí polohu tak se to od něj oddálí.
Ale problikuje to, protože to jestě asi trochu snímá, takže to dělá nepořádek. Jsou to snímače Balluff, snímání 1,5 mm.
Nešlo by třeba do toho programu vložit nějaký malý časovač, že by zajel od toho koncáku dále ?

děkuji ti za pomoc.
můžeš to hodit do cyklu a nechat zopakovat kolikrát potřebuješ,

if (digitalRead(limit_XL_Refer) == LOW) {
Serial.println("Referencni snimac osy X aktivni");
for (int i = 0; i<=400; i++) {
digitalWrite(DIR_X_PIN, HIGH);
digitalWrite(STEP_X_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(STEP_X_PIN, LOW);
if (view == 1) Serial.println("sjizdeni z refer. snimace X");
delay(10);
}

nebo dát na snímač rezistor aby nepouštěl zbytkovej signál,
nebo vypnout vracení se ze snímače,
nebo dočasně zablokovat limits() a dát moveX(kam potřebuješ);

Díky, funguje to. Dam jsem tam tu první verzi. Musím říct že jsi fakt dobrej !! :wink:
tarvisio
Příspěvky: 283
Registrován: 25. 10. 2013, 3:11

30. 9. 2014, 5:52

Bohužel se ozívám znova, protože jsem zjistil že mi nějak samo násobí program.
Spustím jednou program, tak se motor například pootočí o čtvrt otáčky. Až se program dokončí tak jej spustím znovu a motor se pootočí o půl otáčky.
Děje se to na obou osách.


Posledni program:
manipulator2.txt
(8.71 KiB) Staženo 237 x
Odpovědět

Zpět na „roboti a manipulatory“