Difference between revisions of "Comunica prin lpt"
From linux360
(→Cum facem montajul) |
(→Programul de test) |
||
Line 28: | Line 28: | ||
==Programul de test== | ==Programul de test== | ||
+ | <pre> | ||
+ | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <fcntl.h> | ||
+ | #include <unistd.h> | ||
+ | #include <asm/io.h> | ||
+ | #define porta 0x378 | ||
+ | |||
+ | const char *filename; | ||
+ | int main(int argc,char *argv[]) { | ||
+ | int step[] ={1, 2,4,0}; | ||
+ | int i; | ||
+ | int fd, data; | ||
+ | ioperm(porta,3L,1); | ||
+ | filename = "/dev/lp0"; | ||
+ | fd = open(filename, O_RDWR); | ||
+ | if (fd < 0) | ||
+ | { | ||
+ | printf("bla bla bla eroare %s\n", filename); | ||
+ | exit(1); | ||
+ | } | ||
+ | |||
+ | for (;;){ | ||
+ | |||
+ | outb(3,porta); | ||
+ | usleep(1*1000); | ||
+ | outb(6,porta); | ||
+ | usleep(1*1000); | ||
+ | outb(12,porta); | ||
+ | usleep(1*1000); | ||
+ | outb(9,porta); | ||
+ | usleep(1*1000); | ||
+ | ; | ||
+ | |||
+ | }; | ||
+ | |||
+ | close(fd); | ||
+ | exit(0); | ||
+ | } | ||
+ | </pre> |
Revision as of 13:09, 16 December 2005
Contents
Intro
Acesta se vrea un mini ghid despre controlul unui motor pas cu pas unipolar cu ajutorul linux-ului si a portului lpt.
Motoarele pas cu pas unipoloare
Motoarele la care voi face referinta sunt motoare de curent continuu care se alimenteaza la 12-25V si au proprietatea de a putea controla fiecare pas facut de aceste motoare. Un pas are de obicei 1,8 grade, ceea ce inseamna ca o rotatie completa inseamna 200 de pasi. Motoarele pas cu pas unipolare au de obicei 5 sau 6 fire, exista si cu 8 fire dar exista posibilitatea ca acestea sa fie si bipolare.
Schema unui motor cu 5 fire Schema unui motor cu 6 fire
Asa cum observam din cele doua scheme constructia este asemanatoare, singura diferenta fiind alimentarea. La motorul cu 5 fire numai un fir este de alimentare (firul marcat common) restul de control la cel cu 6 fire sunt 2 fire de alimentare (firele marcate A si B). Daca la motorul cu 6 fire unim cele 2 fire de alimentare obtinem un motor pas cu pas cu 5. Concluzia daca invatam sa comandam unul din cele 2 il vom comanda si pe celalalt. Pentru a afla care sunt firele noastre de alimentare vom masura rezistenta intre fire. Intre firul de alimentare si capete va fi o rezistenta pe jumatate decat in cazul masurarii rezistentei intre 2 capete. La motorul cu 6 fire Orice combinatie A(+-)B(+-) nu va intoarce nici o rezistenta cele 2 fire nefiind legate.
Schema portului lpt
Asa cum se vede si din imagine pinii 18-25 sunt pentru masa, iar cei folositi de noi pentru transmiterea datelor vor fi pinii 2-8
Cum facem montajul
Deoarece motorul lucreaza cu tensiuni cu mult peste posibilitatile portului nostru lpt. O sa avem nevoie de o alimentare externa, dar si de o protectie a portului nostru. Pentru aceasta o sa folosim cipul uln2003 sau uln2803a si o dioda zenner de 12V
Trebuie sa mai adaugam o legatura intre unul din pinii de gnd(18-25) de la portul lpt cu masa si una de la pin-ul gnd al chip-ului cu masa. Si sa avem grija, ca firele motorului sa fie legate A+B+A-B- la pinii 2-5 ai portului lpt.
Programul de test
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <asm/io.h> #define porta 0x378 const char *filename; int main(int argc,char *argv[]) { int step[] ={1, 2,4,0}; int i; int fd, data; ioperm(porta,3L,1); filename = "/dev/lp0"; fd = open(filename, O_RDWR); if (fd < 0) { printf("bla bla bla eroare %s\n", filename); exit(1); } for (;;){ outb(3,porta); usleep(1*1000); outb(6,porta); usleep(1*1000); outb(12,porta); usleep(1*1000); outb(9,porta); usleep(1*1000); ; }; close(fd); exit(0); }