You are on page 1of 30

COMANDA UNUI MOTOR PAS CU PAS CU ARDUINO

Nicu FLORICA
un blog, care completeaza site-ul tehniq de la http://www.tehnic.go.ro ( http://www.niqro.3x.ro )

27,719
mari, 2 aprilie 2013

Comanda unui motor pas cu pas unipolar folosind Arduino


Dupa ce am primit de la Adrian un motor pas cu pas unipolar recuperat dintr-o unitate floppy de 5,25' pe care scrie 39SH-29CAA, m-am apucat sa ma documentez cum il comand folosind placa de dezvoltare Arduino.

Un articol de prezentare se gaseste chiar la Arduino pe site si anume Unipolar Stepper Motor in care se foloseste driver-ul UNL2003A, deoarece microcontrolerul nu poate comanda direct bobinele motorului.

Pe langa alte zeci de site-uri care trateaza despre comanda acestui tip de motor cu un microcontroler sau calculator, m-am oprit la Identifying and using a stepper motor on Arduino deoarece prezinta si modul cum se pot identifica terminalele acestui motor:

In acest articol se face trimitere la altul (Tutorial sobre Motores Paso a Paso (Stepper motors)), in care sunt prezentate animatii cu 3 moduri de comanda ale acestui tip de motor:

Despre integratul ULN2003 putem in gasi informatii multe in datasheet-ul de la Texas Instruments sau in cel de la STMicroelectronics. De fapt, in aceste fise de catalog este prezentata toata seria ULN2001, UNL2002, ULN2003 si ULN2004. Diferentele intre cele 4 integrate, care contine 7 driver-e fiecare, pot fi interfatate cu logica: ULN2001 (uz general, DTL, TTL, PMOS, CMOS) ULN2002 (14 - 25 V PMOS) ULN2003 (5 V TTL, CMOS) ULN2004 (6 - 15 V CMOS, PMOS). Curentul la fiecare iesire este maxim 500mA, suficient pentru aplicatia asta. Pentru a pregati un montaj, am desenat in Eagle PCB Editor schema, apoi un cablaj:

Pentru cazul in care se doreste folosirea electronicii clasice, ne putem inspira de din documentatia de la kitsrus (kit K179). Eu am adaptat schema pentru a folosi doar 2 taste fara retinere, pe care am desenat-o in Eagle PCB Editor:

Ca de obicei, Adrian mi-a trimis un set de placute realizate conform indicatiilor de la electroni-city.com prin transfer de toner pe bucatele de autocolant (recomand un filmuletul numit Make your PCB):

Articolul are continuare la Comanda unui motor pas cu pas unipolar folosind Arduino (II) !!!

Comanda unui motor pas cu pas unipolar folosind Arduino (II)


Dupa am facut o prezentare in prima parte, acum am zis ca trebuie sa fac si partea practica... Am incercat identificarea ordinii firelor prin masurarea rezistentelor dintre ele si am observat ca nu pot deoarece au un fir comun (negru), am facut o identificare a modului de rotatie prin legarea firului comun al infasurarilor (negru) la masa si atingerea celor 4 fire la +12V proveniti de la sursa mea reglabila cu LM317, rezultandu-mi ordinea (galben, rosu, albastru si maro).

Am realizat si un filmulet numit testing a unipolar stepper motor in care am prezentat modul de testare:

Am realizat montajul de comanda (driver) cu ULN2003AN:

Schema de conectare este:

Am incercat sketch-ul din articolul Identifying and using a stepper motor on Arduino, modificand partea cu conectarea firelor: /* Stepper Copal * ------------* * Program to drive a stepper motor coming from a 5'25 disk drive * according to the documentation I found, this stepper: "[...] motor * made by Copal Electronics, with 1.8 degrees per step and 96 ohms * per winding, with center taps brought out to separate leads [...]" * [http://www.cs.uiowa.edu/~jones/step/example.html] * * It is a unipolar stepper motor with 5 wires: * * - red: power connector, I have it at 5V and works fine * - orange and black: coil 1 * - brown and yellow: coil 2 * * (cleft) 2005 DojoDave for K3 * http://www.0j0.org | http://arduino.berlios.de * * @author: David Cuartielles * @date: 20 Oct. 2005 */ int motorPin1 = 9; int motorPin2 = 11; int motorPin3 = 10; int motorPin4 = 12; int delayTime = 500; void setup() { pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); } void loop() { digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW);

digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); delay(delayTime);

Filmuletul care prezinta modul de functionare se numeste first test with a unipolar stepper motor and Arduino:

Apoi am testat sketch-ul din programul Arduino IDE numit "Steper_oneRevolution", modificand ordinea a 2 fire in program, apoi schimbandu-le fizic, deoarece in loc de rotire avea o miscare sacadata (fata-spate), filmuletul cu modul de functionare se numeste oneRevolution for a unipolar stepper motor and Arduino:

La motorul testat am conectat culorile astfel: la D9 firul maro la D10 firul rosu la D11 firul galben la D12 firul albastru la +12V firul negru

/* Stepper Motor Control - one revolution This program drives a unipolar or bipolar stepper motor. The motor is attached to digital pins 9 - 12 of the Arduino. The motor should revolve one revolution in one direction, then one revolution in the other direction. Created 11 Mar. 2007 Modified 30 Nov. 2009 by Tom Igoe */

#include <Stepper.h> const int stepsPerRevolution = 100; // change this to fit the number of steps per revolution // for your motor (se // initialize the stepper library on pins 9 through 12: Stepper myStepper(stepsPerRevolution, 9,10,11,12); void setup() { // set the speed at xxx rpm: myStepper.setSpeed(100); // initialize the serial port: Serial.begin(9600); } void loop() { // step one revolution in one direction: Serial.println("clockwise"); myStepper.step(stepsPerRevolution); delay(500); // step one revolution in the other direction: Serial.println("counterclockwise"); myStepper.step(-stepsPerRevolution); delay(500);

Pentru a scadea sau creste viteza de rotatie, se modifica: // set the speed at xxx rpm: myStepper.setSpeed(100); Am modificat acest sketch pentru a comanda rotirea mtorului intr-un sens sau altul prin apasarea a 2 butoane fara retinere (taste): /* use base of "Stepper Motor Control - one revolution" sketch made by Tom Igoe This program drives a unipolar stepper motor with 2 button (clockwise or counterclockwise) The motor is attached to digital pins 9 - 12 of the Arduino. adapted sketch made by Nicu Florica (niq_ro) from http://tehnic.go.ro version 1.0 (07.04.2013 - Craiova, Romania) */ #include <Stepper.h> const int stepsPerRevolution = 100; // change this to fit the number of steps per revolution for your motor Stepper myStepper(stepsPerRevolution, 9,10,11,12); // initialize the stepper library on pins 9 through 12: int speed = 50; // set the speed at 50 rpm: int buton1 = 4; // first button at pin 4 int buton2 = 5; // second button at pin 5 void setup() { myStepper.setSpeed(speed); // set the speed Serial.begin(9600); // initialize the serial port: pinMode(buton1, INPUT); // set buton1 pin as input pinMode(buton2, INPUT); // set buton2 pin as input } void loop() { digitalWrite(buton1, HIGH); // if not pushed, set voltage for buton1 as HIGH

digitalWrite(buton2, HIGH); // if not pushed, set voltage for buton1 as HIGH if (digitalRead(buton1) == LOW) { Serial.println("clockwise"); myStepper.step(stepsPerRevolution); }

if (digitalRead(buton2) == LOW) { Serial.println("counterclockwise"); myStepper.step(-stepsPerRevolution); } delay(10); // waiting little bit... // delay(10); // waiting little bit... } Am definit inca 2 taste, una pentru crestere viteza si una pentru reducere viteza, sketch-ul devenind versiunea 1m1:

