Sari la conținut
ELFORUM - Forumul electronistilor

Problema CNC cu ATmega328P (Arduino uno)


Vizitator savagabriel

Postări Recomandate

Vizitator 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 spre comentariu
  • Răspunsuri 12
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • matache

    2

  • godFather89

    1

Arduino IDE nu are debugger, erorile fiind foarte greu de identificat.

 

O placa Arduino Uno poate fi folosita ca programator pur ISP pentru un Atmega328p, fara sa fie necesar nici un bootloader.

Vezi instructiunile de aici:

http://pdp11.byethost12.com/AVR/ArduinoAsProgrammer.htm

 

Avantajul este ca poti folosi BASCOM (sau alt mediu de dezvoltare) pentru programare, un mediu care are debugger.

Link spre comentariu
Vizitator 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 spre comentariu
Vizitator 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 spre comentariu
Vizitator 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 spre comentariu
Vizitator 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 spre comentariu

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 spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări