En este momento estás viendo Control de servos remoto usando WiFi y UDP

Control de servos remoto usando WiFi y UDP

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");
}

Deja una respuesta