jueves, 28 de julio de 2016

Ingeniería inversa


  • ¿QUE ES INGENIERIA INVERSA?

La ingeniería inversa es el proceso de descubrir los principios tecnológicos de un objeto, herramienta, dispositivo o sistema, mediante el razonamiento abductivo (haciendo conjeturas) de su estructura, función y operación. Dicho de otra manera, se trata de tomar algo, por ejemplo un dispositivo mecánico o electrónico, para analizar su funcionamiento en detalle, con el objetivo de crear un dispositivo que haga la misma tarea o una similar sin copiar los detalles del original.El objetivo de la ingeniería inversa es obtener información o un diseño a partir de un producto, con el fin de determinar de qué está hecho, qué lo hace funcionar y cómo fue fabricado.

  • CLASES DE INGENIERÍA INVERSA

  • ¿Método de aprendizaje?

    La ingeniería inversa no es un método de solución sino más bien de aprendizaje, como implica analizar un objeto hasta el punto de comprender cada uno de sus componentes y sus funciones entonces la cantidad de conocimientos obtenida será bastante, pero solo hemos aprendido, para solucionar el problema deberemos aplicar lo aprendido y comenzar de cero nuevamente.
La ingeniería inversa es consideradacomo un producto de aprendizaje activo (ALP), los cuales son lecciones prácticas, demostraciones, objetos, herramientas multimedia, proyectos cortos, tareas y actividades que ofrecen enfoques alternativos y material complementario a las clases típicas de libros de texto en las áreas de Ciencia, Tecnología, Ingeniería y Matemáticas. (Linsey, Talley, Jensen, & Wood, 2009) 
 
Las metodologías para enseñar a leer se pueden plantear de tres formas, primero entendiendo la lectura de acuerdo al modelo lineal modular(bottom-up), como un proceso detallado de percepción secuencial y de identificación de letras y palabras que forman frases,segundo de acuerdo al modelo holístico constructivista(top-down), como un proceso de formulación de hipótesis a partir de los conocimientos y experiencia del lector y su erificación, o finalmente de acuerdoal modelo interaccionista que surge de una 
combinación de los dos anteriores. Haciendo la analogía, la propuesta de incluir la Ingeniería inversa como metodología, es resultado de entender la enseñanza de la ingeniería como un proceso Top-Down, en contraste con los planes de estudio que tradicionalmentese orientan como un proceso bottom-up, comenzando por conceptos de ciencias básicas, los cuales se van enlazando para entender conceptos más complejos, que a su vez se articulan en aplicaciones de ingeniería.  
Así como en un principio se entendió el proceso lector como un proceso bottom-up, en los ochenta se comenzaron a encontrar mejoras al comprenderlo como un proceso top-down y posteriormente a principios de los noventa aumentaron los argumentos a favor del carácter complementario de ambos procesos, la idea es apuntar a entender la enseñanza de la ingeniería como un proceso complementario. 


  • ¿Problemas legales?

    Si se sigue un proceso de ingeniería inversa bien establecido no tiene porque haber ningún problema legal; esto implica cumplir al pie de la letra el objetivo de la ingeniería inversa: obtener un producto que haga lo mismo pero que sea nuevo, que no aplique los mismos principios de funcionamiento del producto analizado; es decir, la ingeniería inversa se debe utilizar solamente para conocer un producto, con el fin de hacer uno que haga lo mismo pero de otro modo.

jueves, 28 de abril de 2016

Medir el periodo de un péndulo con S4A y Arduino.


Medir el periodo de un péndulo con S4A y Arduino.
Hoy vamos a hacer un circuito en nuestro Arduino para medir el periodo de oscilación con un receptor y un emisor IR, el programa en S4A será el encargado de calcular el periodo del péndulo, como podemos ver en el siguiente vídeo.
Para medir el periodo colocaremos el péndulo de forma que la lenteja pase entre el emisor y el receptor IR en el punto más bajo del recorrido, y calculando los tiempos en los que la lenteja del péndulo corta la comunicación entre emisor y receptor sabremos el tiempo que le ha costado un ciclo completo.
En el circuito incluimos un led que estará encendido mientras contamos el tiempo del ciclo.
Componentes:
§  Placa Arduino
§  Placa prototipos
§  Emisor IR
§  Receptor IR
§  Led
§  Resistencias de 10KΩ y 270Ω


En nuestro caso, el emisor y el receptor infrarrojo son muy parecidos a los leds, el de color obscuro es el emisor y el transparente es el receptor.

Conexión de los componentes IR.
La polaridad del emisor es similar a la de los led, se conecta con una resistencia pequeña (270Ω) con la pata más larga conectada a los 5V y la más corta hacia tierra.

En el receptor la polaridad es la contraria, con la pata más larga hacia tierra y la más corta hacia los 5V.
En el circuito, el receptor se comportará como un interruptor, por lo tanto colocaremos una resistencia grande (10kΩ) entre la pata larga y tierra a modo de Pull down.

El punto de conexión a la placa arduino será la unión entre el receptor IR y la resistencia de 10kΩ que ira conectado a la entrada Analog 6.
Funcionamiento del montaje
Desplazamos la lenteja del péndulo hacia uno de los lados y la soltamos, al pasar la lenteja entre el emisor y receptor producirá el primer corte de señal (en este momento encenderá el led), en ese momento usaremos la sentencia reiniciar cronómetro para que Scratch empiece a contar el tiempo.
El péndulo llegará al otro extremo y volverá hacia el punto más bajo y cuando llegue volverá a cortar la señal (en este momento ha pasado medio periodo) continuará hacia el desplazamiento inicial y volverá hacia el punto central.
Cuando llegue al punto central cortará la señal por tercera vez (en este punto ha realizado un ciclo completo), en este momento se apagará el led y se asignará el tiempo que marque el cronómetro de scratch a la variable tiempo. Esta es la variable que se muestra en pantalla.

Código S4A
El programa empieza apagando el led y espera hasta que el sensor (puerto Analog6) indique que recibe señal del emisor IR.
Esto ocurre al desplazar la lenteja del péndulo desde la posición de reposo.

A continuación, cuando el péndulo se suelta pasará por la posición más baja cortando la señal, el programa espera este momento (el valor del sensor < 600) como el inicio del periodo así que reincida el cronómetro y enciende el led.
Ahora vienen la serie de esperas (instrucción esperar hasta que):
§  La primera es hasta que la señal vuelve a recibirse (el péndulo sale del sensor)
§  La segunda cuando el péndulo vuelve a cortar la señal, esta vez pasa por el mismo sitio pero en sentido contrario.
§  La tercera cuando el sensor vuelve a recibir señal, el péndulo sale del sensor.
§  La cuarta cuando se vuelve a cortar la señal, el péndulo está en la misma posición que al empezar a contar el tiempo y va en el mismo sentido, ha pasado un periodo.

En este corte de señal se apaga el led y se asigna el valor del cronómetro a la variable tiempo que es la que se muestra en la pantalla!

domingo, 24 de abril de 2016

martes, 23 de febrero de 2016

SEMÁFORO CON EL SISTEMA ARDUINO


 

Estructura básica de los códigos


Un código Arduino es una serie de comandos de programación que le dirán a nuestro microcontrolador como configurarse al iniciarse y qué acciones tiene que realizar mientras esté en funcionamiento. Estos comandos utilizados en Arduino son sentencias muy fáciles e intuitivas.
El bloque de código debe tener 2 partes, o funciones principales, que siempre debemos incluir.
 
Ilustración 1 Partes básicas de un código
Primero void setup() . Dentro de esta función principal escribiremos las sentencias de configuración que necesitaremos para que Arduino trabaje correctamente. Éstas se ejecutarán al iniciar Arduino y una única vez. Con ellas, por ejemplo, asignaremos la característica de entrada/salida a los pines, el modo de comunicación serial, activaremos los sensores que vayamos a necesitar, escribiremos órdenes de inicio del programa…etc. Algunas de estas sentencias pueden ser: pinMode( , ), Serial.begin(), sensors.begin()…
La segunda función principal es void loop() . Ésta debe ir siempre después de void setup(). En ella escribiremos todas las sentencias, bucles y llamadas a funciones que necesitemos que nuestro Arduino repita constantemente. Se escribirán en orden de ejecución. Ejemplo de éstas pueden ser digitalWrite( , ), Serial.print(“ “), if( )…
Existen otras partes del código que no son obligatorias  pero que podemos necesitar, según el código lo requiera, para organizarlo todo.
Estas zonas pueden ser un espacio para el título, el autor, librerías, definiciones (variables que vayamos a usar en el programa), una zona para funciones a las que el programa irá llamando…Cada uno es libre de organizarlo como quiera, pero cuanto más ordenado esté todo, más difícil será perdernos cuando los códigos se compliquen.
Abajo podemos ver un ejemplo simple de cómo debe estructurarse un código.
 
Ilustración 2 Como debe estructurarse un código

Sentencias básicas, funciones y librerías


Para poder realizar un código Arduino debemos tener las herramientas con las que decirle a nuestro microcontrolador que es lo que debe hacer en cada momento. Estas herramientas son las sentencias y funciones.
Arduino usa una serie de sentencias y comandos básicos muy sencillitos pero a la vez muy potentes. Combinándolos crearemos programas para decirle a nuestra placa que haga prácticamente cualquier cosa que queramos.
Las sentencias se dividen por su manera de funcionar dentro del programa, pudiendo dividirlas en 3 grades grupos:
  • Estructurales: Nos dan la forma computacional del código y las operaciones lógicas a ejecutar. Con éstos son con los que le marcamos al programa qué camino debe seguir el código al ejecutarse y qué operaciones debe hacer. Algún ejemplo de las más usadas son if, for, while, +, -, =, *, /, ==, >, < …
  • Variables: Con éstas definiremos qué tipo y qué características tendrán los valores que vamos a usar en el código. Pueden ser números, caracteres o estados. Podemos encontrarnos aquí las sentencias int, float, HIGH, LOW, char, string, true, false…
  • Funciones: Nos permiten realizar una serie de operaciones concretas y volver a la zona del código en la que se ejecutó. Existen funciones que están propiamente definidas ya por Arduino como tales y también podemos crearnos nuestras propias funciones para que sean llamadas en las zonas de setup o loop cuando lo necesitemos. Son muy útiles cuando necesitamos realizar un grupo de acciones varias veces en distintas zonas del código. También es una buena forma de ahorrar líneas y de organizarse. Ejemplo de funciones tenemos pinMode, digitalWrite, delay, max, sin, cos, analogWrite…
Como explicar qué acción concreta realiza cada sentencia o función sería muy extenso, os dejamos este enlacepara que podáis consultarlos. Nosotros iremos comentando todos los que vayamos usando en nuestros ejemplos.
Otra cosa importante son las librerías. Son una serie de sentencias y funciones específicas de cada elemento o shield que conectemos a Arduino, que no están dentro de las propias de la IDE, y que realizarán acciones específicas de cada uno facilitándonos mucho la programación.
Por último nombraremos un par de pequeños detalles necesarios para poder programar nuestro código. Para que cada sentencia o función se ejecute debe llevar al final de cada orden el signo de puntuación punto y coma “ ; “ y al utilizar la doble barra “ // ” le decimos al código que lo que se escriba a la derecha es un comentario y que no debe ejecutarlo (Arduino lo coloreará en gris). Esto veréis que es muy útil para explicar que estamos haciendo en cada momento.

Compilación y carga.


