Pilotare 8 rele' con Linux:

sezione dedicata ai progetti fai-da-te e alla autocostruzione di apparecchiature elettroniche

Pilotare 8 rele' con Linux:

Messaggio da leggereda root » 11/04/2012, 21:12

Pilotare 8 rele' con Linux:

Ecco una semplice soluzione per avere otto uscite di potenza per pilotare motori, lampade, elettrodomestici o qualsiasi altra apparecchiatura elettrica
Occorre una semplice interfaccia a rele' da connettere alla porta parallela del PC, se ne capite un po' di elettronica e ve la cavate con il saldatore potete benissimo autocostruirvela, altrimenti la potete trovare abbastanza facilmente in vendita sulla rete.

Per comandare le uscite della porta parallela ecco un semplice programmino in C

Da riga di comando digitate:

sudo gedit relay.c

inserite dentro il file vuoto il seguente listato:

#
#include <stdio.h>
#
#include <stdlib.h>
#
#include <unistd.h>

#
#include <sys/io.h>
#

#
#define base 0x378 /* /dev/lp0 */
#

#
main(int argc, char **argv) {
#
int value;
#

#
if (argc!=2)
#
printf("Enter a number between 0 and 255.\n"), exit(1);
#

#
if (sscanf(argv[1],"%i",&value)!=1)
#
printf("Parameter is not a number.\n"), exit(1);
#

#
if ((value<0) || (value>255))
#
printf("Enter a number between 0 and 255.\n"), exit(1);
#

#
if (ioperm(base,1,1))
#
perror("ioperm");
#

#
printf("Setting base %x to value %d\n", base, value);
#

#
outb((unsigned char)value, base);
}


ora sempre da riga di comando compilate il file:
make relay

a questo punto per lanciare il nostro programmino di invio comandi alla porta parallela ecco la sintassi:

sudo ./relay dato (numero da da 1 a 255)

NOTA: variando il dato da 1 a 255 otterrete tutte le combinazioni possibili di accensione degli 8 relay

esempio:

sudo ./relay 1

Ecco un circuitino che si puo' trovare in rete:

Immagine

ecco tre possibili soluzioni schematiche per il circuitino, le uscite da usare sono da 2 a 9 (D0-D7) la massa e' il pin 25



NOTA: nel primo circuitino la massa del +5V e la massa della parallela devono essere connesse insieme, il +5V puo' essere preso anche dall'alimentatore del PC dal cavetto di alimentazione del floppy o di un CD.
La stessa cosa vale anche per gli altri due schemi.
Fate molta attenzione alla correttezza dei collegamenti e delle polarita', un errore potrebbe costarvi la piastra madre del vostro PC!

(*)ATTENZIONE: se lavorate con tensioni superiori a 48V in uscita, o peggio ancora con il 220V, state attenti agli isolamenti!!! C'e' rischio di folgorazione :oVVoVe: :oVVoVe:
--------------------------------------

e' anche possibile leggere dati dalla porta parallela utilizzando degli switch di ingresso (fotoaccoppiatori) come nel circuito qui sotto visualizzato (schema teorico di esempio):



un esempio di programmino in basic per leggere i dati in ingresso potrebbe essere il seguente:

CLS
DEFINT A-Z
Address = 889: REM 889 = port address, other addresses could be 633 or 957
PRINT "Press the enter key to read printer port pins (15,13,12,10,11)"
PRINT "A (0) reading indicates the pin is at ground level, (1) indicates"
PRINT "the pin is at a high level or unterminated."
INPUT A$
V = INP(Address)
PRINT V
P11 = 1
IF V > 127 THEN P11 = 0: V = V - 128
IF V > 63 THEN P10 = 1: V = V - 64
IF V > 31 THEN P12 = 1: V = V - 32
IF V > 15 THEN P13 = 1: V = V - 16
IF V > 7 THEN P15 = 1
PRINT
PRINT "Pin 15 ="; P15
PRINT "Pin 13 ="; P13
PRINT "Pin 12 ="; P12
PRINT "Pin 10 ="; P10
PRINT "Pin 11 ="; P11
END


in linguaggio C invece potrebbe essere qualcosa del genere:

/*
* example.c: very simple example of port I/O
*
* This code does nothing useful, just a port write, a pause,
* and a port read. Compile with `gcc -O2 -o example example.c',
* and run as root with `./example'.
*/

#include <stdio.h>
#include <unistd.h>
#include <asm/io.h>

#define BASEPORT 0x378 /* lp0 */

int main()
{
/* Get access to the ports */
if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);}

/* Set the data signals (D0-7) of the port to all low (0) */
outb(0, BASEPORT);

/* Sleep for a while (100 ms) */
usleep(100000);

/* Read from the status port (BASE+1) and display the result */
printf("status: %d\n", inb(BASEPORT + 1));

/* We don't need the ports anymore */
if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);}

exit(0);
}

/* end of example.c */



Sono ben accetti suggerimenti e migliorie di quanto sopra esposto
Maurizio
Avatar utente
root
Amministratore
 
Messaggi: 348
Iscritto il: 10/04/2012, 10:55
Località: Ovada

Torna a Progetti fa-da-te

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron