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
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
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é
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
#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
Activar y desactivar la E/S de un M-Duino con UDP