Driver și cod Arduino pentru motoare pas cu pas unipolare

 Autor:   Publicat pe:    Niciun comentariu

Motoarele pas cu pas sunt motoare fără perii care efectuează mișcări de rotație discrete în pași incrementali, spre deosebire de rotația continuă a unui motor electric obișnuit. Numărul de pași este determinat de controller și unghiul unui pas este cunoscut. Astfel, motoarele pas cu pas pot efectua rotații precise, necesare în diverse aplicații mecanice de precizie. Pentru rotirea în pași, motorul conține mai multe bobine care sunt activate secvențial de impulsuri generate de un controller. Rata de succesiune a impulsurilor determină viteza de rotație iar ordinea de succesiune determină sensul rotației. Chiar dacă se găsesc circuite integrate specializate pentru acest scop, în acest articol vom vedea cum putem construi un driver cu tranzistoare și vom folosi o placă de dezvoltare pentru a genera impulsurile necesare rotirii axului motorului.

Există două tipuri de motoare pas cu pas. Motoarele bipolare conțin două bobine separate și au 4 fire de conexiune. Pentru a roti un astfel de motor bobinele sunt alimentate una după alta, apoi polaritatea este inversată și bobinele sunt iarăși alimentate. În acest caz, driver-ul trebuie să fie mai complex. Se folosesc două punți H. Celelalte motoare pas cu pas sunt unipolare. Au tot două bobine, dar aceste bobine prezintă o priză mediană. Prizele mediane sunt conectate la sursa de alimentare și celelalte 4 terminale primesc impulsurile. Aceste motoare au 5 fire. Driver-ul se simplifică în acest caz, fiind necesari doar 4 tranzistori. Mai există și motoare pas cu pas ce pot fi folosite fie ca bipolare, fie ca unipolare. Acestea nu au prizele mediane de la bobine conectate între ele (motoare cu 6 fire sau cu 8 fire). Astfel, dacă vei conecta motorul la un driver bipolar folosești doar terminalele celor 2 bobine, nu și prizele mediane.

Driver pentru motoare pas cu pas unipolare cu tranzistoare

Driver pentru motoare pas cu pas unipolare cu tranzistoare

Acest articol va prezenta metode de acționare a motoarelor unipolare. Impulsurile pot fi generate destul de ușor cu orice microcontroller (platforma Arduino vine inclusiv cu biblioteci pentru acest lucru). Problema este că microcontroller-ul nu poate fi conectat direct la o sarcină inductivă și de curent mare. Așadar, este nevoie de un driver. Poți folosi un circuit integrat specializat sau îți poți construi un driver cu 4 tranzistoare. Reține că majoritatea driverelor integrate conțin mai mult decât cele 4 tranzistoare de putere, deci și semnalele de intrare pentru acționarea motorului sunt diferite.

Driver cu tranzistoare

Pentru a construi driverul, am ales 4 tranzistoare N-FET (am avut la îndemână un tip vechi, 2SK2382). Tranzistoarele care provin din surse de alimentare sunt o alegere bună deoarece suportă curenți mari și include diode de protecție. Atât timp cât pragul de grilă (gate threshold) este mai mic de 5 V (tensiunea ieșirilor digitale ale Arduino), poți folosi tranzistorul. Tranzistoarele bipolare NPN pot fi de asemenea folosite.

Schemă driver motoare unipolare cu tranzistoare N-FET

Schemă driver motoare unipolare cu tranzistoare N-FET

Poți alimenta un motor pas cu pas de la o sursă de tensiune constantă. O opțiune mai bună este folosire unei surse de curent constant. Mai ales dacă nu cunoști specificațiile unui motor găsit prin vreun dispozitiv. Schema prezentată conține o sursă de curent constant construită cu integratul LM317, setată la 500mA. Dacă nu cunoști curentul nominal pentru motor, încearcă cu valori diferite, crescânde astfel încât, în regim normal de funcționare, motorul poate să se încălzească, dar nu atât de mult încât să nu poți ține mâna pe el. Dacă se încălzește foarte tare, micșorează curentul.

Identificarea pinilor unui motor pas cu pas fără documentație poate fi o provocare. În funcție de numărul de fire (conexiuni) poți afla ce tip de motor ai. Apoi, cu un multimetru poți identifica bobinele. Dacă motorul pe care îl ai are 4 fire, acesta este bipolar și nu poate fi folosit cu driverul prezentat.

Conectarea motoarelor pas cu pas la un driver unipolar

Conectarea motoarelor pas cu pas la un driver unipolar

