step step step step

November 26, 2010 on 7:21 pm | In allgemeines, linux, programmieren, projekte, tech | No Comments

es gibt versch. typen von e-motoren. bürsten-, bürstenlos-, schritt-motoren. der vorteil an schrittmotoren ist, dass man keine eigene sensorik braucht, um zu wissen wie weit sich der motore gedreht hat.
bei jedem puls nimmt man an, dass der motor genau diesen einen schritt gemacht hat.

jedenfalls ist dieses wissen vom aktuellen zustand notwendig, um einen plotter zu verwirklichen, und desswegen schlage ich mich mit diesen teilen herum.

im internet konnte ich nirgendwo finden, wie man direkt vom printer-port (drucker-ausgang, lpt) einen schrittmotor (stepper) ansteuert, ohne dazwischen geschaltete ICs und weitere elektronik. aber genau das hat mich interessiert, ein minimaler aufbau, um die funktion eines stepper motors zu verstehen.

es gibt zwei arten von schrittmotoren, unipolar und bipolar. für uns sind unipolare schrittmotoren besser nutzbar, weil einfacher ansteuerbar. diese erkennt man an den 5-6 eingänge. bipolare haben nur 4.

von unseren 6 eingängen sind 2 masse- (Grd) und 4 steuerleitungen. die steuerleitungen gehören zu 4 spulen. jedes mal wenn eine dieser elektromagnetischen spulen unter strom gesetzt wird, dreht sich der schrittmotor um einen gewissen winkeln, sagen wir jetzt einmal (übertriebenerweise) um 90°.
wenn man also alle 4 spulen hintereinander mit strom versorgt hat, weiß man dass der motor sich um 360° gedreht hat.

signal ein- und ausgang über den drucker port ist ebenfalls sehr einfach ansteuerbar, wenn man einige basics weiß.

es sind nur 8 (mit trick bis 12) pins des druckeranschlusses ausgänge, die beschalten werden können. diese geben, wenn sie logisch 0 sind 0V (bzw. die untere flanke) aus, und wenn sie logisch eins sind +5V (die obere flanke). damit kann man jetzt quasi alles (leds, relais, motoren, etc.) ansteuern, und über die eingänge sogar sensoren verwalten.

für uns sind nur diese ausgänge relevant. D0, also der erste ausgang, liegt am pin 2, D0-D7 liegen nebeneinander.
für meinen testaufbau habe ich den schrittmotor so mit dem lpt-port verbunden:

  • D0: orange
  • D1: gelb
  • D2: schwarz
  • D3: braun
  • Grd: rot

ansteuern kann man den drucker-port am einfachsten mit der programmiersprache C. ein einfaches code-beispiel soll das verdeutlichen.
davor muss man noch wissen, dass der status der pins binär codiert ist.
11111111 <- alle ausgänge auf logisch 1
00000000 <- alle ausgänge auf logisch 0
00000001 <- am ausgang D0 liegt +5V an, an allen anderen 0.
diese binäre darstellung muss man jetzt nur noch in basis 10 umwandeln, um sie ins programm einspielen zu können. 11111111 == 255, 00000000 == 0, 00000001 == 1, 00000010 == 2, …


#include 
#include 
#include 
#include 
#include 
#include 


// variablen
#define BASEPORT 0x378 /* lp1 */
#define WAIT 250000 /* wartezeit zwischen schritten */

/* source: http://eagerfish.eu/lpt-programming-example-in-c-for-ubuntu-linux */

int main() {
	char c;
	int n, tem;
	
	printf("any key to stop\n");
	
	//set permissions to access port
	if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);}
	
	tem = fcntl(0, F_GETFL, 0);
	fcntl (0, F_SETFL, (tem | O_NDELAY));
	
	//main loop 
	// hier wird die ansteuerung der ports erledigt.
	while (1) {
		//if some key is pressed, break out from loop
		n = read(0, &c, 1);
		if (n > 0) break;
		
		// 4 eingänge nacheinander belegen.
		outb(1, BASEPORT);
		usleep(WAIT);
		outb(8, BASEPORT);
		usleep(WAIT);
		outb(2, BASEPORT);
		usleep(WAIT);
		outb(4, BASEPORT);
		usleep(WAIT);
		
	}
	
	fcntl(0, F_SETFL, tem);
	outb(0, BASEPORT);
	
	//take away permissions to access port
	if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);}
	
	exit(0);
}

mit dem wissen kann man jetzt quasi jede hardware-anwendung mit dem computer steuern. damit habe ich vor einiger zeit sogar über eine webseite und php scripting eine led übers internet und den browser geschaltet, also viel spass beim experimentieren.

hinweis: der printer ausgang ist direkt am motherboard. die oben gezeigte technik ist SEHR unsicher, und kann diesen port und das dahinter liegende board beschädigen, wenn man pech hat / dumm ist / sonstiges. also macht das auf eigene gefahr.

No Comments yet »

RSS feed for comments on this post. TrackBack URI

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>