Personal tools

Difference between revisions of "Comunica prin lpt"

From linux360

Jump to: navigation, search
(Programul de test)
(Programul de test)
Line 33: Line 33:
  
 
==Programul de test==
 
==Programul de test==
<pre>
+
<code><c/>
 
#include <stdio.h>
 
#include <stdio.h>
 
#include <stdlib.h>
 
#include <stdlib.h>
Line 39: Line 39:
 
#include <unistd.h>
 
#include <unistd.h>
 
#include <asm/io.h>
 
#include <asm/io.h>
 +
 
#define porta 0x378
 
#define porta 0x378
  
 
const char *filename;
 
const char *filename;
 +
 
int main(int argc,char *argv[]) {
 
int main(int argc,char *argv[]) {
 
   
 
   
 
   int fd;
 
   int fd;
 +
  filename = "/dev/lp0";
 +
 
   ioperm(porta,3L,1);
 
   ioperm(porta,3L,1);
  filename = "/dev/lp0";
 
 
   fd = open(filename, O_RDWR);
 
   fd = open(filename, O_RDWR);
  if (fd < 0)
+
  if (fd < 0) {
  {
 
 
     printf("bla bla bla eroare %s\n", filename);
 
     printf("bla bla bla eroare %s\n", filename);
 
     exit(1);
 
     exit(1);
  }
+
  }
 
 
for (;;){
 
 
 
  outb(3,porta);
 
  usleep(20*1000);
 
  outb(6,porta);
 
  usleep(20*1000);
 
  outb(12,porta);
 
  usleep(20*1000);
 
  outb(9,porta);
 
  usleep(20*1000);
 
  
};
+
  for (;;){
 +
    outb(3,porta);
 +
    usleep(20*1000);
 +
    outb(6,porta);
 +
    usleep(20*1000);
 +
    outb(12,porta);
 +
    usleep(20*1000);
 +
    outb(9,porta);
 +
    usleep(20*1000);
 +
  }
  
 
   close(fd);
 
   close(fd);
 
   exit(0);
 
   exit(0);
 
}
 
}
</pre>
+
</code>
  
 
[[Category:Howto]]
 
[[Category:Howto]]
 
[[Category:Programming]]
 
[[Category:Programming]]

Revision as of 04:08, 20 January 2006

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 5wire.jpg Schema unui motor cu 6 fire 6wire.jpg

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. Motoarele pas cu pas se controleaza aplicand o tensiune pe firele de control. Modul de control este prezentat in figura urmatoare:

Step.gif

Pentru schimbarea sensului de rotatie pur si simplu se trimit comenzile in sens invers.

Schema portului lpt

Lpt.jpg 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

Schema este urmatoarea Lptmot.jpg

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

<c/>

  1. include <stdio.h>
  2. include <stdlib.h>
  3. include <fcntl.h>
  4. include <unistd.h>
  5. include <asm/io.h>
  1. define porta 0x378

const char *filename;

int main(int argc,char *argv[]) {

 int fd;
 filename = "/dev/lp0";
 ioperm(porta,3L,1);
 fd = open(filename, O_RDWR);
 if (fd < 0) {
    printf("bla bla bla eroare %s\n", filename);
    exit(1);
 }
 for (;;){
    outb(3,porta);
    usleep(20*1000);
    outb(6,porta);
    usleep(20*1000);
    outb(12,porta);
    usleep(20*1000);
    outb(9,porta);
    usleep(20*1000);
 }
 close(fd);
 exit(0);

}