Bionic Spider Controller - Teil 1 - AZ-Delivery

En el Bionic Spider Robot Kit ya has aprendido cómo funciona la araña biónica y ya has implementado algunos proyectos con ella. Más recientemente, se añadió el control del robot a través de una aplicación de teléfono inteligente.

Dado que el control mediante la pantalla táctil no es especialmente agradable, en esta entrada del blog se presentará un control alternativo con un joystick.

 

Ferretería

Hay dos versiones disponibles como joystick, una puede KY-023 Se puede utilizar el módulo. Sin embargo, dado que aquí se necesitaría mucho cableado, se recomienda Escudo de palanca de mando PS2, que también está conectado directamente a un microcontrolador Uno Se puede insertar el diseño.

Dado que el microcontrolador tiene que comunicarse con el robot, se requiere un microcontrolador con funcionalidad WiFi. Además, se requieren dos ADC para cada uno de los ejes X e Y, por lo que aquí se debe utilizar un ESP32.

(El ESP8266 solo tiene una entrada ADC).

 

Para realizar el proyecto necesitas:

ESP32 NodoMCU D1 R32

Escudo de palanca de mando PS2

(opcional) batería de bloque de 9 V + Clip de batería

y por supuesto uno ensamblado Kit de robot araña biónico

 

Dado que las entradas analógicas de los dos ejes del joystick están en GPIO 2 y 4, que están conectados al ADC2, no se pueden utilizar al mismo tiempo con el módulo WLAN. Las conexiones IO 34 e IO35 (ADC1) se encuentran directamente al lado de ellas, por lo que la funcionalidad se puede establecer fácilmente mediante un puente de cables.

Figura 1: Puente de cables entre las conexiones

Conecte los conectores como se muestra arriba.
Dado que el LED integrado está conectado al GPIO 2, el pin debe retirarse aquí; de lo contrario, la conexión influiría en el valor del voltaje del eje X.

Lo mismo se aplica al pin D12, ya que esto interrumpe el proceso de arranque y, por lo tanto, no sería posible arrancar con el escudo conectado. En esta conexión se encuentra el botón central del joystick, por lo que ya no se puede utilizar. Si aún desea implementarlo, debe volver a conectarse a un puerto libre.

 

Figura 2: Escudo con modificaciones

 

El blindaje se puede enchufar simplemente al D1 R32. Asegúrate de que el pequeño interruptor en la esquina izquierda esté encendido. 3v3 de lo contrario el ESP32 podría dañarse por el voltaje excesivo de 5V.

programas

Si es la primera vez que programa un ESP32/ESP8266 en el IDE de Arduino, copie las siguientes URL en el IDE de Arduino en: Archivo->Preferencias->URL del administrador de placas adicionales:  https://dl.espressif.com/dl/package_esp32_index.json

http://arduino.esp8266.com/stable/package_esp8266com_index.json

 

e instalar los paquetes ESP32 y ESP8266 en la administración de la placa.


 

El protocolo ESPNOW, fácil de usar gracias a la biblioteca integrada, es adecuado para transferir datos entre microcontroladores.

La ventaja de este protocolo es que los paquetes de datos también se pueden transmitir sin servidor ni WLAN, por lo que la comunicación es posible en cualquier lugar y sin hardware adicional.

Además, los paquetes se envían de forma sencilla, sin una autenticación complicada como ocurre con la WLAN, lo que significa que se puede lograr una transmisión muy rápida casi en tiempo real.

 

Para la comunicación se necesitan las direcciones de hardware, las llamadas direcciones MAC (Media Access Control), de ambos dispositivos. Estos se encuentran en una parte protegida de la memoria y pueden asignarse claramente a un dispositivo.

Los paquetes se pueden enviar al destinatario correcto a través de esto.

 

1 Determine las direcciones MAC

Dado que las direcciones están en la memoria protegida, también se pueden leer con un programa corto independiente, ya que éste no cambia al reescribir la memoria.

 

Cargue el programa en los dos microcontroladores:

#ifdef ESP32
  #
include <WiFi.h>
#
endif
#
ifdef ESP8266
  #
include <ESP8266WiFi.h>
#
endif

void setup() {
  
WiFi.mode(WIFI_STA);
  
Serial.begin(115200);
  
delay(2000);
  
Serial.println();
}

void loop() {
  
Serial.print("Mac Adress:");
  
Serial.println(WiFi.macAddress());
  
delay(5000);
}

 

Puedes obtener el código. aquí (macAdress.ino) descargar.

 

