Programar y aprender a programar está muy bien pero si me he estado quejando toda la vida con mis programadores que no vale sentarse delante del editor del lenguaje (el que sea por moda) y ponerse a desarrollar sin tener un esquema, dejar a mis pequeños alumnos hacerlo no tiene perdón.
Por eso y porque, como no soy río me vuelvo cuando quiero (era una expresión de mi abuela que siempre me hizo gracia por lo que subyace en la expresión), vamos un poco más atrás y vamos a hablar de Algoritmos. Hice una pequeña introducción a lo que era un algoritmo y como siempre, práctica.
He preparado un documento que iré complementando con ejemplos y ejercicios de algoritmos. Para el ejemplo primero, el fuente que construyeron está aquí
lunes, 15 de abril de 2013
miércoles, 13 de marzo de 2013
Introducción a la programación
En la línea de abrir otros frentes para despertar otros intereses, preparé una breve introducción a Java para realizar una serie de ejercicios.
Es cierto que finalmente Arduino se programa en C pero me pareció más adecuado hablar de Java y que puedan aprender a manejarse con un IDE estándar en vez de profundizar en C.
También he querido hacer una aproximación alejada de la típica en la que la orientación a objetos sea lo primero antes de nada. Otra cosa es que conceptos como herencia, polimorfismo, etc. van apareciendo quieras o no.
La presentación que hemos usado está aquí.
Después de la introducción lo que enseñé fue Eclipse, JDeveloper y BlueJ, que son los que tengo instalados en el PC. Por simplicidad para las pruebas descartamos JDeveloper y nos centramos en BlueJ para luego pasar a Eclipse las pruebas realizadas y comprobar que es lo mismo. En siguientes sesiones nos quedaremos con BlueJ, mucho más ligero.
Vimos los ejercicios propuestos pero les he dado tiempo para que asienten los conocimientos y hacer unos ejercicios más completos individualmente en posteriores sesiones.
Es cierto que finalmente Arduino se programa en C pero me pareció más adecuado hablar de Java y que puedan aprender a manejarse con un IDE estándar en vez de profundizar en C.
También he querido hacer una aproximación alejada de la típica en la que la orientación a objetos sea lo primero antes de nada. Otra cosa es que conceptos como herencia, polimorfismo, etc. van apareciendo quieras o no.
La presentación que hemos usado está aquí.
Después de la introducción lo que enseñé fue Eclipse, JDeveloper y BlueJ, que son los que tengo instalados en el PC. Por simplicidad para las pruebas descartamos JDeveloper y nos centramos en BlueJ para luego pasar a Eclipse las pruebas realizadas y comprobar que es lo mismo. En siguientes sesiones nos quedaremos con BlueJ, mucho más ligero.
Vimos los ejercicios propuestos pero les he dado tiempo para que asienten los conocimientos y hacer unos ejercicios más completos individualmente en posteriores sesiones.
miércoles, 6 de marzo de 2013
Electrónica Digital. Sesión I
Después del ejercicio del Semáforo y cómo se resolvía con Arduino, uno de mis alumnos se planteó que si les había contado que Arduino existe desde hace unos pocos años y semáforos hay desde hace mucho, ¿cómo se hacían antes?.
Aunque en la introducción de las sesiones hablé un poco de histora, empezamos a hablar de la electrónica convencional de hace 30-40 años (circuitos con transistores, pequeños integrados, ...) y terminé hablando de electrónica digital y puertas lógicas.
Por alguna extraña razón, les llamó la atención y sobre la marcha, dibujé el siguiente esquema que refleja una posibilidad de circuito de control de un semáforo:
Aunque en la introducción de las sesiones hablé un poco de histora, empezamos a hablar de la electrónica convencional de hace 30-40 años (circuitos con transistores, pequeños integrados, ...) y terminé hablando de electrónica digital y puertas lógicas.
Por alguna extraña razón, les llamó la atención y sobre la marcha, dibujé el siguiente esquema que refleja una posibilidad de circuito de control de un semáforo:
identificando el módulo de Reloj (hablando del 555), de un contador binario y de cómo un decodificador ayuda a seleccionar acciones.
Como vi que tenía interés el tema, preparé el siguiente borrador para una sesión monográfica de Electrónica Digital que dado el éxito obtenido, tendrá su continuación.
Creo que el objetivo no es cortar y pegar de otros contenidos de Internet sobre puertas lógicas, simplemente entrando en la Wikipedia (por poner un ejemplo) tienes información suficiente. Es tal vez la referencia de la utilidad de este tipo de contenido contado a chicos interesados en el tema.
Me sorprendió que no conociesen diferentes sistemas de numeración y su justificación por lo que profundicé un poco en ello con teoría y práctica.
Después hablamos de las puertas lógicas y de cómo se implementarían con transistores y de las ventajas de los circuitos integrados (creo que les da un poco de vértigo la miniaturización y eso que esto no es nada pero el comentario del mayor, cuando hablamos del tamaño que puede alcanzar un transistor en un circuito integrado, se le ocurrió que una célula podría tener un MP3 -buena reflexión-)
Como ejercicios prácticos tuvimos:
* Con un programa de simulación de circuitos, las bases de funcionamiento. Les gustó y lo entendieron fácilmente.
* Con una Protoboard se construyeron físicamente algunos ejemplos prestando atención a que 0 es conectado a gnd mientras que abierta la entrada es 1 (esto les supuso un cierto retraso hasta que lo fijamos). Esto les desarrolla la habilidad motora que en algunos casos es bastante deficiente, teclas si, manos, poco.
* Con Arduino hicimos un prototipo que manejaba las entradas de una puerta y la salida para construir vía serial la tabla de la verdad en plan listado cuando se pulsaba un botón (aquí estoy viendo que algunos tienen la mente preparada para la programación ya que se les ocurren cosas curiosas).
En próximas sesiones de Electrónica Digital hablaremos de FlipFlop, Registros de desplazamiento, manejadores de displays, ...
domingo, 17 de febrero de 2013
Sesión III (2ª parte)
Hacemos la segunda parte de la sesión dedicada exclusivamente a finalizar el prototipo de semáforo doble añadiendo la funcionalidad que nos faltó, esto es:
- Añadir un segundo semáforo modificando la programación para contemplar los cambios de este nuevo semáforo.
- Añadir un botón para seleccionar 'Todo Naranja' para los dos semáforos
dada la nula experiencia de programación de los alumnos vamos despacio para que entiendan los conceptos y poco a poco podamos refinar el código. Es decir, hoy no les voy a hablar de las interrupciones en Arduino si no que vamos a introducir el botón como parte del loop para que de esa forma se vayan planteando necesidades que después iremos implementando.
Así, en la primera implementación completa del segundo semáforo, antes de añadir el botón, lo que hacemos es modificar la escala de tiempos (añadimos más delays) para contemplar los pasos a naranja desde verde mientras que está en rojo el otro. Volvemos a trabajar el diagrama de tiempos para que ellos deduzcan los espacios a considerar.
Cuando introducimos el botón y la funcionalidad de 'Todo Naranja', lo hacemos al principio del bucle mirando si está o no pulsado el botón. El problema que aparece con esta localización es que sólo se evalúa cuando todo el bucle de tiempo se ejecuta, pero insisto que es interesante esta aproximación paso a paso para que vean casuísticas y cómo se resuelven.
Sin entrar todavía en interrupciones y para acotar más el problema, lo que hacemos es que nos creamos una función 'espera y mira' que lo que hace es hacer delays más cortos y evaluar el botón.
Aparece entonces otro comportamiento que no les gusta y es que cuando se deja de pulsar el botón se recupera la posición que había en el semáforo lo cual no es seguro en la vida real por lo que les introduzco el concepto de reinicio de bucle implementado con sentencias if.
El prototipo queda como se ve en la foto
Recomiendo echar un vistazo al código y al video que grabamos con el resultado (ya mejoraremos en esto porque no está muy fino) .
Código
/*
Semaforo, Version 2
Incluye dos semáforos y un botón para Naranja Parpadeante
Febr 2013
Arturo, Jaime
*/
int ledRojoSem1 = 12;
int ledNaranjaSem1 = 11;
int ledVerdeSem1 = 10;
int ledRojoSem2 = 5;
int ledNaranjaSem2 = 6;
int ledVerdeSem2 = 7;
int buttonState1 = 0;
int duracion = 1000;
int duracTotal = 1000;
boolean continuar= true;
//Duracion de Naranja. Rojo = 6*Naranja, Verde = 5*Naranja
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
// Serial.begin(9600);
pinMode(ledRojoSem1, OUTPUT);
pinMode(ledNaranjaSem1, OUTPUT);
pinMode(ledVerdeSem1, OUTPUT);
pinMode(ledRojoSem2, OUTPUT);
pinMode(ledNaranjaSem2, OUTPUT);
pinMode(ledVerdeSem2, OUTPUT);
pinMode(1,INPUT); // El Botón para todo Naranja
pinMode(13,OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(ledNaranjaSem1,LOW);
digitalWrite(ledNaranjaSem2,LOW);
continuar = true;
digitalWrite(ledRojoSem1, HIGH); // turn the LED on (HIGH is the voltage level)
digitalWrite(ledVerdeSem2, HIGH); // turn the LED on (HIGH is the voltage level)
espera(5*duracion);
if (continuar){
digitalWrite(ledVerdeSem2, LOW); // turn the LED oFF (LOW is the voltage level)
digitalWrite(ledNaranjaSem2, HIGH); // turn the LED on (HIGH is the voltage level)
espera(duracion);
if (continuar){
digitalWrite(ledNaranjaSem2, LOW); // turn the LED off (LOW is the voltage level)
digitalWrite(ledRojoSem1, LOW); // turn the LED off (LOW is the voltage level)
digitalWrite(ledVerdeSem1, HIGH); // turn the LED on (HIGH is the voltage level)
digitalWrite(ledRojoSem2, HIGH); // turn the LED on (HIGH is the voltage level)
espera(5*duracion);
if (continuar){
digitalWrite(ledVerdeSem1, LOW); // turn the LED oFF (LOW is the voltage level)
digitalWrite(ledNaranjaSem1, HIGH); // turn the LED on (HIGH is the voltage level)
espera(duracion);
if (continuar){
digitalWrite(ledNaranjaSem1, LOW); // turn the LED off (LOW is the voltage level)
digitalWrite(ledRojoSem2, LOW); // turn the LED off (LOW is the voltage level)
}
}
}
}
}
void ponerNaranja(){
digitalWrite(ledNaranjaSem2, HIGH); // turn the LED off (LOW is the voltage level)
digitalWrite(ledNaranjaSem1, HIGH); // turn the LED off (LOW is the voltage level)
digitalWrite(ledVerdeSem2, LOW); // turn the LED off (LOW is the voltage level)
digitalWrite(ledVerdeSem1, LOW); // turn the LED off (LOW is the voltage level)
digitalWrite(ledRojoSem2, LOW); // turn the LED off (LOW is the voltage level)
digitalWrite(ledRojoSem1, LOW); // turn the LED off (LOW is the voltage level)
delay(100);
digitalWrite(ledNaranjaSem2, LOW); // turn the LED off (LOW is the voltage level)
digitalWrite(ledNaranjaSem1, LOW); // turn the LED off (LOW is the voltage level)
delay(50);
}
void espera(int duracTotal){
int n;
int fin = duracTotal/200;
for (n = 0 ;fin > n;n++){
delay(200); //Espero 1/2 seg
buttonState1 = digitalRead(1); //Leer boton
if (buttonState1 == HIGH) {
while(buttonState1 == HIGH){
ponerNaranja();
buttonState1 = digitalRead(1); //Leer boton
}
continuar= false;
break;
}
}
}
Aquí tenéis el video
A modo de reflexión veo que va a ser importante hacer varias sesiones de programación (probaré con BlueJ) para que entiendan completamente las sentencias de control, la utilización de funciones, etc. sin entrar todavía en orientación a objetos.
Como siempre, cualquier aclaración o comentario ...
domingo, 10 de febrero de 2013
Sesión III (1ª parte)
Esta sesión la hemos tenido que hacer entre dos semanas porque el material empezaba a complicarse y una vez que empiezas a programar, el tiempo se va que vuela. El material de apoyo a la sesión está aquí y la agenda es:
Hoy en la sección de componentes hablamos de Diodos de forma general, hablando de diodos rectificadores, Zenner y LED, que son los que más usaremos para las prácticas. Hablamos de los usos de cada uno y vemos con el Cocodrilo, cómo un diodo recorta una señal alterna y varios circuitos de LED para que los 'quemen' virtualmente si se pasan con la corriente.
Incido en cómo son los diodos LED, su forma, su uso, su polaridad, etc. para que se familiaricen lo antes posible con ellos.
En la sección de Circuitos eléctricos hablamos de los tipos de placas de circuitos jugando con ejemplos físicos de cada una de ella. Con la Protoboard hacemos alguno de los circuitos que hemos hecho en el Cocodrilo.
Pasamos por último a lo que más les llama la atención, jugar con el Arduino y hacerle funcionar. Como he comentado, vamos a hacer el ejercicio de Arduino en dos fases. El proyecto es hacer un cruce de carreteras con dos semáforos. Para facilitar las cosas, sólo considerando coches, no peatones.
En este ejercicio se introducen muchos nuevos conceptos,
Hoy en la sección de componentes hablamos de Diodos de forma general, hablando de diodos rectificadores, Zenner y LED, que son los que más usaremos para las prácticas. Hablamos de los usos de cada uno y vemos con el Cocodrilo, cómo un diodo recorta una señal alterna y varios circuitos de LED para que los 'quemen' virtualmente si se pasan con la corriente.
Incido en cómo son los diodos LED, su forma, su uso, su polaridad, etc. para que se familiaricen lo antes posible con ellos.
En la sección de Circuitos eléctricos hablamos de los tipos de placas de circuitos jugando con ejemplos físicos de cada una de ella. Con la Protoboard hacemos alguno de los circuitos que hemos hecho en el Cocodrilo.
Pasamos por último a lo que más les llama la atención, jugar con el Arduino y hacerle funcionar. Como he comentado, vamos a hacer el ejercicio de Arduino en dos fases. El proyecto es hacer un cruce de carreteras con dos semáforos. Para facilitar las cosas, sólo considerando coches, no peatones.
En este ejercicio se introducen muchos nuevos conceptos,
- por el lado de programación vamos a tener que introducir instrucciones de control (if, for, ...), vamos a crear funciones propias, el programa no se va a ver en una sóla pantalla, etc. pero siempre insistiendo de ir de menos a más y probando cada paso. Les insisto en la documentación que no parece que les convenza pero si cogen la costumbre, lo apreciarán en un futuro.
- Por el lado del prototipo va a haber mucho más cable que hay que manejar con cuidado para no crear falsos contactos. Vamos a introducir un interruptor y posteriormente lo vamos a conectar a otra fuente de alimentación distinta al usb del ordenador.
Como primer objetivo planteamos crear un semáforo según el esquema de Fritzing de la presentación y que se iluminen secuencialmente los diodos. Vamos paso a paso con la programación creando el esqueleto, viendo que funciona, cargando de nuevo al Arduino y volviendo a comprobar. Tengo que hacerles ver la importancia de la depuración de la programación y saber buscar potenciales problemas.
El prototipo construido se puede ver en la imagen y la primera versión del programa es:
/*
Semaforo, Version 1
Febr 2013
Arturo, Jaime
*/
int ledRojoSem1 = 12;
int ledNaranjaSem1 = 11;
int ledVerdeSem1 = 10;
int duracion = 1000; //Duracion de Naranja. Rojo = 6*Naranja, Verde = 5*Naranja
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(ledRojoSem1, OUTPUT);
pinMode(ledNaranjaSem1, OUTPUT);
pinMode(ledVerdeSem1, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(ledRojoSem1, HIGH); // turn the LED on (HIGH is the voltage level)
delay(6*duracion);
digitalWrite(ledRojoSem1, LOW); // turn the LED off (LOW is the voltage level)
digitalWrite(ledVerdeSem1, HIGH); // turn the LED on (HIGH is the voltage level)
delay(5*duracion); // wait for a second
digitalWrite(ledVerdeSem1, LOW); // turn the LED oFF (LOW is the voltage level)
digitalWrite(ledNaranjaSem1, HIGH); // turn the LED on (HIGH is the voltage level)
delay(duracion);
digitalWrite(ledNaranjaSem1, LOW); // turn the LED off (LOW is the voltage level)
}
(Para siguientes programas creo que los dejaré como link)
Algo en lo que hemos dedicado mucha explicación ha sido al concepto de linea temporal para decidir los cambios de colores. Hemos usado unas páginas de GoodNotes para las explicaciones que dejo aquí
Están impacientes por seguir pero eso será dentro de unos días.
jueves, 7 de febrero de 2013
Sesión II
En esta sesión entramos ya en materia. El documento de apoyo se encuentra aquí y la agenda es
En la primera sección tratamos las resistencias (o resistores para ser más precisos). Vemos físicamente algunos ejemplos, estudiamos los códigos de colores desde un punto de vista teórico analizando las bandas y práctico con un tester como primera toma de contacto con los aparatos de medida.
Vemos por encima los circuitos de asociación de resistencias y con la ayuda de una protoboard creamos una asociación en paralelo y en serie y medimos con el tester para comprobar las fórmulas.
Se introduce el término de tolerancia al comprobar que no son exactas las medidas.
En la sección de circuitos, introduzco el concepto de electricidad, corriente eléctrica y los tipos de materiales. Mis alumnos están muy orientados a la química (deformación familiar) y se que es útil y procedente hablar de la estructura atómica para hablar de electrones y orbitales.
Definimos circuito como red cerrada (después hay ejercicios para ver que lo han entendido. Estas imágenes las saqué de un blog de un profesor de Castilla la Mancha que se lo ha trabajado mucho que si tengo hueco para buscarlo, referenciaré aquí).
Hablamos de los tipos de corrientes (continua y alterna), de su aplicación, generación, etc.
También cuento la ley de Ohm pero para que sepan que exista como referencia para cálculos. Dependiendo de la evolución que tengamos, la usarán más o menos a corto plazo.
Con la imagen del circuito y de la evolución de los electrones introducimos el concepto de voltaje e intensidad. Les hago notar la diferencia de criterio entre físicos y químicos al considerar cómo fluye la corriente en un circuito.
En síntesis, en esta sección hago una introducción a términos que habrá que repetir seguramente en posteriores sesiones pero que es importante empezar a entender.
Posteriormente repasamos las preguntas y respuestas en la misma sesión para afianzar los términos.
Después nos ponemos con el IDE de Arduino para recordar lo visto la semana pasada y jugamos con series de encendido/apagado del led incluído en la placa (pin 13).
El objetivo es dedicar entre una hora y media y dos horas y con este material se cubre ese objetivo.
En la primera sección tratamos las resistencias (o resistores para ser más precisos). Vemos físicamente algunos ejemplos, estudiamos los códigos de colores desde un punto de vista teórico analizando las bandas y práctico con un tester como primera toma de contacto con los aparatos de medida.
Vemos por encima los circuitos de asociación de resistencias y con la ayuda de una protoboard creamos una asociación en paralelo y en serie y medimos con el tester para comprobar las fórmulas.
Se introduce el término de tolerancia al comprobar que no son exactas las medidas.
En la sección de circuitos, introduzco el concepto de electricidad, corriente eléctrica y los tipos de materiales. Mis alumnos están muy orientados a la química (deformación familiar) y se que es útil y procedente hablar de la estructura atómica para hablar de electrones y orbitales.
Definimos circuito como red cerrada (después hay ejercicios para ver que lo han entendido. Estas imágenes las saqué de un blog de un profesor de Castilla la Mancha que se lo ha trabajado mucho que si tengo hueco para buscarlo, referenciaré aquí).
Hablamos de los tipos de corrientes (continua y alterna), de su aplicación, generación, etc.
También cuento la ley de Ohm pero para que sepan que exista como referencia para cálculos. Dependiendo de la evolución que tengamos, la usarán más o menos a corto plazo.
Con la imagen del circuito y de la evolución de los electrones introducimos el concepto de voltaje e intensidad. Les hago notar la diferencia de criterio entre físicos y químicos al considerar cómo fluye la corriente en un circuito.
En síntesis, en esta sección hago una introducción a términos que habrá que repetir seguramente en posteriores sesiones pero que es importante empezar a entender.
Posteriormente repasamos las preguntas y respuestas en la misma sesión para afianzar los términos.
Después nos ponemos con el IDE de Arduino para recordar lo visto la semana pasada y jugamos con series de encendido/apagado del led incluído en la placa (pin 13).
El objetivo es dedicar entre una hora y media y dos horas y con este material se cubre ese objetivo.
domingo, 3 de febrero de 2013
Sesión I. Introducción
En la sesión I abordamos la introducción real a los temas que vamos a tratar durante el curso. El material de apoyo se puede encontrar aquí (Si alguien necesitase el original en ppt para reaprovecharlo o ampliarlo, que no dude en pedírmelo).
El plan de la entrada no es repetir todo lo que se dice sino apoyar algún mensaje importante que no quede reflejado en el material o dar una visión de cómo dirigir la explicación asumiendo que el auditorio es no técnico y muy joven.
La agenda que utilizamos para la sesión es la siguiente:
y punto a punto:
El plan de la entrada no es repetir todo lo que se dice sino apoyar algún mensaje importante que no quede reflejado en el material o dar una visión de cómo dirigir la explicación asumiendo que el auditorio es no técnico y muy joven.
La agenda que utilizamos para la sesión es la siguiente:
y punto a punto:
- Introducción a los ordenadores: Hago una comparación entre un ser humano como ente autónomo, capaz de aprender y de realizar acciones en base a eventos o tareas aprendidas y un ordenador aunque finalmente lo comparo con una placa de Arduino por simplificar. Hago hincapié en los sensores que son los que van a relacionar al sistema con el mundo real en la misma forma que nuestros sentidos lo hacen para nosotros.
- Pasamos a un modo práctico. Sobre la mesa pongo herramientas y los ojos se abren como platos. Hacemos una revisión de alicates, corta alambres, etc. y prácticas para pelar y cortar cables. Puede parece algo superficial pero la generación del pulgar (mandos de la Play para todo) necesitan desarrollar esta habilidad. Después pasamos a los soldadores, vemos el clásico eléctrico, sus partes, el cuidado, el cambio de puntas, ... y lo enchufamos. Ahora nos ponemos con el de gas que siempre es más curioso por la llama y el color final. Tarda menos en calentarse y empezamos a fundir estaño para volver otra vez al eléctrico. Por último, vemos el desoldador y su uso.
- Volvemos a algo de teoría con la revisión general de componentes electrónicos clasificándolos en Activos y Pasivos pero pronto abandonamos la teoría para verlos en realidad y puedan empezar a distinguirlos.
- Circuitos. Hablo de la diferencia entre circuitos esquemáticos y prototipos. Aquí ven por primera vez una ProtoBoard y montan un circuito fácil (como el que aparece en la diapositiva de apoyo) para que sus manos empiecen a tener más habilidad.
- Revisión de herramientas de diseño y programación. Volvemos al ordenador y empezamos con el Crocodile (en la slide aparece Cocodrile y seguro que se me colará más veces) como entorno de simulación. Esto les encanta aunque no funciona sobre W7 por lo que arranco dos máquinas virtuales para que puedan jugar independientemente (accediendo por Remote Desktop desde sus portátiles). Finalmente vimos por encima Fritzing para realizar prototipos pero entraremo en más detalle próximamente y el IDE de Arduino para que viesen un poco el ciclo de trabajo. Probamos el ejemplo simple del Blink del diodo en el pin 13.
Básicamente este programa da para 2 horas asumiendo no dedicar todo el tiempo que queramos a cada uno de los puntos porque entonces sería 2 horas por punto. Creo que es mejor dejar la necesidad de seguir más que agotar.
El test final se dividió en las primeras preguntas respondidas en la sesión y la lista de sensores para pensarlas durante la semana y el resultado superó a las expectativas.
Creo que esto va bien. Pronto la segunda sesión.
Suscribirse a:
Entradas (Atom)
