----------------------------------- Remus Boldis 02 Apr 2019 07:35 Motorizare axa RA cu motor pas cu pas.Curs pentru incepatori ----------------------------------- Daca dorim sa obtinem un traking simplu pentru a motoriza o montura ecuatoriala manuala, o putem face facil cu componente usor de gasit. Subiectul poate fi abordat chiar si de cei cu cunostinte minime de electronica si fara experienta in microcontrolere. Avem nevoie de un motor bipolar pas cu pas (cu 4 fire), un driver care sa poata duce motorul, o placa de dezvoltare cu Arduino Uno (exista 3 modele, identice functional, difera doar capsula de la microcontroler sau tipul de mufa USB), cabluri de legatura, cablu USB si un laptop pt. programare. ----------------------------------- Remus Boldis 02 Apr 2019 07:40 ----------------------------------- Pentru a simplifica subiectul, prezint componentele alese de mine: https://www.banggood.com/UNO-R3-ATmega328P-Development-Board-For-Arduino-No-Cable-p-964163.html?rmmds=myorder&cur_warehouse=UK https://www.banggood.com/TB6560-3A-CNC-Router-1-Axis-Driver-Board-Stepper-Motor-Drivers-p-921604.html?rmmds=myorder&cur_warehouse=CN https://www.banggood.com/23HS5628-4-lead-Nema-23-Stepper-Motor-2_8A-8mm-Shaft-For-3D-Printer-CNC-Part-p-1362854.html?rmmds=myorder&cur_warehouse=CN ----------------------------------- Remus Boldis 02 Apr 2019 07:42 ----------------------------------- Prezint mai jos legaturile care trebuie facute si pozitia switch. ----------------------------------- Remus Boldis 02 Apr 2019 07:52 ----------------------------------- Trebuie sa instalam programul pentru microcontroler : https://www.arduino.cc/en/main/software Daca folosim windows vom descarca si instala windows instaler. Dupa instalare deschidem programul si vom vedea o fereastra in care putem insera programul pentru arduino. Putem urma indicatiile de aici : https://www.youtube.com/watch?v=5OtMqr5hGjE ----------------------------------- valy 02 Apr 2019 08:03 ----------------------------------- Mai trebuie adaugata si o sursa de alimentare pentru driver. ----------------------------------- Remus Boldis 02 Apr 2019 08:06 ----------------------------------- Programul arata asa : void setup() { pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(13, OUTPUT); digitalWrite(8, LOW); digitalWrite(9, HIGH); digitalWrite(13, LOW); } void loop() { digitalWrite(8, HIGH); digitalWrite(13, HIGH); delay(10); digitalWrite(8, LOW); digitalWrite(13, LOW); delay(500); } Se poate lua cu copy/paste. La ultima linie de cod avem un delay de 500ms. Aceasta cifra va trebui ajustata in functie de reductia pe care o avem la axa RA. Cu setarile actuale motorul face 3200 de micropasi pentru o rotatie completa. ----------------------------------- Remus Boldis 02 Apr 2019 08:20 ----------------------------------- Vom folosi o sursa de 12V pentru alimentarea driverului. Cu toate ca motorul este puternic consumul este mic (in jur de 100 mA). Dupa incarcarea programului, placa cu arduino nu mai are nevoie de laptop. Putem alimenta placa prin mufa USB de la un power bank sau folosim mufa de alimentare a placii pentru a alimenta cu 12V (ca si driverul). Mai multe amanunte aici : https://www.open-electronics.org/the-power-of-arduino-this-unknown/ Mai trebuie sa prevedem montajul cu un intrerupator ca sa putem controla manual montura. Odata gasit obiectul de studiat, alimentam montajul si trakingul va incepe. Pentru montarea propriu zisa putem demonta una din rozetele de la axa RA (la monturile care au doua rozete pentru fiecare axa) si conectam motorul folosind un racord flexibil. Mai adaug cateva linkuri utile: https://www.ebay.com/itm/40pcs-Dupont-10CM-Male-To-Male-Jumper-Wire-Ribbon-Cable-for-Breadboard-Arduino/400985295829?epid=2293421992&hash=item5d5c960bd5:g:8s0AAOSwAL9Uc-OD&frcectupt=true https://www.banggood.com/6PcsPack-56566mm-57-Stepper-Motor-Shock-Absorber-Nwma23-Stepper-Motor-Vibration-Dampers-for-3D-Printer-Reprap-p-1441943.html?rmmds=myorder https://www.banggood.com/GT2-6mm-Closed-Loop-Timing-Belt-2GT-6-280400610852mm-Rubber-Synchronous-Belt-p-1180257.html?rmmds=myorder&ID=515971&cur_warehouse=CN https://www.banggood.com/162030T-GT2-Aluminum-Timing-Drive-Pulley-For-DIY-3D-Printer-p-1001266.html?rmmds=myorder&ID=516463&cur_warehouse=CN https://www.banggood.com/GT2-Timing-Belt-Pulleys-60-Tooth-60T-8mm-Bore-For-RepRap-Prusa-Mendel-3D-Printer-p-1027562.html?rmmds=search&cur_warehouse=CN https://www.ebay.com/itm/Flexible-Shaft-Coupling-Joint-Stepper-Motor-Coupler-Connector-3-10mm-All-Size/153132080540?hash=item23a7621d9c:m:mf3Q6A8KUC9VoqJ-qHGx3Cw&frcectupt=true Putem gasi componente si in Romania, dar trebuie sa ne interesam de caracteristicile driverelor si a motoarelor (pentru a cabla corect). Pentru monturi mai mici putem folosi cu succes motoare Nema 17 (va trebui sa refacem setarile de curent prin motor la valorile recomandate), care sunt mai ieftine si se gasesc usor in Romania (trebuie sa identificam corect cele 4 fire, notate cu A+, A-, B+, B-). Exista drivere iefnine de mici dimensiuni, dar nu le recomand (au radiator prea mic si un reglaj imprecis al curentului prin motor). Avand in vedere ca viteza de urmarire nu este aceiasi pentru Luna sau stele, am sa testez un montaj cu 2 viteze (folosind un intrerupator cu 3 pozitii - fara taking, viteza selenara, viteza stelara). Si iata montajul final : ----------------------------------- nobody 02 Apr 2019 10:25 ----------------------------------- 'Running current' e setat la 3A, iar 'stop current' la 20% ? ----------------------------------- Remus Boldis 02 Apr 2019 10:41 ----------------------------------- Da. Si driverul si motorul sunt reci si silentioase. ----------------------------------- starbuck 02 Apr 2019 11:14 ----------------------------------- Am facut un montaj asemanator de tracking prin toamna lui 2015 cu Arduino Mega 2560 si Big Easy Driver folosind cu succes motoarele de tracking pentru EQ5. Im pare rau ca din cauza unui accident hardware din pacate nu mai am sursele de cod. In prezent intentionez un alt proiect asemanator, mult optimizat raportat la experienta anterioara. Majoritatea chestiunilor mentionate aici sunt utile si suficiente pentru demararea unui proiect. In continuare mi-as permite unele completari: - trebuie avut grija la reglarea analogica (din potentiometru) sau digitala (din cod) a curentului de iesire a driver-ului. O valoare prea mare sau cea maxima (daca e setata implicit) poate produce vibratii neplacute, de aceea trebuie testate valori cat mai apropiate de limita acestor vibratii in functie de configuratia existenta a motoarelor; - bucla de cod (loop) este suficienta daca se doreste o logica simpla de comanda, in cazul unui cod mai complex (in plus cu procesare clock, gps, giroscop, accelerometru, afisare display extern, etc) este necesara folosirea unuia sau a mai multor timere (vezi librariile dedicate integrate), in caz contrar vor avea loc desincronizari si/sau blocaje; - in loc de folosirea unor componente electromecanice de actionare de tip buton sau potentiometru pentru reglarea vitezelor de lucru pentru tracking (eu la viteza maxima a motoarelor am reusit la limita rabdarii chiar si un mod goto minimal) am folosit in prima faza selectia cu menu si afisarea in consola serial monitor a IDE -ului (mediul de dezvoltare) Arduino, urmand ca mai tarziu sa cuplez si un display TFT cu butoanele aferente (speed up and down, directie pentru axele RA si DEC); Pentru cei pasionati de microprogramare acesta poate fi un proiect foarte atractiv (o cautare pe net ofera deja cateva variante implementate), cu multe modalitati facile de implementare (necesitand cunostiinte minime de electronica la nivel de compatibilitate a componentelor implicate) in functie de nevoile si resursele fiecaruia. Pentri cei interesati sa iasa cu produse specifice pe piata am gasit acest link util: https://www.postscapes.com/forum/arduino/47-if-arduino-is-for-prototyping-how/when-do-you-make-the-actual-product/ ----------------------------------- Erwin 02 Apr 2019 11:40 ----------------------------------- Foarte bună ideea acestui topic, deși pentru Arduino&stuff există tone de informații pe net, prezentarea unor aplicații simple și cu aplicabilitate directă este un bun început pentru amatori, scutindu-i de o căutare fără succes sau de eventuale eșecuri. Desigur, o implementare completă a unei motorizări de montură presupune mai mult efort și financiar și tehnic pe partea de hardware, pe partea de software există OnStep, opensource, despre care s-a discutat și pe alt topic: https://groups.io/g/onstep Chiar dacă există soluții de-a gata, amatorul ATM-ist își poate exercita pasiunea implementând propria variantă, descoperind pas cu pas toate secretele punerii lor la punct și chiar de a îmbunătăți aceste soluții. ----------------------------------- Remus Boldis 02 Apr 2019 13:36 ----------------------------------- Pentru cei curiosi revin cu cateva detailari. Placa de dezvoltare are 14 pini digitali si 6 pini analogici, ce pot fi definiti prin program ca intrari sau iesiri. Cei digitali recunosc o valoare low sau high (0V sau 5V), cei analogigici pot citi o valoare pseudoanalogica (definita pe 10 biti, adica 1024 de valori intre 0 si 5V). In cazul de fata sunt folositi doar pini digitali, driverul pentru motor avand nevoie de 2 pini de comanda. Un pin pentru comada directiei, in cazul de fata pinul 9 si un pin pentru a comanda efectuarea unui pas, in cazul de fata pinul 8. Pinul noua sta tot timpul pe high, pt. ca la aplicatia de fata motorul se-nvarte intr-o singura directie, iar pinul 8 trece succesiv prin high si low in cadenta cu care vrem sa miscam motorul. Driverul, pe de alta parte, stie sa faca nu doar pasi intregi ci si fractiuni de pasi, dupa cum setam noi (in cazul de fata e setat pe 1/16 pas). Programul pentru arduino are in esenta doua parti, o parte evidentiata cu void setup() { si o parte denumita void loop() { , care va fi executata in bucla, atat timp cat microcontrolerul este alimentat. In void setup sunt definiti pinii cu care lucram (8, 9, 13) si starea lor initiala. Apare in plus pinul 13 care este legat intern la un led rosu de pe placa si pe care l-am folosit pentru a comanda acest led in ritmul in care se da comada pentru pas (e o indicatie vizuala a functionarii). Si inca ceva - nu umblati la microintrerupatoarele de pe placa driverului decat cu alimentarea oprita. ----------------------------------- nobody 02 Apr 2019 15:31 ----------------------------------- Sper sa nu deranjez, doar doresc sa aduc niste clarificari. Pinii de la Arduino UNO au functionaliti multiple, in functie de cum sunt definiti la initalizare. Cei asa zisi analogici (A0-A5) pot fi folositi analogic doar ca intrari (ADC-10 bit), dar si digital ca intrari/iesiri. Cei "digitali" notati cu PWM (semnul ~, adica Digital 3, 5, 6, 9, 10, 11) pot fi folositi si ca iesiri pseudo-analogice PWM (Pulse-Width Modulation) la frecvente de 490/980 Hz si 256 de valori. Pun si o schema aproape completa (lipseste semnalul OC0B de la pinul Digital 5). ----------------------------------- Remus Boldis 02 Apr 2019 15:56 ----------------------------------- Aici e o descriere buna a pinilor pentru cei interesati : http://roboromania.ro/2016/11/15/descrierea-pinilor-la-placa-arduino-uno-r3/ Cu titlu de amanunt, un semnal PWM este un semnal cu factor de umplere variabil, fiind mai greu de asimilat cu un semnal analogic (semnalul este dreptunghiular, nivelul semnalului variaza intre 0 si maxim, variind doar factorul de umplere). ----------------------------------- valy 02 Apr 2019 16:14 ----------------------------------- Aici e o descriere buna a pinilor pentru cei interesati : http://roboromania.ro/2016/11/15/descrierea-pinilor-la-placa-arduino-uno-r3/ Tot ca o paranteza: lipseste cuvantul "input" la pinii analogici, textul de pe wiki contine "..The Uno has 6 analog inputs, labeled A0 through A5, each of which provide 10 bits of resolution.." ----------------------------------- nobody 02 Apr 2019 17:15 ----------------------------------- Si documentatia oficiala: Analog Input Pins While the main function of the analog pins for most Arduino users is to read analog sensors, the analog pins also have all the functionality of general purpose input/output (GPIO) pins (the same as digital pins 0 - 13). analogWrite(): Writes an analog value (PWM wave) to a pin. On most Arduino boards (those with the ATmega168 or ATmega328P), this function works on https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/ Asta este terminologia (cam nefericita) inventata de cei de la Arduino. Atmel foloseste General Digital I/O + Alternate Port Functions (ADC input channel, Timer/Counter with PWM etc.). ----------------------------------- Remus Boldis 02 Apr 2019 17:49 ----------------------------------- Sper ca aceste amanunte sa nu sperie pe nimeni. Pana la urma putem atinge scopul prezentat fara multe amanunte. Am incercat o abordare cat mai simpla si accesibila tuturor. Desi ma joc in electronica de 30 de ani si eu am ezitat mult pana sa incerc microcontrolerele. Dar aplicatia de fata este una pentru care merita folosit Arduino si as spune ca este cea mai simpla abordare. ----------------------------------- mihai leahul 02 Apr 2019 19:26 ----------------------------------- Remus Boldis, toata stima pentru initiativa! :D Si da, pare ca se complica chestiunea, eu unul m-am panicat! :D Rog sa tineti discutia, daca se poate, la un nivel simplu si orientat pe subiect ( Motorizare axa ) . Poate nu ne pierdeti pe traseu, intre 2 pini! :lol: Spor! ----------------------------------- Remus Boldis 02 Apr 2019 19:50 ----------------------------------- Toata informatia necesara e concentrata la inceputul topicului si poate fi folosita cu succes pentru proiect. Mai pun odata sketch-ul (programul Arduino) Se poate lua cu copy/paste si pune in fereastra softului de programare Arduino. void setup() { pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(13, OUTPUT); digitalWrite(8, LOW); digitalWrite(9, HIGH); digitalWrite(13, LOW); } void loop() { digitalWrite(8, HIGH); digitalWrite(13, HIGH); delay(10); digitalWrite(8, LOW); digitalWrite(13, LOW); delay(500); } ----------------------------------- Remus Boldis 02 Apr 2019 20:48 ----------------------------------- Dupa care ramane sa dam upload (cu sageata de langa bifa din stanga). Ledurile de pe placa Arduino vor clipi toate (semn ca se inacarca programul) si microcontrolerul va trece la executarea programului (sa nu uitam sa conectam placa Arduino cu calculatorul prin cablul USB). ----------------------------------- Erwin 03 Apr 2019 07:17 ----------------------------------- Înainte de a putea face Upload e bine să verificăm în meniul Tools dacă portul USB este conectat și modelul plăcii este ales corect din listă. Se pot folosi clone și tipuri diferite de implementări hardware fără prea multă bătaie de cap, majoritatea fiind compatibile, există o listă lungă deja de dispozitive care pot fi programate și utilizate la fel ca un Arduino Uno. Un alt aspect important la care trebuie să avem grijă: să nu se întrerupă comunicația USB (să folosim un cablu și un port bun) în timpul Upload-ului pentru că există riscul ca microcontrolerul să rămână blocat într-o stare intermediară și să nu mai putem pe urmă să-l programăm. Pentru a-l reseta și reveni la starea normală se ține apăsat pe butonul Reset aflat pe placă (sau legăm noi un buton la pinul potrivit în cazul altor plăci) în timp ce pornim alimentarea. ----------------------------------- starbuck 03 Apr 2019 19:17 ----------------------------------- Cum spuneam despre proiectul nou de tracking intentionat am comandat componentele si astazi mi-au sosit, clone compatibile desigur (dupa cum mentiona si Erwin anterior si ceva mai ieftine decat cele originale - asta e, avantajele platformei deschise), mai exact o clona de Arduino Uno R3, respectiv un driver MP6500 (clona A4988). Le-am conectat si functioneaza bine. ----------------------------------- Remus Boldis 03 Apr 2019 20:42 ----------------------------------- Driverele de tip A4988 merita folosite doar pentru teste, sunt iefine si accesibile dar pentru ceva definitiv, nu imi plac deloc. Au un radiator minuscul, fara un sistem mecanic de prindere, pinii de pe placa te-mpiedica sa pui un radiator mai mare, reglajul de curent este imprecis si neplacut cu semireglabilul ala minuscul. Pentru un proiect serios merita achizitionate driverere mai serioase. Cele prezentate de mine sunt de nota 10, au un radiator mare, tin curenti mai seriosi fara sa se incalzeasca, reglajele de curent si fractiuni de pasi se fac din switch-uri si de fapt au un pret mic (pe siteurile chinezesti). ----------------------------------- starbuck 03 Apr 2019 21:12 ----------------------------------- Da, pentru teste este intentionat acel driver si in general e bine sa nu uitam ca platforma Arduino este conceputa in primul rand pentru prototipizare, in nici un caz pentru uz industrial sau regim de anduranta. Chiar si asa pentru fiecare componenta in functie de parametrii de functionare utilizatorul trebuie sa decida daca cerintele de compatibilitate si functionare ale aplicatiei/montajului sunt satisfacute. Daca voi ajunge la un nivel de realizare cel putin satisfacator pentru cele 5 sau 6 kg de sarcina pe montura abia atunci (avand in vedere dinamica evolutiei domeniului) ma voi gandi daca se merita efortul pentru componente mai fiabile, cel putin pentru drivere. Cred ca e foarte util faptul ca ati mentionat acest lucru si va multumesc pentru precizari. ----------------------------------- Armand Popa 01 Iun 2019 11:01 ----------------------------------- Salut Am o montura Meade LXD75 goto (eq5) la care e stricat partea de goto. Initial am zis ca voi folosi motorul Ra pt urmarie si doar pt vizual in prima faza, dar cand am scos motoarele am constatat ca ele sunt motoare 2 fire deci nu par a fi motoare pas cu pas. Motorul se potriveste perfect pe montura , are reductie , roti dintate tot ce trebuie l-as folosi daca as putea Fiind motor dc, il pot face motor de urmarire cumva? Ms ----------------------------------- Remus Boldis 01 Iun 2019 15:44 ----------------------------------- Teoretic da. Poti comanda in inpulsuri, dar nu merge prea bine. Eu nu am fost foarte multumit, nu obtii un cuplu ca la cele pas cu pas. Daca demultiplicarea e foarte mare, ca sa poti folosi motorul la o turatie apropiata de cea nominala, ar merge. ----------------------------------- Armand Popa 01 Iun 2019 16:26 ----------------------------------- motoarele fiind de la un sistem goto (care presupun ca si urmarea) teoretic ar trebui sa mearga. Inteleg ca ai incercat cu motor dc. Ce rezultate a dat? ----------------------------------- Remus Boldis 01 Iun 2019 16:44 ----------------------------------- Folosind o comanda PWM se poate varia viteza. https://www.banggood.com/DC-6-60V-30A-Speed-PWM-Controller-Adjustable-Motor-Controller-with-Digital-Display-p-1289892.html?rmmds=myorder&cur_warehouse=CN ----------------------------------- nobody 02 Iun 2019 16:33 ----------------------------------- Motoarele alea DC mai mult ca sigur au si encodere pe ax (disc crestat cu senzor optic). Fara encodere nu poti mentine turatia constanta la acet tip te motor. Pentru asta iti trebuie un driver mai special. ----------------------------------- Remus Boldis 16 Oct 2019 16:05 ----------------------------------- Intre timp am mai testat comanda motorului folosind un encoder optic . Folosind encoderul putem duce montura la pozitia dorita, dupa care activam trakingul. Am trecut la Arduino Nano pentru ca e mai mic, consuma mai putin si am gasit la pret mic shielduri care ofera conectoare cu surub, pentru o solutie definitiva. ----------------------------------- Remus Boldis 16 Oct 2019 16:51 ----------------------------------- O poza de ansamblu. ----------------------------------- Erwin 16 Oct 2019 21:54 ----------------------------------- Ce tip de encoder este? Se pierd pași la viteză mare de poziționare? ----------------------------------- starbuck 16 Oct 2019 22:17 ----------------------------------- Problema asta mi-am pus-o si eu. Din cate stiu la motorul DC in acest caz se pierd pasi inevitabil dat fiind inertia ansamblului preconizata la cateva kilograme forta bune si banuiesc ca franarea ar trebui comandata treptat din motor cu o viteza redusa sau descrescatoare inainte de pozitia finala. Volumul de calcul pare destul de mare in acest caz deoarece intra in discutie si masa ansamblului mobil. Poate niste parametrii setati empiric din teste pentru fiecare greutate ar rezolva mai usor problema. Ar mai fi varianta cu schimbarea sensului de rotatie la pozitia finala dar ar putea fi prea solicitanta pentru motor. Eventual o combinatie intre aceste doua metode ar putea asigura o franare lina. ----------------------------------- Remus Boldis 16 Oct 2019 22:17 ----------------------------------- E un encoder optic (pentru fiabilitate) - 360 de pulsuri pe rotatie, dar se poate folosi un encoder obisnuit, care e foarte ieftin. Daca invarti foarte repede de encoder, desigur ca arduino nu va tine ritmul, dar e nesemnificativ, encoderul e folosit pentru a deplasa montura intr-o directie s-au alta pana la pozitia dorita. Encoderul da comanda de miscare, nu de pozitie. Daca am avea nevoie de afisarea pozitiei am putea afisa pasii motorului. Folosind fractiuni de pasi deplasarea e destul de lenta si nu cred e o problema oprirea (mai ales ca motorul actioneaza printr-o reductie). ----------------------------------- starbuck 16 Oct 2019 22:43 ----------------------------------- Asa este, teoretic suna bine dar avem un motor DC ales tocmai pentru a misca mai rapid sarcini relativ mari comparativ cu stepperul. La stepper dat fiind viteza mai mica este nevoie de luarea in calcul suplimentara si a timpului de pozitionare pentru acuratetea pozitionarii. Acum avand viteza considerabil mai mare a motorului DC comparativ cu motorul stepper s-a pus problema fireasca a franarii generata de natura constructiva unipolara a motorului DC cu capacitate mult mai slaba de franare comparativ cu motorul stepper bipolar. ----------------------------------- Remus Boldis 16 Oct 2019 22:51 ----------------------------------- Toate montajele prezentate in acest topic sunt cu motoare pas cu pas (NEMA 23 - un motor foarte puternic). Pozitionarea se face de catre operator exact ca la orice montura manuala (cu deosebirea ca invartim un encoder, nu direct rotita monturii). Dupa pozitionare, pornim trakingul (partea aceasta inca nu am implementat-o). Ideia e sa conectez motorul la una din rotitele monturii manuale (in cazul meu Skytee 2). ----------------------------------- starbuck 16 Oct 2019 23:16 ----------------------------------- Eu m-am referit la testele mentionate in postarile anterioare cu motor DC si am inteles ca pentru el se folosea encoderul, oricum o combinatie obligatorie in acest caz. Desigur, in cazul motorului stepper mentionat oficial pentru implementare franarea n-ar trebui sa fie o problema, e clar ca nu avem viteze de ventilator :). Oricum am considerat util de mentionat la ce sa ne asteptam atunci cand alegem pentru implementare un motor DC sau stepper deoarece ambele tipuri de motoare sunt folosite la motorizarea monturilor (desigur, franarea mentionata de mine se refera la miscarea GO TO, nu de tracking). ----------------------------------- Remus Boldis 17 Oct 2019 13:40 ----------------------------------- Daca doriti sa incercati Arduino Nano, va trebui sa intrati la Tools si sa setati Arduino Uno, portul com 4 (pe alte calculatoare e posibil sa apara alte porturi) si ATmega328P (Old Bootloader). Programul de comada motor folosind un encoder (se ia cu copy-paste) : /*******Interrupt-based Rotary Encoder Sketch******* by Simon Merrett, based on insight from Oleg Mazurov, Nick Gammon, rt, Steve Spence */ const int pinA = 2; // Our first hardware interrupt pin is digital pin 2 const int pinB = 3; // Our second hardware interrupt pin is digital pin 3 const int stepPin = 7; // pin for pulsing a step to the stepper driver const int dirPin = 6; // pin for setting stepper driver direction const bool CW = 0; // clockwise rotation direction (viewed from encoder body out toward shaft--like CNC Machines) const bool CCW = 1; // counter-clockwise rotation direction (see above, these directions appear reverse when viewed from shaft side) volatile byte aFlag = 0; // let's us know when we're expecting a rising edge on pinA to signal that the encoder has arrived at a detent volatile byte bFlag = 0; // let's us know when we're expecting a rising edge on pinB to signal that the encoder has arrived at a detent (opposite direction to when aFlag is set) volatile byte reading = 0; //somewhere to store the direct values we read from our interrupt pins before checking to see if we have moved a whole detent volatile long encoderPos = 0; //this variable stores our current value of encoder position. Change to int or uin16_t instead of byte if you want to record a larger range than 0-255 volatile int encoderPosOld = 0; //stores the last encoder position value so we can compare to the current reading and see if it has changed (so we know when to print to the serial monitor) volatile bool encoderDir = CW; // stores the direction of rotation clockwise = 0 or counter-clockwise = 1 void setup() { pinMode(pinA, INPUT_PULLUP); // set pinA as an input, pulled HIGH to the logic voltage (5V or 3.3V for most cases) pinMode(pinB, INPUT_PULLUP); // set pinB as an input, pulled HIGH to the logic voltage (5V or 3.3V for most cases) pinMode(stepPin,OUTPUT); pinMode(dirPin,OUTPUT); attachInterrupt(0,PinA,RISING); // set an interrupt on PinA, looking for a rising edge signal and executing the "PinA" Interrupt Service Routine (below) attachInterrupt(1,PinB,RISING); // set an interrupt on PinB, looking for a rising edge signal and executing the "PinB" Interrupt Service Routine (below) Serial.begin(115200); // start the serial monitor link } void PinA() { cli(); //stop interrupts happening before we read pin values reading = PIND & 0xC; // read all eight pin values then strip away all but pinA and pinB's values if(reading == B00001100 && aFlag) { //check that we have both pins at detent (HIGH) and that we are expecting detent on this pin's rising edge encoderPos --; //decrement the encoder's position count encoderDir = CW; digitalWrite(dirPin, encoderDir); digitalWrite(stepPin, HIGH); //delayMicroseconds(5); digitalWrite(stepPin, LOW); if (encoderPos <2147483648L> 2147483647L) { encoderPos = 0L; } bFlag = 0; //reset flags for the next turn aFlag = 0; //reset flags for the next turn } else if (reading == B00001000) aFlag = 1; //signal that we're expecting pinA to signal the transition to detent from free rotation sei(); //restart interrupts } void loop() { if(encoderPosOld != encoderPos) { Serial.print(encoderPos); if(encoderDir == CW) Serial.println(" CW"); if(encoderDir == CCW) Serial.println(" CCW"); encoderPosOld = encoderPos; } } ----------------------------------- Erwin 20 Oct 2019 20:53 ----------------------------------- Aha, am înțeles acum. Ar trebui să pui o manivelă la roata de acționare. :) Acest mod de lucru se potrivește mănușă pentru motorizarea unui focuser, desigur, cu afișarea pașilor este mai indicat. Eu am pus 2 butoane push la motofocuser pentru că mi s-a părut obositor să învârt de rotiță. Butoanele push le-am programat astfel: la început e o buclă de 5 sau 10 pași cu delay mare, dacă butonul e apăsat în continuare atunci delay-ul scade pentru încă 100 de pași apoi nu mai există delay. Am așadar 3 viteze de rotație diferite, doar ținând apăsat un buton. Al doilea buton face același lucru, în direcția opusă. ----------------------------------- starbuck 20 Oct 2019 21:01 ----------------------------------- La motofocuser sunt mult mai bune butoanele externe prin cablu sau bluetooth deoarece se evita vibratiile provocate de atingerea cu mana mai ales la magnificatii mari. La montura e clar ca actionarea poate fi oricum desi personal m-am obisnuit prin actionare externa in cazul motorizarii. ----------------------------------- Erwin 21 Oct 2019 21:23 ----------------------------------- Motofocuserul are unitatea de comandă separat, pe cablu. ----------------------------------- Remus Boldis 21 Oct 2019 22:30 ----------------------------------- La motofocuser ar fi interesanta comanda prin telecomanda radio sau infrarosu, ca sa scapi de un cablu urat si incomod. Dupa ce vine frigul si stam mai mult prin case, vreau sa fac un motofocuser telecomandat. La aceasta aplicatie motorul pas cu pas nu mai e o necesitate, un motor clasic de curent continuu dotat cu reductie ar face o treaba buna. ----------------------------------- Erwin 22 Oct 2019 06:34 ----------------------------------- Motorul pas cu pas permite poziționarea precisă, fără encoder, la același plan focal, eventual compensat cu temperatura. De asemenea, pentru că se folosește Arduino Nano sau Micro se poate lega la calculator prin USB. Eu l-am făcut inițial doar pentru astrofoto dar la cassegrain care este mare și vibrează ușor pe montură este util și la vizual. Desigur, la vizual merge și cu motor de CC și cu telecomandă radio, cred că merge una de la o jucărie :). ----------------------------------- Remus Boldis 22 Oct 2019 10:28 ----------------------------------- Telecomanda e deja luata, de la poporul prieten, chinez. ----------------------------------- Remus Boldis 26 Oct 2019 11:55 ----------------------------------- In procesul de copiere al programului apare o eroare. Pentru cei interesati voi oferi un link cu sursa programului. https://drive.google.com/file/d/0B--LGPrqJ1QzLUxVaFNBMnhRaVk/view ----------------------------------- starbuck 27 Oct 2019 11:17 ----------------------------------- O completare utila este consultarea paginii producatorului in caz ca se folosesc diverse alte modele de componente (in cazul acesta, encoderul). E posibil sa fie proceduri de initializare, acces, control si temporizare specifice fiecarui produs furnizate de producator tocmai in scop de utilizare eficienta garantata care altfel ar consuma timp inutil si ar putea avea probleme de functionalitate in cazul determinarii lor empirice. ----------------------------------- Remus Boldis 27 Oct 2019 14:05 ----------------------------------- Nu e nevoie de nici o optimizare. Pentru cei care vor sa cumpere componentele, pot posta linkurile. Merge si cu un encoder mecanic, care e mult mai ieftin. Trebuie doar cunoscute iesirile encoderului. Pentru download program se deschide intai softul arduino ide si se da donload. La sfarsitul downlodarii se va deschide direct o pagina cu programul incarcat. Dupa care se poate incarca in arduino. ----------------------------------- starbuck 27 Oct 2019 15:18 ----------------------------------- Sigur, apreciez mult efortul dumneavoastra de a oferi o solutie deja testata si impartasesc entuziasmul dumneavoastra pentru acest domeniu fascinant ! Ceea ce intentionam era doar o recomandare de abordare ulterioara atat in cazul folosirii de alte modele de componente cat si in cazul modificarilor de infrastructura care pot interveni. Acestea pot fi atat la nivel software in cazul unei noi versiuni a platformei de dezvoltare Arduino si a eventualelor librarii auxiliare cat si la nivel hardware unde multe componente sunt retrase de pe piata si inlocuite cu versiuni noi. Daca cineva va citi si va dori sa aplice acest curs peste 2 sau 3 luni va fi foarte posibil sa intalneasca astfel de cazuri. In cazurile mentionate compatibilitatea codului cu noile modificari poate impune schimbari de diverse grade de complexitate iar solutia in acest caz este consultarea paginii producatorului mentionata anterior unde codul de comanda este de obicei intretinut din acest punct de vedere. Alte solutii de adaptare si intretinere se pot gasi pe forumurile de specialitate unde multi din dezvoltatorii firmelor producatoare sunt membrii activi si pot oferi mai multe detalii despre schimbarile survenite, mai ales in cazul unor arhitecturi destul de complexe de interconectare a componentelor Arduino. ----------------------------------- sorini 27 Noi 2020 12: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-à-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 “marele” 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… Si mai voiam si comanda cu un joystick, pe poz “0” 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 const int jX = A0; //pin analogic care citeș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ș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ț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ție de viteza minimă și maximă mapX = map(valX, 0, 1023, minSpeed, maxSpeed); mapY = map(valY, 0, 1023, minSpeed, maxSpeed); //efectueaza funcția de control al motorului pilotmotors(mapX, mapY); } void pilotmotors(long mapX, long mapY) { if (mapX = 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 = 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(); } } ----------------------------------- Remus Boldis 27 Noi 2020 13:08 ----------------------------------- Felicitari ! Joaca cu arduino e interesanta si merita facuta. Intre timp am experimentat motorizarea ambelor axe si comanda prin telecomanda in infrarosu (astfel ca nu mai ai fire ce atarna pe langa telescop). Pentru axa RA nu am testat inca trecerea de la micropasi (necesari pentru traking) la pasi normali pentru deplasarea rapida. Aveam nevoie de alt driver (care intre timp a venit, dar nu am reluat proiectul pana nu termin cu noua locatie a atelierului de electronica). Altfel insa functioneaza bine si ambele axea pot fi comandate in infrarosu si dupa pozitionarea corecta se trece la traking. ----------------------------------- iulian90 28 Noi 2020 20:16 ----------------------------------- Buna seara tuturor. :) De ceva vreme am trecut si eu la utilizarea de microcontrolere Arduino si sunt fascinat de ce sunt in stare aceste circuite, ce pot fi programate pe PC in multe moduri. :) De curand am imbunatatit montura ecuatoriala Bresser Messier Exos 1, inlocuind vechea motorizare (din ultima imagine de jos), care era compusa din motor pas cu pas cuplat printr-un angrenaj din doua roti dintate din plastic ce nu erau de calitate si generau eroare periodica mai mare decat cea specifica monturii si un circuit de comanda a motorului format din driver Pololu A4988 si circuit NE 555. Numai ca frecventa generata de circuitul NE555 nu ramane perfect constanta ,ci se modifica odata cu temperatura mediului ambiant (din cauza componentelor R-C, adica rezistente , potentiometri si condensatori, care formeaza baza de timp a acestui circuit si care au o toleranta destul de mare la variatii de temperatura) si la randul sau modifica viteza de tracking, astfel ca mereu trebuia sa reglez viteza de tracking si nu era prea placut. Asa ca am inlocuit totul, de la motor pas cu pas ,ca avea o roata cu dinti inclinati care era greu de scos de pe ax, peste care pusesem roata dintata din plastic (cea mica alba din ultima imagine), rotile dintate din plastic si pana la circuitul de comada. In locul motorului respectiv am pus un alt motor pas cu pas primit de la Erwin, care este mai micut compact, are o impendanta mai mare (4 ohmi, fata de 2 ohmi cat avea vechiul motor) si este mai silentios. Rotile dintate din plastic le-am inlocuit cu un sistem de doua fulii dintate GT2 din aluminiu care sunt mult mai calitative si o curea dintata GT2 (primele imagini). Una din fulii, mai mare, cu 60 dinti, am montat-o pe axul melcului de pe axul R.A. al monturii, cealalta fulie mai mica, cu 20 dinti, am montat-o pe axul motorului. Raportul de transmisie este de 3:1 iar raportul de transmisie al monturii de la melc la axul RA este de 144:1, deci in total ar fi 432:1 , cu tot cu sistemul de fulii si curea dintre motor si melcul RA. Circuitul de comanda al motorului l-am inlocuit total, cu un circuit format dintr-un microcontroler Arduino Nano v3 si driver Pololu DRV 8825 care este mai bun decat vechiul driver Pololu A4988 (care intre timp s-a defectat cand l-am testat pe Arduino, dupa ce a functionat bine aproape 7 luni cu circuitul NE 555). Driverul DRV 8825 ,ce il am tot de la Erwin, este capabil de a functiona cu micropasi de 1/32 dintr-un pas normal al motorului, asa ca l-am setat sa functioneze la 1/32 micropasi, pentru un tracking mai lin. Placa Arduino am configurat-o in asa fel incat sa functioneze impreuna cu o telecomanda cu fir pentru comanda motorului atunci cant pozitionez telescopul pe tinta,fiind prevazuta cu 8 butoane (din care numai 4 sunt functionale deocamdata) avand mai multe viteze: -viteza normala de tracking (viteza siderala) atunci cand nu apas niciun buton de pe telecomanda. - FAST RA +, FAST RA -, viteza mare pentru pozitionare grosiera a telescopului. - RA + , RA - , pentru pozitionare fina a telescopului. Celelalte 4 butoane pentru axa DEC (declinatie) de pe telecomanda inca nu sunt conectate la placa Arduino, intrucat axa DEC inca nu am motorizat-o, desi aveam de gand, daca nu aveam ghinionul de a se defecta driverul A4988, putand sa il folosesc pe axa DEC cu celalalt motor pas cu pas, dar asta e. In viitorul apropiat o sa motorizez si axa DEC a monturii. :) Mai jos am pus si codul de programare a microcontrolerului Arduino, care pare destul de complicat la prima vedere, dar nu e chiar asa daca inveti si intelegi cum functioneaza. :) Am mai pus si o schema electrica a circuitului de comanda a motorului RA. Am facut o proba in sarcina ,cu telescopul si contragreutatea montata pe montura, in casa ce-i drept, si se comporta bine la prima vedere, dar adevaratul test va fi la obiecte ceresti, cand va mai fi cer senin, deocamdata nu am mai avut ocazii decat pe 24 si 25 noiembrie, insa atunci aveam configurat circuitul cu Arduino in modul cel mai simplist, fara telecomanda, cu o singura viteza fixa, montura era in faza "incipienta" de testare, nu era asa de "dotata "ca in prezent. :) ----------------------------------- Remus Boldis 28 Noi 2020 21:19 ----------------------------------- O realizare frumoasa si un upgrade binevenit. ----------------------------------- Erwin 29 Noi 2020 08:39 ----------------------------------- Bravo, Iulian! Îmi pare bine că umila mea contribuție a fost valorificată cu succes! Ai făcut progrese remarcabile în ultima perioadă, ceea ce nu poate decât să ne bucure! ----------------------------------- iulian90 29 Noi 2020 08:51 ----------------------------------- Multumesc. :) Mai precizez ca schema electrica a circuitului de comanda a motorului RA si codul de programare Arduino au fost inspirate de pe acest site: https://starsinphotos.wordpress.com/2014/03/23/diy-autoguider-for-long-exposure-astrophotography/ in care proiectul original este de sistem autoguider bazat pe Arduino, dar care eu l-am adaptat doar pentru comanda manuala a motorului de pe axa RA a monturii si a-l face sa functioneze cu telecomanda. Pinii D8 si D9 de pe placa Arduino, care in proiectul original eru conectati prin 2 optocuploare la mufa ST4 a unei camere pentru ghidaj sau la portul serial sau paralel al unui PC care este dotat cu asa ceva, eu i-am conectat tot la telecomanda, pentru actionarea manuala fina a monturii, deoarece ca sa fac montura cu autoghidare, ca in proiectul original prezentat pe acel site, i-mi trebuie un adaptor USB-ST4 sau USB-Serial pentru ca laptopul care il am sa poata controla montura. Deocamdata montura o pozitionez manual din telecomanda atunci cand este nevoie, iar pe axa DEC o pozitionez din butonul montat pe axa melcului DEC pana ce o sa motorizez si aceasta axa. Pe viitor ,cand voi rezolva cu conexiunea dintre PC si microcontrolerul Arduino de pe montura, o sa fie mai usor sa adaptez circuitul de comanda pentru autoguiding, cu mici modificari hardware si software. Pentru ghidaj am aflat ca pot folosi si camera web Philips Toucam care are senzor CCD, iar ca luneta de ghidaj pot folosi teleobiectivul foto Albinar de 200mm focala care este mai bun si ofera claritate buna pe o arie destul de mare ca cea a senzorului unui DSLR, d-apoi pe aria senzorului camerei Philips care este minuscul in comparatie cu senzorul DSLR-ului. :) ----------------------------------- Remus Boldis 29 Noi 2020 13:45 ----------------------------------- Un upgrade binevenit, ca sa scapam de fire, ar fi telecomanda in IR. Exista evident o librarie care invata arduino sa receptioneze si sa decodeze semnalele primite de la telecomenzi in infrarosu (se incarca cu comanda #include ). Daca la Tools deschidem un Serial Monitor, actionand telecomanda, se va afisa un cod. Putem retine acele coduri pentru fiecare tasta care ne intereseaza si sa il folosim apoi in sketch (program). Telecomenzi cu receptor pentru arduino se gasesc la preturi mici (9,25 dolari la 10 bucati) - https://www.ebay.com/itm/HX1838-VS1838-Arduino-Infrared-IR-Wireless-Remote-Control-Sensor-Module-Kits/313270570692?var=612132264671 . Un receptor mai performant care permite o actionare de la distanta mai mare - https://www.ebay.com/itm/2PCS-VS1838-HX1838-TL1838-VS1838B-IR-Receiver-Remote-Control-for-Arduino-UK/192590470652?var=492719936928 . Kitul se gaseste si in Romaia la preturi incepand cu 10 lei. Iata sketchul pentru axa Dec (se folosesc sagetile sus/jos): #include const int RECV_PIN = 7; IRrecv irrecv(RECV_PIN); decode_results results; unsigned long key_value = 0; const int stepPin = 10; const int dirPin = 11; void setup() { Serial.begin(9600); irrecv.enableIRIn(); irrecv.blink13(true); pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); digitalWrite(stepPin, LOW); digitalWrite(dirPin, LOW); digitalWrite(13, LOW); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if (results.value == 0XFFFFFFFF) results.value = key_value; switch (results.value) { case 0xFF629D: //Keypad button "UP" digitalWrite(dirPin, HIGH); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); } switch (results.value) { case 0xFFA857: //Keypad button "DOWN" digitalWrite(dirPin, LOW); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); } key_value = results.value; irrecv.resume(); } } ----------------------------------- iulian90 29 Noi 2020 15:23 ----------------------------------- Interesanta ideea cu telecomanda IR pentru actionarea monturii. :) Pe viitor poate o sa trec si eu la asa ceva. Cum am cunostinte de electronica , as putea construi eu receptorul IR, care e foarte simplu din ce vad pe ebay. Am si eu senzori IR cu 3 pini, de la cablaje de televizoare sau decodoare TV, cu care as putea face in receptor IR pentru montura, iar ca telecomanda, as putea folosi orice telecomanda. Aveam o telecomanda de la un modulator auto FM,este mica si compacta si are cel putin 6 butoane, dar trebuie sa o caut prin atelier. Deocamdata o sa folosesc telecomanda cu fir , dar pe masura ce aprofundez mai bine domeniul Arduino,care este nou pentru mine, o sa implementez varianta cu telecomanda IR pentru comanda monturii. ----------------------------------- Remus Boldis 29 Noi 2020 15:37 ----------------------------------- Poti folosi orice telecomanda IR, vizualizezi codurile transmise si introduci in sketch. Receptorii IR sunt foarte simpli dar si foarte ieftini. ----------------------------------- Remus Boldis 30 Noi 2020 15:23 ----------------------------------- Pun si sketch-ul pentru axa RA, comanda in IR #include const int RECV_PIN = 7; IRrecv irrecv(RECV_PIN); decode_results results; unsigned long key_value = 0; const int stepPin = 10; const int dirPin = 11; void setup() { Serial.begin(9600); irrecv.enableIRIn(); irrecv.blink13(true); pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); pinMode(13, OUTPUT); digitalWrite(13, LOW); digitalWrite(stepPin, LOW); digitalWrite(dirPin, LOW); } void loop() { manual: if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if (results.value == 0XFFFFFFFF) results.value = key_value; switch (results.value) { case 0xFFC23D: //Keypad button "RIGHT" digitalWrite(dirPin, HIGH); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); } switch (results.value) { case 0xFF22DD: //Keypad button "LEFT" digitalWrite(dirPin, LOW); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); delay(1); digitalWrite(stepPin, HIGH); delay(1); digitalWrite(stepPin, LOW); } switch (results.value) { case 0xFF02FD: //Keypad button "OK" goto trak; } key_value = results.value; irrecv.resume(); goto manual; trak: digitalWrite(stepPin, LOW); digitalWrite(dirPin, LOW); digitalWrite(13, LOW); digitalWrite(dirPin, HIGH); digitalWrite(stepPin, HIGH); digitalWrite(13, HIGH); delay(500); digitalWrite(stepPin, LOW); digitalWrite(dirPin, LOW); digitalWrite(13, LOW); if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if (results.value == 0XFFFFFFFF) results.value = key_value; switch (results.value) { case 0xFF4AB5: //Keypad button "0" goto manual; } } key_value = results.value; irrecv.resume(); goto trak; } } ----------------------------------- Remus Boldis 30 Noi 2020 15:29 ----------------------------------- Poate fi inbunatatit prin folosirea unui driver pentru motor la care micropasii se seteaza din arduino. Pentru viteza mare folosim pasi intregi, pentru traking, micropasi. In program step pin e setat pinul 10 si dir pin, pinul 11. In subrutina trak e setat un delay de 500 milisecunde, aceasta trebuie adaptata cu montura efectiva. Dupa pozitionarea telescopului, la apasarea tasei OK se intra in traking si la apasarea tastei 0 se trece din nou la manual. Eu am folosit doua placi arduino, cate una pentru fiecare axa, dar se pot combina intr-o singura placa arduino. ----------------------------------- Remus Boldis 02 Dec 2020 10:09 ----------------------------------- Pentru a veni in ajutorul celor care vor sa inteleaga programarea arduino, am sa incerc un mic serial cu elementele mai slmple de programare. Referinte despre subiect gasim aici : https://www.arduino.cc/reference/en/ void setup() - parte a programului care va fi executata la inceput, o singura data. Aici initializam variabilele, definim pinii cu care lucram, incarcam librariile necesare, etc. void loop() - parte a programului care va fi executata in bucla atat timp cat arduino este alimentat. Se executa dupa void setup(). // - semn folosit pentru introducerea de comentarii intr-o linie de program. Tot ce e la dreapta semnului nu va fi citit de arduino (in linia respectiva). Se foloseste pentru a explica utilitatea liniei respective, pentru a intelege programul si e foarte util pentru depanari, apgradari program. /* */ - acelasi lucru ca mai sus, dar este folosit pentru introducerea de comentarii pe mai multe linii. Tot ce e inclus intre /* */ nu va fi citit de arduino {} - toate subrutinele trebuie incluse intre acolade. Daca nu o facem sau uitam sa inchidem o acolada, programul va semnaliza eroare. digitalRead() - citeste valoarea, high sau low, a unui pin digital pe care l-am definit ca input. In paranteza scriem numarul pinului, sau numele pe care l-am dat pinului respectiv. digitalWrite() - pune in high sau low un pin digital, pe care l-am definit ca output. In paranteza scriem numarul pinului, sau numele pe care l-am dat pinului respectiv. pinMode() configureaza un pin ca intrare sau iesire (input, output). delay() - spunem microcontrolerului sa astepte un numar de milisecunde (valoarea se trece in paranteze). delayMicroseconds() - spunem microcontrolerului sa astepte un numar de microsecunde (valoarea se trece in paranteze). Exemple de sketchuri: 1 Placa arduino are un LED conectat intern la pinul 13. Programul aprinde ledul timp de o secunda, dupa care sta stins o secunda void setup() { pinMode(13, OUTPUT); // setam pinul 13 ca iesire } void loop() { digitalWrite(13, HIGH); // punem pinul 13 in high (5V) delay(1000); // asteapta 1000 de milisecunde digitalWrite(13, LOW); // punem pinul 13 in low (0V) delay(1000); // asteapta 1000 milisecunde } 2 Conectam la pinul 7 un pushbutton (intre +5V si pinul 7). Ledul conectat la pinu 13 se va aprine la apasarea butonului si se va stinge la eliberarea lui. int ledPin = 13; // intitulam, denumim pinul 13 ca ledPin int inPin = 7; // denumim pinul 7 ca inPin int val = 0; // declaram o variabila void setup() { pinMode(ledPin, OUTPUT); // setam ledPin ca output pinMode(inPin, INPUT); // setam inPin ca input } void loop() { val = digitalRead(inPin); // citeste vloarea inPin si o aloca variabilei val digitalWrite(ledPin, val); // seteaza ledPin la vloarea val } Desigur putem lega un led extern la un pin pe care l-am definit ca iesire. In acest caz va trebui sa inseriem cu ledul o rezistenta de limitare a curentului (intre 100ohmi si 10 kiloohmi, cu cat rezistenta e mai mica, cu atat curentul prin led va fi mai mare).Ledul se leaga intre pinul output si GND.https://www.circuitbasics.com/arduino-basics-controlling-led/ ----------------------------------- iulian90 02 Dec 2020 20:54 ----------------------------------- Interesant topicul despre codurile Arduino, este foarte util pentru incepatori. :) Eu , ca sa invat cu se foloseste un microcontroler Arduino, am vizionat o serie de topicuri pe Youtube, prezentate de dl. Paul McWhorter: https://www.youtube.com/watch?v=fJWR7dBuc18 in care explica detaliat fiecare lucru despre Arduino, despre coduri, ce reprezinta , despre cum trebuie scrise si multe altele. Sunt mai multe parti, mai multe episoade ale topicului despre utilizarea Arduino. :) ----------------------------------- Erwin 03 Dec 2020 07:48 ----------------------------------- Pentru soluții practice și exemple din care se poate învăța utilizarea feluritelor module atașabile la Arduino puteți consulta site-ul lui Nicu Florică, un electronist pasionat: https://www.arduinotehniq.com/ ----------------------------------- Remus Boldis 03 Dec 2020 10:16 ----------------------------------- Am sa continui micul serial cu cateva comenzi noi. analogRead() - pe placile Arduino avem un numar de pini asa numiti analogici, de fapt niste convertoare analog-digitale cu rezolutie de 10 biti. Cu alte cuvinte semnalul analogic de la 0 la 5V va fi convertit in semnal digital pe 10 biti (1024 de nivele). In acest fel rezolutia de conversie e de 4.9 mV. Cu comanda analogRead(), de pe un pin analogic, arduino va converti valoarea tensiunii de intrare (intre 0 si 5V) in semnal digital pe 10 biti. Arduino Zero, Due, MKR Family boards, dispun de convertoare pe 12 biti si o plaja de intrare 0 - 3,3V analogWrite() - cu aeasta comanda spunem microcontrolerului sa trimita la un pin PWM (aici avem pini PWM in functie de tipul de arduino - https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/) ,desemnat ca OUTPUT, un semnal PWM cu factor de umplere dependent de numarul introdus intre paranteze. Numarul poate fi intre 0 si 255, 0 insemnand ca pinul sta tot timpul pe 0 iar 255, pinul sta tot timpul pe 5V. Numerele intermediare produc semnale dreptunghiulare cu factor de umplere tot mai mare pe masura ce ne apropiem de 255. Frecventa semnalului dreptunghiular depinde de tipul de Arduino si pinul folosit si poate fi intre 490Hz si 1000Hz. Puteti gasi frecventele aici : https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/ Vedem ca nu avem de a face cu cu o iesire analogica reala, dar printr-un grup de rezistente condensatoare putem indulci pantele semnalului dreptunghiular, transformandul intrun semnal pseudo-analogic. Cum teoria spune ca pentru a caracteriza o anumita frecventa avem nevoie de o frecventa de esantionare de cel putin de 2 ori frecventa, la arduino vom avea doar cateva sute de herti la dispozitie. Exemple sketchuri 1 Citirea valorii tensiunii de la cursorul unui potentiometru. Potentiometrul are legat un capat la 5V, celalat capat la GND si cursorul la pinul A3 int analogPin = A3; // declaram pinul A3 ca variabila analogPin int val = 0; // declaram variabila val void setup() { Serial.begin(9600); // pornim o comunicare seriala } void loop() { val = analogRead(analogPin); // citeste tensiunea de pe analogPin Serial.println(val); // trimite valoarea val la un port serial } 2 Reglarea intensitaii luminoase a unui LED cu ajutorul unui potentiometru. Cursorul potentiometrului e legat la pinul 3 si ledul la pinul 9 int ledPin = 9; // declaram pinul 9 ledPin int analogPin = 3; // declaram pinul 3 analogPin int val = 0; // declaram variabila val void setup() { pinMode(ledPin, OUTPUT); // setam ledPin ca OUTPUT } void loop() { val = analogRead(analogPin); // citeste analogPin si aloca catre val analogWrite(ledPin, val / 4); // trimite catre ledPin valoarea val impartita la 4 (ca sa se incadreze intre 0 si 255) } Avem si aici cateva exemple cu analogWrite : https://www.youtube.com/watch?v=6CRhpUV92ww&t=14s https://www.youtube.com/watch?v=YfV-vYT3yfQ ----------------------------------- Erwin 03 Dec 2020 15:42 ----------------------------------- Atenție, există un singur convertor A/D în chip-ul ATmega ce este comutat automat, în mod transparent pentru utilizator, către pinii respectivi ce pot primi semnal analogic. În unele aplicații care presupun mai mulți senzori simultan va exista un (nuștiucâtde) mic delay între citirile respective. ----------------------------------- Remus Boldis 03 Dec 2020 16:47 ----------------------------------- Poate in anumite aplicatii pot sa apara probleme, altfel, la viteza cu care lucreaza arduino (10.000 de citiri pe secunda), nu va fi nici o problema faptul ca citeste pe rand intrarile. ----------------------------------- Remus Boldis 04 Dec 2020 10:46 ----------------------------------- Azi vreau sa prezint una dintre cele mai puternice comenzi din bucataria Arduino : #include < > Aceasta comanda ne ofera accesul la asa zisele library, programe complexe, scrise de utilizatori avansati, care invata arduino sa interactioneze cu diverse periferice, un fel de drivere. Arduino IDE vine cu mai multe library gata incluse si le putem integra in sketchul nostru cu comanda #include < >. Daca avem nevoie de alte library le putem instala dupa procedurile descrise aici : https://www.arduino.cc/en/Guide/Libraries Odata inclusa library in sketch, arduino va sti cum sa lucreze cu perifericul respectiv, spre exemplu va sti ce comenzi sa dea unui afisor cu cristale lichide,pentru ca acesta sa afiseje ce am scris noi in program. Comanda se pune la inceputul sketchului si intre paranteze trebuie sa trecem numele bibliotecii dorite : #include < > ----------------------------------- Erwin 04 Dec 2020 23:01 ----------------------------------- Nu vreau să fiu moș-contra, dar termenul românesc echivalent pentru englezescul library este bibliotecă. Librăria este altceva, este magazinul unde se vând cărțile. :D Din păcate s-a încetățenit, la fel ca multe alte cuvinte din "romgleză"... Scuze de offtopic, Remus, continuă. ----------------------------------- Remus Boldis 05 Dec 2020 18:34 ----------------------------------- != (nu este egal cu) < (mai putin ca) <= (mai putin sau egal cu) Acestia sunt operatori de comparatie. Arduino va efectua comparatia ceruta si in functie de rezultat va efectua comezile scrise intre acolade. if (x == y) { // testeaza daca x este egal cu y } // daca comparatia este adevarata fa ce e scris intre acolade ----------------------------------- Remus Boldis 05 Dec 2020 18:37 ----------------------------------- In mod ciudat forumul nu accepta sa pun mai mult de 3 operatori, asa ca ii pun intr-o postare noua. == (egal cu) > (mai mare ca) >= (mai mare sau egal cu) ----------------------------------- Erwin 05 Dec 2020 19:42 ----------------------------------- Cred că, dacă incluzi textul între tag-urile "Cod" te va lăsa să scrii. ! != (nu este egal cu) < (mai putin ca) (mai mare ca) >= (mai mare sau egal cu) P.S. E ciudat, desi am scris textul complet l-a ciuntit cand am salvat. ----------------------------------- Remus Boldis 05 Dec 2020 19:59 ----------------------------------- Asa am patit si eu, am incercat mai multe variante, dar afiseaza ciudatenii. ----------------------------------- Remus Boldis 07 Dec 2020 12:45 ----------------------------------- Comenzi pe care le-am mai folosit dar mai detaliez : delay() // asteapta - in paranteze se trece valoarea in milisecunde delayMicroseconds() // asteapta - in paranteze se trece valoarea in microsecunde micros() // contor al timpului trecut de la pornirea programului - in microsecunde millis() // contor al timpului trecut de la pornirea programului - in milisecunde