Una vez que hayamos escrito nuestro código en la IDE Arduino procederemos a verificar que está correctamente escrito. Para ello pulsamos el botón   arriba a la izquierda. Arduino leerá el texto y nos dirá si es correcto o no. Para ello lo que hará será compilarlo, que significa traducir el código del lenguaje de programación a un lenguaje que entienda el microcontrolador directamente.
En el caso de contener un error nos aparecerá en la consola una explicación orientativa del error. (Ilustración 5)

Ilustración 3 Verificando el código



Ilustración 4 Código correcto



Ilustración 5 Error en el código. Falta un ";"


Si la compilación ha sido correcta, ya podremos cargar nuestro programa al Arduino. Para ello, con la placa conectada por USB, pulsamos el botón de carga   y esperamos a que termine.
Ilustración 6 Carga de programa terminada 

Ejemplo: Semáforo

Como primer proyecto, realizaremos un semáforo con unos Leds. Es ideal para iniciarnos en la programación y el montaje de circuitos porque, como veréis, es muy fácil.
Empezaremos nuestro primer proyecto describiendo los elementos que vamos a necesitar.

  • 1 x Arduino UNO R3
  • 1 x Protoboard
  • 1 x Led rojo 3mm
  • 1 x Led amarillo 3mm
  • 1 x Led verde 3mm
  • 3 x resistencias de 220Ω.
  • Cables para conectar todo.
Una vez que tenemos todo, hacemos nuestro montaje siguiendo el siguiente esquema.
Ilustración 7 Esquema de montaje del semáforo


Utilizaremos los pines digitales (rojo), (amarillo) y (verde). Al conectar los Leds debéis tener en cuenta que tienen polaridad, por lo que tenéis que colocarlos bien para que funcionen. En los Leds la patilla corta, o el lado que está achatado, es el negativo e irá conectado a tierra (GND en la placa) a través de una resistencia. La patilla larga, o lado redondeado, es el positivo y se conectará al pin del Arduino correspondiente.

Ilustración 8 Protoboard del proyecto semáforo
Una vez montado, abriremos nuestro IDE Arduino y escribiremos el programa (sketch).
/*************/
/*  SEMAFORO */
/*************/

/*** Fernando Martinez Mendoza ***/

//** Definiciones **//
int rojo=2;      //definimos el valor del pin para el led rojo
int amarillo=4;  //definimos el valor del pin para el led amarillo
int verde=7;     //definimos el valor del pin para el led verde

//** Programa **//

void setup() {
  pinMode(verde,OUTPUT);   //declaramos el pin verde como salida  
  pinMode(amarillo,OUTPUT);//declaramos el pin amarillo como salida
  pinMode(rojo,OUTPUT);    //declaramos el pin rojo como salida  
}

void loop() {
 digitalWrite(verde,HIGH); //encendemos el led rojo
 delay(2000);             //esperamos 2 segundos
 digitalWrite(verde,LOW);  //apagamos el led rojo
 delay(500);              //esperamos medio segundo
 
 digitalWrite(amarillo,HIGH); //encendemos el led amarillo
 delay(2000);                 //esperamos 2 segundos
 digitalWrite(amarillo,LOW);  //apagamos el led amarillo
 delay(500);                  //esperamos medio segundo
 
 digitalWrite(rojo,HIGH); //encendemos el led verde
 delay(2000);              //esperamos 2 segundos
 digitalWrite(rojo,LOW);  //apagamos el led verde
 delay(500);               //esperamos medio segundo
}

Con la sentencia int estamos declarando una variable numérica entera, para poderla usar después en nuestro código.
El comando delay hace que el programa pare un tiempo determinado. Éste lo definiremos, en milisegundos, dentro de los paréntesis.
Las funciones pinMode y digitalWrite se explicarán en el siguiente post, salidas, con detalle.

Espero que os hayáis divertido con este post y que comencéis a cogerle el gusanillo al mundo del Arduino.