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