Páginas

martes, 22 de mayo de 2012

[Emb Comp Class] ARDUINO: Proyecto Final

Control de la Instalación Eléctrica y Medidor del Consumo Eléctrico

Material


General
  • Arduino UNO con su cable USB
  • Protoboard
  • Cables Jumper para las conexiones
  • Cable de cobre delgado para realizar las conexiones en la protoboard

Para el control de la instalación eléctrica
  • 5 Resistencias 330 Ohms
  • 4 push buttons
  • 2 leds blancos de alta luminosidad
  • 2 Relevadores compatibles con Arduino [instrucciones de armado: AQUI]
  • Contacto Duplex con tierra física, cubierta y caja protectora
  • Extensión eléctrica o cable de cobre
  • Lamparita de noche o cualquier otro dispositivo electrico para probar.

Para el sistema de medición (REFERENCIA How to build an Arduino Energy Monitor)
  • Arduino Ethernet Shield
  • Para la medición del voltaje
    • Transformador de corriente alterna 120V - 9V (o un adaptador de corriente AC-AC con salida de 9V)
    • 1 resistencia de 100 KOhms
    • 2 resistencias de 10 KOhms
    • 1 capacitor de 10 uF
  • Para la medición de la corriente
    • Sensor CT SCT-013-000
    • Burden Resistor (resistencia de 33 Ohms)
    • 2 resistencias de 10 KOhms
    • 1 capacitor de 10 uF
    • 1 jack 3.5mm hembra

Advertencias y consideraciones previas

  • Se trabajara con corriente alterna, se recomienda utilizar no conectar ningun componente a la misma hasta terminar el armado
  • Es importante tener un multimetro a la mano, nos ayudara a realizar correctamente nuestras conexiones y verificar que funcionen correctamente antes de conectarlas a la corriente alterna.

Armado para la el control de la instalación eléctrica


Vamos primero con lo mas simple, armemos el contacto duplex de tal forma que simulemos la instalación eléctrica de la casa, es algo complejo explicarlo, pero es algo básico y super fácil que todos podemos hacer, así que mejor les dejo un esquema:

Y estas son las fotos de como yo arme mi contacto duplex



Por si no recuerdan como conectar correctamente los relevadores, aqui les dejo las entradas y salidas correspondientes.

Para las entradas del relevador (son 3 inputs)


  • Arduino 5V: Es la salida regulada (5V) que nos proporciona nuestro Arduino
  • Arduino Digital Out: Esta conectada al pin desde el cual enviaremos la señal
  • Arduino GND: Es la tierra (GND) que proporciona nuestro Arduino


Para las entradas del relevador de corriente alterna:



  • AC/DC Input: Es el cable ya sea de corriente alterna o directa de donde entra el voltaje
  • Sin usar: Por seguridad para cuando usemos corriente alterna, se deja sin usar para separar la corriente y evitar un arco y provocar algun corto circuito
  • AC/DC Output: Es el cable por el que continuara circulando la corriente una vez que el relevador cierre el circuito

Después hay que conectar nuestros relevadores al arduino, para ello prepare el siguiente esquema en Fritzing:



Armado para la el control de la iluminación


Ahora continuamos con el control de la iluminación, para ello utilizaremos 2 entradas, una para aumentar la luminosidad de los leds y otra para bajarla; además de una salida regulada. Esquema en fritzing:



La idea es combinar ambos sistemas, para tener todo en uno solo, así se ven ambos sistemas conectados:


Armado para la el sistema de medición


Primero preparamos las conexiones en nuestro protoboard siguiendo el esquema que les adjunto:

Tomado de OpenEnergyMonitor URL=http://openenergymonitor.org/emon/buildingblocks/how-to-build-an-arduino-energy-monitor


Tomado de OpenEnergyMonitor URL=http://openenergymonitor.org/emon/buildingblocks/measuring-voltage-with-an-acac-power-adapter


Conectaremos la entrada de nuestro transformador a la corriente alterna y la salida (9V-300mA) a la protoboard,



Tomado de OpenEnergyMonitor URL=http://openenergymonitor.org/emon/buildingblocks/ct-sensors-interface


Para conectar el CT a la protoboard utilizaremos un jack 3.5mm hembra, conectaremos solamente el positivo (cabeza o tap) y la tierra (brazo o sleeve).



Con esto vamos a construir un monitor de energía electrica simple que se puede utilizar para medir la cantidad de energía eléctrica que utiliza en una casa. Se mide la tensión con el transformador 120V-9V y la corriente con el sensor CT.

El monitor de energía se puede calcular la potencia real, potencia aparente, factor de potencia, voltaje rms, corriente eficaz. Todos los cálculos se hacen en el Arduino.

Los datos son enviados al servidor por medio de un shield Arduino Ethernet y son recogidos para su posterior procesamiento.

OpenEnergyMonitor es el proyecto en el que base, valga la redundancia, mi proyecto. OpenEnergyMonitor se compone de diversos módulos, en este caso el hardware EmonTX, para el Arduino la librería que realiza los cálculos EmonLib, y un servidor que se encarga de graficar los datos de salida del Arduino EmonCMS

Toda la teoría la podemos encontrar en esta página: http://openenergymonitor.org/emon/buildingblocks.
En ella se explican de forma bastante detallada los conceptos necesarios para comprender el funcionamiento del monitor de energía.

Este es todo el circuito, los 3 modulos montados en la protoboard



Código

Video





Referencias

martes, 8 de mayo de 2012

[MDE Lab] ANDROID: Tabs

Para una primera parte del proyecto decidí hacer una barra de Tabs para elegir entre los 2 posibles módulos que el usuario tiene al momento de ejecutar mi aplicación, entonces, después de mucho intentar ahora les mostraré como realizar esta tarea.

1. Creamos un proyecto en Eclipse


Abrimos Eclipse y creamos un nuevo proyecto Android:


Despues introducimos el nombre de nuestro proyecto y damos siguiente, este se llamara TabTuto, damos click en next.


