Gå til innhold

Hvordan styre lys og andre ting via parallel porten[Linux]


Anbefalte innlegg

Jeg vil prøve å lære dere hvordan man kontrollere ting via parallel porten, også kalt printer porten.

Denne "tutorial" gå ut fra at du har tilgang til linux og har en del elektriske komponenter.

 

Jeg vil starte med å beskrive hvordan parallel porten er bygget opp.

 

parallelPort-indicator.png

 

En parallel port består av 3 forskjellig såkalte "registers".

Pin 2 - 9 er data register. Pin 10-13 og 15 er "status" register, og pin 1, 14, 16 og 17 er control register. Resten av "pin'ene" er Ground(0v), dette brukes for å lage en krets.

 

Du kan koble et led til en parallel port, som dette:

 Resistor------------
|                   |
|            C0 C1  |
-----Led-----D0 S3  |
             D1 C2  |
             D2 C3  |
             D3 GND -
              -||-

Output'en til en parallel porten er 5 volt. 5 volt vil gjøre at Led'en sprekker. Derfor setter man på en resistor. Det er forskjellig hvor mye elektrisitet led'ene trenger. Et rødt lys trenger mindre enn et grønt lys. Jeg bruker et grønt led og da passer en 330 ohm resistor perfekt.

 

Led i eksemplet over vil lyse når D0 er "logisk" 1. Du sender en logisk en til D0 ved å sende 0x01,

hvis du vil sende en logisk en til D1 så skriver du 0x02, eller hvis du vil sende en logisk en til D3 så må du skrive 0x04, D4(0x08), D5(0x10), D6(0x20), D7(0x40) og D8(0x80).

 

Du kan sende logisk en til flere av PIN'ene samtidig ved å addere HEX'a, sammen. Et eksempel er hvis du har koblet et led til D0 og et led til D6 og vil at begge led lysene skal lyse. Det du gjør da er å addere

0x01 med 0x20 svaret er da 0x21.

 

Det du kanskje lurer på er hvorfor dette funker, så jeg vil ta det i binary. 0x21 er det samme som 0010 0001, som du da ser så vil PIN D0 få logisk en og PIN D6 logisk en.

 

Nok om parallel porten, nå er det på tide å lære litt om hvordan du kan programmere porten.

 

Det finnes flere måter å programmere parallel porten, den jeg skal lære dere er den du må være admin for at du skal kunne kjøre programmet.

Vi skal bruke linux sitt IO interface.

#include <inttypes.h>
#include <sys/io.h>
#include <signal.h>
#include <string>
#include <iostream>

#define BASE 0x378

using namespace std;

int main(void)
{
bool exit = false;

// Setter opp bare BASE porten til å være åpen, det vil si Data register
int result = ioperm(BASE, 1, 1);

// Hvis den ikke klarte å sette opp
if (result != 0)
{
	cout << "Kunne ikke sette opp porten";
	return result;
}


while ( !exit )
{
               string mode;
               cout << "Hva for modus skal lyset være i? Av/På\n";
               cin >> mode;

	if ( ( mode.compare( "på" ) )|| ( mode.compare( "På" ) ) )
               { 
				outb( 0x01, BASE );
               }
               if ( ( mode.compare( "av" ) ) || ( mode.compare( "Av" ) ) )
               {
                   outb( 0x00, BASE );
               }

               if ( mode.compare( "q" ) )
                       exit = true;
}

// Lukker porten
result = ioperm(BASE, 1, 0);

if (result != 0)
{
	cout << "Kunne ikke lukke porten ";
	return result;
}

   return 0;
}

Dette programmet her spør deg om hvilken status du vil ha lyset i. Hvis du skriver "på" så vil det bli sendt en logisk en til D0, det vil si PIN2, og hvis du skriver "av" så vil det bli send logisk 0 til alle PIN'ene. For å stenge av programmet kan du skrive q.

BASE er adressen til min parallel porten, det kan hende ditt hovedkort gir en annen adresse enn dette. 0x378 er den vanlige så jeg regner med at du ikke kommer til å ha noen problemer med dette.

Når du kjører dette programmet er det viktig, at du kjører som admin, for eksempel:

sudo ./lysprogram

 

Den elektriske kretsen jeg viste ovenfor passer perfekt til dette programmet.

 Resistor------------
|                   |
|            C0 C1  |
-----Led-----D0 S3  |
             D1 C2  |
             D2 C3  |
             D3 GND -
              -||-

 

Parallelporten kan bli ødelagt når du holder på med den, så det er på eget ansvar.

 

Hvis du ikke har et led lys så kan du finne det i en gammel datamaskin.

 

Du kan også kjøpe deler fra Elfa. Jeg anbefaler deg å kjøpe deg et breadboard, en microcontroller, som PIC, små ting, som LED lys, capacitor, resistor og transistor.

 

Det vil komme mer. :thumbup:

 

-Tapped

Endret av Tapped
Lenke til kommentar
Videoannonse
Annonse

       /* ... */
while ( !exit )
{
	char * mode;
	cout << "Hva for modus skal lyset være i? Av/På\n";
	cin >> mode;

 

Jeg tror ikke det. (det er heller intet poeng i strcmp() i C++, men la nå dette ligge).

 

Det er sant det. Jeg brukte argv før, og da brukte jeg strcmp(). Jeg har fått fikset det nå. Takk for at du sa fra. :thumbup:

 

-Tapped

Endret av Tapped
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...