Uneori, dezasamblarea motorului poate aduce informații suplimentare despre conectarea bobinelor. În imaginea de mai jos poți vedea prizele mediane (CT, center tap) ale unui motor NEMA17 cu 6 fire. Apoi, cu un multimetru am reușit să identific următoarele fire ca fiind terminale ale aceleiași bobine (A și A# este una din bobine cu priza mediană din stânga, iar B și B# este a doua bobină, cu priza mediană din dreapta).

Conexiunile interne ale unui motor pas cu pas cu 6 fire

Conexiunile interne ale unui motor pas cu pas cu 6 fire

Schema driverului de mai sus este completă. Pentru majoritatea motoarelor, diodele de protecție pot fi diode redresoare ultrarapide, din surse în comutație, ca de exemplu UF4004 sau BA157. Dacă folosești tranzistoare N-FET cu diode incluse, diodele externe de protecție nu mai sunt necesare. De asemenea, în cazul tranzistoarelor FET, poți conecta grila (gate) direct la pinii microcontroller-ului, fără rezistoare înseriate. Rezistoarele sunt necesare dacă vei folosi tranzistoare bipolare NPN. Și acestea pot fi utilizate în acest scop, dar se recomandă tranzistoare Darlington deoarece au un factor de amplificare mult mai mare. Asigură-te că tranzistoarele folosite suportă amperajul necesar motorului (curentul drenă-sursă, respectiv curentul colector-emitor) și dacă pot fi activate de microcontroller (tensiunea prag a grilei, respectiv factorul de amplificare mare).

Rezistorul conectat între pinul OUT și pinul ADJ al LM317 determină curentul prin motor, conform formulei 1,25/R. În cazul meu, 1,25/2,4 = 0,5 A. Se va folosi un rezistor adecvat ca putere (2-3 W). Tensiunea la intrarea LM317 nu poate depăși 35 V. Un radiator este necesar pentru LM317. Dimensionarea acestuia se va face în funcție de caz (puterea disipată calculată ca produs între căderea de tensiune pe LM317 și curentul constant stabilit prin motor). Driverul poate fi construit chiar și pe o placă de test.

Secvența de impulsuri

Bobinele trebuie activate într-o ordine precisă: se începe cu jumătatea unei bobine (de exemplu A), apoi o jumătate a celeilalte (B). Apoi se continuă cu jumătățile rămase (prima A# și apoi B#). Ordinea determină direcția de rotație. Reține că nu poți alimenta o jumătate a unei bobine urmată de cealaltă jumătate a aceleiași bobine (de exemplu A urmat de A#). Motorul va face un pas într-o direcție și pasul următor înapoi, deci nu vei observa axul rotindu-se. Secvențe valide sunt A-B-A#-B# și A-B#-A#-B. A-A#-B-B# nu este corectă (se va avea în vederea denumirea conexiunilor de mai sus). Secvențele inversate își mențin validitatea (B#-A#-B-A și B-A#-B#-A sunt bune).

În cazul motoarelor unipolare ai 4 bobine de alimentat secvențial. Sunt trei moduri în care poți face acest lucru. Primul mod prezentat este wave drive. În orice moment, doar o jumătate de bobină este alimentată prin diferența de potențial aplicată între priza mediană și firul specific bobinei. Modul acesta determină un cuplu și un consum de energie mai mici. Iată cum arată secvența de impulsuri.

Acționare motor unipolar în mod wave drive

Acționare motor unipolar în mod wave drive

Putem crește durata impulsului și să lăsăm jumătatea bobinei activă în timp ce o activăm pe următoarea. Jumătate din timp, două bobine adiacente sunt active. Modul se numește half drive și determină un cuplu ceva mai mare decât modul anterior. Produce de asemenea o dublare aparentă a numărului de pași necesari unei rotații complete.

Acționare motor unipolar în mod half drive

Acționare motor unipolar în mod half drive

Dacă menținem tot timpul două jumătăți de la fiecare bobină activate (A și B) obținem cel mai mare cuplu posibil pentru motor, în modul full drive.

Acționare motor unipolar în mod full drive

Acționare motor unipolar în mod full drive

Biblioteca Arduino

Biblioteca Stepper este inclusă în mediul de dezvoltare Arduino IDE. Pentru a vedea cum funcționează am declarat un obiect Stepper după cum urmează și am analizat semnalul digital cu un analizor logic.

Stepper motor(STEPSPERREV, 8, 9, 10, 11);

unde STEPSPERREV este numărul de pași pe rotație completă (200, specific motorului meu). Mă așteptam să obțin un set de impulsuri similar cu unul din graficele de mai sus, dar nu a fost chiar așa.

Impulsurile generate de biblioteca Stepper

Impulsurile generate de biblioteca Stepper

Sunt într-adevăr impulsuri full drive, dar ordinea pinilor este diferită (conform legendei graficului). Documentația Arduino nu ne spune nimic despre cum ar trebui să declarăm pinii motorului. Se observă că prima pereche de pini din declarația Stepper trebuie să aparțină aceleiași bobine (deci, A și A#), iar cea de-a doua, celeilalte bobine (B și B#). Reține acest lucru dacă folosești biblioteca.

Cod sursă

Chiar dacă Arduino vine cu biblioteci pentru aproape orice, putem scrie propriul cod care să acționeze motoare pas cu pas. La urma urmei nu este atât de greu. După cum se vede, biblioteca suportă numai modul full drive.

Am ales să generez impulsurile scriind direct în registrul portului de ieșire. Comutarea rapidă și simultană a tuturor pinilor cuprinși de registru este un mare avantaj. Dar codul este mai greu de înțeles și pinii motorului sunt determinați de atribuirea specifică portului. Microcontrollerul ATmega328 de pe platforma Arduino oferă pinii portului D sub forma ieșirilor digitale D0...D7 și cei ai portului B la pinii D8...D13. Tot ce trebuie să facem în schiță este să atribuim un număr de 8 biți portului și starea pinilor se va modifica asemeni biților numărului atribuit. Dar, D0 și D1 sunt pinii portului serial. Iar ultimii biți (7 și 6) ai portului B sunt conectați la oscilatorul cu quartz. Deci trebuie să nu le modificăm starea.

Începem prin a scrie registrul DDRB ce modifică tipul pinilor (intrare sau ieșire). Am ales să setez doar primii 4 biți ai portului B ca ieșiri. Între valoarea actuală a DDRB și 0x0F (adică B00001111 binar) am aplicat operatorul OR (sau) la nivel de biți. Singura linie de cod este echivalentul a 4 apelări ale funcției pinMode().

DDRB |= 0x0F;

Cu siguranță cei 4 biți vor fi setați în DDRB. Starea celorlalți nu se modifică. Biții modificați, 3-0 corespund pinilor digitali D8-D11. Iată cum putem genera impulsurile pentru modul wave drive.

const int wavePulse[4] = { B0001, B0010, B0100, B1000 };

void waveDrive() {
  byte port = 0;

  for (int i = 0; i < 4; i++) {
    port = PORTB & 0xF0; // se păstrează biții 4-7
    port |= wavePulse[i];
    PORTB = port;
    delay(5);
  }
}

Funcția de mai sus determină efectuarea de 4 pași, cu un timp de 5 milisecunde pe pas. Half drive este diferit pentru că numărul de pași se dublează.

const int halfPulse[8] = { B0001, B0011, B0010, B0110, B0100, B1100, B1000, B1001 };

void halfDrive() {
  byte port = 0;

  for (int i = 0; i < 8; i++) {
    port = PORTB & 0xF0; // se păstrează biții 4-7
    port |= halfPulse[i];
    PORTB = port;
    delay(5);
  }
}

Deși motorul face 8 pași la o apelare a funcției de mai sus, aceștia sunt mai mici (pe jumătatea celor din funcția anterioară). Modul full drive este similar celui wave drive.

const int fullPulse[4] = { B0011, B0110, B1100, B1001 };

void fullDrive() {
  byte port = 0;

  for (int i = 0; i < 4; i++) {
    port = PORTB & 0xF0; // se păstrează biții 4-7
    port |= fullPulse[i];
    PORTB = port;
    delay(5);
  }
}

Fiecare din funcțiile de mai sus citește întâi starea portului, apoi modifică doar cei 4 pini aferenți motorului. Funcțiile sunt simple și ușor de implementat. Dar generează 4 pași la fiecare apelare și nu permit schimbarea direcției de rotație. Voi încerca să adaug aceste caracteristici într-un articol viitor.

Aprecierea distanței cu senzorul ultrasonic HC-SR04

 Autor:   Publicat pe:    Niciun comentariu

Senzorul HC-SR04 este un modul complex care permite aprecierea distanțelor cuprinse între 2 centimetri și 4 metri cu o acuratețe de 3 milimetri. Senzorul se bazează pe principiul reflexiei ultrasunetelor. Astfel, HC-SR04 conține un generator piezoelectric de ultrasunete, pe frecvența de 40 kHz. Semnalul sonor se reflectă pe suprafețele cu care vine în contact, și este apoi preluat de receptorul aflat pe aceeași placă de circuit.

Modulul în sine este un circuit complex, ce conține un microprocesor, un convertor de tensiune pentru alimentarea emițătorului de ultrasunete și mai multe amplificatoare operaționale care amplifică și filtrează semnalul captat de receptorul ultrasonic. Senzorul se alimentează la 5V și necesită un curent de 15 mA, putând fi astfel utilizat cu diverse plăci de dezvoltare (de exemplu, Arduino).

Aprecierea distanței cu senzorul ultrasonic HC-SR04