Comanda Unui Motor Pas Cu Pas Cu Arduino

34
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 marți, 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

Transcript of Comanda Unui Motor Pas Cu Pas Cu Arduino

Page 1: Comanda Unui Motor Pas Cu Pas Cu Arduino

COMANDA UNUI MOTOR PAS CU PAS CU ARDUINO

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

 27,719m a r ț i , 2 a p r i l i e 2 0 1 3

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.

Page 2: Comanda Unui Motor Pas Cu Pas Cu Arduino

   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:

Page 6: Comanda Unui Motor Pas Cu Pas Cu Arduino

   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:

Page 9: Comanda Unui Motor Pas Cu Pas Cu Arduino

   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);

Page 10: Comanda Unui Motor Pas Cu Pas Cu Arduino

  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:

Page 11: Comanda Unui Motor Pas Cu Pas Cu 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

Page 12: Comanda Unui Motor Pas Cu Pas Cu Arduino

 */

#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 motorStepper 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 4int 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 inputpinMode(buton2, INPUT);  // set buton2 pin as input

Page 13: Comanda Unui Motor Pas Cu Pas Cu Arduino

}

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:

Page 14: Comanda Unui Motor Pas Cu Pas Cu Arduino

/*  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.rohttp://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 motorStepper 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 4int buton2 = 5;                 // second button at pin 5int buton3 = 6;                 // third button at pin 6int 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 inputpinMode(buton2, INPUT);  // set buton2 pin as inputpinMode(buton3, INPUT);  // set buton3 pin as inputpinMode(buton4, INPUT);  // set buton4 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  digitalWrite(buton3, HIGH);  // if not pushed, set voltage for buton1 as HIGH  digitalWrite(buton4, 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...   }          

Page 15: Comanda Unui Motor Pas Cu Pas Cu Arduino

  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 Nord-Sud-Nord-Sud.  

Rotorul, compus dintr-un magnet permanent la suprafata caruia sunt fixate doua coroane danturate cu cate

Page 16: Comanda Unui Motor Pas Cu Pas Cu Arduino

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. 

Page 17: Comanda Unui Motor Pas Cu Pas Cu Arduino

Controlul motoarelor pas cu pas cu Arduino

Rate This 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.

Page 18: Comanda Unui Motor Pas Cu Pas Cu Arduino

//============ 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 ArduinoStepper 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. Rezistenţa măsurată î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 creşte capacitatea de conducere a cip 2051. Fiecare iesire prevede max 500mA la 50V. P1.4 la P1.7, patru pini de ieşire sunt conectate la intrarea ULN2003 aşa 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 opţională pentru exercitiile tale. Mulţi s-au oferit tehnice utile, şi aplicarea de utilizarea pas cu pas, a se vedea link-urile de mai jos. 

Page 19: Comanda Unui Motor Pas Cu Pas Cu Arduino

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

ExpunereUVPentruPCBBazataPeARDUINOModificat in: December 30, 2012, at 10:49 PM[Modifică] - [Istoric]

   "Industria" realizării cablajelor imprimate home made a evoluat foarte mult în ultimii ani. De la realizarea traseelor cu ajutorul peniţei cu smoala, trecând mai apoi pe marker şi finalizând cu metoda toner transfer/CNC/ şi foto-rezist. De asemenea recent am văzut pe internet o altă metodă ingenioasă de realizat PCB şi anume modificarea unei imprimante EPSON şi tipărirea traseului direct pe placa de cupru. Personal am vrut sa încerc aceasta metoda, dar parca mi-a fost milă să stric o imprimanta perfect funcţionala. Proiectul prezentat în continuare îşi propune sa fie o mână de ajutor pentru cei care realizează cablaje prin metoda foto-rezist. Componenţă: -Scanner Cu ceva timp în urma am găsit pe piaţă un scanner folosit la un preţ foarte avantajos. Pentru proiectul acesta am dezmembrat scanerul, folosind din el doar următoarele componente: opto-limitatorul/car-ul cu bara de ghidaj/sticla pe care se punea documentul pentru scanat/ și bineînţeles motorul pas cu pas -Arduino UNO -Un display LCD 1x16 -ULN2003A -Sursa de alimentare 24V pentru motorul pas cu pas -câteva rezistente -3 butoane Schema electrică: 

Page 20: Comanda Unui Motor Pas Cu Pas Cu Arduino

 

Page 21: Comanda Unui Motor Pas Cu Pas Cu Arduino

  Funcționare:    Proiectul este controlat din 3 butoane. Primul buton are rolul de a seta distanţa de parcurgere(din 5 în 5 cm, în funcție de dimensiunea plăcii ce se doreşte 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ă distanţa setată, cu viteza setată, iar în momentul finalizării acestea se întorc rapid în poziția 0. Software: #include <Stepper.h>#include <Bounce.h>#include <LiquidCrystal.h>#include <Metro.h>

#define STEPS 48#define CM 194 //1cm este parcurs in 233 pasi#define PIN_SENZOR 0#define ZGOMOT 5

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

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

Page 22: Comanda Unui Motor Pas Cu Pas Cu Arduino

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

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

//se foloseste aceasta variabila pentru a putea executa functii in backgroundMetro background0 = Metro(5000); //se citeste senzorul in backgroundMetro background1 = Metro(10); 

int senzor;//valoarea limitatorului optic va fi stocata aiciint stare=0;int reset=0;

int start=0;//variabila folosita pentru a determina prima rularea a programuluiint viteza=4;//se stabileste viteza de rulareint distanta=30;//se stabileste distanta de rulareint 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 pregatit");}

void mergi(int d,int v){ int de_parcurs=0;  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 16x1void print_lcd(String text){

Page 23: Comanda Unui Motor Pas Cu Pas Cu Arduino

  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 butonul 2  if ( buton2.update() ) {     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 butonul 3  if ( buton3.update() ) {     if ( buton3.read() == HIGH) {      apas_b3++;      if (apas_b3==1){      print_lcd("Pornesc leduri.");      delay(1000);

Page 24: Comanda Unui Motor Pas Cu Pas Cu Arduino

      String mesaj="Parcurg ";      String mesaj1=mesaj+distanta;      String 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 mesaj="D=";  String mesaj1=mesaj+distanta;  String mesaj2=mesaj1+"cm ";  String mesaj3=mesaj2+"V=";  String mesaj4=mesaj3+viteza;  String mesaj5=mesaj4+"cm/min";  print_lcd(mesaj5);  stare=0;  }}

void setup() {  Serial.begin(9600);  pinMode(2, INPUT);  pinMode(3, INPUT);  pinMode(A5, INPUT);  lcd.begin(8, 2);    print_lcd("Bine ati venit!");}

void loop() {

  //executa functia AFIS in background

Page 25: Comanda Unui Motor Pas Cu Pas Cu Arduino

  if (background0.check() == 1) { // se verifica daca a trecut intervalul setat pentru background.    AFIS();  }

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

}

[Varianta text]

 Am primit o variantă de soft puţin modificata de la domnul Gheorghe Gainaru (Attach:modificare_ggainaru.txt). Modificarile sunt urmatoarele:  -folosirea limitatorului optic pe portul digital faţa de analogic.  -folosirea kitului LCD distribuit de ROROID pentru afişaj Poze:

Arduino legat la scaner şi

primul test al

programului

Calitatea cablajului de

testCalitatea cablajului de

test

CAR cu ledurile UV

Ledurile UV si montarea

in CAR

Leduri UV

Test cu erorile aparute la

trasee foarte fine

Erorile marite

Page 26: Comanda Unui Motor Pas Cu Pas Cu Arduino

PCB pentru comanda

aparatului UV

PCB pentru display-ul

LCD al aparatului UV

PCB pentru kitul LCD

R2

PCB pentru kitul LED-

MATRIX R2

Un nou kit marca

ROROID

PCB pentru un viitor

voltmetruElectronica aparatului Electronica aparatului

Unitatea UV in versiune

finala

Panoul de control Proba de functionare Proba de functionare

 Aparatul la lucru:  De făcut:    1.realizat partea de comanda a ledurilor UV    2.realizat montaj cu ATMEGA8 și transferul datelor de pe ARDUINO    3.optimizare cod și adăugare 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

Page 27: Comanda Unui Motor Pas Cu Pas Cu Arduino

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 montajhttp://vladprogrammer.wordpress.com/2012/02/08/controlul-motoarelor-pas-cu-pas-cu-arduino/

Controlul motoarelor pas cu pas cu Arduinofebruarie 8, 2012 — Vlad

Page 28: Comanda Unui Motor Pas Cu Pas Cu Arduino

      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:

Page 29: Comanda Unui Motor Pas Cu Pas Cu Arduino

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 ArduinoStepper Motor(rezolutieMotor, pin1,pin2,pin3,pin4);   

Page 30: Comanda Unui Motor Pas Cu Pas Cu Arduino

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); }//==================================.

Share this: