Written by Jiayi Ye
Hemos empezado también el prototipo del mando, a base de un joystick Arduino KY-023 y una placa ESP32 para así conectarlo vía Wi-Fi.
Joystick Pruebas (Sin Wi-Fi)
Hemos conectado el joystick a la placa con las siguientes conexiones que hemos encontrado en internet:
Y hemos empleado el siguiente código que hemos encontrado en internet para la prueba del robot:
#define VRX_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRX pin
#define VRY_PIN 39 // ESP32 pin GPIO39 (ADC0) connected to VRY pin
int valueX = 0; // to store the X-axis value
int valueY = 0; // to store the Y-axis value
void setup() {
Serial.begin(9600) ;
}
void loop() {
// read X and Y analog values
valueX = analogRead(VRX_PIN);
valueY = analogRead(VRY_PIN);
// print data to Serial Monitor on Arduino IDE
Serial.print("x = ");
Serial.print(valueX);
Serial.print(", y = ");
Serial.println(valueY);
delay(200);
}
Joystick Pruebas (Con Wi-Fi ; Solo lectura de datos)
Hemos estado también interactuando con las placas ESP32 entre sí mediante ESP-NOW, una tecnología Wi-Fi implementada dentro de estas placas ESP32.
Los códigos que hemos usado son los que están adjuntos a continuación:
ESP ESCLAVO
#include <esp_now.h>
#include <WiFi.h>
// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
int x;
int y;
} struct_message;
// Create a struct_message called myData
struct_message myData;
// callback function that will be executed when data is received
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("X: ");
Serial.println(myData.x);
Serial.print("Y: ");
Serial.println(myData.y);
}
void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);
// Init ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
// Once ESPNow is successfully Init, we will register for recv CB to
// get recv packer info
esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
}
ESP MAESTRO
#include <esp_now.h>
#include <WiFi.h>
#define VRX_PIN 34
#define VRY_PIN 35
// REPLACE WITH YOUR RECEIVER MAC Address
uint8_t broadcastAddress[] = {0x94, 0xB9, 0x7E, 0xE2, 0x77, 0x30};
// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
int x;
int y;
} struct_message;
// Create a struct_message called myData
struct_message myData;
esp_now_peer_info_t peerInfo;
int v_x;
int v_y;
// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.print("\r\nLast Packet Send Status:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
void setup() {
// Init Serial Monitor
Serial.begin(115200);
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);
// Init ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
// Once ESPNow is successfully Init, we will register for Send CB to
// get the status of Trasnmitted packet
esp_now_register_send_cb(OnDataSent);
// Register peer
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
// Add peer
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Failed to add peer");
return;
}
pinMode(VRX_PIN, INPUT);
pinMode(VRY_PIN, INPUT);
}
void loop() {
// Set values to send
myData.x = analogRead(VRX_PIN);
myData.y = analogRead(VRY_PIN);
// Send message via ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
if (result == ESP_OK) {
Serial.println("Sent with success");
}
else {
Serial.println("Error sending the data");
}
delay(100);
}
Y en estas semanas estaremos intentando también «escalar» los valores X e Y que nos da el joystick para controlar las direcciones que va a tomar el robot sumo.
Deja una respuesta