FTDI USB chip + '595 shift shift' en cadena. Coloque un transistor separado en cada relé.
Más detalles:
Una cadena de 74hc595 se describe aquí: enlace (solo se muestran dos, pero el concepto se puede expandir a cualquier número de '595s.)
Para conducir una cadena, se necesitan tres señales, datos, cierre y reloj.
Puedes usar una parte FTDI en modo "bitbang" para generar tres señales desde el control de computadora. Para usar el FTDI en modo bitbang, use libftdi (También puede usar los controladores oficiales de FTDI, pero libftdi es menos problemas en mi experiencia). Un FT232R tiene suficientes pines para hacer esto. FTDI vende un desglose DIP, y Sparkfun también vende algunos brotes.
Tengaencuentaquenecesitará1282N2222sy128resistenciasde330ohmios.(Puedeobtenermatricesderesistenciasquepodríansermásfácilesdeadministrar).
Dibujéelcircuitoasumiendounaalimentaciónde12Vparasusrelésynomenosde24bobinasdeohmios.Siestenoeselcaso,esposiblequenecesiteuntransistormásresistenteoMOSFETdenivellógico.El2222esuntransistorcasitanbaratocomoloencontrarás,ycuandocompras128piezas,esohaceladiferencia.
Nomostrémayúsculasdederivaciónnilaconexiónexactade232R.Leelahojadedatos.
Bien,acabodeverelsolenoidequeintentascontrolar.2N2222nofuncionará.Necesitacambiar120VCAalsolenoide.Porlotanto,puedetenerunpequeñorelé(con2N2222)paracambiarlos120V,ousarunrelédeestadosólidoquepuedatomarentradaslógicasyconectarlodirectamentealasalida'595.
OK,aquíhayuncódigoparamanejarestousandolibftdi.Asignacionesdepinesenelcódigofuente.apt-getinstalllibftdi-dev,luegocompileasí:"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í hay una foto de mi configuración de prueba:
(Utilicéelcable TTL-232R-3V3 ).