/* use base of "Stepper Motor Control - one revolution" sketch made by Tom Igoe This program drives a unipolar stepper motor with 2 button (clockwise or counterclockwise) and 2 for speed The motor is attached to digital pins 9 - 12 of the Arduino. adapted sketch made by Nicu Florica (niq_ro) from http://tehnic.go.ro http://nicuflorica.blogspot.com & http://www.niqro.3x.ro

version 1m1 (07.04.2013 - Craiova, Romania) */ #include <Stepper.h> const int stepsPerRevolution = 100; // change this to fit the number of steps per revolution for your motor Stepper myStepper(stepsPerRevolution, 9,10,11,12); // initialize the stepper library on pins 9 through 12: int viteza = 50; // set the speed at 50 rpm: int buton1 = 4; // first button at pin 4 int buton2 = 5; // second button at pin 5 int buton3 = 6; // third button at pin 6 int buton4 = 7; // fourth button at pin 7 void setup() { myStepper.setSpeed(viteza); // set the speed Serial.begin(9600); // initialize the serial port: pinMode(buton1, INPUT); // set buton1 pin as input pinMode(buton2, INPUT); // set buton2 pin as input pinMode(buton3, INPUT); // set buton3 pin as input pinMode(buton4, INPUT); // set buton4 pin as input } void loop() { digitalWrite(buton1, HIGH); digitalWrite(buton2, HIGH); digitalWrite(buton3, HIGH); digitalWrite(buton4, HIGH);

// if not pushed, set voltage for buton1 as HIGH // if not pushed, set voltage for buton1 as HIGH // if not pushed, set voltage for buton1 as HIGH // if not pushed, set voltage for buton1 as HIGH