A continuacion elegimos la API de Android con la cual trabajaremos, en mi caso elijo la API 2.3.3 que es compatible con mi celular, damos clic en next.


Por ultimo agregamos la informacion de nuestra aplicacion


2. Creamos las Tabs


Cada tab necesita su clase independiente, entonces necesitamos crear archivos .java diferentes para cada tab y necesitamos crear tantos archivos como tabs queremos tener.
Entonces, para crear las tabs, tenemos que crear nuevas clases:


Y le ponemos un nombre, en este caso las pondré numeradas, es decir Tab1, Tab2, ..., TabN


Y este es el código que debemos colocar a cada clase que hemos creado para cada Tab, cuidando por supuesto cambiar el nombre para las clases de las Tabs. Cada tab es una actividad, es decir, una ventanita individual en el teléfono. Como es una prueba lo único que agregaremos a la ventana sera un TextView.



Lo siguiente es agregar las actividades de cada Tab al archivo AndroidManifest.xml, como son 3 Tabs entonces agregamos 3 actividades.



3. Creamos el contenedor de las Tabs


En el archivo principal del código, vamos a teclear el siguiente código, con el agregaremos las Tabs al contenedor de la ventana principal.



Y por ultimo, pero no menos importante, debemos configurar el main.xml para que se muestren las tabs correctamente en nuestra ventana principal. Convertimos la ventana en un TabHost y le agregamos un LinearLayout vertical para acomodar nuestras tabs con el mismo tamaño y hacia la derecha. Agregamos el Widget de las tabs y cada tab contiene un FrameLayout para mostrar su contenido.



4. Prueba

Solo nos queda probar nuestro codigo, en las barras de herramientas damos clic en el boton Run As... y en la ventana emergente seleccionamos la opcion Android Application, con ello se abrira nuestro emulador de Android.



Y este debe ser nuestro resultado final.



Espero les haya servido el minitutorial, saludos :)

Referencias

Android Developer: TabWidget

[Emb Comb Lab] ARDUINO: Trabajando con relevadores

Material

  • Relevador RAS-0510
  • Diodo 1N4007
  • Transistor 2N2222A
  • Resistencia 10KOhms
  • Terminales para circuito con 3 entradas
  • Placa fenólica pequeña para realizar las conexiones (opcional)
  • Cable de cobre calibre 14 (opcional)

Advertencias y consideraciones previas

  • El relevador que vamos a utilizar es capaz de trabajar con corrientes y voltajes altos, es muy util para controlar la instalación eléctrica, que es lo que queremos hacer. También puede trabajar con corrientes directas, útil para controlar circuitos en proyectos pequeños
  • El cable de cobre es opcional también, yo lo usaré porque trabajare con corriente alterna.
  • La placa fenólica es opcional, pueden hacer su propia placa impresa.
  • Se puede utilizar una protoboard en caso de querer utilizar el relevador para corriente directa.
  • No es recomendable utilizar una protoboard si se quiere utilizar el relevador para corrientes alternas.


Armado

Para armar el relevador, vamos a seguir el siguiente esquemático:



El relevador tiene 5 patitas, con el podemos controlar 2 estados diferentes para un circuito en lugar de solo prenderlo y apagarlo. Podemos medir la continuidad de las patitas utilizando un multímetro.



La posición natural del relevador es tener el circuito cerrado conectando la patita 4 y 3, es decir, que si giramos el relevador con las patitas arriba y después ubicamos 3 de las patitas en la parte inferior y 2 en la superior podremos ver que la patita 3 corresponde a la que queda en la parte superior derecha.

Esta sera nuestra posición de apagado.

La posición de encendido sera cuando el circuito este cerrado con las patitas 4 y 5, que si giramos el relevador igual que antes la patita 5 sera la que se encuentra en la parte superior izquierda.

Esta posición sera para cerrar el circuito que queremos controlar.

Las terminales para circuito son opcionales, a mi se me hace una forma bastante cómoda para cablear, en mi caso, las terminales las conecte asi:

Para las entradas del relevador (3)


  • Arduino 5V: Es la salida regulada (5V) que nos proporciona nuestro Arduino
  • Arduino Digital Out: Esta conectada al pin desde el cual enviaremos la señal
  • Arduino GND: Es la tierra (GND) que proporciona nuestro Arduino


Para las salidas del relevador (2)



  • AC/DC Input: Es el cable ya sea de corriente alterna o directa de donde entra el voltaje
  • Sin usar: Por seguridad para cuando usemos corriente alterna, se deja sin usar para separar la corriente y evitar un arco y provocar algun corto circuito
  • AC/DC Output: Es el cable por el que continuara circulando la corriente una vez que el relevador cierre el circuito


Este es el circuito ya armado.



Pruebas con Arduino


Para las pruebas hice un sketch bastante simple que solo envía una señal desde el PIN 13, cierra el circuito del relay, espera 3 segundos, abre el circuito, espera 3 segundos.

Video





Espero que les haya sido util la entrada, el Relay Shield compatible con Arduino de Sparkfun cuesta aproximadamente $8 USD + envió, nuestro Relay también es 100% compatible y la inversión fue de aproximadamente $50 pesos MXN, la mitad :)

Referencias

jueves, 3 de mayo de 2012

[Emb Comb Lab] Juego con Stars Wars The Force Trainer

Para la competencia del iPad tuvimos que desarrollar un juego utilizando este dispositivo. Para ello habia que hackear el MindReader y despues interfacear el mismo al Arduino.

Este es el tutorial hecho por el compañero Saul para lograr dicho objetivo:

LINK: Como hacer un hack a un dispositivo EEG con Arduino

Preparación


Primero que nada hay que instalar la IDE de Arduino, aqui un minitutorial hecho por mi

LINK: Programando con Arduino

Después hay que instalar la librería Brain, los pasos son sencillos:
  • 1. Descargar la libreria de aquí: Arduino Brain Library
  • 2. Descomprimimos y la agregamos a la carpeta libraries en la carpeta de Arduino, en mi caso el path es:


    Y ya dentro:


Esto nos permitirá exportar la libreria y utilizar el ejemplo BrainSerialOut que viene en la IDE de Arduino, lo encontramos así:


Así se ve el sketch, si se fijan en la función loop comente la línea Serial.println(brain.readErrors()); , esto es para que no nos regrese ninguna otra información que no sean los datos que nos interesan del MindReader.


Ahora simplemente lo compilamos y lo subimos a nuestro Arduino conectado al MindReader, con el botón UPLOAD

Yo usé Python para el juego, entonces, para escuchar los datos enviados por Arduino debemos instalar pySerial, los pasos son ultra sencillos:

El juego


El juego lo llame Magic Warriors!.


El objetivo del juego es sencillo, se trata de algo parecido a hacer Genkidamas. Según tu nivel de concentración es la cantidad de energía que se agrega a la Genkidama, asi pues, de todos los datos que me da el MindReader solo me quedo con dos que son atención y meditación; dichos valores se suman y se saca un promedio, el promedio es la energía que se agrega cada segundo a la Genkidama. Básicamente son sumas, del valor anterior mas el nuevo valor durante un tiempo determinado que son 5 segundos.

Por el lado de la CPU, es una simple sumatoria que se realiza mediante números random, que, según la dificultad, son obtenidos dentro de determinado rango. Entre mayor es el nivel el rango es más ajustad y se mueve hacia valores más altos.

El ganador se selecciona comparando quién acumulo la mayor cantidad de energía, una comparación entre tu sumatoria final y la del CPU.


Código relevante



El juego fue desarrollado utilizando pygame, la temática es simple, y como ven el cálculo que realiza es super sencillo, entonces, veamos algunas partes relevantes del código desarrollado.

Escuchando al Arduino



Jugador y Enemigo



La Batalla!!



Lo demas ya son funciones propias de python para interconectar clases, enviar variables y bueno, los métodos obligados de PyGame para la asignación de teclas y demás. Por ultimo, les dejo las librerías que utilice por si a alguien le interesa.



Espero que les guste, lo que falta es obviamente lo gráfico en en 6 horas fue imposible de terminar, adicional quise agregar algo de interactividad con OpenCV, NADA DE TECLAS!!, quería hacer que el juego se controlara con movimientos en la webcam, hacer un movimiento con el brazo para avanzar entre pantallas y levantar los brazos como si realmente estuvieras haciendo la Genkidama para recargar energía, pero bueno, eso era mas complejo, y ademas quería imprimir los valores del EEG en todo momento pero igual, por falta de tiempo no pude instalar las dependencias y demás.

Sin embargo, me divertí mucho haciéndolo y deseo terminarlo un día de estos, comprar mi EEG y todo el rollo porque realmente estuvo genial.

Bueno, esa fue mi idea en la competencia, espero les haya gustado :)

domingo, 22 de abril de 2012

[MDE Lab] Accesibilidad y Usabilidad

Una de las grandes preocupaciones de las empresas que desarrollan tecnología es la usabilidad. En la actualidad se destina una inversión importante para cubrir este rubro y parece que se esta logrando bien. Sin embargo, los dispositivos móviles, debido a su reducido tamaño, son un reto ya que muchas veces no es posible montar en ellos todos los perifericos que en una PC si es posible. Entonces, ¿qué consideraciones se pueden tomar al momento de hablar de usabilidad y accesibilidad en dispositivos móviles?


Conceptos


Usabilidad

Todo objeto y dispositivo que es creado tiene una funcionalidad, por otra parte, también existe un componente que es la manera a traves de la cual los usuarios acceden a esa funcionalidad. La usabilidad estudia este componente.
Existen varios conceptos involucrados dentro de la usabilidad:
  • Efectividad: Es la precisión y la plenitud con las que los usuarios alcanzan los objetivos especificados. A esta idea van asociadas la facilidad de aprendizaje (en la medida en que este sea lo más amplio y profundo posible), la tasa de errores del sistema y la facilidad del sistema para ser recordado (que no se olviden las funcionalidades ni sus procedimientos).
  • Eficiencia: Los recursos empleados en relación con la precisión y plenitud con que los usuarios alcanzan los objetivos especificados. A esta idea van asociadas la facilidad de aprendizaje (en tanto que supone un coste en tiempo; igualmente, si se requiere un acceso continuo a los mecanismos de ayuda del sistema), la tasa de errores del sistema y la facilidad del sistema para ser recordado (una asimilación inapropiada puede traducirse en errores de usuario).
  • Satisfacción: El nivel de ausencia de incomodidad y la actitud positiva en el uso del producto. Se trata, pues, de un factor subjetivo.
La usabilidad, hace referencia, a la rapidez y facilidad con que las personas llevan cabo sus tareas propias a través del uso del producto objeto de interés, idea que descansa en cuatro puntos:
  • Usabilidad significa enfocarse en los usuarios. Para desarrollar un producto usable, se tienen que conocer, entender y trabajar con las personas que representan a los usuarios actuales o potenciales del producto.
  • Las personas utilizan los productos para incrementar su propia productividad. Un producto se considera fácil de aprender y usar en términos del tiempo que toma el usuario para llevar a cabo su objetivo, el número de pasos que tiene que realizar para ello, y el éxito que tiene en predecir la acción apropiada para llevar a cabo.
  • Los usuarios son gente ocupada intentando llevar a cabo una tarea. Se va a relacionar usabilidad con productividad y calidad. El hardware y el software son las herramientas que ayudan a la gente ocupada a realizar su trabajo y a disfrutar de su ocio.
  • Son los usuarios, y no los diseñadores y los desarrolladores, los que determinan cuando un producto es fácil de usar.

Usabilidad en dispositivos móviles


Aspecto Físico

Uno de las limitantes mas grandes es el tamaño de un dispositivo móvil y el espacio que hay para colocar los objetos. En el se englobal varios aspectos:
  • Tamaño de la Pantalla: Participantes con pantallas de mayor resolución y tamaño realizan mas eficientemente sus tareas con una rapidez también mayor. Los usuarios con pantallas reducidas tienden a gastar más tiempo localizando información, navegando a través de la interfaz. Se recomienda entonces englobar de mejor manera la información en menos pantallas, reduciendo la cantidad de clicks y desplazamientos que el usuario necesita realizar, asi como incluir opciones de búsqueda.
  • Tamaño del Texto: Lo suficientemente grande, es altamente recomendado incluir opciones de zoom.
  • Tamaño de los controles: La entrada de datos y el control de interfaces ha sido uno de los problemas mejor atacados. En las pantallas táctiles, los botones han de lo suficientemente grandes para evitar que el usuario toque accidentalmente otras opciones. Asi pues, el uso de gestos táctiles han eliminado de la pantalla gran cantidad de controles.


Movilidad

Los usuarios con un dispositivo móvil realizan sus actividades en todas partesm caminando por la calle, manejando un automóvil, sentados, en el transporte público, o esperando en un restaurante; y a su vez, interactuando con muchas personas y demas etímulos.


La aplicación debe vencer esos estímulos, asi como el constante movimiento de las personas y de vehículos alrededor, además de las interacciones con otras personas. También, ya que la aplicación corre en una pantalla pequeña, cuenta con un impacto visual menor, y es más difícil atraer la atención a los usuarios que con una computadora o laptop.

Una sola mano

Los usuarios estarán realizando varias actividades que requieren su atención, pero también el uso de una mano. Por ejemplo si una persona esta tomando alguna bebida, cargando bolsas, etc. Usar una aplicación móvil con una sola mano y si la persona descubre que no es posible usar dicha aplicación en ese caso, lo que puede impedir que la usen hasta que tengan total atención en ella.
Por lo tanto, la operación de las aplicaciones usando una sola mano es una consideración mayor para las aplicaciones móviles.


Accesibilidad



El concepto de Accesibilidad hace referencia al conjunto de características que debe presentar un entorno, producto o servicio para ser utilizable en condiciones de confort, seguridad e igualdad por todas las personas y, en particular, por aquellas que tienen alguna discapacidad .

Aquí se intentan atacar 3 frentes principales
  • Visión: Esta discapacidad puede ir desde un fallo visual hasta una perdida total de la visión, en cualquier caso no se permite el aprovachamiento completo del dispositivo. 
    Otro problema es que algunas personas con esta discapacidad no pueden distinguir algunos colores o combinaciones de colores.
  • Audición: Los problemas de audición pueden presentarse levemente, parcialmente o sordera total. 
    En el caso de dispositivos móviles el uso de imágenes, metáforas y diagramas es de gran utilidad, así como la posibilidad de incluir vídeos.
  • Movilidad: Abarca los problemas de coordinación o manipulación lo cual hace que se dificulte o se impida la utilización de los objetos. Esta discapacidad puede ir desde una falta de un miembro hasta problemas nerviosos que afectan a estos mismos.
  • Edad Avanzada: Son uno de los frentes mas importantes para las empresas y por lo general son las personas mas renuentes a utilizar la tecnología debido a la dificultad que les puede llevar. Además se juntan problemas visuales, auditivos y motores.

Herraminientas

Discapacidad Auditiva
  • Lazo de inducción: Se trata de un filtro de ruidos para evitar las interferencias electromagnéticas, que en combinación con los audífonos, pueden resultar muy molestas a la hora de mantener una conversación.
  • Alertas visuales y por vibrador para indicar que se está recibiendo una llamada o un mensaje de texto.
  • Vídeollamadas para que personas con falta total de audición puedan comunicarse a través del lenguaje de signos.

Discapacidad Visual
  • Narradores de voz
  • Teclados con marcas sensibles al tacto para guiar al usuario.
  • Señales sonoras para todas las acciones, incluyendo la narración de todas las teclas que se pulsan.
  • Pantalla retroiluminada
  • Comandos de voz.
  • Tonos de llamada diferentes para cada contacto
  • Ajustes en el contraste de la pantalla y el tamaño de las fuentes.

Movilidad Reducida
  • Comandos de voz para activar las funciones más habituales como llamar o recibir llamadas.
  • Atajos de teclado.
  • Botones periféricos con comandos programados.
  • La función “manos libres”.
  • Predicción de texto al escribir para reducir las pulsaciones necesarias.
  • La función de responder con cualquier tecla.

Edad Avanzada
  • Tamaño de teléfono adecuado para facilitar la manipulación
  • Menú gráfico, con iconos fáciles de comprender
  • Asociación de imágenes a los contactos
  • Buen contraste entre caracteres y fondo de tecla
  • Ademas, se pueden aplicar las consideraciones de los problemas visuales, auditivos y motrices


Referencias

[Emb Comb Lab] Programando en Arduino

Bueno, en esta entrada tratare de abarcar un poco sobre la programación en Arduino.

Entorno de desarrollo


Para programar en Arduino es necesario descargar el entorno de desarrollo (IDE). Hay versiones para Windows, MAC y LINUX.

En mi caso, descargue la versión para Linux 64bits. No es necesario compilar simplemente seguimos estos pasos:
  1. Instalar librerias:
    sudo apt-get install gcc-avr avr-libc
  2. Vamos a la pagina oficial de Arduino y descargamos la versión necesitemos. Enlace: Arduino Software
  3. Una vez que la descargamos simplemente la descomprimirmos.
  4. Desde la terminal, nos ubicamos en la carpeta que acabamos de descomprimir y corremos el archivo arduino, se vera algo asi:
  5. ... y a su vez se iniciara el entorno gráfico:
Lo primero que tenemos que hacer para comenzar a trabajar con el entorno de desarrollo de arduino es configurar las comunicaciones entre la placa Arduino y el PC. Para ello deberemos abrir en el menú "Tools" la opción "Serial Port". En esta opción deberemos seleccionar el puerto serie al que está conectado nuestro Arduino.

