• No se han encontrado resultados

Curso de Arduino

In document Elektor 12 Diciembre No 390 (página 52-59)

www.elektor.es/magazine| diciembre 2012| 51

The Go’. De acuerdo con esto, el mismo conec- tor USB (actualmente un conector micro-USB) puede convertirse en un cliente USB (como un ratón o un teclado) o un Host USB (como el de nuestro ordenador personal).

El AOAP establece qué accesorios actúan como “huéspedes” (‘Host’) mientras que los disposi- tivos Android actúan como clientes. Esto per- mite que el host alimente al cliente con electri- cidad (nuestra placa Arduino recargará nuestro teléfono móvil cuando se conecte), entre otras prestaciones.

Para establecer la comunicación entre ambas partes, ya vimos en el artículo previo que nece- sitamos ejecutar la librería Host USB como parte de nuestro código Arduino. Podemos comprobar uno de los ejemplos de la librería para confirmar que la tenemos instalada.

Nota: usaremos el menú para navegar a través

de: “File / Examples / USB Host”, si no encontra- mos estos ejemplos aquí quiere decir que no tene- mos instalada la librería host USB en el entrono Arduino. Comprueba la parte de descargas de este artículo [3] e instálala; la vamos a necesitar. La Figura 1 muestra la circuitería involucrada.

Configuración experimental: la parte de procesado

Primero vamos a dar un vistazo al software que necesitamos para programar nuestras aplicacio- nes Android:

•SDK Android con todas las actualizaciones a la

última versión de las APIs.

•Processing 2.0b3 o superior (si leemos el pri-

mer artículo podremos ver que ya hemos actua- lizado a la última versión. Debemos hacer lo mismo para este punto).

•La herramienta ADK Arduino para Processing. •La Librería USB ADK Arduino para Processing.

El último elemento de esta lista es lo que no estaba si hemos experimentado con el artículo previo de esta serie. Fue omitido intencionada- mente en dicho artículo.

Necesitamos la librería complementaria para el Host USB en la parte de Processing, para ase- gurarnos que podemos conseguir que nuestra placa hable a nuestro teléfono. Llamamos a esta librería “ USB ADK Arduino”. La siguiente sección explica cómo instalarla. LaFigura 2 muestra la

parte hardware de las cosas.

Instalando la Librería USB ADK Ardui- no parar Android

Dentro del fichero descargado para este artículo encontraremos un directorio llamado “Processing” en el que tendremos un subdirectorio llamado ‘libraries’. Debemos copiar el contenido de este directorio dentro de nuestro directorio de librerías Processing. Éste último está localizado dentro de nuestro directorio “sketchbook” de Processing, normalmente almacenado en el directorio “Mis documentos/ Processing”, en ordenadores con Windows, o en el directorio “Documents/Proces- sing”, para ordenadores con Mac o Linux. Esta librería viene con cuatro ejemplos, reco- mendamos arrancar nuestros accesorios con uno de estos ejemplos, ya que eso hará nuestra vida mucho más fácil. Vamos a comenzar inten- tando ejecutar el ejemplo llamado ‘digitalWrite’. En este caso tendremos que conectar nuestra placa Arduino a nuestro teléfono y, al tocar la pantalla, se encenderá un diodo LED conectado nuestra placa. Si dejamos de tocar la pantalla el LED se apagará.

DigitalWrite

Cada ejemplo tiene dos partes. La primera se ejecuta en la placa Arduino, controla las comu- nicaciones hacia y desde el teléfono a la vez que

Figura 1.

 ADK Mega Arduino con Shield TinkerKit y teléfono.

Figura 2.

 ADK Mega Arduino conectado a un PC y a un teléfono.

car dicho código sobre la placa una vez que lo hayamos hecho!

Este código de ejemplo será “escuchado” por el puerto USB. Una vez que el teléfono esté conec- tado a la placa Arduino, la función usb.isCon- nected() devolverá una respuesta afirmativa.

Cuando el teléfono comience a enviar datos, la funciónusb.available() devolverá un valor dife-

rente de cero que Arduino leerá y almacenará en la variableval. Algo muy similar a lo que se

muestra en la Figura 3 debe ser lo que tenga-

mos también nosotros. realiza acciones sobre los otros terminales de la