if (digitalRead(buton1) == LOW) { Serial.println("clockwise"); myStepper.step(stepsPerRevolution); } if (digitalRead(buton2) == LOW) { Serial.println("counterclockwise"); myStepper.step(-stepsPerRevolution); } if (digitalRead(buton3) == LOW) { Serial.println("speed +"); viteza = viteza*1.2; delay(250); // waiting little bit... if (digitalRead(buton4) == LOW) Serial.println("speed -"); viteza = viteza*0.8; delay(250); // waiting little bit...

} {

myStepper.setSpeed(viteza); // set the speed delay(10); // waiting little bit... }

Filmuletul care prezinta modul de comanda al motorului pas cu pas unipolar cu 4 taste (una pentru rotire in stanga, una pentru rotire in drepata, una pentru creste viteza si una pentru scadere viteza) se numeste control a unipolar stepper motor with 4 button and Arduino: ALRA SCHEMA

Motorul pas cu pas

Un motor pas cu pas, difera radical de un motor electric conventional. Un motor conventional determina rotirea unui ax si viteza de rotatie a acestui ax poate fi modificata prin controlul alimentarii motorului. Dar nu este necesar aprioric un circuit de comanda: motorul se roteste imediat ce este conectat la o sursa de alimentare si nu se poate influenta asupra pozitiei precise a axei de rotatie sau asupra numarului de rotatii ce trebuie efectuate. In schimb, un motor pas cu pas, nu se poate roti fara un circuit de comanda special. El permite obtinerea unor rotatii cu exact acelasi unghi, corespunzator unui pas. Astfel, un motor cu 200 de pasi pe rotatie, permite rotirea axei, la fiecare comanda primita, cu 360/200=1,8 (spre stanga sau spre dreapta). Se poate deci comanda cu usurinta o deplasare precisa, numarand pasii de efectuat dupa alegerea sensului de rotatie. De aceea, motoarele pas cu pas sunt utilizate in aplicatii care impun deplasari precise: robotica, imprimante, scanere, cititoare optice.

Motorul pas cu pas este un convertor electromecanic ce functioneaza pe principiul reluctantei minime si care realizeaza transformarea unui sir de impulsuri digitale intr-o miscare de rotatie. Miscarea rotorului motorului pas cu pas consta din deplasari unghiulare discrete, succesive, de marimi egale, care reprezinta pasii motorului. In general, un motor pas cu pas este alcatuit dintr-un magnet montat pe axa de rotatie si din bobine fixe situate imprejurul acestui magnet. Pentru a se obtine o rezolutie satisfacatoare (numar de pasi pentru o rotatie completa suficient de mare) magnetul este multipolar: el este alcatuit dintr-un cilindru canelat NordSud-Nord-Sud. Rotorul, compus dintr-un magnet permanent la suprafata caruia sunt fixate doua coroane danturate cu cate 50 de dinti, decalate intre elecu o jumatate de dinte. Din profil, se obtin 100 de dinti, alternand un pol nord cu unul sud (numarul de perechi de poli este 50).

Motoarele pas cu pas (MPP) se pot clasifica in : 1.MPP cu o singura infasurare de comanda. 2.MPP cu doua infasurari de comanda. 3.MPP cu trei sau mai multe infasurari de comanda. Se mai construiesc si alte variante de MPP : -MPP cu circuite imprimate -MPP electrohidraulice -MPP liniare Motoarele pas cu pas cu o singura infasurare de comanda este reprezentat in figura de mai jos.Cand infasurarea de comanda nu este alimentata, axa longitudinala a rotorului are aceasi pozitie cu axa polilor din magnetii permanenti.Acest tip constructive se poate construe cu un numar de poli statorici divizibil cu patru ( 2p = 4 k , k=1,2,3...) . Numarul de poli rotorici va fi jumatate din cel al statorului. Pasi sunt realizati mai mici de 90 . Fiecare cuplare a unei infasurari de comanda corespunde unui pas 90. Marind numarul de poli se poate micsora pasul.Astefel s-au realizat MPP cu rotorul excitat in curent continu care permite optinerea unui pas de 15 .Aceste tipuri se construiesc in doua variante : 1.Cu mai multe statoare , pe fiecare stator avand cate o infasurare de comanda ( reprezentat in figura de mai sus ), 2.Cu un singur stator cu mai multe infasurari de comanda . Motorul pas cu pas se utilizeaza in schemele sistemelor de comanda cu program si prin impulsuri. Folosirea ordinatoarelor pentru comanda unor procese tehnologice complexe necesita prelucrarea unor semnale, sub forma e impulsuri ceea ce se poate realiza cu MPP. In prezent MPP se foloseste in diverse instalatii industriale, dupa cum urmeaza: -Actionarea masinilor unelte cu comanda numerica -Industria metalurgica si usoara

-Sisteme periferice ale calculatoarelor numerice -In aeronautica.

Controlulmotoarelorpas cu pas cu Arduino


Rate This Arduinoeste o platforma de dezvoltare foarte simplu de utilizat dar totusi cu multe aplicabilitati pentru pasionatii de electronica si robotica. Este vorba de o solutie open-source ce include atat un modul hardware cat si interfatarea software cu acesta, anume un IDE proprietar ce foloseste limbajul Wiring, foarte asemanator cu C. Platforma foloseste un microprocesor ATMega328 la 16MHz, dispune de 14 intrari+iesiri TTL (dintre care 6 PWM), 6 intrari analog, memorie flash de 32 KB si SRAM de 2KB. Mai multe detalii pe situl oficial.

In exemplul de mai jos, am folosit un motor pas cu pas unipolar la 12v/1A, rezolutie de 1,8 grade/pas, comandat in modul full-step. Functie de aplicatie, se poate comanda si in modurile microstepping si halfstep (detalii aici). Pentru protectia microcontrollerului, am izolat galvanic cele 2 parti ale circuitului, prin optocuploare. Proiectia in Multisim a circuitului electronic de control:

Ca optocuploare, se pot folosi integratele 4n35. Rezistentele se vor ajusta in functie de consumul motorului, pentru a permite deschiderea totala a tranzistoarelor Darlington din driverul ULN2003 (Nota: in schema apare integratul ULN2004, care e varianta CMOS a driverului, din motive ce tin de Multisim; se va folosi TTL, ULN2003). Cuplarea celor 4 pini de intrare ai circuitului (J1 in schema) se face pe pinii 2, 3, 4, 5 ai placii Arduino, iar catodul LED-urilor optocuploarelor (in schema, cel mai de jos pin al J1) se vor lega la masa Arduino (pinul GND). Daca se doreste folosirea altor pini, se modifica cele 4 linii de cod ( #define pinX Y). In orice caz,

integratul ULN2003 se va incalzi puternic chiar si la lucrul cu motorul in gol, asa ca este nevoie de un radiator pentru disiparea caldurii. Daca stepperul este de putere mare, este necesar ca iesirile ULN2003 sa fie cuplate la baza unor tranzistoare de putere, sau MOSFET, deoarece acest integrat suporta pana la 500mA pentru toate iesirile (ceea ce inseamna destul de putin pentru un motor). Alimentarea motorului daca e de 12v se poate face de la o sursa obicnuita de PC, de 350-400W. //============ Stepper Motor control ============== #include <Stepper.h> #define rezolutieMotor 200 //numarul de pasi pentru o rotatie //completa; se modifica in functie //de rezolutia motorului #define pin1 2 #define pin2 3 #define pin3 4 #define pin4 5 //se foloseste libraria speciala pentru steppere //din compilatorul Arduino Stepper Motor(rezolutieMotor, pin1,pin2,pin3,pin4); void setup() { //seteaza viteza motorului la 80 RPM Motor.setSpeed(80); } void loop() { //deplasare 200 pasi in fata, adica 360 grade //pentru un motor cu rezolutia de 200 de pasi Motor.step(200); delay(100); //deplasare 200 pasi in spate, adica 360 grade //pentru un motor cu rezolutia de 200 de pasi Motor.step(-200); delay(100); } //==================================.

M1 este un pas cu pas luate dintr-o unitate de disc vechi. Exist cinci ace, de exemplu, comun, bobina 1, 2, 3 i 4. Rezistena msurat ntre pini comun i fiecare bobin este de aproximativ 75 ohmi. Actual de conducere pentru fiecare bobin, atunci este nevoie de aproximativ 60mA la +5 V de alimentare.

Un tranzistor Darlington matrice, ULN2003 este folosit pentru a crete capacitatea de conducere a cip 2051. Fiecare iesire prevede max 500mA la 50V. P1.4 la P1.7, patru pini de ieire sunt conectate la intrarea ULN2003 aa cum se arat n circuit. Patru rezistori 4.7k ajuta 2051 de a furniza mai mult curent

de aprovizionare de la sursa de +5 V. Portul serial este opional pentru exercitiile tale. Muli s-au oferit tehnice utile, i aplicarea de utilizarea pas cu pas, a se vedea link-urile de mai jos.

http://www.roroid.ro/wiki/pmwiki.php/Main/ExpunereUVPentruPCBBazataPeARDUINO

ExpunereUVPentruPCBBazataPeARDUINO
Modificat in: December 30, 2012, at 10:49 PM[Modific] - [Istoric]

"Industria" realizrii cablajelor imprimate home made a evoluat foarte mult n ultimii ani. De la realizarea traseelor cu ajutorul peniei cu smoala, trecnd mai apoi pe marker i finaliznd cu metoda toner transfer/CNC/ i foto-rezist. De asemenea recent am vzut pe internet o alt metod ingenioas de realizat PCB i anume modificarea unei imprimante EPSON i tiprirea traseului direct pe placa de cupru. Personal am vrut sa ncerc aceasta metoda, dar parca mi-a fost mil s stric o imprimanta perfect funcionala. Proiectul prezentat n continuare i propune sa fie o mn de ajutor pentru cei care realizeaz cablaje prin metoda foto-rezist. Componen: -Scanner Cu ceva timp n urma am gsit pe pia un scanner folosit la un pre foarte avantajos. Pentru proiectul acesta am dezmembrat scanerul, folosind din el doar urmtoarele componente: opto-limitatorul/car-ul cu bara de ghidaj/sticla pe care se punea documentul pentru scanat/ i bineneles motorul pas cu pas -Arduino -Un -ULN2003A -Sursa de -cteva -3 butoane Schema electric: UNO 1x16 pas cu pas rezistente

display alimentare 24V pentru

LCD motorul

Funcionare: Proiectul este controlat din 3 butoane. Primul buton are rolul de a seta distana de parcurgere(din 5 n 5 cm, n funcie de dimensiunea plcii ce se dorete a fi expus). Cu al doilea buton se seteaz viteza de deplasare a ledurilor(1,2,3 sau 4 cm/min). Ultimul buton este folosit pentru pornirea sau anularea programului. Astfel la rularea programului ledurile se deplaseaz distana setat, cu viteza setat, iar n momentul finalizrii acestea se ntorc rapid n poziia 0. Software: #include #include #include #include #define #define #define #define CM 194 //1cm STEPS este parcurs PIN_SENZOR ZGOMOT <Stepper.h> <Bounce.h> <LiquidCrystal.h> <Metro.h> in 233 48 pasi 0 5 LCD motor1

LiquidCrystal lcd(12, 13, 4,5,6,7);//definire Stepper motor1(STEPS, 8,10,9,11);// definire pini

pini pentru

//Butoane Bounce buton1 = Bounce(2,5); //debounce pe butonul 1 int apas_b1=0;//aceasta variabila e folosita pentru a determina numarul de apasari

Bounce buton2 = Bounce(3,5); //debounce pe butonul 2 int apas_b2=0;//aceasta variabila e folosita pentru a determina numarul de apasari Bounce buton3 = Bounce(A5,5); //debounce int apas_b3=0;//aceasta variabila e folosita numarul de pe butonul 2 pentru a determina apasari

//se foloseste aceasta variabila pentru a putea executa functii in background Metro background0 = Metro(5000); //se citeste senzorul in background Metro background1 = Metro(10); int senzor;//valoarea int stare=0; int reset=0; limitatorului optic va fi stocata aici

int start=0;//variabila folosita pentru a determina prima rularea a programului int viteza=4;//se stabileste viteza de rulare int distanta=30;//se stabileste distanta de rulare int distanta_limita=30; int viteza_limita=4;

void initializare() { senzor = analogRead(0); motor1.setSpeed(400); while (senzor>0){ senzor = analogRead(0); motor1.step(1); } print_lcd("Sunt } void mergi(int d,int v) { int de_parcurs=0;

pregatit");

reset=0; motor1.setSpeed(v*5); while (((de_parcurs/CM)<=d)&&(reset==0)) {de_parcurs++; BU3(); motor1.step(-1);} } //aceasta functie e necesara pentru a tipari corect pe LCD 16x1 void print_lcd(String text){

lcd.clear(); lcd.print(text.substring(0,8)); lcd.setCursor(0,1); lcd.print(text.substring(8,16)); } void BU1(){ if ( buton1.update() ) { if ( buton1.read() == HIGH) { apas_b1++; distanta=apas_b1*5; String mesaj="Distanta="; String mesaj1=mesaj+distanta; String mesaj2=mesaj1+"cm"; print_lcd(mesaj2); if (distanta==distanta_limita){ apas_b1=0; } stare=1; background0.reset();//la apasarea butonului reseteaza timerul } } } void BU2(){//citire if ( buton2.update() ) { butonul 2

if ( buton2.read() == HIGH) { apas_b2++; viteza=apas_b2; String mesaj="Viteza="; String mesaj1=mesaj+viteza; String mesaj2=mesaj1+"cm/min"; print_lcd(mesaj2); if (viteza==viteza_limita){ apas_b2=0; } stare=1; background0.reset();//la apasarea butonului reseteaza timerul } } } void BU3(){//citire if ( buton3.update() ) { butonul 3

if ( buton3.read() == HIGH) { apas_b3++; if (apas_b3==1){ print_lcd("Pornesc leduri."); delay(1000);

mesaj="Parcurg "; mesaj1=mesaj+distanta; mesaj2=mesaj1+"cm."; print_lcd(mesaj2); mergi(distanta,viteza); apas_b3=0; print_lcd("Sting leduri."); delay(1000); print_lcd("Revin la 0."); initializare(); stare=1; AFIS(); } else if (apas_b3==2){ print_lcd("Anulare program."); delay(1000); reset=1; apas_b3=0; } } } } void AFIS(){ if (stare==1){ String String String String String String } } void setup() { Serial.begin(9600); pinMode(2, INPUT); pinMode(3, INPUT); pinMode(A5, INPUT); print_lcd("Bine } ati lcd.begin(8, 2); venit!"); mesaj="D="; mesaj1=mesaj+distanta; mesaj2=mesaj1+"cm "; mesaj3=mesaj2+"V="; mesaj4=mesaj3+viteza; mesaj5=mesaj4+"cm/min"; print_lcd(mesaj5); stare=0;

String String String

void loop() { //executa functia AFIS in background

if (background0.check() == 1) { // intervalul setat } if (start==0) {

se verifica pentru

daca

a trecut background. AFIS();

start=1; print_lcd("Initializare"); initializare(); } BU1(); BU2(); BU3(); }


[Varianta text]

Am primit o variant de soft puin modificata de la domnul Gheorghe Gainaru (Attach:modificare_ggainaru.txt). Modificarile sunt urmatoarele: -folosirea limitatorului optic pe portul digital faa de analogic. -folosirea kitului LCD distribuit de ROROID pentru afiaj Poze:

CAR cu ledurile UV Calitatea cablajului de test Arduino legat la scaner i primul test al programului Calitatea cablajului de test

Ledurile UV si montarea in CAR Leduri UV

Test cu erorile aparute la trasee foarte fine

Erorile marite

PCB pentru display-ul LCD al aparatului UV PCB pentru comanda aparatului UV

PCB pentru kitul LCD R2

PCB pentru kitul LEDMATRIX R2

Un nou kit marca ROROID

PCB pentru un viitor voltmetru

Electronica aparatului

Electronica aparatului

Unitatea UV in versiune finala

Panoul de control

Proba de functionare

Proba de functionare

Aparatul la lucru:

De fcut: 1.realizat partea de comanda a ledurilor UV 2.realizat montaj cu ATMEGA8 i transferul datelor de pe ARDUINO 3.optimizare cod i adugare comentarii pentru o mai buna n elegere
Comentarii:
May 25 12 pm31 01:35 PM

Am incercat programul pentru expunere UV, pina la urma mi-a mers . Modificarile facute de mine: -Am schimbat codul pentru LCD 16x2 cu 3 fire; -Senzorul meu este home made .Fata de sechema , am modificat o rezistenta R6 = 1 kilohm, si am verificat cu avometrul daca scot 0 si 1 logic , la 5 volti -Apoi am modoficat in program intrarea pe pin digital. Functioneaza fara probleme.
May 25 12 pm31 02:12 PM

Ma bucur ca ati reusit sa il faceti sa mearga. Sa imi trimiteti va rog varianta de program modificata a.i. sa o pot pune si pe site.
May 25 12 pm31 02:57 PM

Multumesc pentru PDF. Am postat varianta de soft modificat. Am sa pun niste poze cu testele facute cu aparatul semifinalizat. Cablajele ies de o calitate foarte apropriata de cele profesionale.
May 29 12 pm31 01:43 PM

Va salut ! Pina la urma , am reusit sa procur o curea crenelata si un pinion de la o imprimanta defecta ; Am "improvizat " un stand de lucru" cu un motor pas cu pas , si am continuat incercarile la programul "scaner" . Nu am folosit reductor de turatie . Am pus pinionul crenelat direct pe axul motorului . A trebuit sa realculez si sa schimb in program constanta CM la valoarea 17 . A fost o chestie destul de tampita , neavind pentru pinion decit nr. de dinti - fara pas , etc. Imi apare o mica diferenta , coam de 3 mm la distanta parcursa de 5cm . Am mai "descoperit" ca senzorul tre sa fie amplasat pe partea mobila,ca sa fie in stare 1- iar la faza de revenire sa se optureze fanta si sa treaca in 0 la capat de cursa ; O sa fac si o poza - am facut un sistem mecanic foarte simplu , ca sa pot verifica functionarea corecta in program . Astept vesti cind soseste senzorul meu SHARP ! Cu stima , si numai bine !
Cu 4 luni n urm:

pentru ledurile din acest proiect. cam care este valoarea optima de cm/minut ?
Cu 4 luni n urm:

Optim este 1cm/min maxim 2.


Cu 4 luni n urm:

Cam ce distanta este intre varful led-ului si geam-ul fostului scanner ? se poate face focalizarea la minim cat oare ?
Cu 4 luni n urm:

Ledurile sunt bagate in cutia unde a fost lampa de la scanner. Distanta este de 10mm intre varful ledului si geam.

Alt montaj http://vladprogrammer.wordpress.com/2012/02/08/controlul-motoarelor-pas-cu-pas-cuarduino/

Controlul motoarelor pas cu pas cu Arduino


februarie 8, 2012 Vlad

1 Vote Arduino este o platforma de dezvoltare foarte simplu de utilizat dar totusi cu multe aplicabilitati pentru pasionatii de electronica si robotica. Este vorba de o solutie open-source ce include atat un modul hardware cat si interfatarea software cu acesta, anume un IDE proprietar ce foloseste limbajul Wiring, foarte asemanator cu C. Platforma foloseste un microprocesor ATMega328 la 16MHz, dispune de 14 intrari+iesiri TTL (dintre care 6 PWM), 6 intrari analog, memorie flash de 32 KB si SRAM de 2KB. Mai multe detalii pe situl oficial.

In exemplul de mai jos, am folosit un motor pas cu pas unipolar la 12v/1A, rezolutie de 1,8 grade/pas, comandat in modul full-step. Functie de aplicatie, se poate comanda si in modurile microstepping si half-step (detalii aici). Pentru protectia microcontrollerului, am izolat galvanic cele 2 parti ale circuitului, prin optocuploare. Proiectia in Multisim a circuitului electronic de control:

Ca optocuploare, se pot folosi integratele 4n35. Rezistentele se vor ajusta in functie de consumul motorului, pentru a permite deschiderea totala a tranzistoarelor Darlington din driverul ULN2003 (Nota: in schema apare integratul ULN2004, care e varianta CMOS a driverului, din motive ce tin de Multisim; se va folosi TTL, ULN2003). Cuplarea celor 4 pini de intrare ai circuitului (J1 in schema) se face pe pinii 2, 3, 4, 5 ai placii Arduino, iar catodul LED-urilor optocuploarelor (in schema, cel mai de jos pin al J1) se vor lega la masa Arduino (pinul GND). Daca se doreste folosirea altor pini, se modifica cele 4 linii de cod (#define pinX Y). In orice caz, integratul ULN2003 se va incalzi puternic chiar si la lucrul cu motorul in gol, asa ca este nevoie de un radiator pentru disiparea caldurii. Daca stepperul este de putere mare, este necesar ca iesirile ULN2003 sa fie cuplate la baza unor tranzistoare de putere, sau MOSFET, deoarece acest integrat suporta pana la 500mA pentru toate iesirile (ceea ce inseamna destul de putin pentru un motor). Alimentarea motorului daca e de 12v se poate face de la o sursa obicnuita de PC, de 350-400W. //============ Stepper Motor control ============== #include <Stepper.h> #define rezolutieMotor 200 //numarul de pasi pentru o rotatie //completa; se modifica in functie //de rezolutia motorului #define pin1 2 #define pin2 3 #define pin3 4 #define pin4 5 //se foloseste libraria speciala pentru steppere //din compilatorul Arduino Stepper Motor(rezolutieMotor, pin1,pin2,pin3,pin4);

void setup() { //seteaza viteza motorului la 80 RPM Motor.setSpeed(80); } void loop() { //deplasare 200 pasi in fata, adica 360 grade //pentru un motor cu rezolutia de 200 de pasi Motor.step(200); delay(100); //deplasare 200 pasi in spate, adica 360 grade //pentru un motor cu rezolutia de 200 de pasi Motor.step(-200); delay(100); } //==================================.
Sharethis: