|
arduino IDEArduino
|
Compact IC2 GPIO Interface with 16 Inputs and 16 Outputs from 5 to 24 Vdc
Compact IC2 GPIO Interface with 16 Inputs and 16 Outputs from 5 to 25 Vdc.
Board Name: UM-UL20
Date: aug 2020
_______________________
----- index -----
# Purpose -
# Hardware -
# Inputs -
# Interrupts -
# Choice of GPIOs -
# Darlington PNP and NPN -
# Wiring -
# A curious effect -
# Firmware -
# Chain -
# I2C addressing -
# 3D -
# Note -
# References -
_______________________
# Scope
The UM-UL20 project is used to test output cards equipped with 16 relays. My Test Equipment must command the relays and check that the corresponding contacts respond to the commands.
In my case:
- the relays coils must be connected to a 20 pin IDC connector;
- the contacts of the relays must be read from the terminal boards on which a bed of needles must be placed.
IT
Il progetto UM-UL20 viene utilizzato per testare schede di uscita dotate di 16 relè. La mia attrezzatura di prova deve comandare i relè e verificare che i contatti corrispondenti rispondano ai comandi.
Nel mio caso:
- le bobine dei relè devono essere collegate ad un connettore IDC a 20 pin;
- i contatti dei relè devono essere letti dalle morsettiere su cui va posizionato un letto di aghi.
_______________________
# Hardware
- GPIO input: PCF8575
- GPIO output: PCA 9555
- Input adaptation: resistive dividers
- Output drivers: Darlington Drivers PNP TD62783
- (NPN outputs in a future version)
- Logic power supply: +5 Vdc
- Driver power supply: up to +24 Vdc
- Communication: IC2 Bus
_______________________
# Inputs
Each input, with a 10K and 2K2 resistive divider, reduces the input voltage from 24V to 4.3 making it compatible (and with a certain margin) to circuits that operate on +5 Vdc, it is therefore very easy to calculate different values, to be mounted in cases where it is necessary.
IT
Ogni ingresso, con divisore resistivo da 10K e 2K2, riduce la tensione di ingresso da 24V a 4,3 rendendola compatibile (e con un certo margine) ai circuiti che funzionano a +5 Vdc, risulta quindi molto semplice calcolare valori diversi, da montare nei casi in cui sia necessario.
_______________________
# Interrupts
Both the Input GPIO and the Output GPIO to their own Interrupt line named /INT and /ONT respectively. Each of these lines has a pull-up resistor which can be removed or not mounted, as only one of them is sufficient. The /INT and /ONT lines can be connected if and where it is considered appropriate, in case you have to manage the Interrupts caused by changes in the Inputs or Outputs.
IT
Sia il GPIO di Input che il GPIO di Output ad una propria linea di Interrupt denominate rispettivamente /INT e /ONT. Ciascuna di queste linee dispone di una resistenza di pull-up che può essere tolta o non montata, dato che una sola di esse è sufficiente. Le linee /INT e /ONT possono essere collegate se e dove si ritiene opportuno, nel caso si debbano gestire gli Interrupt provocati da variazioni degli Input o degli Output.
_______________________
# Choice of GPIOs
I would have preferred both GPIOs to be of the same type, but I chose a different path.
The first candidate was the PCF8575, but although it can draw the current needed to light an LED, it cannot deliver the little current for a Darlington driver input.
The second candidate was the Motorola MCP23017, very complete, versatile and easy to use, but its size is SOP-28 and I found it too bulky for my circuit especially if you keep in mind that two of them must be mounted.
The UM-UL20 board is based on the two very similar GPIOs: the PCF8575 and the PCA 9555.
Since the PCF8575 is not able to drive the Darlingtons needed to drive the +24 Vdc relays, I used it only for the inputs; the PCA9555 is used only for outputs because it has a good output current in both sink and surge.
I could have used the PCA9555 for both inputs and outputs, but while the PCF8575 is found in all packages including the SOD, the PCA9555 is found only in the SSOD package.
Since my intention is not to produce numerous specimens of this project of mine, but to build only a few specimens with my hands and not having excessive sympathy for the SSOD package especially when it comes time to solder it on the PCB, I resigned myself to this mixed solution, not very elegant, but very practical.
IT
Avrei preferito entrambi i GPIO fossero dello stesso tipo, ma ho scelto una strada diversa.
Il primo candidato è stato il PCF8575, ma sebbene sia in grado di assorbire la corrente necessaria ad illuminare un LED, non è in grado di erogare la poca corrente per l'ingresso di un Darlington driver.
Il secondo candidato è stato il Motorola MCP23017, molto completo, versatile e facile da usare, ma la sua taglia è SOP-28 ed io ho l'ho trovata troppo ingombrante per il mio circuito soprattutto se si tiene presente che ne vanno montati due.
La scheda UM-UL20 si basa sui due GPIO molto simili: il PCF8575 e il PCA 9555.
Dato che il PCF8575 non è in grado di pilotare i Darlington necessari per pilotare i relays a 24 Vdc, l'ho utilizzato solo per gli ingressi; il PCA9555 viene utilizzato solo per le uscite perché ha una buona corrente di uscita sia in sink che in surge.
Avrei potuto utilizzare il PCA9555 sia per gli ingressi che per le uscite, ma mentre il PCF8574 lo si trova in tutti i packages compeso il SOD, il PCA9555 lo si trova soltanto in package SSOD.
Dato che la mia intenzione non è quella di produrre numerosi esemplari di questo mio progetto, ma di costruirne solo alcuni esemplari con le mia mani e non avendo eccessiva simpatia per il package SSOD soprattutto quando arriva il momento di saldarlo sul PCB, mi sono rassegnato a questa soluzione mista, poco elegante, ma molto pratica.
_______________________
# Darlington PNP and NPN
In my most frequent cases, the outputs must supply current from + 24Vdc to the inputs of the various UUTs, but in other cases the current must be absorbed and is more intense than that to drive a relay, for example that necessary to check the 16 circuits of protections that intervene if the current exceeds the normal operating values.
This is why the UM-UL20 project will be accompanied by a very similar one, but which will mount NPN Darlington (active low) instead of those of PNP type (active high).
These PCBs will have the same dimensions and connections and will therefore be compatible on the same I2C bus. The construction will also be almost identical.
The PNP Darlington Drivers are the TD62783 and the NPN ones will be the ULN2804.
IT
Nei miei casi più frequenti, le uscite devono fornire corrente dal +24Vdc agli ingressi delle varie UUT, ma in altri casi la corrente deve essere assorbita ed è più intensa di quella per pilotare un relay, ad esempio quella necessaria per verificare i 16 circuiti di protezione che intevengono se la corrente supera i normali valori operativi.
Ecco perché al progetto UM-UL20 sarà affiancato uno del tutto simile, ma che monterà Darlington di tipo NPN (attivo basso) al posto di quelli di tipo PNP (attivo alto).
Questi PCB avranno le stesse dimensioni e gli stessi collegamenti e risulteranno quindi compatibili sullo stesso bus I2C. Anche la costruzione sarà pressoché identica.
I Darlington Driver PNP sono il TD62783 e quelli NPN saranno gli ULN2804.
_______________________
# Wiring
- 0V (or GND) - to any GND pin of Arduino;
- +5V (or Vcc) - to any Arduino Vcc pin;
- SDA - to Arduino pin A4;
- SCL - to Arduino pin A5;
- / INT - to an Arduino pin to react to Interrupts on Inputs (example 2);
- / ONT - to Arduino pin An to react to Interrupts on Outputs (example 2);
- +24 Vdc - to the external +24 Vdc power supply in common with the relay coils.
The +24 Vdc must be connected to the terminal board mounted on the 'long' side opposite the 20 pin male IDCs for Inputs and Outputs. The presence of +24 Vdc is signaled by the blue (or green) PWR LED.
As my well-established habit, the intervention of the (resettable) fuse is signaled by the red FAIL LED.
All other connections (SDA, SCL, GND, Vcc, /INT, /ONT, and also +24 Vdc) are arranged and replicated on both 'short' sides.
This solution allows the boards to be connected together in two ways:
° by placing them side by side and connecting them together with normal jumpers which also have the function of making the set of cards quasi-integral, or with headed ribbon cables.
° by superimposing them and connecting them in piggy-back.
IT
0V (o GND) - a qualsiasi pin GND di Arduino;
+5V (o Vcc) - a qualsiasi pin Vcc di Arduino;
SDA - al pin A4 di Arduino;
SCL - al pin A5 di Arduino;
/INT - ad un pin di Arduino per reagire agli Interrupt sugli Inputs (esempio 2);
/ONT - al pin An di Arduino per reagire agli Interrupt sugli Outputs (esempio 2);
+24 Vdc - alla alimentazione esterna a +24 Vdc in comune con le bobine dei relays.
Il +24Vdc va collegato sulla morsettiera montata sul lato 'lungo' opposto degli IDC 20 pin maschio per Inputs ed Outputs. La presenza del +24Vdc è segnalata dal LED PWR di colore blu (oppure verde).
Come mia consolidata abitudine, l'intervento del fusibile (ripristinabile) è segnalato dal LED rosso FAIL.
Tutti gli altri collegamenti (SDA, SCL, GND, Vcc, /INT, /ONT, e anche +24Vdc) sono disposti e replicati su entrambi i lati 'corti'.
Questa soluzione permette collegare fra di loro le schede in due modi:
° affiancandole e collegandole fra loro con dei normali jumpers che hanno anche la funzione di rendere quasi-solidale l'insieme delle schede, oppure con dei ribbon cable intestati.
° sovrapponendole e collegandole in piggy-back.
_______________________
# a curious effect
Even in the absence of 24 Vdc, when at least one of the 16 inputs of the Darlington Drivers TD62783 is driven, through the internal 'clamp' diodes a current sufficient to illuminate the PWR LED flows towards the + 24Vdc line (but which is currently called OK ).
Pur in assenza del 24 Vdc, quando viene pilotato almeno uno dei 16 ingressi dei Darlington Drivers TD62783, attraverso i diodi interni di 'clamp' scorre verso la linea del +24Vdc una corrente sufficiente ad illuminare il LED PWR (ma che attualmente si chiama OK).
_______________________
# Chain
A GPIO for 16 outputs and a GPIO for 16 inputs are mounted on the UM-UL20 board.
In some of my tests I had to add an additional 16 outputs to check the intervention of the protection circuits.
This has made it clear that 16 outputs and 16 inputs may not always be sufficient and that therefore other units must be added to this UM-UL20 unit and with the I2C bus.
IT
Sulla scheda UM-UL20 sono montati un GPIO per 16 uscite ed un GPIO per 16 ingressi.
In alcuni dei miei test ho dovuto aggiungere ulteriori 16 uscite per controllare l'intevento dei circuiti di protezione.
Questo ha reso evidente che 16 uscite e 16 ingressi possano non essere sempre sufficienti e che quindi a questa mia unità UM-UL20 si devono poter aggiungere altre unità e con il bus I2C.
_______________________
# Indirizzamento I2C
The devices working on the I2C bus need an address consisting of 3 bits, in order to choose one of the 8 addresses available for each bus member. Almost always the 3 inputs (ADR0, ADR 1, ADR2) are connected to switches or jumpers for address configuration. During the development of the PCB, it became clear to me how much space on the pull-up resistors, switches, and all their connections take up. I am convinced that it makes a certain sense to assign addresses adjacent to the GPIOs of the same card, so I decided to use the same pull-up resistors and the same dip-switches for both the Input GPIO and the Output GPIO (black s md 1.27 + 2 PIN), the same lines ADR 1, ADR2, but not ADR0 which is fixed at 0 for the Output GPIO and to 1 for the Input GPIO.
By setting the value 0 with the dip-switches, the Output GPIO will have address 0X20 and the Input GPIO will have address 0x21.
In this way, instead of using 2 x 3x dip-switches, I use only one 2x dip-switch.
During the development and debugging of the hardware, I needed to merge two UM-UL20s: on one only the Output part was mounted and on the other only the Input part. The dip-switches for the I2C address had not yet been mounted on the Input UM-UL20, but the pull-up resistors were mounted.
It was not necessary to mount the dip-switches because in those conditions the address on the I2C bus was 0x26 for the non-existent Output GPIO and 0x27 for the Input GPIO.
IT
Indirizzamento I2C
I dispositivi che lavorano sul bus I2C, hanno bisogno di un indirizzo composto da 3 bit, per poter scegliere per ciascun membro del bus, uno degli 8 indirizzi disponibili. Quasi sempre i 3 ingressi (ADR0,
ADR 1, ADR2) sono collegati a degli switches o a dei ponticelli per la configurazione dell'indirizzo. Durante lo sviluppo del PCB, mi è apparso evidente quanto spazio sul occupino le resistenze di pull-up, gli switches, e tutti i loro collegamenti. Mi sono convinto che ha un certo senso assegnare indirizzi adiacenti ai GPIO della stessa scheda, quindi ho deciso di utilizzare sia per il GPIO di Input che per il GPIO di Output le stesse pull-up resistors e gli stessi dip-switches ( black s md 1.27+ 2 PIN), le stesse linee ADR 1, ADR2, ma non ADR0 che è fisso a 0 per il GPIO di Output e ad 1 per il GPIO di Input.
Impostando coi dip-switch il valore 0, il GPIO di Output avrà indirizzo 0X20 ed il GPIO di Input avrà indirizzo 0x21.
In questo modo anziché utilizzare 2 dip-switch da 3x, utilizzo un solo dip-switch da 2x.
Durante lo sviluppo ed il debug dell'hardware, ho avuto necessità di unire due UM-UL20: su di una era montata la sola parte di Output e sull'altra solo la parte di Input. Sulla UM-UL20 di Input non erano ancora state montati i dip-switches per l'indirizzo I2C, ma erano montate le pull-up resistors.
Non è stato necessario montare i dip-switches perché in quelle condizioni l'indirizzo sul bus I2C era 0x26 per l'inesistente GPIO di Output e 0x27 per il GPIO di Input.
_______________________
# Firmware
The main functionalities of the UM-UL20 are performed in the simplest way possible with Arduino:
° output number 1 is commanded and kept ON for 400 mS;
° the 16 inputs are read and their status is placed and maintained for 600 mS on the outputs;
° everything is repeated until exit number 16;
° a pause of 2 seconds follows and the whole cycle starts again.
By connecting an array of LEDs with resistances towards 0V to the outputs, the sequential scan of the outputs is observed; for the inputs just connect some switches with common at +24Vdc.
A more orthodox way would be to place the status of the corresponding input on each output, but I have chosen to show the 'live status' of this unit even when the inputs are not connected, as long as an array of LEDs is connected.
When UM-UL20 has passed its testing, the sketch can be replaced by a version enriched with other useful functions, such as:
° the sequential command for the excitation of a relay and the check that only the relative contact closes;
° the sequential command for releasing a relay and checking that only the relative contact opens;
° simultaneous command of all relays and check that the protection circuit does not intervene.
° control of the response time of each contact.
Some of these functions may be superfluous, or on the contrary, a function not contemplated by my examples may be necessary, it all depends on the needs of the cases and the imagination of each one.
The circuit is limited to being able to carry out the tests that are most likely necessary and as far as possible allow the development of new ones, if necessary also by expanding the hardware.
The only purpose of the sketch for Arduino that I propose (UM-UL20x.ino) is to test the board that I have baptized UM-UL20.
To do this you need to close the test loop on something that simulates the actual UUT.
As appropriate, I used my own little test circuits:
° an array of LEDs to check the commands sent to the outputs;
° an array of switches to check each input.
Using the Arduino terminal (I use CoolTerm) and with small changes to the sketch, it is possible to do without this hardware and replace it with a simple ribbon cable headed with two female IDC20s. By introducing the two connectors in UM-UL20, the 16 outputs would be connected to the 16 inputs, thus closing the ring that allows you to re-read with the Input GPIO what the Output GPIO places on the 16 outputs.
With a UM-UL20 unit (controlled by Arduino) connected to the two IDC20 connectors, it is possible to simulate a UUT of which it is possible to change the response times of the contacts and simulate faults, in order to verify the proper functioning of the sketch that will control the Test Equipment.
IT
Le principali funzionalità di UM-UL20 sono eseguite nel modo più semplice possibile con Arduino:
° viene comandata e si mantiene ON per 400 mS l'uscita numero 1;
° si leggono i 16 ingressi ed il loro stato è posto e mantenuto per 600 mS sulle uscite;
° tutto si ripete fino all'uscita numero 16;
° segue una pausa di 2 secondi e l'intero ciclo ricomincia.
Collegando alle uscite, una schiera di LED con resistenze verso lo 0V si osserva la scansione sequenziale delle uscite; per gli ingressi basta collegare degli switch con comune a +24Vdc.
Un modo più ortodosso sarebbe quello di porre su ciascuna uscita lo stato del corrispondente ingresso, ma ho scelto di mostrare lo 'stato in vita' di questa unità anche quando gli ingressi non sono collegati, purché si sia collegata una schiera di LED.
Quando UM-UL20 ha superato il proprio collaudo, lo sketch potrà essere sostituito da una versione arricchita di altre utili funzioni, come ad esempio:
° il comando sequenziale per l'eccitazione di un relay e la verifica che si chiuda esclusivamente il relativo contatto;
° il comando sequenziale per il rilascio di un relay e la verifica che si apra esclusivamente il relativo contatto;
° il comando contemporaneo di tutti i relay e la verifica che non intervenga il circuito di protezione.
° il controllo del tempo di risposta di ciascun contatto.
Alcune di queste funzioni può essere superflua, o al contrario, può essere necessaria una funzione non contemplata dai miei esempi, tutto dipende dalle necessità dei casi e dalla fantasia di ognuno.
Il circuito si limita a poter eseguire i test che con buona probabilità sono necessari e per quanto possibile consentire di svilupparne di nuovi, se necessario anche espandendo l'hardware.
L'unico scopo dello sketch per Arduino che propongo (UM-UL20x.ino) è quello di collaudare la scheda stessa che ho battezzato UM-UL20.
Per farlo è necessario chiudere l'anello di test su qualcosa che simuli la UUT vera e propria.
A secondo dei casi, io ho utilizzato dei miei piccoli circuiti di test:
° una schiera di LED per verificare i comandi inviati alle uscite;
° una schiera di switches per verificare ciascun ingresso.
Utilizzando il terminale di Arduino (io utilizzo CoolTerm) e con piccole modifiche allo sketch, è possibile fare a meno di questo hardware e sstituirlo con un semplice ribbon cable intestato con due IDC20 femmina. Introducendo i due connettori in UM-UL20 si collegherebbero le 16 uscite ai 16 ingressi, chiudendo così l'anello che permette di rileggere col GPIO di Input ciò che il GPIO di Output pone sulle 16 uscite.
Con una unità UM-UL20 (controllata da Arduino) collegata ai due connettori IDC20, si può simulare una UUT della quale poter cambiare i tempi di risposta dei contatti e simulare dei guasti, allo scopo di verificare il buon funzionamento dello sketch che controllerà il Test Equipment.
_______________________
# Sketches
With the UM-UL20.ino sketch I tested 35 24V version boards (2021).
With the UM-UL20Tst6.ino sketch and through a State Machine I checked the functioning of a single relay, measuring the delay between the command of the coils and the closing of the contact.
With a UM-UL20 sketch ??????. Ino I immediately checked the inputs and outputs of numerous types of boards.
With a variation of one of these sketches, I have commanded the Outputs in a way corresponding to the state of the 16 Inputs. (mirror)
IT
Con lo sketch UM-UL20.ino ho collaudato 35 schede versione a 24V (2021).
Con lo sketch UM-UL20Tst6.ino e mediante una State Machine ho controllato il funzionamento di un solo relay, misurando il ritardo fra il comando della bobine e la chiusura del contatto.
Con uno sketch UM-UL20??????.ino ho controllato immediatamente ingressi ed uscite di numerosi tipi di scheda.
Con una variazione di uno di questi sketch, ho comandato gli Outputs in modo corrispondente allo stato dei 16 Inputs. (mirror)
_______________________
# 3D
I made a small 3D shell to reduce the risk of damage to the circuit and also to have less confusion on the table where I develop my projects. Although it does not have a functional utility, it helps me to have more order while I work and therefore I re-evaluated the lack of importance I gave it.
IT
Ho realizzato un piccolo "guscio" stampato in 3D per ridurre il rischio di provocare danni al circuito ed anche per avere un po' meno confusione sul tavolo dove sviluppo i miei progetti. Pur non avendo un'utilità funzionale, mi aiuta ad avere più ordine mentre lavoro e quindi ne ho rivalutato la scarsa importanza che gli davo.
_______________________
# References
° ElectroDragon : GPIO Expander PCF8575 as Input
"http://www.electrodragon.com/w/index.php?title=Category:IO_Expander&oldid=25064")
° Bristol Watch : Arduino Interface PCA9555 GPIO Expander
"https://www.bristolwatch.com/arduino/arduino6.htm"
° Playground.arduino.cc : i2c_scanner
"https://playground.arduino.cc/Main/I2cScanner/"
° Version 1 - The original author is not know
° Version 2 - Adapted to be as simple as possible by Arduino.cc user Krodal
° Version 3 - by louarnold
° Version 4 . by Arduino.cc user Krodal.
° Scanning addresses changed from 0...127 to 1...119 according to Nick Gammon
"https://www.gammon.com.au/forum/?id=10896 "
° Version 5 - As version 4, but address scans now to 127.
° Version 6 - Added waiting for the Leonardo serial communication.
° PCB "https://www.pcbway.com/"
// ***********************************************************************
// rdAGPI - Read the two Input port of the GPIO and combine them
// ***********************************************************************
void rdAGPI()
{
byte bytes; // dummy
bytes = Wire.requestFrom(AGPI,2); //
regInp = Wire.read(); // get Low byte (1st)
regInp = regInp ^ (Wire.read()<<8); // combine with High byte (2nd)
Wire.endTransmission();
}
// ***********************************************************************
// wrAGPO - write High and Low byte combined on the two Output port of the GPIO
// ***********************************************************************
void wrAGPO(long pattern)
{
Wire.beginTransmission(AGPO);
Wire.write(0x02); // OUTPUT PORT 0
Wire.write lowByte (pattern);
Wire.endTransmission();
Wire.beginTransmission(AGPO);
Wire.write(0x03); // OUTPUT PORT 1
Wire.write highByte (pattern);
Wire.endTransmission();
}
Compact IC2 GPIO Interface with 16 Inputs and 16 Outputs from 5 to 24 Vdc
*PCBWay community is a shared platform and we are not responsible for any design issues.
- Comments(0)
- Likes(3)
- chaminda Jayasinghe Jan 26,2024
- Engineer Jul 07,2023
- DRV Apr 07,2023
- 0 USER VOTES
- YOUR VOTE 0.00 0.00
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
More by Silvano Rossi
- Compact IC2 GPIO Interface with 16 Inputs and 16 Outputs from 5 to 24 Vdc Compact IC2 GPIO Interface with 16 Inputs and 16 Outputs from 5 to 25 Vdc.Board Name: UM-UL20Date: a...
- Versatile 16 LED display UM-0516 The small board UM-0516 mounts 16 LEDs which, through series resistors, connect to a 20-pin female I...
- Adapter IDC - Breadboard - Breakout After you've mounted few components on this little PCB, you can connect a usual Breadboard to a wide...
- UM-0518-IR-Receiver ProjectDescription----------------The smallest IR Receiver, with reversed output for connect it to t...
- UM-0515-IDCY ### DESCRIPTIONUseful to share the 20 pins of an IDC male connector to different ways to get the sig...
- W15874AST55_UM-0518 ### DESCRIPTION### TECHNICAL DETAILS / COMPONENTS### LEARN / TOPIC / BUILD INSTRUCTIONS
-
-
Electronic Enclosure applied for electronic projects
42 0 0 -
Water pump control for irrigation via telegram and esp32
72 0 0 -
-
-
ADS1256 - RP2040 Custom DAQ Front Panel without GPIO
66 0 0 -