METODOLOGÍA DE PROGRACIÓN CIRCUITOS ELÉCTRICOS HECHO EN ARDUINO BASADO EN LADDER
Hola jóvenes, en estos enlaces del BLOGG y DEL CANAL, pueden encontrar recursos sobre fundamentos de ingeniería mecatrónica como : SOLIDWORKS, PROGRAMACIÓN DE ARDUINO, HIDRÁULICA – LENGUAJE LADDER , LENGUAJE GRAFCET ,ELECTROHIDRÁULICA , NEUMÁTICA, ELECTRONEUMÁTICA, PLC M221, PLC SIEMEMS S7 1200, PLC SIEMENS S7 300 , FLUID SIM, FACTORY IO, CONTROL, entre otros https://www.mecatrónica.com.co/ https://mecatronicaitsa.blogspot.com/ http://www.youtube.com/c/JovannyDu que?sub_confirmation=1_ Si te ha sido útil, regálame un Like, comenta y suscríbete :) (っ◕‿◕)
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_ “METODOLOGÍA DE PROGRACIÓN” El procedimiento general a seguir para la implementación de la metodología de programación (LADDER sobre Arduino) se describe en las siguientes etapas:
Etapa1: Encontrar la solución a la situación planteada en lógica cableada (LADDER) con el Software Fluid Sim. A partir del enunciado o análisis del problema planteado, que describe en forma precisa la situación a solucionar, el programador/estudiante usa los conocimientos y competencias que tenga en el área de controles eléctricos y plantea una solución al problema de automatización en forma de un circuito de control eléctrico en lógica cableada aplicado a un sistema electromecánico (eléctrico, electroneumático y/o electrohidráulico) para ello se apoyará en el software de Simulación (Fluid Sim P). Como resultado de esto, se contará con un circuito de control en diagrama de contactos que representa la lógica a ser implementada como programa en el Arduino. Esta solución al ser simulada y verificada quedará fija como el algoritmo que debe ser traducido a la tarjeta de control, esta solución será independiente de el tipo de entradas
con la que se quiera
implementar el programa en el Arduino.
Etapa 2: Definir el diagrama de conexión de entradas y salidas en el Arduino En la etapa 1 se encontró una solución en términos de lógica cableada , la cual puede ser implementada de un sinnúmero de formas dependiendo de las características de las entradas que se le conecten o escojan para hacerlo por esta razón se debe definir el número de entradas, el tipo de entradas si son contactos
NO o NC y que pines serán asignados a cada una, similar a lo mostrado en la figura Y.
Etapa 3: Conectar alimentación del equipo de prácticas (sistema electromecánico /neumático + Arduino) a la fuente de poder de 110VAC, conectar la alimentación neumática , verificar y definir los pines y las conexiones de las entradas y salidas al Arduino las cuales están ya precableadas.
Etapa 4: Elaborar el programa equivalente en el IDE del Arduino Se elaborará el programa equivalente del circuito eléctrico
hecho en LADDER / Fluid Sim siguiendo
los lineamientos que a continuación se describen: 1 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_ 1. Todo programa de Arduino está dividido en tres (3) espacio
Antes del void setup:
En esta sección del programa se hace la “Declaración de Variables “ en ella deben aparecer las variables Ki corresponden
a las relés/memorias
interruptores, sensores
las
variables Si corresponden
a las Entradas de pulsador,
que aparecen en para el circuito/programa, las variables que corresponde a los
pin de salidas acoplada a un LED, bobina o relee. También se declaran las variables asociadas a cada temporizador y las variables asociadas al cada contador.
Void setup: En esta sección del programa se Habilita la apertura del visualizador serial, se
hace la declaración
de puertos digitales como entradas o como salidas, se declaran los estados iniciales de los pines de las salidas en bajo/apagadas.
Void loop: se capturan los valores de puertos digitales de entrada, inicio del Tratamiento Secuencial con la declaración de las ecuaciones características de cada renglón del circuito eléctrico, se
activan
las salidas/acciones.
Después del void loop : se programan las subrutinas de temporización (Para cada temporización se asigna un subprograma //activetempx y un desactivetempx usando para ello comparaciones con el comando millis
Estas organización de tareas en la programación
se verán aplicadas a cada uno de los cuatro (4)
casos que hacen parte de la práctica Nº1.
Etapa 5: Configurar la comunicación entre el PC y el Arduino en términos de tipo de controlador (Mega) y puerto serial de comunicación, cargar y probar el funcionamiento.
2 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_ IMPLEMENTACIÓN
DE LA METODOLOGÍA PARA TRADUCIR AL LENGUAJE “PROCESSING”
UN
CIRCUITO ELÉCTRICO HECHO EN LADDER.
La implementación de la metodología iniciará con la realización del control de encendido de una carga/salida representada por una (LUZ), con el uso de dos (2) pulsadores NO, para ello se usará la misma conexión simplificada de entradas y salidas de la figura Y, se probaran cuatro (4) casos ,Caso I, Caso II, Caso III y Caso IV con el uso del equipo de prácticas (sistema electromecánico /neumático + Arduino) cada uno con un nivel de complejidad creciente, al cabo de los cuales quedará claro como hacer uso de los elementos de programación como : entradas digitales, salidas digitales, memorias(relé), temporizaciones, contadores de eventos, entre otros , siguiendo una metodología.
En cada caso se desarrollan completamente las 5 etapas del proceso . Los pasos que se han de seguir en estos primeros casos van a ser similares para todas la demás experiencias que se puedan realizar con el equipo. Con la realización de estos casos se comprueba la flexibilidad que ofrecen los Arduino ya que sin modificar las entradas y salidas conectadas a él, se pueden correr diversos programas y causar un efecto diferente. Los elementos y equipos requeridos para realizar los 4 casos están descritos en la tabla T. Tabla T. Equipos y elementos requeridos
ITEM
ELEMENTOS
CANTIDAD
1
Luz piloto Led a 24 VDC
1
2
Fuente a 24 V DC
1
3
Pulsador Normalmente Abierto
2
4
Tarjeta Arduino
1
5
Cable de Comunicación PC - Arduino
1
6
Cables de conexión
7
Computador con los Programas Fluid Sim P y el IDE de Arduino
1
3 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_
Fig. Y
Esquema simplificado de conexión de entradas y salidas a Arduino
CASO N°1 Planteamiento de la situación: La salida LUZ ( H1) del PLC se activará al pulsar START (S1) y se apagará al pulsar STOP (S0).
Solución Eléctrica LADDER en Fluid Sim P.
Programa en IDE del Arduino CASO N°1 4 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_ /// TRATAMIENTO PREVIO /// Nombre del proyecto : START STOP LADDER EN ARDUINO OKOK //DECLARACION DE VARIABLES //Declaración de las variables Ki corresponden a las reles/memorias utilizadas para el circuito/programa //Declaración de las variables Si corresponden a las Entradas de pulsador NO (Normalmente abiertos) utilizadas para el circuito/programa //La designación H corresponde al pin de salidas acoplada a un LED int K1=0; // las memorias equivalentes a los Relés se declaran en estado inicial bajo o false. int S0 ; // Hará la función de STOP int S1 ; // Hará la función de START int H1 = 29; // LED de salida void setup() { //Apertura del visualizador serial Serial.begin(9600); //Declaración de puertos digitales pinMode(6, INPUT); pinMode(7, INPUT); pinMode(29, OUTPUT); //Algunos dispositivos traen una configuración "Sinking and Sourcing" //por eso es necesario colocar los puertos de salida en 0v. //Declaración del estado inicial de los pines de las salidas en bajo/apagadas digitalWrite(H1, LOW); } //TRATAMIENTO SECUENCIAL void loop() { //Capturar valores de puertos digitales de entrada S0= digitalRead(6); S1= digitalRead(7); if ((S1 | K1) && (!S0)) {K1=1;} else {K1=0; } // TRATAMIENTO POSTERIOR if (K1) {digitalWrite(H1, HIGH);} else {digitalWrite(H1, LOW);} }
5 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_
CASO N°2 Planteamiento de la situación: La salida del PLC se activará al pulsar START (S1) y se apagará después de unos segundos por efecto de un temporizador o al pulsar STOP (S0) antes de la temporización.
Solución Eléctrica LADDER en Fluid Sim P.
Programa en IDE del Arduino del CASO N°2 /// TRATAMIENTO PREVIO /// CASO 2 LED TEMPORIZADO OKOK FUNCIONA //DECLARACION DE VARIABLES //Decalaración de las variables Ki corresponden a las reles/memorias utilizadas para el circuito/programa //Declaración de las variables Si corresponden a las Entradas de pulsador NO (Normalmente abiertos) utilizadas para el circuito/programa //La designación H corresponde al pin de salida acoplada a un LED int K1=0; // las memorias se declaran en estado inicial bajo o false. int S0 ; // Hará la función de STOP int S1 ; // Hará la función de START int H1 = 29; 6 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_ // Variables asociadas a "temp1". int T1 = LOW; // Bit asociado al temporizador 1 int activado1 = 0; // Al principio no ha sido activado. long inicio1, final1, actual1; void setup() { //Apertura del visualizador serial Serial.begin(9600); //Declaración de puertos digitales pinMode(6, INPUT); pinMode(7, INPUT); pinMode(29, OUTPUT); //Algunos dispositivos traen una configuración "Sinking and Sourcing" //por eso es necesario colocar los puertos de salida en 0v. //Declaración del estado inicial
de los pines de las salidas en bajo/apagadas
digitalWrite(H1, LOW); } //TRATAMIENTO SECUENCIAL void loop() { //Capturar valores de puertos digitales de entrada S0= digitalRead(6); S1= digitalRead(7);
if ((S1 | K1) && (!S0) && (!T1)) {K1=1;} else {K1=0; } if (K1) {activetemp1(); } else {desactivetemp1();} // TRATAMIENTO POSTERIOR if (K1) {digitalWrite(H1, HIGH);} else {digitalWrite(H1, LOW);} } //SUBRUTINAS DE TEMPORIZACIÓN (Par cada temporización se asigna un subprograma //activetempx y un desactivetempx usando para ello comparaciones con el comando millis //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //SUBRUTINA TEMPORIZADOR 1 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void activetemp1() { if (K1 && activado1 == 0) { // Si K1 esta activa y no ha sido activado=0 antes... activado1 = 1; // marca activado=1 y guarda el tiempo de inicio. inicio1 = millis(); 7 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_ final1 = inicio1 + 2000; } actual1 = millis(); // Consulta el tiempo actual. if (activado1 == 1 && (actual1 > final1) ) { T1 = HIGH; } else { T1 = LOW; } } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void desactivetemp1() { T1 = LOW; activado1 = 0; inicio1 = 0; final1 = 0; actual1 = 0; } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CASO N°3 Planteamiento de la situación: La salida del PLC (H1) quedará en un ciclo intermitente de encendido (2s) y apagado (2s) al pulsar START (S1) y se detendrá al pulsar STOP (S0). Solución Eléctrica LADDER en Fluid Sim P.
8 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_ Programa en IDE del Arduino del CASO N°3
/// TRATAMIENTO PREVIO /// CASO 3 LED INTERMITENTE INDEFINIDO TEMPORIZADO OK //DECLARACION DE VARIABLES //Declaración de las variables Ki corresponden a las relés/memorias utilizadas para el circuito/programa //Declaración de las variables Si corresponden a las Entradas de pulsador NO (Normalmente abiertos) utilizadas para el circuito/programa //La designación H corresponde al pin de salidas acoplada a un LED int K1=0; int K2=0; // Las memorias se declaran en estado inicial bajo o false. int S0 ; // Hará la función de STOP int S1 ; // Hará la función de START int H1 = 29; // Pin de salida del LED
// Variables asociadas a "temp1". int T1 = LOW; // Bit asociado al temporizador 1 int activado1 = 0; // Al principio no ha sido activado. long inicio1, final1, actual1; // Variables int T2 ; int activado2 long inicio2,
asociadas a "temp2". // Bit asociado al temporizador 2 = 0; // Al principio no ha sido activado. final2, actual2;
void setup() { //Apertura del visualizador Serial.begin(9600);
serial
//Declaración de puertos digitales pinMode(6, INPUT); pinMode(7, INPUT); pinMode(29, OUTPUT); //Algunos dispositivos traen una configuración "Sinking and Sourcing" //por eso es necesario colocar los puertos de salida en 0v. //Declaración del estado inicial
de los pines de las salidas en bajo/apagadas
digitalWrite(H1, LOW); } //TRATAMIENTO void loop() {
SECUENCIAL 9
Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_ //Capturar valores de puertos digitales de entrada S0= digitalRead(6); S1= digitalRead(7);
if ((S1 | K1 |T2) && (!S0) && (!T1)) {K1=1;} else {K1=0; } if (K1) {activetemp1(); } else {desactivetemp1();} if ((T1 | K2) && (!S0) && (!T2)) {K2=1;} else {K2=0;} if (K2) {activetemp2(); } else {desactivetemp2();}
// TRATAMIENTO POSTERIOR - ACTIVACIÓN DE LAS if (K1) {digitalWrite(H1, HIGH);} else {digitalWrite(H1, LOW);}
SALIDAS/ ACCIONES
} //SUBRUTINAS DE TEMPORIZACIÓN (Par cada temporización se asigna un subprograma //activetempx y un desactivetempx usando para ello comparaciones con el comando millis //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //SUBRUTINA TEMPORIZADOR 1 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void activetemp1() { if (K1 && activado1 == 0) { // Si K1 esta activa y no ha sido activado=0 antes... activado1 = 1; // marca activado=1 y guarda el tiempo de inicio. inicio1 = millis(); final1 = inicio1 + 1000; } actual1 = millis(); // Consulta el tiempo actual. if (activado1 == 1 && (actual1 > final1) ) { T1 = HIGH; } else { T1 = LOW; } } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void desactivetemp1() { T1 = LOW; activado1 = 0; inicio1 = 0; final1 = 0; actual1 = 0; } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 10 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_ //SUBRUTINA TEMPORIZADOR 2 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void activetemp2() { if (K2 && activado2 == 0) { // Si ha pulsado HIGH y no ha sido activado2 = 1; // marca activado=1 y guarda inicio2 = millis(); final2 = inicio2 + 1000; } actual2 = millis(); // Consulta el tiempo actual. if (activado2 == 1 && (actual2 > final2) ) { T2 = HIGH; } else { T2 = LOW; } } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void desactivetemp2() { T2 = LOW; activado2 = 0; inicio2 = 0; final2 = 0; actual2 = 0; } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - activado=0 antes... el tiempo de inicio.
- - - - - - - - - - -
- - - - - - - - - - -
11 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_
CASO N°4 Planteamiento de la situación: Al pulsar START (S1) , la salida del Arduino (H1) solo hará una secuencia de encendido y apagado intermitente por (4) cuatro ciclos de encendido (2s) y apagado (2s). Una vez realizados deberá accionarse el pulsador RESET (S0) para habilitar una nueva secuencia.
Solución Eléctrica LADDER en Fluid Sim P.
Programa equivalente en IDE del Arduino
/// TRATAMIENTO PREVIO /// CASO 4 LED INTERMITENTE X4 OKO //DECLARACION DE VARIABLES //Declaración de las variables Ki corresponden a circuito/programa //Declaración de las variables Si corresponden a abiertos) utilizadas para el circuito/programa //La designación H corresponde al pin de salidas int K1=0; int K2=0; // Las memorias se declaran en estado
las relés/memorias
utilizadas para el
las Entradas de pulsador
NO (Normalmente
acoplada a un LED inicial bajo o false. 12
Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_ int S0=6; // Hará la función de STOP int S1=7 ; // Hará la función de START int H1 = 29; // Pin de salida del LED // Variables asociadas a "temp1". int T1 = LOW; // Bit asociado al temporizador 1 int activado1 = 0; // Al principio no ha sido activado. long inicio1, final1, actual1; // Variables int T2 ; int activado2 long inicio2,
asociadas a "temp2". // Bit asociado al temporizador 2 = 0; // Al principio no ha sido activado. final2, actual2;
// Variables asociadas al Contador 1 int CONTADOR1 = 0; const int PSCONTADOR1 = 3; // Preselect del Contador o # de ciclos int ESTADOPREVIO_T1 = 0; // Estado previo del componente que incrementa el contador void setup() { //Apertura del visualizador Serial.begin(9600);
serial
//Declaración de puertos digitales pinMode(6, INPUT); pinMode(7, INPUT); pinMode(29, OUTPUT); //Algunos dispositivos traen una configuración "Sinking and Sourcing" //por eso es necesario colocar los puertos de salida en 0v. //Declaración del estado inicial
de los pines de las salidas en bajo/apagadas
digitalWrite(H1, LOW); } //TRATAMIENTO
SECUENCIAL
void loop() { //Capturar valores de puertos digitales de entrada S0= digitalRead(6); S1= digitalRead(7); //TRATAMIENTO SECUENCIAL // Declaración de las ecuaciones caracteristicas de cada renglon if ((S1 | K1 |T2) && (CONTADOR1< PSCONTADOR1) && (!T1)) {K1=1;} else {K1=0; } if (K1) {activetemp1(); } 13 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_ else {desactivetemp1();} if ((T1 | K2) && (!S0) && (!T2)) {K2=1;} else {K2=0;} if (K2) {activetemp2(); } else {desactivetemp2();} if (T1 != ESTADOPREVIO_T1) { if (T1 == HIGH) { CONTADOR1++; Serial.print("Numero de Ciclos : Serial.println(CONTADOR1); } ESTADOPREVIO_T1 = T1; } if (S0 == HIGH) { Serial.print("Numero de Ciclos : Serial.println(CONTADOR1); CONTADOR1 = 0; }
");
");
// TRATAMIENTO POSTERIOR - ACTIVACIÓN DE LAS if (K1) {digitalWrite(H1, HIGH);} else {digitalWrite(H1, LOW);}
SALIDAS/ ACCIONES
} //SUBRUTINAS DE TEMPORIZACIÓN (Para cada temporización se asigna un subprograma //activetempx y un desactivetempx usando para ello comparaciones con el comando millis //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //SUBRUTINA TEMPORIZADOR 1 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void activetemp1() { if (K1 && activado1 == 0) { // Si K1 esta activa y no ha sido activado=0 antes... activado1 = 1; // marca activado=1 y guarda el tiempo de inicio. inicio1 = millis(); final1 = inicio1 + 1000; } actual1 = millis(); // Consulta el tiempo actual. if (activado1 == 1 && (actual1 > final1) ) { T1 = HIGH; } else { T1 = LOW; }
} //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void desactivetemp1() { 14 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_ T1 = LOW; activado1 = 0; inicio1 = 0; final1 = 0; actual1 = 0; } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//SUBRUTINA TEMPORIZADOR 2 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void activetemp2() { if (K2 && activado2 == 0) { // Si ha pulsado HIGH y no ha sido activado2 = 1; // marca activado=1 y guarda inicio2 = millis(); final2 = inicio2 + 1000; } actual2 = millis(); // Consulta el tiempo actual. if (activado2 == 1 && (actual2 > final2) ) { T2 = HIGH; } else { T2 = LOW; } } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void desactivetemp2() { T2 = LOW; activado2 = 0; inicio2 = 0; final2 = 0; actual2 = 0; } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - activado=0 antes... el tiempo de inicio.
- - - - - - - - - - -
- - - - - - - - - - -
15 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_
16 Elaborado por Ing. Jovanny Duque
http://www.youtube.com/c/JovannyDuque?sub_confirmation=1_
Hola jovenes, en estos enlaces del BLOGG y DEL CANAL, pueden encontrar recursos sobre sobre fundamentos de ingeniería mecatronica como : SOLIDWORKS, PROGRAMACION DE ARDUINO, HIDRAULICA ELECTROHIDRAULICA , NEUMATICA, LENGUAJE LADDER , LENGUAJE GRAFCET ELECTRONEUMATICA, PLC M221, PLC SIEMEMS S7 1200, PLC SIEMENS S7 300 , FLUID SIM, FACTORY IO, CONTROL, entre otros
https://www.mecatronica.com.co/ https://mecatronica-itsa.blogspot.com/ http://www.youtube.com/c/JovannyDuque?sub_confirmation =1_ Si te ha sido util, regalame un Like, comenta y suscríbete :) (っ◕‿◕)
17 Elaborado por Ing. Jovanny Duque