- See more at: http://coquitoblogger.blogspot.com.co/2011/06/bonito-rotador-de-imagenes-automatico.html#sthash.eF1YM9nj.dpuf
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.
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 dePull
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!
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 2 (rojo), 4 (amarillo) y 7 (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 *//*************//*** FernandoMartinezMendoza ***///** Definiciones **//int rojo=2; //definimos el valor del pin para el led rojoint amarillo=4; //definimos el valor del pin para el led amarilloint 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.