Este post es la continuación de Comunicando dos placas Arduino usando WiFi UDP, y donde usaremos las funciones que aprendimos en Conversión de cadenas de texto en matrices (arrays) para enviar una cadena de texto que tenga dos variables de tipo entero y la otra placa responderá con un valor de temperatura.
Para el ejercicio usare dos placas Arduino MKR1000.
Comencemos con el sketch de la placa transmisora que tiene el joystick.
Ejemplo 1 – Placa transmisora con un joystick
#include <SPI.h> #include <WiFi101.h> #include <WiFiUdp.h> int status = WL_IDLE_STATUS; char ssid[] = "Nombredelared"; // El nombre de tu red wifi char pass[] = "contraseña"; // la clave de tu red wifi unsigned int localPort = 2390; // numero del puerto de la placa para recibir mensajes IPAddress ipremoto(192, 168, 1, 131); //direccion IP de placa remota unsigned int puertoRemoto = 1500; //numero de puerto de la placa remota char packetBuffer[20]; // buffer para guardar el paquete de datos entrantes char convBuffer[4]; // bufer para extraer cada dato de entrada char msg[20]; // bufer de datos de salida WiFiUDP Udp; //nombre de la instancia void setup() { //Inicia el puerto serial y espera hasta que se complete: Serial.begin(9600); while (!Serial) { ; // espera la conexion del puerto serie. Solo es necesario para placas con puerto USB nativo // Remover este while si la placa no estara conectada al ordenador } // revision de la presencia del shield de comunicación: if (WiFi.status() == WL_NO_SHIELD) { Serial.println("El shield WiFi no esta presente"); // no continua: while (true); } if (status != WiFi.status()) { status = WiFi.status();} // actualiza la variable status // intenta conectar a la red wifi: while ( status != WL_CONNECTED) { Serial.print("Conectando a SSID: "); Serial.println(ssid); // Conecta a una red WPA/WPA2: status = WiFi.begin(ssid, pass); // espera 10 segundos por la coneccion: delay(10000); } Serial.println("Conectado a wifi"); printWiFiStatus(); Udp.begin(localPort); // Inicia el socket WiFiUDP, y escucha el puerto local } void loop() { // lee los valores del joistick y arma el mensaje int valorx = analogRead(A1); //leo el valor del eje x int valory = analogRead(A2); //leo el valor del eje y sprintf(msg, "%4i%4i", valorx,valory); // Crea una cadena de texto con los valores de los ejes Serial.println(msg); //Imprimo la cadena de texto al monitor serie Udp.beginPacket(ipremoto, puertoRemoto); //configura el envio del paquete de datos Udp.write(msg); //coloca en el buffer los datos de salida Udp.endPacket(); //envia el paquete de datos // recepcion de datos - recibira un paquete de 4 caracteres con el valor de temperatura int packetSize = Udp.parsePacket(); // pregunto si hay paquetes de datos por leer if (packetSize) { Serial.print("Tamaño del paquete recibido "); Serial.println(packetSize); Serial.print("De "); IPAddress remoteIp = Udp.remoteIP(); Serial.print(remoteIp); Serial.print(", puerto "); Serial.println(Udp.remotePort()); // lee el paquete y lo guarda en el buffer int len = Udp.read(packetBuffer, 20); //lee el paquete y lo guarda en el buffer if (len > 0) packetBuffer[len] = 0; // coloca el caracter null al final de la cadena Serial.println("Contents:"); Serial.println(packetBuffer); // imprime el contenido del paquete de datos convBuffer[0]=packetBuffer[0]; convBuffer[1]=packetBuffer[1]; convBuffer[2]=packetBuffer[2]; convBuffer[3]=packetBuffer[3]; convBuffer[4]=0; // coloca el caracter null al final de la cadena int temp=atoi(convBuffer); //convierte la cadena de caracteres a entero // muestra el valor de temperatura recibido Serial.print("El valor extraido es:"); Serial.println(temp); float voltage = (temp / 1024.0) * 3.3; float temperature = (voltage - .5) * 100; Serial.println("La temperatura remota es de "); Serial.print(temperature); Serial.println(" grados Celsius"); } delay(200); } void printWiFiStatus() { // imprime el nombre de la red a la cual estas conectado: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // imprime la direcion IP del shield o placa con la cual estas conectado: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // imprime la intensidad de señal recibida: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); }
Y el sketch de la placa receptora con los servos y el sensor de temperatura.
Ejemplo 2 – Placa receptora con servos y sensor de temperatura
#include <SPI.h> #include <WiFi101.h> #include <WiFiUdp.h> #include <Servo.h> Servo servox; // crea un objeto servo para x Servo servoy; // crea un objeto servo para y int status = WL_IDLE_STATUS; char ssid[] = "Nombredelared"; // El nombre de tu red wifi char pass[] = "contraseña"; // la clave de tu red wifi unsigned int localPort = 1500; // numero del puerto de la placa para recibir mensajes char packetBuffer[20]; // buffer para guardar el paquete de datos entrantes char convBuffer[4];// bufer para extraer cada dato de entrada char msg[20]; //bufer de datos de salida WiFiUDP Udp; //nombre de la instancia void setup() { servox.attach(2); // asocia el servo en el pin D2 al objeto servo servoy.attach(3); // asocia el servo en el pin D3 al objeto servo //Inicia el puerto serial y espera hasta que se complete: Serial.begin(9600); while (!Serial) { ; // espera la conexion del puerto serie. Solo es necesario para placas con puerto USB nativo // Remover este while si la placa no estara conectada al ordenador } // revision de la presencia del shield de comunicación: if (WiFi.status() == WL_NO_SHIELD) { Serial.println("El shield WiFi no esta presente"); // no continua: while (true); } if (status != WiFi.status()) { status = WiFi.status();} // actualiza la variable // intenta conectar a la red wifi: while ( status != WL_CONNECTED) { Serial.print("Conectando a SSID: "); Serial.println(ssid); // Conecta a una red WPA/WPA2: status = WiFi.begin(ssid, pass); // espera 10 segundos por la coneccion: delay(10000); } Serial.println("Conectado a wifi"); printWiFiStatus(); Udp.begin(localPort); // Inicia el socket WiFiUDP, y escucha el puerto local } void loop() { // recepcion de datos - recibira un paquete de 8 // caracteres con los valores de "x" y "y" del joystick int packetSize = Udp.parsePacket(); // pregunto si hay paquetes de datos por leer if (packetSize) { Serial.print("Tamaño del paquete recibido "); Serial.println(packetSize); Serial.print("De "); IPAddress remoteIp = Udp.remoteIP(); Serial.print(remoteIp); Serial.print(", puerto "); Serial.println(Udp.remotePort()); // lee el paquete y lo guarda en el buffer int len = Udp.read(packetBuffer, 20); //lee el paquete y lo guarda en el buffer if (len > 0) packetBuffer[len] = 0; // coloca el caracter null al final de la cadena Serial.print("Contents:"); Serial.println(packetBuffer); // imprime el contenido del paquete de datos convBuffer[0]=packetBuffer[0]; convBuffer[1]=packetBuffer[1]; convBuffer[2]=packetBuffer[2]; convBuffer[3]=packetBuffer[3]; convBuffer[4]=0; // coloca el caracter null al final de la cadena int valServox=atoi(convBuffer); //convierte la cadena de caracteres a entero convBuffer[0]=packetBuffer[4]; convBuffer[1]=packetBuffer[5]; convBuffer[2]=packetBuffer[6]; convBuffer[3]=packetBuffer[7]; convBuffer[4]=0; // coloca el caracter null al final de la cadena int valServoy=atoi(convBuffer); //convierte la cadena de caracteres a entero // muestra los valores recibidos Serial.print("El valor extraido de X es:"); Serial.println(valServox); Serial.print("El valor extraido de Y es:"); Serial.println(valServoy); // proceso los datos y los envio a los servos valServox = map(valServox, 0, 1023, 0, 180); // escalo los datos de 0 a 180 servox.write(valServox); // posiciono el servo de acuerdo al valor recibido valServoy = map(valServoy, 0, 1023, 0, 180); // escalo los datos de 0 a 180 servoy.write(valServoy); // posiciono el servo de acuerdo al valor recibido //envio la temeratura de respuesta int temp = analogRead(A1); //leo el sensor de temperatura sprintf(msg, "%i", temp); // Crea una cadena de texto con el valor Serial.print("El valor de temperatura enviado es: "); //Imprimo la cadena de texto al monitor serie Serial.println(msg); //Imprimo la cadena de texto al monitor serie Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); //configura el envio del paquete de datos Udp.write(msg); //coloca en el buffer los datos de salida Udp.endPacket(); //envia el paquete de datos } } void printWiFiStatus() { // imprime el nombre de la red a la cual estas conectado: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // imprime la direcion IP del shield o placa con la cual estas conectado: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // imprime la intensidad de señal recibida: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); }