Para verificar que lo hemos hecho bien, podemos probar alguno de los ejemplos incluidos, utilizaremos el ejemplo Blink: FILE > EXAMPLES > 1.Basics > Blink
El ejemplo "Blink" lo único que hace es parpadear un LED que está colocado en el pin número 13 de la placa. Lo que hay que hacer para subir el programa a la placa Arduino, primero comprobamos que el código fuente es el correcto con el botón "Verify". Si todo va bien deberá aparecer un mensaje en la parte inferior de la interfaz indicando "Done compiling". Una vez que el código ha sido verificado procederemos a cargarlo en la placa. Para ello tenemos que pulsar el botón de reset de la placa e inmediatamente después pulsar el botón que comienza la carga.


El código


La estructura básica de programación de Arduino es bastante simple y divide la ejecución en dos partes: setup y loop.

Setup() constituye la preparación del programa y loop() es la ejecución.

En la función Setup() se incluye la declaración de variables y se trata de la primera función que se ejecuta en el programa.
Esta función se ejecuta una única vez y es empleada para configurar el pinMode (p. ej. si un determinado pin digital es de entrada o salida) e inicializar la comunicación serie. La función loop() incluye el código a ser ejecutado continuamente (leyendo las entradas de la placa, salidas, etc.).
void setup() { 
   inMode(pin, OUTPUT);  // Establece 'pin' como salida 
} 
void loop() {
   digitalWrite(pin, HIGH); // Activa 'pin'
   delay(1000);   // Pausa un segundo 
   digitalWrite(pin, LOW);  // Desactiva 'pin'
   delay(1000);
}
Cada instrucción acaba con ; y los comentarios se indican con //. Al igual que en C se pueden introducir bloques de comentarios con /* ... */.

Caracteristicas del Código



Tipos de Datos

Arduino permite manejar los siguientes tipos de datos:
  • Byte: Almacena un valor numérico de 8 bits. Tienen un rango de 0-255.
  • Int: Almacena un valor entero de 16 bits con un rango de 32,767 a -32,768.
  • Long: Valor entero almacenado en 32 bits con un rango de 2,147,483,647 a -2,147,483,648.
  • Float: Tipo coma flotante almacenado en 32 bits con un rango de 3.4028235E+38 a -3.4028235E+38.
  • Arrays: Se trata de una colección de valores que pueden ser accedidos con un número de índice (el primer valor del índice es 0). Ejemplos:
    • Definición y asignación. int myArray[] = {value0, value1, value2...}
    • Definición. int myArray[5]; // declara un array de 6 enteros
    • Asignación del cuarto componente. myArray[3] = 10;
    • Recuperar el cuarto componente y asignarlo a x. x = myArray[3];


Variables

Una variable debe ser declarada y opcionalmente asignada a un determinado valor. En la declaración de la variable se indica el tipo de datos que almacenará (int, float, long)
int inputVariable = 0; 
Una variable puede ser declarada en el inicio del programa antes de setup(), localmente a una determinada función e incluso dentro de un bloque como pueda ser un bucle. El sitio en el que la variable es declarada determina el ámbito de la misma. Una variable global es aquella que puede ser empleada en cualquier función del programa. Estas variables deben ser declaradas al inicio del programa (antes de la función setup()).
int v;    // 'v' es visible en todo el programa
void setup() { 
   // no se requiere setup 
} 
void loop() { 
   for (int i=0; i<20;) // 'i' es visible solo en el bucle
   i++; 
   float f; // 'f' es visible únicamente en la función loop()
}
Constantes
  • HIGH / LOW: niveles alto y bajo en pines. Los niveles altos son aquellos de 3 voltios o más.
  • INPUT / OUTPUT: entrada o salida
  • true / false


Funciones

Una función es un bloque de código identificado por un nombre y que es ejecutado cuando la función es llamada. La declaración de una función incluye en primer lugar el tipo de datos que devuelve la función (e.j. int si lo que devuelve es un valor entero).
Después del tipo de datos se especifica el nombre de la función. Por ejemplo:
int functionName(int param1, float param2, char param3) { 
   //All the statements
}


Operadores

  • Aritméticos: +, -, *, /, %
  • Asignación: =
  • Operadores de comparación: ==, !=, <, >, <=, >=
  • Operadores Booleanos: &&, ||, !
  • Operadores de acceso a punteros: *, &
  • Operadores de bits: &, |, ^, ~, <<, >>
  • Operadores compuestos:
    • Incremento/decremento de variables: ++, --li
    • Asignación y operación: +=, -=, *=, /=, &=, |=li


Condiciones

IF, IF ELSE, ELSE IF
if (algunaCondicion) {
   // ejecutar si la condicion es verdadera
}
if (algunaCondicion) {
   // ejecutar si la condicion es verdadera
} else {
   // ejecutar si la condicion es falsa
}
if (algunaCondicion) {
   // ejecutar si la condicion es verdadera
} else if (otraCondicion) {
   // ejecutar si la primera y segunda condiciones son verdaderas
}
FOR
for (inicializacion; condicion; incremento) {
   // codigo
}
WHILE
for (inicializacion; condicion; incremento) {
   // codigo
}
DO... WHILE
do {
    // codigo
} while (condicionDePrueba);
SWITCH
switch (variable) {
    case 1:
      // ejecutar cuando la variable sea igual a 1
      break;
    case 2:
      // ejecutar cuando la variable sea igual a 1
      break;
    default: 
      // si ninguna de las anteriores es valida
      // ejecutar este código
      // default es opcional
  }


Entradas y salidas digitales y analógicas


  • Función pinMode(pin, mode): Función usada en la function setup() para configurar un pin dado para comportarse como INPUT o OUTPUT. Ej. pinMode(pin, OUTPUT); configura el pin número 'pin' como de salida. Los pines de Arduino funcionan por defecto como entradas, de forma que no necesitan declararse explícitamente como entradas empleando pinMode().
  • Función digitalRead(pin): Lee el valor desde un pin digital específico. Devuelve un valor HIGH o LOW. El pin puede ser especificado con una variable o una constante (0-13). Ej. v = digitalRead(Pin);
  • Funcion digitalWrite(pin, value): Introduce un nivel alto (HIGH) o bajo (LOW) en el pin digital especificado. De nuevo, el pin puede ser especificado con una variable o una constante 0-13. Ej. digitalWrite(pin, HIGH);
  • Función analogRead(pin): Lee el valor desde el pin analógico especificado con una resolución de 10 bits. Esta función solo funciona en los pines analógicos (0-5). El valor resultante es un entero de 0 a 1023. Los pines analógicos, a diferencia de los digitales no necesitan declararse previamente como INPUT o OUTPUT.
  • Función analogWrite(pin, value): Escribe un valor pseudo-analógico usando modulación por ancho de pulso (PWM) en un pin de salida marcado como PWM. Esta función está activa para los pines 3, 5, 6, 9, 10, 11. Ej analogWrite(pin, v); // escribe 'v' en el 'pin' analógico. Puede especificarse un valor de 0 - 255. Un valor 0 genera 0 V en el pin especificado y 255 genera 5 V. Para valores de 0 a 255, el pin alterna rápidamente entre 0 V y 5 V, cuanto mayor sea el valor, más a menudo el pin se encuentra en HIGH (5 V). Por ejemplo, un valor de 64 será 0 V tres cuartas partes del tiempo y 5 V una cuarta parte. Un valor de 128 será 0 V la mitad del tiempo y 5 V la otra mitad. Un valor de 192 será 0 V una cuarta parte del tiempo y 5 V tres cuartas partes.


Algunas funciones utiles


  • delay(ms): Realiza una pausa en el programa la cantidad de tiempo en milisegundos especificada en el parámetro (máximo 1000, mínimo 1).
  • millis(): Devuelve la cantidad de milisegundos que lleva la placa Arduino ejecutando el programa actual como un valor long unsigned. Después de de 9 horas el contador vuelve a 0.
  • min(x,y). max(x,y): Devuelve el mínimo y el máximo respectivamente de entre sus parámetros.
  • randomSeed(seed): Especifica un valor o semilla como el punto de inicio para la función random(). Este parámetro debe ser realmente aleatorio y para ello puede emplearse la función millis() o incluso analogRead() para leer ruido eléctrico desde una entrada analógica.
  • random(max), random(min, max): Esta función devuelve un valor aleatorio entre el rango especificado.


Funciones del puerto serial


  • Serial.begin(rate): Abre un Puerto serie y especifica la velocidad de transmisión. La velocidad típica para comunicación con el ordenador es de 9600 aunque se pueden soportar otras velocidades.
  • Serial.println(data): Imprime datos al puerto serie seguido por un retorno de línea automático. Este comando tiene la misma forma que Serial.print() pero este último sin el salto de línea al final. Este comando puede emplearse para realizar la depuración de programas. Para ello puede mandarse mensajes de depuración y valores de variables por el puerto serie. Posteriormente, desde el entorno de programación de Arduino, activando el "Serial Monitor" se puede observar el contenido del puerto serie, y, por lo tanto, los mensajes de depuración. Para observar correctamente el contenido del puerto serie se debe tener en cuenta que el "Serial Monitor" y el puerto serie han de estar configurados a la misma velocidad (Para configurar la velocidad del puerto serie se hará con el comando Serial.begin(rate)).
  • Serial.read(): Lee o captura un byte (un caracter) desde el puerto serie. Devuelve -1 si no hay ningún carácter en el puerto serie.
  • Serial.available(): Devuelve el número de caracteres disponibles para leer desde el puerto serie.


Referencia

[Emb Com Lab] Arduino

Basicamente, ARDUINO es una plataforma de desarrollo libre. Esta basada en una placa con un microcontrolador y un entorno de desarrollo, diseñada para facilitar el uso de la electrónica.

El hardware consiste en una placa con un microcontrolador Atmel AVR y puertos de entrada/salida. Los microcontroladores más usados son el Atmega168, Atmega328, Atmega1280, ATmega8 por su sencillez y bajo coste que permiten el desarrollo de múltiples diseños.
Por otro lado el software consiste en un entorno de desarrollo que implementa el lenguaje de programación Processing/Wiring y el cargador de arranque (boot loader) que corre en la placa.

Las placas pueden ser hechas a mano o compradas montadas de fábrica; el software puede ser descargado de forma gratuita.

Componentes



ColormapDescripción
Terminal de referencia analógica
Tierra digital
Terminales digitales 2-13
Terminales digitales 0-1/ E/S serie TX/RX. Estos pines no se pueden utilizar como e/s digitales
Botón de reinicio - S1
Programador serie en circuito "In-circuit Serial Programmer" o "ICSP"
Terminales de entrada analógica 0-5
Terminales de alimentación y tierra
Entrada de alimentación externa (9-12VDC) - X1
Selector de alimentación externa o por USB. En las versiones nuevas de Arduino la selección de alimentacion es automática por lo que puede que no tengas este selector.
USB (utilizado para subir programas a la placa y para comunicaciones serie entre la placa y el ordenador; puede utilizarse como alimentación de la placa)

Microcontroladores Utilizados

IC1 Atmega168 Atmega328 Atmega1280
Voltaje operativo 5 V 5 V 5 V
Voltaje de entrada recomendado 7-12 V 7-12 V 7-12 V
Voltaje de entrada límite 6-20 V 6-20 V 6-20 V
Pines de entrada y salida digital 14 (6 proporcionan PWM) 14 (6 proporcionan PWM) 54 (14 proporcionan PWM)
Pines de entrada analógica 6 6 16
Intensidad de corriente 40 mA 40 mA 40 mA
Memoria Flash 16KB (2KB reservados para el bootloader) 32KB (2KB reservados para el bootloader) 128KB (4KB reservados para el bootloader)
SRAM 1 KB 2 KB 8 KB
EEPROM 512 bytes 1 KB 4 KB
Frecuencia de reloj 16 MHz 16 MHz 16 MHz


Terminales Digitales: Las terminales digitales de una placa Arduino pueden ser utilizados para entradas o salidas de propósito general a través de los comandos pinMode(), digitalRead(), y digitalWrite(). Cada terminal tiene una resistencia pull-up que puede activarse o desactivarse utilizando DigitalWrite() (con un valor de HIGH o LOW, respectivamente) cuando el pin esta configurado como entrada. La corriente máxima por salida es 40 mA.
  • Serial: 0 (RX) y 1 (TX): Utilizado para recibir (RX) y transmitir (TX) datos serie TTL.
  • Interrupciones externas: 2 y 3: Estas terminales pueden ser configuradas para disparar una interrupción con un valor bajo, un pulso de subida o bajada, o un cambio de valor.
  • PWM: 3, 5, 6, 9, 10, y 11: Proporcionan salidas PWM de 8 bit con la función analogWrite(). En placas con ATmega8, las salidas PWM solo están disponibles en los pines 9, 10, y 11.
  • SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK): Estas terminales soportan comunicación SPI. Aunque esta funcionalidad esta proporcionada por el hardware, no está incluida actualmente el el lenguaje Arduino.
  • LED: 13: Conectado al pin digital 13, cuando el pin tiene valor HIGH, el LED está encendido, cuando el pin está en LOW, está apagado

Pines analogicos: En adición a las funciones específicas listadas abajo, los pines de entrada analógicos soportan conversiones analógico-digital (ADC) de 10 bit utilizando la función analogRead(). Las entradas analógicas pueden ser también usadas como pines digitales: entrada analógica 0 como pin digital 14 hasta la entrada analógica 5 como pin digital 19.
  • I2C: 4 (SDA) y 5 (SCL): Soportan comunicaciones I2C (TWI) utilizando la librería Wire

Alimentación
  • VIN (9V): Es el voltaje de entrada a la placa Arduino cuando se está utilizando una fuente de alimentación externa
  • 5V: La alimentación regulada utilizada para alimentar el microcontrolador y otros componentes de la placa. Esta puede venir de VIN a través de un regulador en placa o ser proporcionada por USB u otra fuente regulada de 5V.
  • GND: Pines de tierra
  • AREF: Referencia de voltaje para las entradas analógicas.
  • Reset: Pon esta línea a LOW para resetear el microcontrolador


Tipos de Arduino


Arduino Duemilanove



Es una placa con microcontrolador basada en el ATmega168 o ATmega328. Tiene 14 pines con entradas/salidas digitales (6 de las cuales pueden ser usadas como salidas PWM), 6 entradas analógicas, un cristal oscilador a 16Mhz, conexión USB, entrada de alimentación, una cabecera ISCP, y un botón de reset. Contiene todo lo necesario para utilizar el microcontrolador; simplemente conectalo a tu ordenador a través del cable USB o aliméntalo con un transformador o una batería para empezar a trabajar con el. "Duemilanove" significa 2009 en italiano que fue el año cuando salio al mercado. El Duemilanove es el mas popular en dentro de las series de placas con USB

MicrocontroladorATmega368 o ATmega168
Voltaje de funcionamiento5V
Voltaje de entrada (recomendado)7-12V
Voltaje de entrada (limite)6-20V
Pines E/S digitales14 (6 proporcionan salida PWM)
Pines de entrada analógica6
Intensidad por pin40 mA
Intensidad en pin 3.3V50 mA
Memoria Flash16 KB (ATmega168) o 32 KB (ATmega328) de las cuales 2 KB las usa el gestor de arranque (bootloader)
SRAM1 KB (ATmega168) o 2 KB (ATmega328)
EEPROM512 bytes (ATmega168) o 1 KB (ATmega328)
Velocidad de reloj16 MHz


Arduino Mega



El Arduino Mega es una placa microcontrolador basada ATmeg1280. Tiene 54 entradas/salidas digitales (de las cuales 14 proporcionan salida PWM), 16 entradas digitales, 4 UARTS (puertos serie por hardware), un cristal oscilador de 16MHz, conexión USB, entrada de corriente, conector ICSP y botón de reset. Contiene todo lo necesario para hacer funcionar el microcontrolador; simplemente conectálo al ordenador con el cable USB o aliméntalo con un trasformador o batería para empezar. El Mega es compatible con la mayoría de shields diseñados para el Arduino Duemilanove o Diecimila.

MicrocontroladorATmega1280
Voltaje de funcionamiento5V
Voltaje de entrada (recomendado)7-12V
Voltaje de entrada (limite)6-20V
Pines E/S digitales54 (14 proporcionan salida PWM)
Pines de entrada analógica16
Intensidad por pin40 mA
Intensidad en pin 3.3V50 mA
Memoria Flash128 KB de las cuales 4 KB las usa el gestor de arranque(bootloader)
SRAM8 KB
EEPROM4 KB
Velocidad de reloj16 MHz


Arduino Bluetooth



Es una placa Arduino con el módulo Blueetooh incorporado, que permite la comunicación inalámbrica.
El uso de un convertidor DC-DC,permite que la placa sea alimentada con un mínimo de 1,2 V, pero con un máximo de 5,5 V. Los voltajes superiores o la polaridad invertida en la fuente de alimentación estropeará la placa.
Un ATmega168 para montaje en superficie (como con el Arduino Mini). Esto duplica la cantidad de espacio disponible para tus sketches y agrega tres pines PWM más y dos entradas analógicas.
El Pin 7 está conectado al pin de reinicio (reset) del módulo bluetooth.
Utiliza sólo la comunicación serie a 115200 baudios, que es la velocidad a la que el módulo ha sido configurado para usar.

Arduino Nano