placa. La segunda parte es el código que tiene que ser compilado sobre Processing y que se eje- cutará dentro del dispositivo Android. Esta app leerá y escribirá datos a través de la conexión por cable del teléfono, a la vez que realizar algu- nas acciones en la pantalla o leerá cualquiera de los sensores del teléfono como la cámara, el acelerómetro, etc.

Primero vamos a analizar el código Arduino, abriremos nuestro IDE Arduino y escribiremos el código delListado 1. ¡Debemos recordar vol-

Listado 1. Ejemplo DigitalWrite para la Librería Host USB de Arduino. #include <AndroidAccessory.h>

// descriptor de accesorios. Así es como Arduino se identifica con Android char accessoryName[] = “DigitalWrite”; // nuestra placa Arduino

char companyName[] = “Arduino SA”; // variables led

int ledPin = 10; // contadores

long timer = millis(); // inicializa el accesorio:

AndroidAccessory usb(companyName, accessoryName); void setup() {

// comienza la conexión al dispositivo por el host USB:   usb.begin();

// configura el terminal LED como salida

Listado 2. Procesando el ‘sketch’ que detectará los toques de pantalla. import cc.arduino.*;

// crea el objeto ADK ArduinoAdkUsb arduino; void setup() {

// Establece la vista PORTRAIT orientation( PORTRAIT );

// inicializa el objeto ADK

arduino = new ArduinoAdkUsb( this ); if ( arduino.list() != null )

arduino.connect( arduino.list()[0] ); }

void draw() {

// Dibuja una recta rellena basada en el estado de la conexión Arduino connected( arduino.isConnected() );

Curso de Arduino

www.elektor.es/magazine| diciembre 2012| 53

ArduinoADKUsb’, si hemos instalado la librería adecuadamente. Ver Listado 2.

El código del Listado 2 es bastante auto-expli- catorio. Una parte que podemos encontrar un poco y esa es la de definición del método

surfaceTouchEvent(MotionEvent event). Java

es un lenguaje de programación muy potente y, en este caso, permite suplantar algunos de los métodos de llamada existentes. En el momento en que tocamos la pantalla del dispositivo Android, el sistema esta configurado para llamar a la función específica (surfaceTouchEvent(MotionEvent

En el lado de Processing necesitaremos escri- bir un programa que compruebe el evento de alguien tocando la pantalla. Si hay una conexión por cable, el teléfono enviará ‘a’ para indicar que alguien acaba de comenzar a tocar la pantalla. Enviará ‘b’ para indicar que el dedo ya no la toca. Estamos detectando los eventos de ‘comenzar a tocar’ y ‘para tocar’, ya que no queremos inun- dar el puerto de comunicaciones.

Abriremos nuestro IDE Processing y buscaremos el ejemplo adk_digitalWrite. Lo encontraremos en el menú ‘Examples / Contributed Libraries /

pinMode(ledPin, OUTPUT); }

void loop() {

// saca al USB 10 veces por segundo if(millis()-timer>100) {

if (usb.isConnected()) { // ¿está abierta la comunicación USB? if (usb.available() > 0) { // ¿está el dato?

char val = usb.read();

// ‘a’ pone el LED on, ‘b’ off if( val == ‘a’ )

digitalWrite( ledPin, HIGH ); else if( val == ‘b’ )

digitalWrite( ledPin, LOW ); }

timer = millis(); }

} }

public boolean surfaceTouchEvent(MotionEvent event) { if ( arduino.isConnected() ) {

if ( event.getAction() == MotionEvent.ACTION_DOWN )   arduino.write(‘a’);

else if ( event.getAction() == MotionEvent.ACTION_UP )   arduino.write(‘b’);

}

// si queremos las variables para motionX/motionY, // mouseX/mouseY etc.

// para trabajar adecuadamente necesitaremos llamar a // super.surfaceTouchEvent().

return super.surfaceTouchEvent(event); }

Nota: El Listado 3 no nos muestra la clase Ani-

mation que abrirá todas las imágenes llamadas s00.gif, s01.gif, etc. Recomendamos que verifique y el listado completo del código que viene con el ejemplo Elektor_Simple_Animation. También veremos un directorio llamado ‘data’, dentro del directorio ‘sketch’ de Processing, que contiene todas las imágenes que forman parte de la ani- mación (54 en total).

