Codigos Control Por IA
Codigos Control Por IA
Codigos Control Por IA
Objetivos:
Programar la sigmoide y verificar el tiempo de ejecución.
Familiarizar con el ambiente sketch
// Siempre los codigos desarrollados en ambiente wire ejecutan 1ro la función setup
void setup()
{
Serial.begin(115200); // Iniciamos com serial
Serial.print("Codigo ejemplo 001, iniciando");
Serial.println("... demonios funciona x2");
delay(150);
pinMode(75, OUTPUT); // Led verde del RGB
digitalWrite(75,1); // apagar el LED
}
// La funcion loop seria el equivalente al main(), solo recordar que estamos dentro de
// un ciclo, el codigo que se coloca aqui se ejecuta siempre como un ciclo while.
void loop()
{
unsigned int ti,tt,i; // Variables locales: tiempo inicia - final y contador
float f_res,f_val=-5.00; // Variables locales: resultado de la función y valor para
cargar
digitalWrite(75,0); // prendemos el LED
Serial.println("Calculo de 200 funciones 4.0*seno(pi*f_val/2) con valores decimales
(float)!");
ti=micros(); // guardamos el tiempo antes de realizar los ciclos
for (i=0;i<=199;i++) // ciclo para hacer muchas veces el calculo
{
f_res=4.0*exp(f_val*3.1416/2);
//f_res=f_val;
f_val=f_val+0.05;
}
tt=micros()-ti; // guardamos el tiempo transcurrido al terminar los ciclos
//i=tt*1000; // tiempo transcurrido en micro segundos
Serial.print("Tiempo transcurrido son: ");
Serial.print(tt);//Serial.print(String(tt, DEC));
Serial.println(" milisegundos.");
Serial.print("En promedio cada calculo de c/u tardo: ");
//f_val=tt*1000.0/200.0;
f_val=tt/200.0;
Serial.print(f_val, 4);
Serial.println(" microsegundos.");
Serial.print(f_res, 4);
Serial.println("\n");
digitalWrite(75,1); // prendemos el LED
delay(1000); // Esperamos 1segundo para continuar
}
// Zona de funciones
// Aqui colocaremos las diferentes funciones para hacer las pruebas objetivo del codigo
// END
Resultados:
Conclusiones:
Se tuvo que modificar el valor de los baudios, con los que funciona el programa porque estaba devolviendo
caracteres sin sentido, al azar.
Se puede observar que la versión que se maneja no proyecta una consola externa, pero despliega una
ventana con los resultados.
CÓDIGO 001.1: Gráfica Sigmoide
Objetivo:
Programar la sigmoide y verificar el tiempo de ejecución. Mostrar la gráfica de la sigmoide
Familiarizar con el ambiente sketch
// Zona de librerias
// Siempre los codigos desarrollados en ambiente wire ejecutan 1ro la función setup
void setup()
{
Serial.begin(115200); // Iniciamos com serial, sin mensaje a consola
delay(150);
pinMode(16, OUTPUT); // Pin 16 como salida
digitalWrite(16,1); // apagar el LED del pin 16
}
// La funcion loop seria el equivalente al main(), solo recordar que estamos dentro de
// un ciclo, el codigo que se coloca aqui se ejecuta siempre como un ciclo while.
void loop()
{
unsigned int ti,tt,i; // Variables locales: tiempo inicia - final y
contador
float f_res[cuentas],f_val=-5.00; // Variables locales: resultado de la sigmoide y valor
para cargar
// f_val variable que guarda el incremento del paso
digitalWrite(16,0); // prendemos el LED
ti=millis(); // guardamos el tiempo antes de realizar los ciclos
for (i=0;i<=cuentas-1;i++) // ciclo para hacer muchas veces el calculo
{
f_res[i]=f_sigmoide(c[activa]*f_val); //Invocamos y calculamos la sigmoide con el
valor c definido
f_val=f_val+paso; //Actualizamos el parametro de eval de la sigmoide
Serial.println(10.0*f_res[i], 4); //Se multiplica por 10 para que sea mas visible la
grafica
}
tt=millis()-ti; // guardamos el tiempo transcurrido al terminar los ciclos
if (activa>=2)
activa=0;
else
activa=activa+1;
delay(1000); // Esperamos 1segundo para continuar graficando
}
// Zona de funciones
// Aqui colocaremos las diferentes funciones para hacer las pruebas objetivo del codigo
Resultados:
Conclusiones:
Se puede observar, que la salida oscila entre valores de 10 a -10 y la gráfica característica de la función
sigmoide.
CÓDIGO 002: Perceptrón Función OR
Objetivo:
Programar el perceptrón para el ejemplo de la OR.
Comparar resultados con los datos de la hoja de cálculo.
// Zona de librerias
// Siempre los codigos desarrollados en ambiente wire ejecutan 1ro la función setup
void setup()
{
Serial.begin(115200); // Iniciamos com serial
Serial.print("Codigo ejemplo 002, iniciando");
Serial.println("...");
delay(150);
pinMode(16, OUTPUT); // Pin 16 como salida
digitalWrite(16,1); // apagar el LED del pin 16
}
// La funcion loop seria el equivalente al main(), solo recordar que estamos dentro de
// un ciclo, el codigo que se coloca aqui se ejecuta siempre como un ciclo while.
void loop()
{
unsigned ti,tt,i; // Variables locales: tiempo inicia - final
// Variables locales para las entradas y salida del perceptron
float x1[]={0.0,0.0,1.0,1.0};
float x2[]={0.0,1.0,0.0,1.0};
float y[4];
String mensaje; // Para generar la tabla de salida
digitalWrite(16,0); // prendemos el LED
ti=millis(); // guardamos el tiempo inicial
for (i=0;i<=3;i++)
{
y[i]=perceptron(x1[i],x2[i]);
}
tt=millis()-ti; // guardamos el tiempo transcurrido al terminar los ciclos
i=tt*1000; // tiempo transcurrido en micro segundos
mensaje=String("|| X1 | X2 || Y ||");
Serial.println(mensaje);
for (i=0;i<=3;i++)
{
mensaje=String("||"+String(x1[i],4)+"|"+String(x2[i],4)+"||"+String(y[i],4)+"||");
Serial.println(mensaje);
}
Serial.print("El codigo se ejecuto en: ");
Serial.print(String(i, 4));
Serial.println(" microsegundos.");
Serial.println("\n");
delay(1000); // Esperamos 1segundo para continuar
}
// Zona de funciones
// Aqui colocaremos las diferentes funciones para hacer las pruebas objetivo del codigo
Resultados:
Conclusiones:
Para obtener resultados más cercanos a la tabla de la respuesta de la compuerta OR, es necesario modificar
los valores de los pesos y del BIAS, en orden de acrecentar la diferencia entre valores de activación.
CÓDIGO 003: RNA multicapa XOR
Objetivos:
Programar la RNA multicapa para el ejemplo de la XOR
Comparar resultados con los datos de la hoja de calculo
// Zona de librerias
// Parametros de la RNA MC
// conforme al ejemplo, los valores en diapositiva son:
// Pesos
const float w13=1.0, w14=1.0, w23=1.0, w24=1.0, w35=1.0, w45=-1.0;
// bias de c/neurona
const float b3=0.5, b4=1.5, b5=0.5;
// constante para activación de la sigmoide
const float c3=4.0,c4=4.0,c5=4.0;
// Siempre los codigos desarrollados en ambiente wire ejecutan 1ro la función setup
void setup()
{
Serial.begin(115200); // Iniciamos com serial
Serial.println("Codigo ejemplo 003, iniciando!");
delay(150);
pinMode(16, OUTPUT); // Pin 16 como salida
digitalWrite(16,1); // apagar el LED del pin 16
}
// La funcion loop seria el equivalente al main(), solo recordar que estamos dentro de
// un ciclo, el codigo que se coloca aqui se ejecuta siempre como un ciclo while.
void loop()
{
unsigned ti,tt,i; // Variables locales: tiempo inicia - final
// Variables locales para las entradas y salida del perceptron
String mensaje; // Para generar la tabla de salida
digitalWrite(16,0); // prendemos el LED
ti=millis(); // guardamos el tiempo inicial
// Generamos un ciclo para evaluar los 4 casos de las entradas x1 y x2
for (i=0;i<=3;i++)
{
// se procesa la capa intermedia
y3[i]=perceptron(x1[i],x2[i],w13,w23,b3,c3);
y4[i]=perceptron(x1[i],x2[i],w14,w24,b4,c4);
// se procesa la capa de salida
y5[i]=perceptron(y3[i],y4[i],w35,w45,b5,c5);
}
tt=millis()-ti; // guardamos el tiempo transcurrido al terminar los ciclos
i=tt*1000; // tiempo transcurrido en micro segundos
mensaje=String("|| X1 | X2 || Y ||");
Serial.println(mensaje);
for (i=0;i<=3;i++)
{
mensaje=String("||"+String(x1[i],4)+"|"+String(x2[i],4)+"||"+String(y5[i],4)+"||");
Serial.println(mensaje);
}
Serial.print("El codigo se ejecuto en: ");
Serial.print(String(i, 4));
Serial.println(" microsegundos.");
Serial.println("\n");
delay(1000); // Esperamos 1segundo para continuar
}
// Zona de funciones
// Aqui colocaremos las diferentes funciones para hacer las pruebas objetivo del codigo
Resultados:
Conclusiones:
Se puede observar que los valores de la hoja de Excel, son idénticos a los obtenidos con el código, del
perceptrón para el problema XOR.
CODIGO 004: Valores de Salida de -5 a 5
Objetivo:
A partir del código 001, hacer la modificación al código para enviar los cálculos de la sigmoide para
valores de entrada de -5 a 5.
Comparar con datos de Excel.
// Zona de librerias
// Siempre los codigos desarrollados en ambiente wire ejecutan 1ro la función setup
void setup()
{
Serial.begin(115200); // Iniciamos com serial, sin mensaje a consola
delay(150);
pinMode(16, OUTPUT); // Pin 16 como salida
digitalWrite(16,1); // apagar el LED del pin 16
}
// La funcion loop seria el equivalente al main(), solo recordar que estamos dentro de
// un ciclo, el codigo que se coloca aqui se ejecuta siempre como un ciclo while.
void loop()
{
unsigned int ti,tt,i; // Variables locales: tiempo inicia - final y
contador
float f_res[cuentas],f_val=-5.00; // Variables locales: resultado de la sigmoide y valor
para cargar
// f_val variable que guarda el incremento del paso
digitalWrite(16,0); // prendemos el LED
ti=millis(); // guardamos el tiempo antes de realizar los ciclos
for (i=0;i<=cuentas-1;i++) // ciclo para hacer muchas veces el calculo
{
f_res[i]=f_sigmoide(c[activa]*f_val); //Invocamos y calculamos la sigmoide con el
valor c definido
f_val=f_val+paso; //Actualizamos el parametro de eval de la sigmoide
Serial.println(5.0*f_res[i], 4); //Se multiplica por 5 para obtener el valor solicitado
en la actividad
}
tt=millis()-ti; // guardamos el tiempo transcurrido al terminar los ciclos
if (activa>=2)
activa=0;
else
activa=activa+1;
delay(1000); // Esperamos 1segundo para continuar graficando
}
// Zona de funciones
// Aqui colocaremos las diferentes funciones para hacer las pruebas objetivo del codigo
Resultados:
Conclusiones:
Para este ejercicio solo hizo falta modificar el valor del producto por el cual se multiplicaba la señal en la
línea 48 del código 001 original.
CODIGO 005. Perceptrón con pesos modificados
Objetivos:
Utilizando el Código 002, hacer la modificación al código donde se varíen los pesos y el bias del
perceptrón, comprar con resultados de cálculos del Excel.
// Zona de librerias
// Siempre los codigos desarrollados en ambiente wire ejecutan 1ro la función setup
void setup()
{
Serial.begin(115200); // Iniciamos com serial
Serial.print("Codigo ejemplo 002, iniciando");
Serial.println("...");
delay(150);
pinMode(16, OUTPUT); // Pin 16 como salida
digitalWrite(16,1); // apagar el LED del pin 16
}
// La funcion loop seria el equivalente al main(), solo recordar que estamos dentro de
// un ciclo, el codigo que se coloca aqui se ejecuta siempre como un ciclo while.
void loop()
{
unsigned ti,tt,i; // Variables locales: tiempo inicia - final
// Variables locales para las entradas y salida del perceptron
float x1[]={0.0,0.0,1.0,1.0};
float x2[]={0.0,1.0,0.0,1.0};
float y[4];
String mensaje; // Para generar la tabla de salida
digitalWrite(16,0); // prendemos el LED
ti=millis(); // guardamos el tiempo inicial
for (i=0;i<=3;i++)
{
y[i]=perceptron(x1[i],x2[i]);
}
tt=millis()-ti; // guardamos el tiempo transcurrido al terminar los ciclos
i=tt*1000; // tiempo transcurrido en micro segundos
mensaje=String("|| X1 | X2 || Y ||");
Serial.println(mensaje);
for (i=0;i<=3;i++)
{
mensaje=String("||"+String(x1[i],4)+"|"+String(x2[i],4)+"||"+String(y[i],4)+"||");
Serial.println(mensaje);
}
Serial.print("El codigo se ejecuto en: ");
Serial.print(String(i, 4));
Serial.println(" microsegundos.");
Serial.println("\n");
delay(1000); // Esperamos 1segundo para continuar
}
// Zona de funciones
// Aqui colocaremos las diferentes funciones para hacer las pruebas objetivo del codigo
Resultados:
Conclusiones:
Se puede observar, que efectivamente los valores del Excel y del programa coinciden satisfactoriamente.
CODIGO 006. Perceptrón con función escalón unitario
Objetivos:
Utilizando el Código 003, cambiar la función de modificación de la sigmoide a escalón.
Implementar entradas digitales mediante botón y la salida sea para un LED.
// Siempre los codigos desarrollados en ambiente wire ejecutan 1ro la función setup
void setup()
{
Serial.begin(115200); // Iniciamos com serial
Serial.println("Codigo ejemplo 003, iniciando!");
delay(150);
pinMode(16, OUTPUT); // Pin 16 como salida
digitalWrite(16,1); // apagar el LED del pin 16
}
// La funcion loop seria el equivalente al main(), solo recordar que estamos dentro de
// un ciclo, el codigo que se coloca aqui se ejecuta siempre como un ciclo while.
void loop()
{
unsigned ti,tt,i; // Variables locales: tiempo inicia - final
// Variables locales para las entradas y salida del perceptron
String mensaje; // Para generar la tabla de salida
digitalWrite(16,0); // prendemos el LED
ti=millis(); // guardamos el tiempo inicial
// Generamos un ciclo para evaluar los 4 casos de las entradas x1 y x2
for (i=0;i<=3;i++)
{
// se procesa la capa intermedia
y3[i]=perceptron(x1[i],x2[i],w13,w23,b3,c3);
y4[i]=perceptron(x1[i],x2[i],w14,w24,b4,c4);
// se procesa la capa de salida
y5[i]=perceptron(y3[i],y4[i],w35,w45,b5,c5);
}
tt=millis()-ti; // guardamos el tiempo transcurrido al terminar los ciclos
i=tt*1000; // tiempo transcurrido en micro segundos
mensaje=String("|| X1 | X2 || Y ||");
Serial.println(mensaje);
for (i=0;i<=3;i++)
{
mensaje=String("||"+String(x1[i],4)+"|"+String(x2[i],4)+"||"+String(y5[i],4)+"||");
Serial.println(mensaje);
}
Serial.print("El codigo se ejecuto en: ");
Serial.print(String(i, 4));
Serial.println(" microsegundos.");
Serial.println("\n");
delay(1000); // Esperamos 1segundo para continuar
}
// Zona de funciones
// Aqui colocaremos las diferentes funciones para hacer las pruebas objetivo del codigo
Conclusiones:
Objetivos:
El alumno desarrollará el siguiente código y comparará los resultados con cuentas hechas en hoja de
cálculo: Perceptrón que compute la AND de 2 entradas.
// Zona de librerias
// Siempre los codigos desarrollados en ambiente wire ejecutan 1ro la función setup
void setup()
{
Serial.begin(115200); // Iniciamos com serial
Serial.print("Codigo 007, iniciando");
Serial.println("...");
delay(150);
pinMode(16, OUTPUT); // Pin 16 como salida
digitalWrite(16,1); // apagar el LED del pin 16
}
// La funcion loop seria el equivalente al main(), solo recordar que estamos dentro de
// un ciclo, el codigo que se coloca aqui se ejecuta siempre como un ciclo while.
void loop()
{
unsigned ti,tt,i; // Variables locales: tiempo inicia - final
// Variables locales para las entradas y salida del perceptron
float x1[]={0.0,0.0,1.0,1.0};
float x2[]={0.0,1.0,0.0,1.0};
float y[4];
String mensaje; // Para generar la tabla de salida
digitalWrite(16,0); // prendemos el LED
ti=millis(); // guardamos el tiempo inicial
for (i=0;i<=3;i++)
{
y[i]=perceptron(x1[i],x2[i]);
}
tt=millis()-ti; // guardamos el tiempo transcurrido al terminar los ciclos
i=tt*1000; // tiempo transcurrido en micro segundos
mensaje=String("|| X1 | X2 || Y ||");
Serial.println(mensaje);
for (i=0;i<=3;i++)
{
mensaje=String("||"+String(x1[i],4)+"|"+String(x2[i],4)+"||"+String(y[i],4)+"||");
Serial.println(mensaje);
}
Serial.print("El codigo se ejecuto en: ");
Serial.print(String(i, 4));
Serial.println(" microsegundos.");
Serial.println("\n");
delay(1000); // Esperamos 1segundo para continuar
}
// Zona de funciones
// Aqui colocaremos las diferentes funciones para hacer las pruebas objetivo del codigo
Resultados:
Conclusión:
La modificación de este código, radica principalmente en los pesos (w1=-6, w2=-6) y el bias (bias=1), con los
valores previamente buscados en el Excel.
CÓDIGO 008. Perceptrón para NAND de dos entradas
Objetivo:
El alumno desarrollará el siguiente código y comparará los resultados con cuentas hechas en hoja de
cálculo: Perceptrón que compute la NAND de 2 entradas.
// Zona de librerias
// Siempre los codigos desarrollados en ambiente wire ejecutan 1ro la función setup
void setup()
{
Serial.begin(115200); // Iniciamos com serial
Serial.print("Codigo 008, iniciando");
Serial.println("...");
delay(150);
pinMode(16, OUTPUT); // Pin 16 como salida
digitalWrite(16,1); // apagar el LED del pin 16
}
// La funcion loop seria el equivalente al main(), solo recordar que estamos dentro de
// un ciclo, el codigo que se coloca aqui se ejecuta siempre como un ciclo while.
void loop()
{
unsigned ti,tt,i; // Variables locales: tiempo inicia - final
// Variables locales para las entradas y salida del perceptron
float x1[]={0.0,0.0,1.0,1.0};
float x2[]={0.0,1.0,0.0,1.0};
float y[4];
String mensaje; // Para generar la tabla de salida
digitalWrite(16,0); // prendemos el LED
ti=millis(); // guardamos el tiempo inicial
for (i=0;i<=3;i++)
{
y[i]=perceptron(x1[i],x2[i]);
}
tt=millis()-ti; // guardamos el tiempo transcurrido al terminar los ciclos
i=tt*1000; // tiempo transcurrido en micro segundos
mensaje=String("|| X1 | X2 || Y ||");
Serial.println(mensaje);
for (i=0;i<=3;i++)
{
mensaje=String("||"+String(x1[i],4)+"|"+String(x2[i],4)+"||"+String(y[i],4)+"||");
Serial.println(mensaje);
}
Serial.print("El codigo se ejecuto en: ");
Serial.print(String(i, 4));
Serial.println(" microsegundos.");
Serial.println("\n");
delay(1000); // Esperamos 1segundo para continuar
}
// Zona de funciones
// Aqui colocaremos las diferentes funciones para hacer las pruebas objetivo del codigo
Resultados:
Conclusiones:
Para obtener este resultado, es necesario agregar una capa extra de negación, de esta manera, podemos
basar nuestro codigo en el codigo 007, anterior, correspondiente a la compuerta AND
CÓDIGO 009. RNA compuerta NOR de 2 entradas
Objetivo:
El alumno desarrollará el siguiente código y comparará los resultados con cuentas hechas en hoja de
cálculo: RNA MC (como el de la XOR) que compute la NOR de 2 entradas
// Zona de librerias
// Parametros de la RNA MC
// conforme al ejemplo, los valores en diapositiva son:
// Pesos
const float w13=1.0, w14=1.0, w23=1.0, w24=1.0, w35=1.0, w45=-1.0;
// bias de c/neurona
const float b3=5, b4=1.5, b5=0.4;
// constante para activación de la sigmoide
const float c3=1,c4=c3,c5=c4;
// Siempre los codigos desarrollados en ambiente wire ejecutan 1ro la función setup
void setup()
{
Serial.begin(115200); // Iniciamos com serial
Serial.println("Codigo ejemplo 003, iniciando!");
delay(150);
pinMode(16, OUTPUT); // Pin 16 como salida
digitalWrite(16,1); // apagar el LED del pin 16
}
// La funcion loop seria el equivalente al main(), solo recordar que estamos dentro de
// un ciclo, el codigo que se coloca aqui se ejecuta siempre como un ciclo while.
void loop()
{
unsigned ti,tt,i; // Variables locales: tiempo inicia - final
// Variables locales para las entradas y salida del perceptron
String mensaje; // Para generar la tabla de salida
digitalWrite(16,0); // prendemos el LED
ti=millis(); // guardamos el tiempo inicial
// Generamos un ciclo para evaluar los 4 casos de las entradas x1 y x2
for (i=0;i<=3;i++)
{
// se procesa la capa intermedia
y3[i]=perceptron(x1[i],x2[i],w13,w23,b3,c3);
y4[i]=perceptron(x1[i],x2[i],w14,w24,b4,c4);
// se procesa la capa de salida
y5[i]=perceptron(y3[i],y4[i],w35,w45,b5,c5);
}
tt=millis()-ti; // guardamos el tiempo transcurrido al terminar los ciclos
i=tt*1000; // tiempo transcurrido en micro segundos
mensaje=String("|| X1 | X2 || Y ||");
Serial.println(mensaje);
for (i=0;i<=3;i++)
{
mensaje=String("||"+String(x1[i],4)+"|"+String(x2[i],4)+"||"+String(y5[i],4)+"||");
Serial.println(mensaje);
}
Serial.print("El codigo se ejecuto en: ");
Serial.print(String(i, 4));
Serial.println(" microsegundos.");
Serial.println("\n");
delay(1000); // Esperamos 1segundo para continuar
}
// Zona de funciones
// Aqui colocaremos las diferentes funciones para hacer las pruebas objetivo del codigo
Resultados:
Conclusiones.
Al pasar los cálculos de las conexiones del bias, en el Excel se obtiene el resultado esperado, sin embargo,
en el código, nos arroja un error, no se detecta cual es el fallo.