Jostick — ESP32-S3 simulation

An interactive ESP32-S3 circuit simulation you can run free in your browser on Velxio, by ortizlaurava.

Components

Sketch code

#include "NeuralNetwork.h"

// Asignación de pines analógicos:
// - Potenciómetro IZQUIERDA: Eje X (GPIO 1)
// - Potenciómetro DERECHA:   Eje Y (GPIO 2)
const int PIN_X = 1; 
const int PIN_Y = 2; 

NeuralNetwork nn;

const int NUM_MUESTRAS = 16;

const double X_train[NUM_MUESTRAS][2] = {
    // Izquierda Superior (X < 0.5, Y > 0.5)
    {0.1, 0.9}, 
    {0.2, 0.8}, 
    {0.0, 0.6}, 
    {0.3, 0.9},
    // Izquierda Inferior (X < 0.5, Y < 0.5)
    {0.1, 0.1}, 
    {0.2, 0.2}, 
    {0.0, 0.4}, 
    {0.3, 0.1},
    // Derecha Inferior (X > 0.5, Y < 0.5)
    {0.9, 0.1}, 
    {0.8, 0.2}, 
    {1.0, 0.4}, 
    {0.7, 0.1},
    // Derecha Superior (X > 0.5, Y > 0.5)
    {0.9, 0.9}, 
    {0.8, 0.8}, 
    {1.0, 0.6}, 
    {0.7, 0.9}
};

const double Y_train[NUM_MUESTRAS][4] = {
    // Izquierda Superior
    {1.0, 0.0, 0.0, 0.0}, 
    {1.0, 0.0, 0.0, 0.0}, 
    {1.0, 0.0, 0.0, 0.0}, 
    {1.0, 0.0, 0.0, 0.0},
    // Izquierda Inferior
    {0.0, 1.0, 0.0, 0.0}, 
    {0.0, 1.0, 0.0, 0.0}, 
    {0.0, 1.0, 0.0, 0.0}, 
    {0.0, 1.0, 0.0, 0.0},
    // Derecha Inferior
    {0.0, 0.0, 1.0, 0.0}, 
    {0.0, 0.0, 1.0, 0.0}, 
    {0.0, 0.0, 1.0, 0.0}, 
    {0.0, 0.0, 1.0, 0.0},
    // Derecha Superior
    {0.0, 0.0, 0.0, 1.0}, 
    {0.0, 0.0, 0.0, 1.0}, 
    {0.0, 0.0, 0.0, 1.0}, 
    {0.0, 0.0, 0.0, 1.0}
};

const char* NOMBRES_POSICIONES[4] = {
    "Izquierda Superior",
    "Izquierda Inferior",
    "Derecha Inferior",
    "Derecha Superior"
};

void setup() {
    Serial.begin(115200);
    delay(1500);

    randomSeed(analogRead(PIN_X));
    Serial.println("=================================================");
    Serial.println("        ESPECIFICACION DE LA ARQUITECTURA        ");
    Serial.println("=================================================");
    Serial.println(" - Entradas (2):     X (GPIO 1) | Y (GPIO 2)");
    Serial.println(" - Capa Oculta 1:    4 Neuronas (Sigmoide)");
    Serial.println(" - Capa Oculta 2:    4 Neuronas (Sigmoide)");
    Serial.println(" - Capa Salida (4):  [Izq_Sup, Izq_Inf, Der_Inf, Der_Sup]");
    Serial.println(" - Operaciones:      Multiplicacion Matricial");
    Serial.println("=================================================\n");
    delay(2000);
    Serial.println("=================================================");
    Serial.println("   INICIANDO ENTRENAMIENTO   ");
    Serial.println("=================================================");
    Serial.println("Por favor, espere un momento...");
    delay(1000);

    int epocas = 350;
    double tasaAprendizaje = 0.8;

    for (int epoca = 0; epoca <= epocas; epoca++) {
        double errorTotal = 0.0;
        for (int i = 0; i < NUM_MUESTRAS; i++) {
            errorTotal += nn.entrenarMuestra(X_train[i], Y_train[i], tasaAprendizaje);
        }

        if (epoca % 10 == 0) {
            Serial.print("Epoca: ");
            Serial.print(epoca);
            Serial.print(" / ");
            Serial.print(epocas);
            Serial.print(" | Error Acumulado: ");
            Seri