La configuración final

Lo siguiente será modificar el ejemplo para incluir la librería que controla las comunicaciones por USB. Recomendamos a nuestros lectores que agreguen el código previo con el ejemplo adk_ analogRead. El resultado de ello debe ser similar

al código delListado 4 en [3].

Hay un par de cosas en el ejemplo que han que ser remarcadas. En primer lugar, hay un array llamado delays[i]. Este array es responsa-

ble de controlar el tiempo durante el que cada trama será mostrada en la animación. Cada vez que cargamos una nueva trama, también cambiamos la longitud del temporizador en la condiciónmillis()- timer > delays[index].

Animamos a nuestros lectores a experimen- tar con las cifras de este array para ver como afectan a la animación. Debemos recordar que tiene que haber tantas cifras como tramas en la animación.

También está el array keyFrames[i], que aloja

una lista de tramas en la animación que espe- rarán una acción del usuario para que continúe la película. En este caso, vamos a detectar la pulsación de un botón. La animación se deten- drá en aquellas tramas que se marquen hasta que el usuario presione el botón conectado al módulo expansor TinkerKit, como podemos ver en la Figura 5.

Si nos fijamos en la línea que verifica cuantos bytes llegan desde la placa Arduino, verificamos

arduino.available() >= 3 para ver si hemos

recibido, o no, 3 bytes. La información se codi- fica de la siguiente manera:

•Byte 0: tiene que ser 255, es un marcador

que usamos para distinguir cuando comienza el bloque;

•Byte 1: es el valor del potenciómetro; rango

de 0 a 254;

•Byte 2: viene desde el botón; su valor será,

bien 0 o bien 1.

event)). Si suplantamos esta función en nuestro

programa (básicamente, rescribiéndola) podemos conseguir que haga lo que queramos.

En este caso, nosotros detectamos dos de los muchos eventos del sistema: MotionEvent. ACTION_DOWN (el equivalente a comenzar a pul-

sar la pantalla), que envía una ‘a’ a Arduino,

MotionEvent.ACTION_UP (el mismo para detener

el pulsar la pantalla), que envía una ‘b’.

Algo más divertido

Una vez que hemos conseguido ejecutar el primer ejemplo… ¿por qué no construir algo más diver- tido? Internet está repleta de gatos, por lo que el último mes hemos decidido crear la aplicación Elektor_Miau. Queríamos hacer un comentario divertido y, al mismo tiempo, mostrar a nues- tros lectores que es posible comenzar a hacer cosas más llamativas que el clásico ejemplo “Hola mundo” cuando aprendemos a programar. Este mes queremos crear las bases y animar a nuestros lectores a aprender cómo hacer peque- ñas animaciones usando Processing. Podemos buscar cualquier GIF animado en Internet y usarlo para hacer una réplica de lo que queremos ver en este ejemplo. La única condición es que necesita- mos que en el GIF animado sea exportado como tramas. Tendremos que nombrar cada trama de la siguiente manera: s00.gif, s01.gif, s02.gif… Por supuesto, también podemos utilizar la misma imagen que estamos usando para nuestro artículo. Hemos conseguido que un dibujante nos dibuje un pequeño conejo que sale y se deja ver. El objetivo de este ejemplo es hacer un pequeño juego interactivo donde utilizaremos sensores (un botón y un poten- ciómetro) para interactuar con el pequeño conejo en la pantalla del teléfono, como en laFigura 4. Esta vez es mejor comenzar mirando el código que se va a ejecutar dentro del teléfono. El pri- mer paso es construir una animación dentro de Processing. Si somos conocedores de Android, podemos intentar exportar la librería GIFdeco- der, que hemos utilizado el mes pasado, para reproducir GIFs animados dentro de nuestra app Android. Como queremos mantener la programa- ción sencilla y fácil de entender, la manera en que recomendamos a nuestros lectores que animen su conejo es muy simple: debemos construir un ‘array’ de imágenes diseñado para contener las tramas que queremos que formen parte de la ani- mación. Este concepto está basado en el ejemplo Animated Sprite de Processing de James Paterson [2], ver elListado 3que podrás encontrar en [3].

Curso de Arduino

www.elektor.es/magazine| diciembre 2012| 55