El Arduino Nano es una pequeña y completa placa basada en el ATmega328 (Arduino Nano 3.0) o ATmega168 (Arduino Nano 2.x) que se usa conectándola a una protoboard. Tiene más o menos la misma funcionalidad que el Arduino Duemilanove, pero con una presentación diferente. No posee conector para alimentación externa, y funciona con un cable USB Mini-B en vez de el cable estandar. El nano fue diseñado y está siendo producido por Gravitech.

MicrocontroladorAtmel ATmega168 o ATmega328
Voltaje de funcionamiento5V
Voltaje de entrada (recomendado)7-12V
Voltaje de entrada (limite)6-20V
Pines E/S digitales14 (de los cuales 6 proveen de salida PWM)
Pines de entrada analógica8
Corriente máx por cada PIN de E/S40 mA
Memoria Flash16 KB (ATmega168) o 32 KB (ATmega328) de los cuales 2KB son usados por el bootloader
SRAM1 KB (ATmega168) o 2 KB (ATmega328)
EEPROM512 bytes (ATmega168) o 1 KB (ATmega328)
Velocidad de reloj16 MHz
Dimensiones18,5mm x 43.2mm


Arduino Mini



Arduino Mini es una placa con un pequeño microcontrolador basada en el ATmega168, pensada para ser usada en placas de prototipado y donde el espacio es un bien escaso. Cuenta con 14 entradas/salidas digitales (de las cuales 6 pueden ser usadas como salidas PWM ), 8 entradas analógicas y un cristal de 16 MHZ. Puede ser programada con el adaptador Mini USB u otros adpatadores USB o RS232 a TTL serial

MicrocontroladorATmega168
Voltaje de funcionamiento5V
Voltaje de entrada (recomendado)7-9V
Voltaje de entrada (limite)6-20V
Pines E/S digitales14 (de los cuales 6 proveen de salida PWM)
Pines de entrada analógica8 (de las cuales 4 se extienden en pines)
Corriente máx por cada PIN de E/S40 mA
Memoria Flash16 KB (de las cuales 2 KB son usadas por el bootloader)
SRAM1 KB
EEPROM512 bytes
Velocidad de reloj16 MHz


LilyPad Arduino



El LilyPad Arduino es una placa con microcontrolador diseñado para prendas y e-textiles. Puede utilizar con complementos similares como fuentes de alimentación, sensores actuadores unidos por hilo conductor. La placa esta basada en el ARmega168V (la versión de baja consumo del ATmega168), o el ATmega328V. El LilyPad Arduino ha sido diseñado y desarrollado por Leah Buechley y SparkFun Electronics.

MicrocontroladorATmega168V
Voltaje de funcionamiento2.7-5.5 V
Voltaje de entrada2.7-5.5 V
Pines E/S digitales14 (de los cuales 6 proveen de salida PWM)
Pines de entrada analógica6
Corriente máx por cada PIN de E/S40 mA
Memoria Flash16 KB (de las cuales 2 KB son usadas por el bootloader)
SRAM1 KB
EEPROM512 bytes
Velocidad de reloj8 MHz


Arduino Serial



Es una placa básica que utiliza una interfaz RS232 para comunicarse con el ordenador o para la carga de sketches. Esta placa es fácil de montar, incluso como ejercicio de aprendizaje. Se ha diseñado para utilizar los componentes más simples posibles, de manera que sea fácil de construir, incluso si buscas las componentes en la tienda de la esquina.

Arduino Shields


Los Shields son placas que se colocan encima de la placa Arduino y que amplían una nueva función para que sea controlada desde Arduino, para controlar diferentes aparatos, adquirir datos, etc.

XBEE Shield



La Xbee shield permite a una placa Arduino comunicarse de forma inalámbrica usando Zigbee. Está basada en el módulo Xbee de MaxStream. El módulo puede comunicarse hasta 100ft (30 metros) en interior o 300ft (90 metros) al aire libre (en visión directa). Puede ser usado como reemplazo del puerto serie/usb o puedes ponerlo en modo de comandos y configurarlo para una variedad de opciones de redes broadcast o malladas. La shield tiene pistas desde cada pin del Xbee hasta un orificio de soldar. También provee conectores hembra para usar los pines digitales desde 2 hasta 7 y las entradas analógicas, las cuales están cubiertas por la shield (los pines digitales de 8 a 13 no están cubiertos por la placa, así que puedes usar los conectores de la placa directamente).

Ethernet Shield



La Arduino Ethernet Shield permite a una placa Arduino conectarse a internet. Está basada en el chip ethernet Wiznet W5100. El Wiznet W5100 provee de una pila de red IP capaz de TCP y UDP. Soporta hasta cuatro conexiones de sockets simultáneas. Usa la librería Ethernet para escribir programas que se conecten a internet usando la shield.
Por favor notar que el actual diseño de la ethernet shield no es compatible con el Arduino Mega.
La ethernet shield dispone de unos conectores que permiten conectar a su vez otras placas encima y apilarlas sobre la placa Arduino.
Arduino usa los pines digitales 10, 11, 12, y 13 (SPI) para comunicarse con el W5100 en la ethernet shield. Estos pines no pueden ser usados para e/s genéricas.
La shield provee un conector ethernet estándar RJ45
El botón de reset en la shield resetea ambos, el W5100 y la placa Arduino.

La shield contiene un número de LEDs para información:
  • PWR: indica que la placa y la shield están alimentadas
  • LINK: indica la presencia de un enlace de red y parpadea cuando la shield envía o recibe datos
  • FULLD: indica que la conexión de red es full duplex
  • 100M: indica la presencia de una conexión de red de 100 Mb/s (de forma opuesta a una de 10Mb/s)
  • RX: parpadea cuando la shield recibe datos
  • TX: parpadea cuando la shield envía datos
  • COLL: parpadea cuando se detectan colisiones en la red
El jumper soldado marcado como "INT" puede ser conectado para permitir a la placa Arduino recibir notificaciones de eventos por interrupción desde el W5100, pero esto no está soportado por la librería Ethernet. El jumper conecta el pin INT del W5100 al pin digital 2 de Arduino.
El slot SD en la shield no está soportado por el software Arduino.

Referencias