En este proyecto desarrollamos un controlador programable tipo PLC con Arduino, que incorpora una pantalla táctil HMI, entradas multivoltaje (0V a 290V en AC y DC) y 8 salidas digitales con transistores MOSFET. Te mostramos todo el proceso: desde el diseño del esquemático electrónico, la creación de las PCBs, hasta el diseño de la carcasa en SolidWorks e impresión 3D. También incluimos la programación del sistema y el ensamblaje final. Todos los materiales están disponibles para descarga en esta página.
DATOS TÉCNICOS

- Tensión de alimentación……………………….…………24VDC
- Corriente de alimentación………………….……………90mA
- Entadas Analogicas 0-290VDC/AC……………………….……8
- Salidas RLY…………………………………………………………8
-
- Tensión DC…………..……….………………….….……24V
- Corriente DC…………………………………………….1A
-
- Entorno de programación………………………..……….., Arduino IDE
- Condiciones ambientales min……………………….….-40°
- Condiciones ambientales max…………………..……….150°
- Empotrable………………………………….……………………Sí
- Puerto ISP………………………………………………………………SÍ
- Comunicacion Serial……………………………………………..Sí
ESQUEMÁTICO ELECTRÓNICO

CODIGO ARDUINO

int ain1 = A0;
int ain2 = A1;
int ain3 = A2;
int ain4 = A3;
int ain5 = A4;
int ain6 = A5;
int ain7 = A6;
int ain8 = A7;
int an1, an2, an3, an4, an5, an6, an7, an8;
int out1 = 2;
int out2 = 3;
int out3 = 4;
int out4 = 5;
int out5 = 6;
int out6 = 7;
int out7 = 8;
int out8 = 9;
int anDate[5][8] = {
{ 24, 24, 24, 24, 24, 24, 24, 24 },
{ 48, 48, 48, 48, 48, 48, 48, 48 },
{ 115, 115, 115, 115, 115, 115, 115, 115 },
{ 208, 208, 208, 208, 208, 208, 208, 208 },
{ 220, 220, 220, 220, 220, 220, 220, 220 }
};
int ada, adb, adc, add, ade, adf, adg, adh;
boolean act1, act2, act3, act4, act5, act6, act7, act8 = false;
boolean actA, actB, actC, actD, actE, actF, actG, actH = false;
boolean ina24, ina48, ina110, ina208, ina220 = false;
boolean inb24, inb48, inb110, inb208, inb220 = false;
boolean inc24, inc48, inc110, inc208, inc220 = false;
boolean ind24, ind48, ind110, ind208, ind220 = false;
boolean ine24, ine48, ine110, ine208, ine220 = false;
boolean inf24, inf48, inf110, inf208, inf220 = false;
boolean ing24, ing48, ing110, ing208, ing220 = false;
boolean inh24, inh48, inh110, inh208, inh220 = false;
char dato;
void setup() {
// start serial com
Serial.begin(9600);
//inputs
pinMode(ain1, INPUT);
pinMode(ain2, INPUT);
pinMode(ain3, INPUT);
pinMode(ain4, INPUT);
pinMode(ain5, INPUT);
pinMode(ain6, INPUT);
pinMode(ain7, INPUT);
pinMode(ain8, INPUT);
// outputs
pinMode(out1, OUTPUT);
pinMode(out2, OUTPUT);
pinMode(out3, OUTPUT);
pinMode(out4, OUTPUT);
pinMode(out5, OUTPUT);
pinMode(out6, OUTPUT);
pinMode(out7, OUTPUT);
pinMode(out8, OUTPUT);
}
void loop() {
an1 = analogRead(ain1);
an2 = analogRead(ain2);
an3 = analogRead(ain3);
an4 = analogRead(ain4);
an5 = analogRead(ain5);
an6 = analogRead(ain6);
an7 = analogRead(ain7);
an8 = analogRead(ain8);
if (an1 || an2 || an3 || an4 || an5 || an6 || an7 >= 0 && an1 || an2 || an3 || an4 || an5 || an6 || an7 <= 88) { // cuando no hay nada de voltaje
if (an1 >= 0 && an1 <= 88) ada = 0;
if (an2 >= 0 && an2 <= 88) adb = 0;
if (an3 >= 0 && an3 <= 88) adc = 0;
if (an4 >= 0 && an4 <= 88) add = 0;
if (an5 >= 0 && an5 <= 88) ade = 0;
if (an6 >= 0 && an6 <= 88) adf = 0;
if (an7 >= 0 && an7 <= 88) adg = 0;
if (an8 >= 0 && an8 <= 88) adh = 0;
//Serial.print("an8.val=");
/*Serial.print(0);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);*/
}
if (an1 || an2 || an3 || an4 || an5 || an6 || an7 > 88 && an1 || an2 || an3 || an4 || an5 || an6 || an7 <= 200) { // cuando hay 24VDC
if (an1 > 88 && an1 <= 200) ada = 24;
if (an2 > 88 && an2 <= 200) adb = 24;
if (an3 > 88 && an3 <= 200) adc = 24;
if (an4 > 88 && an4 <= 200) add = 24;
if (an5 > 88 && an5 <= 200) ade = 24;
if (an6 > 88 && an6 <= 200) adf = 24;
if (an7 > 88 && an7 <= 200) adg = 24;
if (an8 > 88 && an8 <= 200) adh = 24;
}
if (an1 || an2 || an3 || an4 || an5 || an6 || an7 > 200 && an1 || an2 || an3 || an4 || an5 || an6 || an7 <= 419) { // cuando hay 48VDC
if (an1 > 200 && an1 <= 419) ada = 48;
if (an2 > 200 && an2 <= 419) adb = 48;
if (an3 > 200 && an3 <= 419) adc = 48;
if (an4 > 200 && an4 <= 419) add = 48;
if (an5 > 200 && an5 <= 419) ade = 48;
if (an6 > 200 && an6 <= 419) adf = 48;
if (an7 > 200 && an7 <= 419) adg = 48;
if (an8 > 200 && an8 <= 419) adh = 48;
}
if (an1 || an2 || an3 || an4 || an5 || an6 || an7 > 419 && an1 || an2 || an3 || an4 || an5 || an6 || an7 <= 776) { //Cuando hay 110VAC
if (an1 > 419 && an1 <= 776) ada = 115;
if (an2 > 419 && an2 <= 776) adb = 115;
if (an3 > 419 && an3 <= 776) adc = 115;
if (an4 > 419 && an4 <= 776) add = 115;
if (an5 > 419 && an5 <= 776) ade = 115;
if (an6 > 419 && an6 <= 776) adf = 115;
if (an7 > 419 && an7 <= 776) adg = 115;
if (an8 > 419 && an8 <= 776) adh = 115;
}
if (an1 || an2 || an3 || an4 || an5 || an6 || an7 > 776 && an1 || an2 || an3 || an4 || an5 || an6 || an7 <= 890) { //cuando hay 208VAC
if (an1 > 776 && an1 <= 890) ada = 208;
if (an2 > 776 && an2 <= 890) adb = 208;
if (an3 > 776 && an3 <= 890) adc = 208;
if (an4 > 776 && an4 <= 890) add = 208;
if (an5 > 776 && an5 <= 890) ade = 208;
if (an6 > 776 && an6 <= 890) adf = 208;
if (an7 > 776 && an7 <= 890) adg = 208;
if (an8 > 776 && an8 <= 890) adh = 208;
}
if (an1 || an2 || an3 || an4 || an5 || an6 || an7 > 890 && an1 || an2 || an3 || an4 || an5 || an6 || an7 <= 1023) { //cuando hay 220VAC
if (an1 > 890 && an1 <= 1023) ada = 220;
if (an2 > 890 && an2 <= 1023) adb = 220;
if (an3 > 890 && an3 <= 1023) adc = 220;
if (an4 > 890 && an4 <= 1023) add = 220;
if (an5 > 890 && an5 <= 1023) ade = 220;
if (an6 > 890 && an6 <= 1023) adf = 220;
if (an7 > 890 && an7 <= 1023) adg = 220;
if (an8 > 890 && an8 <= 1023) adh = 220;
}
if (Serial.available() > 0) {
dato = Serial.read();
}
if (dato == 'I') ina24 = true;
if (dato == 'J') ina48 = true;
if (dato == 'K') ina110 = true;
if (dato == 'L') ina208 = true;
if (dato == 'M') ina220 = true;
if (dato == '1') {
ina24 = false;
ina48 = false;
ina110 = false;
ina208 = false;
ina220 = false;
}
if (dato == 'N') inb24 = true;
if (dato == 'O') inb48 = true;
if (dato == 'P') inb110 = true;
if (dato == 'Q') inb208 = true;
if (dato == 'R') inb220 = true;
if (dato == '2') {
inb24 = false;
inb48 = false;
inb110 = false;
inb208 = false;
inb220 = false;
}
if (dato == 'S') inc24 = true;
if (dato == 'T') inc48 = true;
if (dato == 'U') inc110 = true;
if (dato == 'V') inc208 = true;
if (dato == 'W') inc220 = true;
if (dato == '3') {
inc24 = false;
inc48 = false;
inc110 = false;
inc208 = false;
inc220 = false;
}
if (dato == 'X') ind24 = true;
if (dato == 'Y') ind48 = true;
if (dato == 'Z') ind110 = true;
if (dato == 'i') ind208 = true;
if (dato == 'j') ind220 = true;
if (dato == '4') {
ind24 = false;
ind48 = false;
ind110 = false;
ind208 = false;
ind220 = false;
}
if (dato == 'k') ine24 = true;
if (dato == 'l') ine48 = true;
if (dato == 'm') ine110 = true;
if (dato == 'n') ine208 = true;
if (dato == 'o') ine220 = true;
if (dato == '5') {
ine24 = false;
ine48 = false;
ine110 = false;
ine208 = false;
ine220 = false;
}
if (dato == 'p') inf24 = true;
if (dato == 'q') inf48 = true;
if (dato == 'r') inf110 = true;
if (dato == 's') inf208 = true;
if (dato == 't') inf220 = true;
if (dato == '6') {
inf24 = false;
inf48 = false;
inf110 = false;
inf208 = false;
inf220 = false;
}
if (dato == 'u') ing24 = true;
if (dato == 'v') ing48 = true;
if (dato == 'w') ing110 = true;
if (dato == 'x') ing208 = true;
if (dato == 'y') ing220 = true;
if (dato == '7') {
ing24 = false;
ing48 = false;
ing110 = false;
ing208 = false;
ing220 = false;
}
if (dato == 'z') inh24 = true;
if (dato == '#') inh48 = true;
if (dato == '$') inh110 = true;
if (dato == '%') inh208 = true;
if (dato == '&') inh220 = true;
if (dato == '8') {
inh24 = false;
inh48 = false;
inh110 = false;
inh208 = false;
inh220 = false;
}
if ((ina24 == true && ada == 24) || (ina48 == true && ada == 48) || (ina110 == true && ada == 115) || (ina208 == true && ada == 208) || (ina220 == true && ada == 220)) act1 = true;
else if (ina24 == false || ada == 0) act1 = false;
if ((inb24 == true && adb == 24) || (inb48 == true && adb == 48) || (inb110 == true && adb == 115) || (inb208 == true && adb == 208) || (inb220 == true && adb == 220)) act2 = true;
else if (inb24 == false || adb == 0) act2 = false;
if ((inc24 == true && adc == 24) || (inc48 == true && adc == 48) || (inc110 == true && adc == 115) || (inc208 == true && adc == 208) || (inc220 == true && adc == 220)) act3 = true;
else if (inc24 == false || adc == 0) act3 = false;
if ((ind24 == true && add == 24) || (ind48 == true && add == 48) || (ind110 == true && add == 115) || (ind208 == true && add == 208) || (ind220 == true && add == 220)) act4 = true;
else if (ind24 == false || add == 0) act4 = false;
if ((ine24 == true && ade == 24) || (ine48 == true && ade == 48) || (ine110 == true && ade == 115) || (ine208 == true && ade == 208) || (ine220 == true && ade == 220)) act5 = true;
else if (ine24 == false || ade == 0) act5 = false;
if ((inf24 == true && adf == 24) || (inf48 == true && adf == 48) || (inf110 == true && adf == 115) || (inf208 == true && adf == 208) || (inf220 == true && adf == 220)) act6 = true;
else if (inf24 == false || adf == 0) act6 = false;
if ((ing24 == true && adg == 24) || (ing48 == true && adg == 48) || (ing110 == true && adg == 115) || (ing208 == true && adg == 208) || (ing220 == true && adg == 220)) act7 = true;
else if (ing24 == false || adg == 0) act7 = false;
if ((inh24 == true && adh == 24) || (inh48 == true && adh == 48) || (inh110 == true && adh == 115) || (inh208 == true && adh == 208) || (inh220 == true && adh == 220)) act8 = true;
else if (inh24 == false || adh == 0) act8 = false;
if (dato == 'A') actA = true;
else if (dato == 'a') actA = false;
if (actA == true) digitalWrite(out8, !act1);
else if (actA == false) digitalWrite(out8, act1);
if (dato == 'B') actB = true;
else if (dato == 'b') actB = false;
if (actB == true) digitalWrite(out7, !act2);
else if (actB == false) digitalWrite(out7, act2);
if (dato == 'C') actC = true;
else if (dato == 'c') actC = false;
if (actC == true) digitalWrite(out6, !act3);
else if (actC == false) digitalWrite(out6, act3);
if (dato == 'D') actD = true;
else if (dato == 'd') actD = false;
if (actD == true) digitalWrite(out5, !act4);
else if (actD == false) digitalWrite(out5, act4);
if (dato == 'E') actE = true;
else if (dato == 'e') actE = false;
if (actE == true) digitalWrite(out4, !act5);
else if (actE == false) digitalWrite(out4, act5);
if (dato == 'F') actF = true;
else if (dato == 'f') actF = false;
if (actF == true) digitalWrite(out3, !act6);
else if (actF == false) digitalWrite(out3, act6);
if (dato == 'G') actG = true;
else if (dato == 'g') actG = false;
if (actG == true) digitalWrite(out2, !act7);
else if (actG == false) digitalWrite(out2, act7);
if (dato == 'H') actH = true;
else if (dato == 'h') actH = false;
if (actH == true) digitalWrite(out1, !act8);
else if (actH == false) digitalWrite(out1, act8);
//if (Serial.available() > 0) {
/*String dato = Serial.readString();
if (int (dato[0])== 1) {
digitalWrite(led, 1);
}
if (int (dato[0]) == 0) {
digitalWrite(led, 0);
}
*/
}





