FTDI-USB-Chip + verkettetes 595-Schieberegister. Setzen Sie für jedes Relais einen separaten Transistor ein.
Weitere Details:
Hier wird eine Kette von 74hc595 beschrieben: http: //www.arduino .cc / de / Tutorial / ShiftOut (Es werden nur zwei angezeigt, aber das Konzept kann auf eine beliebige Anzahl von 595 erweitert werden.)
Um die Kette anzutreiben, werden drei Signale benötigt. Daten, Latch und Clock.
Sie können einen FTDI-Part im "Bitbang" -Modus verwenden, um drei Signale von der Computersteuerung zu generieren. Um das FTDI im Bitbang-Modus zu verwenden, verwenden Sie libftdi (Sie können auch die offiziellen FTDI-Treiber verwenden, aber libftdi ist meiner Erfahrung nach weniger problematisch). Ein FT232R verfügt über genügend Pins, um dies zu tun. FTDI verkauft einen DIP-Breakout und Sparkfun verkauft auch einige Breakouts.
Beachten Sie, dass Sie 128 2N2222s und 128 330 Ohm-Widerstände benötigen. (Sie können Widerstands-Arrays erhalten, die möglicherweise einfacher zu verwalten sind.)
Ich habe die Schaltung unter der Annahme einer 12-V-Versorgung für Ihre Relais und nicht weniger als 24-Ohm-Spulen gezeichnet. Ist dies nicht der Fall, benötigen Sie möglicherweise einen stabileren Transistor oder MOSFETs mit Logikpegel. Der 2222 ist ungefähr so billig wie ein Transistor, und wenn Sie 128 Stück kaufen, macht das einen Unterschied.
Ich habe keine Bypass-Kappen oder den genauen 232R-Anschluss gezeigt. Lesen Sie das Datenblatt.
OK, ich habe gerade den Magneten gesehen, den Sie steuern möchten. 2N2222 funktioniert nicht. Sie müssen 120 VAC an den Magneten schalten. Sie können also entweder ein kleines Relais (mit 2N2222) zum Schalten der 120 V verwenden oder ein Halbleiterrelais verwenden, das Logikeingänge aufnimmt und direkt mit dem 595-Ausgang verbindet.
OK, hier ist der Code, um dies mit libftdi zu steuern. Pinbelegung im Quellcode. apt-get installiere libftdi-dev und kompiliere dann wie folgt: "gcc test_595.c -lftdi"
/ * Dieses Programm wird unter der GPL, Version 2 * / # include <stdio.h> vertrieben #include <ftdi.h> # define HC595_CT (1) // Anzahl der 595 Chipsint main (int argc, char ** argv) {struct ftdi_context ftdic; int f, i;
vorzeichenloser char buf [2 * 8 * HC595_CT + 1]; // Latch-Impuls, 8 * HC595_CT-Taktimpulse 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, "ftdi-Gerät kann nicht geöffnet werden:% d (% s) \ n", f, ftdi_get_error_string (&ftdic)); Ausfahrt (-1); } printf ("ftdi open erfolgreich:% d \ n", f); // FTDI-Kabelzuweisungen: #define BIT_DATA (1<<0) // 1: orange. TXD, "Daten" // 2: gelb. RXD, nicht verwendet # define BIT_CLOCK (1<<2) // 4: grün. RTS, "Uhr" #define BIT_LATCH (1<<3) // 8: braun. CTS, "Latch" ftdi_enable_bitbang (&ftdic, BIT_DATA | BIT_CLOCK | BIT_LATCH); // setze Null * buf = 0; f = ftdi_write_data (&ftdic, buf, 1); vorzeichenloses Zeichen * b = buf; vorzeichenlose Zeichendaten; vorzeichenloser Zeichenstatus; if (argc == 2) {data = atof (argv [1]); } else {data = 0x5a; } printf ("Daten senden% d \ n", Daten); für (i = 0; i<8; i ++) {state = (Daten & (128L>>i))? BIT_DATA: 0; * b ++ = Zustand; state | = BIT_CLOCK; * b ++ = Zustand; } * b ++ = BIT_LATCH; f = ftdi_write_data (&ftdic, buf, (b-buf)); ftdi_disable_bitbang (&ftdic); ftdi_usb_close (&ftdic); ftdi_deinit (&ftdic);}
Und hier ist ein Bild meines Testaufbaus:
(ich habe das verwendet TTL-232R-3V3 -Kabel.)