Una vez cargados los programas en el microcontrolador, ahora se muestra la dirección MAC correspondiente en el monitor serie (velocidad de baudios: 115200). Anótelos para el siguiente programa.

 

2 controladores de código

El módulo joystick dispone de 6 botones individuales y un joystick de dos ejes y botón integrado.

Para que el proyecto sea lo más sencillo posible, sólo se transmite en forma de cadena la dirección del movimiento o las teclas pulsadas, de la siguiente manera:

Joystick arriba: CMD_FWD

Joystick hacia abajo: CMD_BWD

Joystick a la derecha: CMD_RGT

Joystick a la izquierda: CMD_LFT

 

Botón A: BTN_A

Botón B: BTN_B

etc...

 

Para garantizar que solo se pueda enviar un nuevo comando si se ha ejecutado el anterior, el destinatario envía un acuse de recibo. Sólo cuando se haya recibido se podrá enviar un nuevo comando.
Para garantizar que la comunicación no se bloquee por completo en caso de error, solo se requiere información después de que la transmisión de datos se haya realizado correctamente al destinatario. Además, el estado se restablecerá automáticamente después de 10 segundos si no se ha enviado ninguna confirmación.

 

Código:
Para mantener la claridad, aquí sólo se muestran extractos para su explicación. El código completo se puede descargar al final.

#define X 34
#
define Y 35

#
define A 26
#
define B 25
#
define C 17
#
define D 16
#
define E 27
#
define F 14

uint8_t receiverAddress[] = {0xA40xCF0x120xDC0xCF0x3A};

int calibY, calibX;
bool status = true;
long sentTime;

Al principio, los pines GPIO de los respectivos ejes del botón/joystick se definen para que puedan usarse más fácil y claramente más adelante en el programa.
A continuación se define la dirección MAC del receptor; debe estar en el formato hexadecimal que se muestra con 0x como prefijo:
A4:CF:... -> 0xA4, 0xCF,...

Las siguientes variables se utilizan para calibración y control para enviar solo los comandos si el anterior ya ha sido ejecutado.

void onDataRecv(const esp_now_recv_info_t *info, const uint8_t *data, int data_len) {
  
char dataTemp[data_len];
  memcpy(dataTemp, data, data_len);
//Copy data bytes in char Array
  
Serial.println(dataTemp);

  
if(String(dataTemp).indexOf("RDY") >= 0) {//data contains RDY
    
Serial.println("RST");
    status = true;
  }
}

void onDataSent(const wifi_tx_info_t *tx_info, esp_now_send_status_t sendStatus)
{
    
Serial.print("Sendestatus: ");
    
Serial.println(sendStatus == ESP_NOW_SEND_SUCCESS ? "Success" : "Error");
    
if(sendStatus == ESP_NOW_SEND_SUCCESS) {
      status = false; 
//marking sent
      sentTime = 
millis(); //store time for limitation
    }
}

Estos dos métodos son los métodos de devolución de llamada para recibir y enviar a través de ESPNOW.

Los datos recibidos de la función de recepción se almacenan primero en un carbón Matriz copiada para luego verificar el contenido de la palabra clave. Si se recibe, se restablecerá el estado. cierto configurar y los comandos se pueden enviar nuevamente.

La función de devolución de llamada de envío verifica el estado del envío y establece la variable de estado falso.falso, para que no se vuelva a enviar un comando inmediatamente después. Además, el tiempo de ejecución del programa actual se almacena mediante la función millis(), ya que el estado debe restablecerse después de 10 segundos.

 

En setup() solo se llaman los comandos de configuración de la biblioteca ESPNOW, seguido de la calibración de los ejes del joystick y la configuración GPIO.

En loop() se miden los valores de los ejes del joystick y el estado se restablece después de 10 segundos.

La siguiente lógica evalúa la posición de los ejes del joystick:

if(status) {
    
if(valX < -50 || valY < -50 || valX > 50 || valY > 50) {
      
Serial.println("trig");
      
if(abs(valX) > abs(valY)) {
        
if(valX < 0) {
          
Serial.println("LEFT");
          
String msg = "CMD_LFT";
          esp_now_send(receiverAddress, (uint8_t *)msg.c_str(), msg.length());
        }
        
else {
          
Serial.println("Right");
          
String msg = "CMD_RGT";
          esp_now_send(receiverAddress, (uint8_t *)msg.c_str(), msg.length());
        }
      }
      
else {
        
if(valY < 0) {
          
Serial.println("BWD");
          
String msg = "CMD_BWD";
          esp_now_send(receiverAddress, (uint8_t *)msg.c_str(), msg.length());
        }
        
else {
          
Serial.println("FWD");
          
String msg = "CMD_FWD";
          esp_now_send(receiverAddress, (uint8_t *)msg.c_str(), msg.length());
        }
      }
    }

En primer lugar se comprueba si los valores de los ejes superan el valor límite 50. Esto es necesario porque tanto los potenciómetros con los que se lee la posición de los ejes como el convertidor analógico-digital (ADC) se mueven mínimamente alrededor del valor cero (la llamada deriva), incluso en la posición cero.

Si un eje está por encima del valor umbral, se comparan entre sí los valores de magnitud de los dos ejes. De esta forma se puede determinar el eje que más se ha movido y que por tanto es indicativo.

Después de seleccionar el eje, solo necesita verificar si el valor es positivo o negativo para proporcionar la instrucción de dirección exacta. ESPNOW para poder enviar.

 

Puedes ver el programa completo aquí (Controlador.ino) Descárguelo y cárguelo en el ESP32 seleccionando la placa y el puerto correctos.

3 robots de código

La estructura básica y en particular la ESPNOW Los métodos de devolución de llamada son casi equivalentes al programa de controlador anterior.
La principal diferencia aquí es que en el método de devolución de llamada de recepción los datos no se comparan directamente sino que se almacenan en una cadena.

cmd = String(dataTemp);
y luego evaluado en loop().

 

En setup() los servomotores también se inicializan y se ajustan a la posición cero.

 

La evaluación luego sigue en el bucle() cmd Cuerdas:

if(cmd.length() > 0) {
    
if(cmd.indexOf("CMD_FWD") >= 0) {
      
Serial.println("FWD");
      forward();
    }
    
else if(cmd.indexOf("CMD_BWD") >= 0) {
      
Serial.println("BWD");
      back();
    }
    
else if(cmd.indexOf("CMD_RGT") >= 0) {
      
Serial.println("RGT");
      rightmove();
    }
    
else if(cmd.indexOf("CMD_LFT") >= 0) {
      
Serial.println("LFT");
      leftmove();
    }

    
else if(cmd.indexOf("BTN_A") >= 0) {
      
Serial.println("A");
      dance1();
    }
    
else if(cmd.indexOf("BTN_B") >= 0) {
      
Serial.println("B");
      dance2();
    }
    
else if(cmd.indexOf("BTN_C") >= 0) {
      
Serial.println("C");
      hello();
    }
    
else if(cmd.indexOf("BTN_D") >= 0) {
      
Serial.println("D");
      pushup();
    }
    
else if(cmd.indexOf("BTN_E") >= 0) {
      
Serial.println("D");
      turnright();
    }
    
else if(cmd.indexOf("BTN_F") >= 0) {
      
Serial.println("D");
      turnleft();
    }
   

    cmd = 
"";
    
const char* ack = "RDY";
    esp_now_send(senderAddress, (uint8_t*)ack, strlen(ack));
    
Serial.println("ACK gesendet");
  }

Si la longitud de la cadena es mayor que 0, significa que se ha escrito un nuevo comando en la cadena. A continuación se compara de nuevo el contenido con el comando correspondiente y se ejecuta la función correspondiente del robot.

Después de la evaluación, la confirmación se envía de vuelta al controlador.

 

En particular, a las funciones de los 6 botones se les puede asignar cualquier función del robot.

 

Los métodos de movimiento del robot biónico se encuentran en un archivo separado de la última lección sobre el robot. puedes hacer esto aquí (Comandos.h) Descárguelo y luego cópielo al directorio del proyecto.

 

Puedes ver el programa completo aquí (Spider.ino) Descárguelo y cárguelo en el ESP8266 seleccionando la placa y el puerto correctos. No olvide copiar el archivo de movimientos del robot mencionado anteriormente en el directorio

 

Conclusión

En esta publicación de blog, el escudo del joystick y un ESP32 D1 R32 se convirtieron en un controlador completamente funcional para el Araña biónica construido, que puede transmitir comandos al robot a través de WiFi con ESPNOW.

El proyecto también deja mucho potencial para su propio rediseño, por ejemplo, se pueden ejecutar otros comandos usando los botones individuales, pero también se pueden ejecutar patrones de movimiento programados con solo presionar un botón.

Diviértete replicándolo :)

Esp32Esp8266Projekte für anfänger

Deja un comentario

Todos los comentarios son moderados antes de ser publicados