El valor del potenciómetro será usado para cam- biar el color de fondo de la pantalla, mientras que el botón disparará la siguiente secuencia de la animación.

Nota: usaremos la herramienta USB ADK Arduino

(menú ‘Tools / Arduino ADK’ en el IDE de nuestro Processing) para volcar este programa a nuestro teléfono. Aparecerá una ventana de diálogo. En el campo de texto denominado “model” introdu- ciremos el nombre de la app a la que llamamos dentro del IDE de Arduino. El último parámetro se emplea para seleccionar la versión del SDK para nuestro modelo de accesorio. Si nuestro teléfono o tableta trabaja con Android 3.0 o pos- terior, debemos tener un SDK v12. El SDK v10 es sólo para aquellos dispositivos que trabajan con Android 2.3.4. En el caso desafortunado de que nuestro dispositivo Android esté trabajando con la versión 2.3.3 de SO o anterior, no seremos capaces de usar el modo ‘Accesorio’.

Por último, el código Arduino es prácticamente una repetición del ejemploadk_analogRead, aña-

diendo el byte marcador adicional, limitando la lectura analógica a 254 y añadiendo el botón. El bucle para el este programa se muestra en el

Listado 5en [3]. Por favor, verificad el programa

completo dentro de la documentación que podéis conseguir de la página web de Elektor [1], en el directorio “Arduino / code”.

Palabras finales

Con este artículo hemos acabado nuestra intro- ducción a Android y cómo conectarlo a Arduino. Ahora ya deberíamos ser capaces de crear un nuevo proyecto, crear robots donde nuestro telé- fono móvil pueda ser la inteligencia del mismo, o integrar sensores que no vienen con nuestro dispositivo Android. Si hacéis cualquier proyecto interesante usando cualquier parte de nuestro código, no os importe dejar una línea en blog@ arduino.cc, estaremos encantados de hacer saber al resto de la comunidad lo que estáis haciendo.

 (120573)

Enlaces en Internet y Referencias

[1] Processing Project: http://processing.org [2] Animaciones usando múltiples imágenes con

Processing: http://processing.org/learning/ topics/sequential.html

[3] www.elektor.es/120573

Figura 3.

El LED se enciende cuando tocamos la pantalla.

Figura 5.

Botón y potenciómetro en la parte superior del Shield TinkerKit.

Figura 4.

Un par de tramas de nuestra película de conejo.

Agradecimientos

El equipo de diseño Arduino desea expresar su agradecimiento al equipo de Circuits@ Home por sus primeros trabajos sobre la librería Host USB para Arduino y a Philip Lindsay por su trabajo en la depuración de la colección inicial de las librerías Arduino para Android. También a Rodrigo Calvo, que ayudó en el trabajo de mejorar la librería Host USB para que funcionase con dispositivos Android 4.1. Y a Laura Balboa, por su trabajo de dibujo e ilustraciones.

Consejos sobre componentes

Raymond Vermeulen (Elektor.Labs)

Controlador de ventilador dependiente de la temperatura

Para este mes he seleccionado dos integrados que se encargan de una regulación de ventilación independiente. Puede ser útil si dispones de un sistema que consuma mucha potencia y se encuentre en una caja, de modo que requiera una refrigeración activa mediante un ventilador. Sería muy útil utilizar un integrado separado de control si quieres que la regulación del ventilador dependa de la temperatura, pero no quieres que el microcontrolador presente se encargue de eso. Sólo necesitas conectar un sensor y un ventilador. Un detalle llamativo de los integrados que presentamos aquí es que no siguen el estándar de control de ventilación de 25 kHz PWM y de un conector de 4 terminales, sino que con- mutan directamente la tensión de alimentación a una frecuencia mucho más baja.

(120569)

MIC502

EL MIC502 de Micrel utiliza un NTC o un PTC como sensor de temperatura, con la opción de un segundo sensor. Los sensores se conectan a las entradas VT1 y VT2. Una tensión desde el 30% hasta el 70% de la tensión Vdd produce un ciclo de trabajo desde 0% hasta el 100%. Tiene prioridad la más alta de las dos entradas, una característica perfecta si mides con un sensor la temperatura ambiental y con el otro el componente que está disipando fuertemente. En el terminal Vslp se coloca una tensión que haga que el chip entre en modo reposo cuando las entradas VT1 y VT2 caigan por debajo de ese valor. Cuando VT1 o VT2 supere dicho valor, el integrado se reactivará de nuevo. Esto se hace para evitar que el ventilador funcione con un ciclo de trabajo demasiado bajo. Sobre el terminal CF se conecta un condensador de temporización cuyo valor recomendado es 100 nF para una frecuencia de 30 Hz. Sin embargo, también se puede configurar una frecuencia más alta, según la hoja de datos el alcance va desde una frecuencia de 15 hasta 90 Hz.

MAX6643

El MAX6643 utiliza un transistor configurado como diodo para medir la temperatura. Este integrado tiene tres opciones diferentes para la configuración de la temperatura. Con el

'Overtemperature Threshold' (terminales OT1 y OT2) se configura la temperatura (entre 60 y 100ºC) que hace que la salida OT conmute en el momento en que se sobrepase dicha temperatura. El 'High temperature Threshold' (terminales TH1 y TH2) determina a qué temperatura hay que subir un peldaño el ciclo de trabajo de la señal PWM. El 'Low temperature Threshold' (terminales TL1 y TL2) determina a qué temperatura hay que bajar un peldaño el ciclo de trabajo de la señal PWM. Para todos estos umbrales (thresholds) de la temperatura se pueden configurar unos valores determinados conectando los terminales correspondientes a Vdd o GND o dejándolos abiertos (ver hoja de características).

También dispone de un terminal ‘FULLSPD’ para forzar un ciclo de trabajo de 100%. Esto puede ser útil cuando se detecta un estado con una temperatura demasiado alta. Además dispone de una entrada para recibir la señal de tacho del ventilador, con el que se indica que el ventilador ha dejado de funcionar a través del terminal ‘FANFAIL’.

Hoja de características MIC502: www.micrel.com/_PDF/mic502.pdf 

Figura 1. Diagrama de bloques del MIC502.

Hoja de características MAX6643:

http://datasheets.maximintegrated.com/en/ds/MAX6643-MAX6645.pdf 

Figura 3. Diagrama de bloques del MAX6643.

Figura 4. Ejemplo de aplicación con el MAX6643. Figura 2. Ejemplo de aplicación con el MIC502.

Construir nuestra propia radio es una buena manera de iniciarse en la electrónica. Pero debería ser posible sin utilizar componentes especiales, y que ésta tuviera cierta fiabilidad. Echemos un vistazo al audión de banda ancha de lafigura 1.

Como audión nos referimos a un circuito capaz de realizar ambas funciones, tanto demodular señales en HF, como amplificarlas. Este sencillo receptor incluye todo lo necesario para escuchar todo lo que surca el aire, que puede proceder de emisores de onda media cercanos, pero también de onda corta que se encuentren en el rango, y naturalmente, también todos los ruidos de alta frecuencia generados en las inmediaciones. Lo único que necesitamos es una antena de cable lo suficientemente larga. Lo más óptimo sería dis- poner de un cable colgado de unos 10 metros de longitud, pero con antenas más cortas también podemos obtener buenos resultados. También necesitamos una conexión a tierra. En la salida de audio en baja frecuencia podemos conectar unos auriculares con cierta sensibilidad, y mucho mejor si se trata de un amplificador para altavoces. El audión de banda ancha recibe todo simultá- neamente. Normalmente puede escucharse más de una emisora, entre los cuales destaca una especialmente intensa. Ajustando adecuadamente la bobina, influiremos en cierta medida en el rango de recepción. También puede utilizarse una inductancia fija. Para la recepción en onda media, necesitaremos unos 300 �H, para la onda corta unos 10 �H, o tan sólo 3 �H, si queremos centrarnos en las bandas más altas, de 15 a 17 MHz. Una bobina diseñada por nosotros mismos para onda media podría tener por ejemplo 100 espiras alrededor de una varilla de ferrita; para onda corta bastan entre 10 y 30 espiras con un diámetro de 10 mm, sin necesidad de ferrita. El resultado también depende de la propia antena. Podemos probar con distintas bobinas. Depen-

Burkhard Kainka

(Alemania)

In document Elektor 12 Diciembre No 390 (página 52-59)