
-----------------------------------
dcristi
14 Aug 2014 13:07


-----------------------------------
Am, pentru teste, un NemaXX pe care-l cumparasem pentru motorizare focusser. Am pus pe o placa un L298N, cu tot ce-i trebuie, si m-am apucat sa programez arduino sa accepte comenzi din HC. Nu sunt eu programator dar nici nu ma sperie un float sau o clasa.
Ca librarie folosesc AccelStepper. E buna pentru ca permite viteze foarte mici si poate gestiona mai multe motoare in acelasi timp.
Initial am implementat comenzile de baza, care sa faca HC sa creada ca e legat la MC-urile originale. 

Prima problema a fost cand a trebuit sa separ comunicatia seriala. HC-ul comunica cu MC-urile pe un singur fir, comun intre ALT si AZ. MC-urile nu vorbesc de capul lor si raspund doar la comenzile ce li se adreseaza.
Pe Arduino comunicatia seriala stie ca Rx si Tx sunt pe fire separate. Daca le pui in scurt iese varza in buffere.
Mare minune ca libraria SoftwareSerial e prost implementata si nu poate gestiona Rx si Tx in acelasi timp, prioritate avand Rx. Deci nu mai folosesc hardware serial ci o emulez software.
Viteza reala, in steps/sec, am vazut ca e raportul intre valoarea trimisa de MC in secventa de initializare la comanda :b (InquireTimerInterruptFreq = 19531.25) si valoarea parametrului I (track speed).
Am ignorat encoderele si am folosit pozitia motorului gestionata de librarie.

Motorul se invarte, la viteze mici, exact cum era comandat de HC. Parca se mai auzea cate un sughit din cand in cand, atunci cand HC interoga MC cam la 10 sec.
La viteze mari (goto) sughitul era stranut in toata regula. HC-ul interogheaza positia cam de 2 ori/sec. Motorul se oprea atunci cand pe seriala aparea orice comunicatie. Nu intepenea mult timp dar era inacceptabil. Adio acceleratie si viteza uniforma. Asta din cauza ca in Arduino intreruperile pentru comunicatie blocheaza procesorul si libraria pentru stepper e in pom atunci cand lucreaza seriala.
Cum nu puteam sa opresc HC-ul sa-si faca treaba am mai pus un Arduino pe post de proxy. El comunica cu HC si MC pe seriale separate. Aici emulez un motor care se misca sincron cu cel real si trimit catre HC pozitia lui. Catre MC trimit doar setupul de goto si semnal de start. Cand motorul virtual din proxy se opreste inseamna ca s-a oprit si cel din MC si atunci permit comunicatia transparenta.
Ce s-ar intampla cand motorul cand ar merge pe viteza maxima dar ar aparea ceva care-mi blocheaza procesorul? Nici nu vreau sa ma gandesc la ce ar face inertia tubului de 40Kg.
Pentru asta am mai tras 2 fire se semnal intre proxy si MC. Unul care cere motoarelor sa se opreasca si altul in care se raspunde daca viteza e zero si poate accepta comenzi pe serial. Nu e nevoie de intreruperi si am rezolvat-o usor cu semnale HIGH/LOW.
