<
Cristionel |
Messinaldo
>
Proyecto preparado para los alumnos de 4to año de Electrónica y diseñado para competir en la Liga Nacional de Robotica como robot Futbolista
El mismo también tiene una integración apta para ser un sumo; sin embargo, no tiene un código implementado para ello.
PCB - Robot
Circuito con sensores infrarrojos y de ultrasonido, botón de encendido, y la capacidad de controlar dos motores. A más detalles de su funcionamiento leer la documentación respectiva en el repositorio de Github del proyecto.
Bluetooth .1
#include "BluetoothSerial.h"
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
#define Motor1a 16
#define Motor1b 17
#define Motor2a 18
#define Motor2b 19
int veloc;
BluetoothSerial BT; // Objeto Bluetooth
void callback_function(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) {
if (event == ESP_SPP_START_EVT) {
Serial.println("Inicializado SPP");
}
else if (event == ESP_SPP_SRV_OPEN_EVT ) {
Serial.println("Cliente conectado");
}
else if (event == ESP_SPP_CLOSE_EVT ) {
Serial.println("Cliente desconectado");
}
else if (event == ESP_SPP_DATA_IND_EVT ) {
Serial.println("Datos recibidos");
while (BT.available()) { // Mientras haya datos por recibir
int incoming = BT.read(); // Lee un byte de los datos recibidos
}
}
}
void setup() {
Serial.begin(115200); // Inicializando la conexión serial para debug
BT.begin("ESP32_Fulbo"); // Nombre de tu Dispositivo Bluetooth y en modo esclavo
Serial.println("El dispositivo Bluetooth está listo para emparejar");
BT.register_callback(callback_function); // Registramos la función "callback_function" como función callback.
pinMode(Motor1a, OUTPUT);
pinMode(Motor1b, OUTPUT);
pinMode(Motor2a, OUTPUT);
pinMode(Motor2b, OUTPUT);
}
void loop() {
if (BT.available()) // Compruebe si recibimos algo de Bluetooth
{
int incoming = BT.read(); // Lee lo que recibimos
Serial.print("Recibido: ");
Serial.println(incoming);
switch(incoming){
case 70: // F en ASCII
Adelante() ;
Serial.print("Adelante");
break;
case 66: // B en ASCII
Retroceder();
Serial.print("Retroceder");
break;
case 76: // L en ASCII
Izquierda();
Serial.print("Izquierda");
break;
case 82: // R en ASCII
Derecha();
Serial.print("Derecha");
break;
case 0: // 0 en ASCII
veloc = 0;
break;
case 1: // 1 en ASCII
veloc = 25;
break;
case 2: // 2 en ASCII
veloc = 51;
break;
case 3: // 3 en ASCII
veloc = 76;
break;
case 4: // 4 en ASCII
veloc = 102;
break;
case 5: // 5 en ASCII
veloc = 127;
break;
case 6: // 6 en ASCII
veloc = 153;
break;
case 7: // 7 en ASCII
veloc = 179;
break;
case 8: // 8 en ASCII
veloc = 200;
break;
case 9: // 9 en ASCII
veloc = 225;
break;
case 113: // q en ASCII
veloc = 255;
break;
default:
Parar();
Serial.print("Parado");
break;
}
}
}
void Adelante() {
digitalWrite(Motor1a, veloc);
digitalWrite(Motor1b, LOW);
digitalWrite(Motor2a, veloc);
digitalWrite(Motor2b, LOW);
}
void Retroceder() {
digitalWrite(Motor1a, LOW);
digitalWrite(Motor1b, HIGH);
digitalWrite(Motor2a, LOW);
digitalWrite(Motor2b, HIGH);
}
void Izquierda() {
digitalWrite(Motor1a, LOW);
digitalWrite(Motor1b, HIGH);
digitalWrite(Motor2a, HIGH);
digitalWrite(Motor2b, LOW);
}
void Derecha() {
digitalWrite(Motor1a, HIGH);
digitalWrite(Motor1b, LOW);
digitalWrite(Motor2a, LOW);
digitalWrite(Motor2b, HIGH);
}
void Parar() {
digitalWrite(Motor1a, LOW);
digitalWrite(Motor1b, LOW);
digitalWrite(Motor2a, LOW);
digitalWrite(Motor2b, LOW);
}
Wifi .2
// Import required libraries
#include < WiFi.h >
#include < AsyncTCP.h >
#include < ESPAsyncWebServer.h >
// Replace with your network credentials
const char* ssid = "Polenta3000";
const char* password = "Tecnica5";
//Estudiantes
//educar_2018
int Numero;
#define STBY 5
#define Motor1a 17
#define Motor1b 16
#define Motor2a 18
#define Motor2b 19
char move = 'default';
int ledState = 0;
bool getA, getS, getD, getW = 0;
// Create AsyncWebServer object on port 80
AsyncWebServer server(80);
AsyncWebSocket ws("/ws");
const char index_html[] PROGMEM = R"rawliteral(
// Aquí se inserta la Página Web
)rawliteral";
void notifyClients() {
ws.textAll(String(ledState));
}
void handleWebSocketMessage(void *arg, uint8_t *data, size_t len) {
AwsFrameInfo *info = (AwsFrameInfo*)arg;
if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) {
data[len] = 0;
//----------------
if (strcmp((char*)data, "IZQUIERDA") == 0) {
Serial.println("Voy hacia la izquierda");
move = 'A';
getA = 0;
} if (strcmp((char*)data, "DERECHA") == 0) {
Serial.println("Voy hacia la derecha");
move = 'D';
getD = 0;
}
if (strcmp((char*)data, "ABAJO") == 0) {
Serial.println("Voy hacia abajo");
move = 'S';
getS = 0;
}
if (strcmp((char*)data, "ARRIBA") == 0) {
Serial.println("Voy hacia adelante");
move = 'W';
getA = 0;
}
//-------------- MENOS
if (strcmp((char*)data, "MENOSARRIBA") == 0) {
move = 'default';
}
if (strcmp((char*)data, "MENOSDERECHA") == 0) {
move = 'default';
}
if (strcmp((char*)data, "MENOSIZQUIERDA") == 0) {
move = 'default';
}
if (strcmp((char*)data, "MENOSABAJO") == 0) {
move = 'default';
}
}
}
void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type,
void *arg, uint8_t *data, size_t len) {
switch (type) {
case WS_EVT_CONNECT:
Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str());
break;
case WS_EVT_DISCONNECT:
Serial.printf("WebSocket client #%u disconnected\n", client->id());
break;
case WS_EVT_DATA:
handleWebSocketMessage(arg, data, len);
break;
case WS_EVT_PONG:
case WS_EVT_ERROR:
break;
}
}
void initWebSocket() {
ws.onEvent(onEvent);
server.addHandler(&ws);
}
String processor(const String& var){
Serial.println(var);
if(var == "STATE"){
if (ledState){
return "ON";
}
else{
return "OFF";
}
}
return String();
}
void setup(){
// Serial port for debugging purposes
Serial.begin(115200);
pinMode(Motor1a, OUTPUT);
pinMode(Motor1b, OUTPUT);
pinMode(Motor2a, OUTPUT);
pinMode(Motor2b, OUTPUT);
digitalWrite(Motor1a, LOW);
digitalWrite(Motor1b, LOW);
digitalWrite(Motor2a, LOW);
digitalWrite(Motor2b, LOW);
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
// Print ESP Local IP Address
Serial.println(WiFi.localIP());
initWebSocket();
// Route for root / web page
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html, processor);
});
// Start server
server.begin();
}
void loop() {
ws.cleanupClients();
switch (move)
{
case 'A':
Serial.println("A");
digitalWrite(Motor1a, HIGH);
digitalWrite(Motor1b, LOW);
digitalWrite(Motor2a, LOW);
digitalWrite(Motor2b, HIGH);
digitalWrite(STBY, HIGH);
break;
case 'D':
Serial.println("D");
digitalWrite(Motor1a, LOW);
digitalWrite(Motor1b, HIGH);
digitalWrite(Motor2a, HIGH);
digitalWrite(Motor2b, LOW);
digitalWrite(STBY, HIGH);
break;
case 'W':
Serial.println("W");
digitalWrite(Motor1a, HIGH);
digitalWrite(Motor1b, LOW);
digitalWrite(Motor2a, HIGH);
digitalWrite(Motor2b, LOW);
digitalWrite(STBY, HIGH);
break;
case 'S':
Serial.println("S");
digitalWrite(Motor1a, LOW);
digitalWrite(Motor1b, HIGH);
digitalWrite(Motor2a, LOW);
digitalWrite(Motor2b, HIGH);
digitalWrite(STBY, HIGH);
break;
default:
digitalWrite(Motor1a, LOW);
digitalWrite(Motor1b, LOW);
digitalWrite(Motor2a, LOW);
digitalWrite(Motor2b, LOW);
digitalWrite(STBY, LOW);
break;
}
}