
-----------------------------------
sorini
27 Noi 2020 13:20


-----------------------------------
Cum ideea initiala mi-a placut foarte mult, dar pana acum nu m-am jucat deloc cu Arduino, mi-a luat ceva timp sa trec la treaba (asta pt mine nu e ceva nou, proiectele mele, daca nu mor pe drum, se intind pe perioade f mari).
Pentru ca porneam la drum cu un mare handicap, adica experienta 0 vis-&#224;-vis de Arduino, am inceput cu partea mecanica. Cu ceva (mult) timp in urma, am achizitionat de la Bazar, o montura homemade, executata de colegul Katran. Ideea initiala era sa o utilizez ca atare, adica o montura pur manuala, pt observatii strict vizuale. Dupa mici modificari conform propriilor cerinte, eram multumit, mai ales ca procurasem si un trepied, foarte sanatos, de tipul celor folosite in geodezie.
Dar na, omul creatia imperfecta a lui D-zeu, am vrut mai mult; asa ca de ce nu si o motorizare, mai ales ca ideea s-a suprapus cu topicul colegului Remus. (Acum realizez ca a durat mai bine de un an de zile de la gand la finalizare!). Asa ca am trecut la procurare motoare, profile, roti si curele T, etc. Dar oricat trageam de timp, trebuia sa infrunt si &#8220;marele&#8221; impas: Arduino. Toti copii se jucau cu Arduino, fii-mea si-a facut proiectul de licenta cu Arduino, dar eu stateam cuminte, deoparte. Asa ca, ascuns de privirile tuturor, mi-am luat placa si am inceput sa ma joc, efectiv cu programele simple de inceput; aprinde un LED, fa o sirena, si altele. Nu pot sa mint, dar dupa nici o ora de joaca, eram total captivat de noua jucarie, mai ales ca modificam liniile sa faca ce voiam eu.
Cum cizmarul nu are opinci, nici electronistul din mine nu avea chef sa mai realizeze cablaje, asa ca repede am luat si un shield (Dfrobot) dedicat comenzii pt 2 motoare pas cu pas, am montat driverele si am inceput sa studiez joaca cu motoarele.
Cu un motor treaba era simpla, dar cu 2&#8230; Si mai voiam si comanda cu un joystick, pe poz &#8220;0&#8221; sa am numai tracking, altfel cand miscam de mansa, sa am slew cu viteza proportionala cu pozitia acesteia. Am descoperit pana la urma, pe undeva pe net, un program care stia de joystick! Uraaa! L-am mai coafat putin (am gasit unde si cum sa faca tracking) si am obtinut ce voiam de la el. Am atasat si un buton pt slew rapid (trec motoarele din 1/32 in full step).
O mica paranteza: pe Onstep am gasit asemenea programe, dar toate (ce am gasit eu) sunt cu GoTo, afisaje, luminite, GPS si alte asemenea, lucruri care chiar nu le vroiam in proiectul meu. Poate asa ma inzdravenesc sa invat si eu cerul!
Este posibil ca programul ca atare sa nu prezinte interes pt multi colegi de pe forum, impatimiti de GoTo si controlul monturilor din calculator / telefon. Dar ceea ce am obtinut este ceea ce am dorit; o montura cu telecomanda proportionala (termen imprumutat din modelism, alta pasiune a mea) si cu tracking.
In momentul de fata mai am de primit, de la poporul prieten chinez, un joystick (mansa) de la statiile de telecomanda (cele gen Arduino imi par prea mici) si sa pun totul intr-o cutie.
Numai bine,


#include <AccelStepper>

const int jX = A0;  //pin analogic care cite&#537;te valorile pentru X
const int stepX = 6;  //pin digital care trimite semnale STEP către driverul X
const int dirX = 7; //pin digital care trimite semnalul DIRECTION către driverul X
long speedX, valX, mapX;

const int jY = A1;  //pin analogic care cite&#537;te valorile pentru Y
const int stepY = 5;  //pin digital care trimite semnale STEP către driverul Y
const int dirY = 4; //pin digital care trimite semnalul DIRECTION către driverul Y
long speedY, valY, mapY;

const int maxSpeed = 4000;  //conform documenta&#539;iei bibliotecii, această valoare poate fi setată la 4000 pentru Arduino UNO
const int minSpeed = 10; //viteza minima a motorului

const int treshold = 100; //largimea zonei de Stop
long tresholdUp, tresholdDown; //variabile de serviciu pentru sarcina de mai sus

boolean qualified, moveX, moveY, enable;

AccelStepper motorX(1, 6, 7); // pin 6 = step, pin 7 = direction
AccelStepper motorY(1, 5, 4); // pin 5 = step, pin 4 = direction

void setup() {
  motorX.setMaxSpeed(maxSpeed);
  motorX.setSpeed(minSpeed);
  
  motorY.setMaxSpeed(maxSpeed);
  motorY.setSpeed(minSpeed);

  tresholdDown = (maxSpeed / 2) - treshold;
  tresholdUp = (maxSpeed / 2) + treshold;
}

void loop() {  
  valX = analogRead(jX);
  valY = analogRead(jY);

  //mapează valorile citite în func&#539;ie de viteza minimă &#537;i maximă
  mapX = map(valX, 0, 1023, minSpeed, maxSpeed);
  mapY = map(valY, 0, 1023, minSpeed, maxSpeed);

  //efectueaza func&#539;ia de control al motorului
  pilotmotors(mapX, mapY);

}

void pilotmotors(long mapX, long mapY) {

  if (mapX <tresholdDown>= tresholdUp) {
    //motor x inainte
    speedX = map(mapX,  maxSpeed, tresholdUp, maxSpeed, minSpeed);
    moveX = true;
  } else {
    //motor x stop
    speedX = 100; // pasi/sec in zona Stop, pt tracking (+/- pt schimbare sens)
    moveX = true; // pt tracking = true; pt oprit = false
  }

  if (mapY <tresholdDown>= tresholdUp) {
    //motor y inainte
    speedY = map(mapY, maxSpeed, tresholdUp, maxSpeed, minSpeed);
    moveY = true;
  } else {
    //motor y stop
    speedY = 0;
    moveY = false;
  }

  if (moveX) {
    motorX.setSpeed(speedX);
    motorX.run();
  } else {
    motorX.stop();
  }

  if (moveY) {
    motorY.setSpeed(speedY);
    motorY.run();
  } else {
    motorY.stop();
  }
}
