Jump to content
ELFORUM - Forumul electronistilor

Problema CNC cu ATmega328P (Arduino uno)


Guest savagabriel

Recommended Posts

Guest savagabriel

Buna ziua, Lucrez la un CNC pe care vreau sa il comand cu un microcontroler atmega328, deoarece are un limbaj de programare pe care il inteleg(nu sunt programator). Microcontroler -ul va primii coordonatele pe portul serial de la 'Procesing'. Am incarcat bootloader-ul intr-un micro. atmega328 cu ajutorul placii Arduino uno si am inceput sa programez. Pentru motoare folosesc biblioteca Stepper.h de la Arduino, comandate pe 2 pini, cu ajutorul ULN2003 si tranzistori MOS pe iesire. Totul merge perfect DAR imi merg motoarele pe rand: merge motor x, apoi motor y, apoi motor z. Pierd mult timp si vreau ca motoarele X si Y sa plece amandoua odata! De exemplu daca dau: motorX 200 (pasi,mm,cm,etc) motorY 50motorZ 20 Sa imi plece X si Y deodata, Y se opreste la 50, X continua pana la 200, apoi sa imi plece Z. Nu reusesc sa rezolv aceasta problema nicicum, nu ma prea pricep la programare! Orice ajutor este binevenit.Multumesc.

Link to comment
  • Replies 12
  • Created
  • Last Reply

Top Posters In This Topic

  • matache

    2

  • godFather89

    1

Guest savagabriel

Multumesc de ajutor. Merge cu acest cod cum am precizat mai sus, dar merge doar pentru stepsX,Y,Z pozitiv(ex: 200, 50, 9000). Am incercat multe 'smecherii' sa il fac sa imi mearga si cu negativ(ex: -200, -9000) ca sa imi vina si inapoi axa respectiva, dar nu am reusit inca. Daca o sa rezolv problema o sa postez rezolvarea. Intre timp, daca nu cer prea mult, accept orice rezolvare din partea unui cunoscator. Multumesc.

int totalSteps = max(stepsX, stepsY, stepsZ);for (int i =0; i< totalSteps; i++) {    if (i<stepsX)        StepperX.step(1);    if (i<stepsY)        StepperY.step(1);    if (i<stepsZ)        StepperZ.step(1);}
Sursa: http://arduino.cc/forum/index.php?PHPSE ... c=139008.0
Link to comment
Guest savagabriel

Cineva sugereaza rezolvarea de aici:http://arduino.cc/forum/index.php/topic ... msg1046242

Nu e OK pentru valorile negative.
Da, nu e ok. Nu merge, schimba doar sensul de rotatie.Daca dau 200 el face - 200, si daca dau -200 nu face nimic. Eu am facut 4 functii pe care le apelez cand vreau, in functie de caz:x>0,y>0void motoareP(){ int totalSteps = max(a, b); for (int i =0; i< totalSteps; i++){ if (itotalSteps; i--){ if (i>a) myStepperx.step(-1); if (i>b) mySteppery.step(-1); }}x<0,y>0void motoareXm(){#define sign(x) (((x)<0)?(1):-(1))a=(-1)*a;int totalSteps = max(a, b); for (int i =0; i< totalSteps; i++) { if (i0,y<0void motoareYm(){#define sign(x) (((x)<0)?(1):-(1))b=(-1)*b;int totalSteps = max(a, b); for (int i =0; i< totalSteps; i++) { if (i
Link to comment
Guest beamrider

Pot fi greseli. Nu am incercat codul dar cred ca cel care a scris programul, din repezeala, a uitat sa aplice functia "absolute" lui StepX,Y,Z in if-uri, codul corect fiind de fapt asa:

#define absolute(x) (x>=0?x:-x)#define sign(x) (x<0?-1:1)int totalSteps = max(absolute(stepsX), absolute(stepsY), absolute(stepsZ));for (int i =0; i< totalSteps; i++) {    if (i<absolute(stepsX))        StepperX.step(sign(stepsX));    if (i<absolute(stepsY))        StepperY.step(sign(stepsY));    if (i<absolute(stepsZ))        StepperZ.step(sign(stepsZ));}
Un program frumos, compact si elegant.
Link to comment
Guest savagabriel

Pot fi greseli. Nu am incercat codul dar cred ca cel care a scris programul, din repezeala, a uitat sa aplice functia "absolute" lui StepX,Y,Z in if-uri, codul corect fiind de fapt asa:

#define absolute(x) (x>=0?x:-x)#define sign(x) (x<0?-1:1)int totalSteps = max(absolute(stepsX), absolute(stepsY), absolute(stepsZ));for (int i =0; i< totalSteps; i++) {    if (i<absolute(stepsX))        StepperX.step(sign(stepsX));    if (i<absolute(stepsY))        StepperY.step(sign(stepsY));    if (i<absolute(stepsZ))        StepperZ.step(sign(stepsZ));}
Un program frumos, compact si elegant.
Mie acest cod nu imi merge. Am o intrebare: Poate cineva sa explice acest cod rand cu rand?Ce face functia absolute, functia sign? Daca va uitati in codul scris de mine mai sus conditia din bucla 'for' difera de la caz la caz! Cum pot eu ,pentru aceeasi conditie, sa rulez motorul si in fata si in spate, adica sa am si valori pozitive si negative? Nu imi dau seama ce face functia absolute, functia sign am vazut ca schimba sensul la motor, dar eu cred ca acest cod nu merge din cauza conditiei din 'for'.
Link to comment

Ce face functia absolute, functia sign?

- absolute(x) = modul(x)=|x|- sign(x)=semnul lui x care poate sa fie + sau -Functiile acestea se fac la matematica pina la sfirsitul clasei a IX-a. In programare sunt des folosite.Ideea codului este ca atita vreme cit numarul de pasi prescris pe o axa este mai mare decit numarul de pasi efectiv realizati motorul axei se roteste la stinga sau la dreapta functie de semnul numarului de pasi introdus de tine.Altfel spus, este suficient sa-i dai unui motor numarul de pasi ca modul (numar pozitiv) si semnul rotatiei (inainte sau inapoi) ca acesta sa stie in ce directie sa o ia si cind sa se opreasca.Cele doua functii "absolute" si "sign" te scutesc de o intreaga durere de cap, mai precis, impartirea codului pe cazuri particulare, pe ramuri, cum ai facut tu.Simplu, ai un i care merge de la 0 la nr. maxim de pasi si se incrementeaza mereu cu o unitate la fiecare rulare a buclei for. Nu mai trebuie sa te scarpini cu degetul mic de la piciorul drept la urechea stinga sa-l rulezi pe i de la maxim spre 0 cu step negativ si cite si mai cite complicatii.
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines