Hírek:

Fontos tudnivalók a migrációval kapcsolatban, kérlek olvasd el:

A régi fórumról áthozott hozzászólásoknál a felhasználó neve adatvédelmi megfontolásokból véletlenszerűen generált értékekre lett  lecserélve. Ez akkor tud a valódi értékre visszaállni, ha az adott felhasználó a régi fórumon nyilatkozik, hogy beleegyezik az adatainak az új fórumra továbbításához, majd ezután itt a régi felhasználónevével és email címével regisztrál.
8~20 óra között, 1~30 percen belül megtörténik a jóváhagyás, 30 percenként ellenőrizd email fiókodat (SPAM-ot is) mindenképp kapsz mail-t, a sikeres regisztrácioról, vagy a hibáról és, hogy mi a teendőd.
Nézd meg  "A régi fórumról, az új fórumra költözés útmutatót."
A régi fórumon használt email címmel de más felhasználói azonosítóval érkező regisztrációs kérelmek törlésre kerűlnek.

Main Menu

Arduino

Indította gaben, 2025 február 03, 18:09

Előző téma - Következő téma

Devecz Miklós

Igen, ez kimaradt.

DRV8825, és step-dir vezérléssel kell megoldani.

morvfer7

itt van egy 3 motoros kód UNO pinekkel, CNCshield panellal A4988 vagy DRV8825, mindegy.
Ebben a beállításban x 10x többet fordul mint y, z pedig nem forog




//dir pinek definialasa
#define X_DIR     5
#define Y_DIR     6
#define Z_DIR     7

//step pinek definialasa
#define X_STP     2
#define Y_STP     3
#define Z_STP     4

#define EN        8  //enable

//driver - lepesek
int delayTime=500; //szunet
int stpx=10;// lepesek x motor
int stpy=1;// lepesek y motor
int stpz=0;// lepesek z motor

void step(boolean dir, byte dirPin, byte stepperPin, int steps)

{

  digitalWrite(dirPin, dir);

  for (int i = 0; i < steps; i++) {

    digitalWrite(stepperPin, HIGH);

    delayMicroseconds(delayTime);

    digitalWrite(stepperPin, LOW);

    delayMicroseconds(delayTime);

  }

}

void setup(){

  pinMode(X_DIR, OUTPUT); pinMode(X_STP, OUTPUT);

  pinMode(Y_DIR, OUTPUT); pinMode(Y_STP, OUTPUT);

  pinMode(Z_DIR, OUTPUT); pinMode(Z_STP, OUTPUT);

  pinMode(EN, OUTPUT);

  digitalWrite(EN, LOW);

}

void loop(){

  step(false, X_DIR, X_STP, stpx); //X forog jobbra, ha balra kell, akkor true
  step(false, Y_DIR, Y_STP, stpy); //Y forog jobbra, ha balra kell, akkor true
  step(false, Z_DIR, Z_STP, stpz); //Z forog jobbra, ha balra kell, akkor true

 delay(10); // sebességet itt lehet állítani

}


Devecz Miklós

Kipróbáltam, de van egy kis hibája.

Ez csak egész lépéseknél használható, ha 16 mikrolépést, és a motor 200 lépés/fordulatot is beállítom, akkor már nem igen használható, mivel egyik motor mozgatása után kezdi a másik motor mozgatását.
Nekem a szinkron mozgás lenne elfogadható.

morvfer7

Amit írsz, az nem szerepel a kódban.
Itt csak annyi van, amit írtam.
Kap 10 impulzust az X motor, 1-et az Y motor.
Az 1-et nem lehet jobban darabolni.
A mikrolépések pedig ettől függetlenek, valamint a 200lépés/ fordulat is.

Ha betennéd azt a kódot, amivel próbálod, talán jobban át lehetne nézni, hogy hol a probléma.

000000000

Mivel egy rutin fut csak egymás után sorba igy követik egyást de nem egyszer igy azért látszik a kapcsolási késés (fordulat)  a két művelet kötöz!
Ha több művelet lehet egy idöbbe futtatni párhuzamosan multitask millis fügvényel[#kacsint]

000000000

Eben ott van amit keresel 2 motor kötöti fordulat osztás ...

https://www.youtube.com/watch?reload=9&v=fHAO7SW-SZI

vjanos

Ezzel a megoldással mi a gond, benéztem valamit?
Szerintem a GRBL megoldana minden ilyen időzítési gondot...

PSoft

Lehet, túl...egyszerű?[#nemtudom]

morvfer7

Szerintem a megoldandó feladatnak csak egy része a kérdés, az meg arduino esetében ritkán feltételezhető, hogy valaki a pici arduino panel mellé magával cipel egy számítógépet, amin ki tudja adni azt a parancsot.  :)

PSoft

Ez igaz, de Miklós eddig még, nem írt a "környezetről".:)
Én nem értek hozzá, de szerintem biztos megoldható PC nélkül is, egy zsebben lapuló okos telóról.
(ha nem, majd a hozzáértők...megmondod):)

Devecz Miklós

Nem árulok zsákbamacskát, csak egy tekercselő gépet akarok összehozni.
A saját kútfejemből már megírtam egy progit, ami működik is, de bíztam benne, hogy létezik egy ennél jobb megoldás is.
Az én progim "for-next" és "if" utasításokkal működik.




  

000000000

Ez így nem elég információ a feladat korrekt megoldásához, ugyanis ha a gyorsabban forgó motor szögelfordulásának az idő szerinti első deriváltja nagyobb egy a motorra jellemző értéknél (ez a 2. eset), akkor foglalkozni kell a második deriválttal is a programozás kapcsán.
Csak halkan jegyzem meg, az első esetben 2 db  20 forintos IC-vel is megoldható a feladat pl. 1:1 ... 255 tetszés szerinti n arány beállítási lehetőséggel.

Devecz Miklós

Ebben a felállásban túl egyszerű lett volna. [#wave]

000000000

Azért a deriválási feltétel elágazást vizsgáld meg, mert nagy csalódások fognak érni, ha ezzel nem foglalkozol.[#wave]

gk6nzg8h4

Ezt nem értem...
" ha a gyorsabban forgó motor szögelfordulásának az idő szerinti első deriváltja nagyobb egy a motorra jellemző értéknél"
 = Ez lenne a sebesség (RPM) ugye?

"akkor foglalkozni kell a második deriválttal is a programozás kapcsán"
 = Ez lenne a gyorsulás

Tehát magyarán ha az első motor fordulatszáma nagyobb a névlegesnél (vagy amit el tud érni?), akkor a gyorsulását is figyelembe kell venni a programozáshoz. Jól fordítottam le?
 De ezzel mit akartál mondani?