Activar y desactivar la E/S de un M-Duino con UDP

10 de mayo de 2019 por
Activar y desactivar la E/S de un M-Duino con UDP
Serzh Ohanyan

Index

1. Introducción
2. Requisitos
3. Aplicación
4. Recepción
    4.1 Protocolo de mensajes
5. Transmisión
6. Código
7. Demostración
8. Vídeo

Introducción

En este post se mostrará una aplicación de uso de una conexión UDP entre el PC y M-DUINO. El objetivo es habilitar y deshabilitar Entradas y Salidas con un mensaje. 

Requisitos


Familia M-Duino 

Librería Ethernet2 proporcionada por Industrial shieldsDescargando nuestras placas tendrás esta Librería.  link puedes leer el blog donde se explica cómo conseguirlo. 


Aplicación

Con Ethernet2.h también tenemos disponible EthernetUDP2.h. Esta Librería permite enviar y recibir mensajes con UDP. 

En primer lugar tenemos que crear tu red local para trabajar mejor sin molestar a nadie. Aquí tienes un diagrama de ejemplo:





Nuestro M-Duino tiene be:ad:be:ef:fe:ed como dirección mac, 10.20.1.2 como IP y 8888 como puerto local. Los pasos a seguir son:

    - Configurar nuestro M-Duino con estos parámetros.

    - Esperar a que se reciba un mensaje.

    - Transmitir el mensaje de confirmación.

    - Analizar el mensaje.    


Recepción

Protocolo de mensajes

Hay diferentes formas de enviar los mensajes, depende de ti, pero en nuestro caso hemos utilizado el siguiente protocolo: 

ON:QX.X para activar un relé

OFF:QX.X para desactivar un relé

Conocer la estructura del mensaje que vamos a recibir nos permite saber cómo filtrarlo/analizarlo para habilitar o deshabilitar la entrada/salida deseada. En este ejemplo habilitamos y deshabilitamos una salida digital, pero se puede aplicar a una entrada/salida analógica o a una salida de relé utilizando el mismo protocolo. Como conocemos la estructura de los mensajes podemos filtrar por tipos, Q -> Digital, A -> Analógica, R -> Relé...y habilitar o deshabilitar el pin según la entrada: ON o OFF.

Transmisión

Una vez que hemos recibido un mensaje, enviamos un mensaje de confirmación, ACK, a la IP remota. El puerto utilizado para transmitir el mensaje es el 5566.

Código


Este código está preparado para un M-Duino 21+, por lo que hemos utilizado E/S digitales (Q0.0...Q0.7). Sin embargo, como puedes ver, si utilizas otras placas en las que hay más zonas o tienen relés, sólo tienes que añadir el código necesario para filtrar correctamente. 
Aquí tienes el código:  

#include <Ethernet2.h>
#include <EthernetUdp2.h>

byte mac[] = { 0xBE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 20, 1, 2);
uint16_t rx_udp_port = 8888; // local port to listen on
uint16_t tx_udp_port = 5566;

char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
char *replyBuffer = "ACK\n"; // acknoleged;

EthernetUDP Udp;

void setup() {
  // start Ethernet
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  Serial.println(Ethernet.localIP());
  // start UDP
  Udp.begin(rx_udp_port);  
}

static void filter_message(char *packet){
  char zone, pin; switch(packet[1]){ case 'N': // Filter by N -> ON  if (packet[3] == 'Q'){ // Filter by Q -> Digital pin  zone = packet[4]; pin = packet[6]; if (zone == '0'){ // Filter by zone 0, 1 or 2  switch(pin){ // Filter by pin 0, 1, 2, 3, 4, 5, 6 or 7 case '0': digitalWrite(Q0_0, HIGH); break; case '1': digitalWrite(Q0_1, HIGH); break; case '2': digitalWrite(Q0_2, HIGH); break; case '3': digitalWrite(Q0_3, HIGH); break; case '4': digitalWrite(Q0_4, HIGH); break; case '5': digitalWrite(Q0_5, HIGH); break; case '6': digitalWrite(Q0_6, HIGH); break; case '7': digitalWrite(Q0_7, HIGH); break; } }/* If it had more zones else if (zone == '1'){ switch(pin){ case '1': digitalWrite(Q1_0, HIGH); break; case '2': digitalWrite(Q1_1, HIGH); break; case '3': digitalWrite(Q1_2, HIGH); break; . . . } } else if (zone == '2'){ switch(pin){ case '1': digitalWrite(Q2_0, HIGH); break; case '2': digitalWrite(Q2_1, HIGH); break; case '3': digitalWrite(Q2_2, HIGH); break; . . . } }*/ Serial.print("Digital "); Serial.print(zone); Serial.print("."); Serial.print(pin); Serial.println(" activated"); } break; case 'F': // Filter by F -> OFF if (packet[4] == 'Q'){ // some relay I/O zone = packet[5]; pin = packet[7]; if (zone == '0'){ switch(pin){ case '0': digitalWrite(Q0_0, LOW); break; case '1': digitalWrite(Q0_1, LOW); break; case '2': digitalWrite(Q0_2, LOW); break; case '3': digitalWrite(Q0_3, LOW); break; case '4': digitalWrite(Q0_4, LOW); break; case '5': digitalWrite(Q0_5, LOW); break; case '6': digitalWrite(Q0_6, LOW); break; case '7': digitalWrite(Q0_7, LOW); break; } }/* else if (zone == '1'){ switch(pin){ case '1': digitalWrite(Q1_0, LOW); break; case '2': digitalWrite(Q1_1, LOW); break; case '3': digitalWrite(Q1_2, LOW); break; . . . } } else if (zone == '2'){ switch(pin){ case '1': digitalWrite(Q2_0, LOW); break; case '2': digitalWrite(Q2_1, LOW); break; case '3': digitalWrite(Q2_2, LOW); break; . . . } }*/ Serial.print("Digital "); Serial.print(zone); Serial.print("."); Serial.print(pin); Serial.println(" desactivated"); } break; } } void loop() { int packetSize = Udp.parsePacket(); if (packetSize) { // read the packet into packetBufffer Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); // send a reply to the IP address and port that sent us the packet we received Udp.beginPacket(Udp.remoteIP(), tx_udp_port); Udp.write(replyBuffer); Udp.endPacket(); filter_message(packetBuffer); } delay(10); }


Demostración


En esta demostración enviamos cuatro mensajes desde el PC (IP : 10.20.1.1) al M-Duino (IP : 10.20.1.2)

Mensaje 1: Habilitar pin digital 0.1

Mensaje 2: Habilitar el pin digital 0.5

Mensaje 3: Desactivar el pin digital 0.1

Mensaje 4: Desactivar el pin digital 0.5 

La siguiente imagen muestra esto

Vídeo


 
 

Buscar en nuestro blog

Activar y desactivar la E/S de un M-Duino con UDP
Serzh Ohanyan 10 de mayo de 2019
Compartir

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


Industrial PLC comparison >>>