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,

  • 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.


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:


  • 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.

sábado, 2 de febrero de 2013

Objetivo del curso

Para tener una primera sesión y plantear el objetivo y contenido del curso, preparé una presentación de diapositivas de apoyo disponible aquí.
El objetivo real es que tengan una inmersión práctica en la confluencia de dos disciplinas en las que habían mostrado interés por separado, por un lado la informática desde el punto de vista de creación de programas y la electrónica por la cantidad de juguetes electrónicos con los que han jugado desde pequeños.
Indudablemente la existencia de una plataforma como Arduino facilita notablemente la labor.
Para hacer más agradable las sesiones y para que desde el primer día puedan ver cada parte y no tener que esperar al final para ensamblar un prototipo, cada sesión se subdivide en secciones en las que se tratan diferentes aspectos como:

  • Componentes electrónicos, empezando por resistores, diodos, condensadores, etc. irán teniendo una visión general de cada uno de ellos
  • Circuitos eléctricos: Los componentes ensamblados. Con algo de teoría previa, después nos apoyaremos en simuladores como Crocodrile para ir preparando circuitos. Veremos también tipos de placas y su construcción así como técnicas básicas como soldadura, recuperación de componentes, etc.
  • Entornos de desarrollo, básicamente para Arduino aprendiendo conceptos de programación con Java estructurado. 
  • Prácticas con Arduino
  • Pequeños test resumen

En definitiva, como aparece en la imagen, lo que se pretende cubrir son los siguientes bloques, orientado a un entorno práctico donde la teoría, asumiendo su gran importancia, no supone un impedimento para realizar la práctica. Tiempo tendrán de aprender física, matemáticas, química más teóricamente pero puede les resulte más fácil cuando recuerden una aplicación práctica por ejemplo de la ley de Ohm, de los semiconductores, etc.

Pronto la primera lección.