USB FTDI chip + daisy-chained '595 registro de desplazamiento. Poner por separado un transistor en cada relevo.
Más detalle:
Una cadena de integrado 74hc595 se describe a continuación: http://www.arduino.cc/en/Tutorial/ShiftOut (Sólo se muestran dos, pero el concepto puede ser ampliado a cualquier número de '595s.)
A la unidad de la cadena, se necesitan tres señales, datos, pestillo, y el reloj.
Usted puede utilizar un FTDI parte en "bitbang" modo de generar tres señales de control de la computadora. Para utilizar el FTDI en bitbang modo, el uso de libftdi (también Se puede utilizar FTDI oficial de los pilotos, pero libftdi tiene menos problemas en mi experiencia). Un FT232R tiene suficiente pines para ello. FTDI vende un CHAPUZÓN breakout, y Sparkfun vende algunos brotes de acné también.
El aviso deberá 128 2N2222s y 128 330 ohm resistencias. (usted puede obtener la resistencia de las matrices que pueden ser más fáciles de manejar.)
He dibujado el circuito suponiendo una tensión de 12 v para su relés y no menos de 24 ohmios bobinas. Si este no es el caso, usted puede ser que necesite un más robusto transistor o lógica-nivel de MOSFETs. El 2222 es tan barato un transistor como se dará cuenta, y cuando usted está comprando de 128 trozos que hace una diferencia.
No me muestran las tapas de bypass o exacta de 232R del circuito. Lea la hoja de datos.
OK, acabo de ver el solenoide está tratando de controlar. 2N2222 no funciona. Se necesita cambiar de 120VAC para el solenoide. Así que usted puede tener un pequeño relé (con 2N2222) para cambiar el 120V, o el uso de un relé de estado sólido que puede tomar la lógica de entradas y conectarlo directamente a la '595 de salida.
OK, aquí está el código para impulsar el uso de este libftdi. Pin de asignaciones en el código fuente. apt-get install libftdi-dev, a continuación, compile como esta: "gcc test_595.c -lftdi"
/* This program is distributed under the GPL, version 2 */
#include <stdio.h>
#include <ftdi.h>
#define HC595_CT (1) // number of '595 chips
int main(int argc, char **argv)
{
struct ftdi_context ftdic;
int f,i;
unsigned char buf[2*8*HC595_CT+1]; // latch pulse, 8*HC595_CT clock pulses
if ((f=ftdi_init(&ftdic)) < 0)
{
fprintf(stderr, "ftdi_init failed\n");
return f;
}
f = ftdi_usb_open(&ftdic, 0x0403, 0x6001);
if (f < 0 && f != -5)
{
fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic));
exit(-1);
}
printf("ftdi open succeeded: %d\n",f);
// FTDI cable assignments:
#define BIT_DATA (1<<0) // 1: orange. TXD, "data"
// 2: yellow. RXD, unused
#define BIT_CLOCK (1<<2) // 4: green. RTS, "clock"
#define BIT_LATCH (1<<3) // 8: brown. CTS, "latch"
ftdi_enable_bitbang(&ftdic, BIT_DATA | BIT_CLOCK | BIT_LATCH);
// set zero
*buf=0;
f = ftdi_write_data(&ftdic, buf, 1);
unsigned char *b=buf;
unsigned char data;
unsigned char state;
if (argc == 2) {
data=atof(argv[1]);
} else {
data=0x5a;
}
printf("sending data %d\n",data);
for (i=0; i<8; i++) {
state=(data & (128L>>i))?BIT_DATA:0;
*b++=state;
state |= BIT_CLOCK;
*b++=state;
}
*b++=BIT_LATCH;
f = ftdi_write_data(&ftdic, buf, (b-buf));
ftdi_disable_bitbang(&ftdic);
ftdi_usb_close(&ftdic);
ftdi_deinit(&ftdic);
}
Y aquí una imagen de mi configuración de prueba:
(He utilizado el TTL-232R-3V3 cable.)