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); } */ }