Curso de Programacion de Android
Curso de Programacion de Android
Curso de Programacion de Android
Programación de
Android
Índice de contenido
Introducción______________________________________________________________________5
¿A partir de qué edad se puede programar con App Inventor?_____________________________6
¿Por qué en inglés si se podría hacer en español?______________________________________6
Ahora, también en GitHub________________________________________________________7
Capítulo 1. Preparación del entorno. La primera aplicación con Android______________________8
1. Instalación de las herramientas___________________________________________________8
1.1 Conectar un dispositivo Android con AI Companion vía WiFi (método recomendado)____9
1.2 Conectar Android vía USB sólo para transferir archivos (método recomendado para
utilizar en clase)_____________________________________________________________10
1.3 Utilización de Dropbox, Google Drive o OneDrive para instalar Apps en Android______12
1.4 Conectar un dispositivo Android vía USB para depuración (método desaconsejado en
clase, válido para casa)________________________________________________________12
1.5 Instalar y utilizar el emulador (con pc medianamente potente) (Válido en el aula pero sólo
para ciertas Apps)____________________________________________________________13
1.5.1 La manera “normal” de instalar el emulador (requiere privilegios de administrador)13
1.5.2 La otra manera de utilizar el emulador (válida para clientes ligeros).........................14
1.6 Trabajar sin conexión (recomendado para utilizar en clase)________________________15
2. El panel de diseño____________________________________________________________15
3. Tu primera pantalla___________________________________________________________18
4. Elementos no visibles_________________________________________________________20
5. El editor de bloques__________________________________________________________21
6. Probar la aplicación__________________________________________________________23
6.1 Utilizar el emulador (si trabajas en Linux y no tienes un dispositivo Android)_________23
6.2 Conecta el teléfono móvil o la tableta Android__________________________________23
7. Empaqueta tu App____________________________________________________________24
10. Publícala en Google Play Store________________________________________________25
11. Actividades propuestas_______________________________________________________25
Capítulo 2. Aplicaciones básicas del MIT______________________________________________27
1. La bola 8___________________________________________________________________27
2. El bote de pintura____________________________________________________________34
3. Machacar Topos (Whac-A-Mole)________________________________________________46
4. Juego de disparos (Arcade)_____________________________________________________57
5. Si tecleas no conduzcas (Texting, TextBox, TinyDB, GPS)____________________________66
6. La Mariquita________________________________________________________________75
Más mariquita______________________________________________________________89
7. Trabajo Libre________________________________________________________________91
8. Mapa turístico de París (o de donde tú quieras)_____________________________________91
9. ¿Donde está mi coche?________________________________________________________99
10. ¿Dónde estáis?____________________________________________________________105
Capítulo 3. Otras Apps___________________________________________________________122
Introducción_________________________________________________________________122
3.1 Repite todo lo que tú dices___________________________________________________122
3.2 El Ahorcado______________________________________________________________122
3.3 Pong____________________________________________________________________136
Capítulo 4. El Internet de las cosas__________________________________________________137
4.1 Introducción a Arduino______________________________________________________138
4.2 Arduino: control de una pequeña luz (LED)______________________________________143
4.3 Arduino: control de un motor eléctrico a pilas____________________________________146
4.4 Arduino: control de un motor potente con relés___________________________________149
4.5 Arduino: control de una lámpara de 220 V_______________________________________157
Libre Arduino________________________________________________________________163
4.6 Arduino + Android: control por Bluetooth desde Android___________________________164
4.7 Arduino + Android: control por voz____________________________________________171
4.8 Ejemplo de aplicación: el cochecito____________________________________________172
4.9 ¿Qué más puede hacerse con Arduino + Android?_________________________________178
4.11 Raspberry Pi_____________________________________________________________179
4.15 Windows IOT____________________________________________________________180
Capítulo 5. mBot________________________________________________________________182
Introducción_________________________________________________________________182
APPM01. Instalación de la extensión (movimientos básicos)___________________________184
APPM02. Sonido según la distancia (sonido y distancia)______________________________188
APPM03. Avanzar sin chocar (led)________________________________________________191
APPM04. Más música_________________________________________________________193
APPM11. Seguidor de línea_____________________________________________________195
APPM12. Seguidor de línea blanca (sin terminar)____________________________________203
APPM15. Luchador de sumo (sin terminar)_________________________________________204
Capítulo 6. Y después, ¿qué?_______________________________________________________207
Android Studio y Java__________________________________________________________207
Windows__________________________________________________________________208
LliureX (o Ubuntu)_________________________________________________________209
Ejercicios Recomendados____________________________________________________211
Ejercicio 1. El botón rojo....................................................................................................211
Ejercicio 2. El botón que cuenta.........................................................................................211
Generar el apk....................................................................................................................212
Anexo I. Cómo Dar de alta un sitio web para TinyWebDB_______________________________213
Bibliografía y otras cosillas sobre este documento______________________________________216
Cambios interesantes que se han producido en App Inventor___________________________216
¿Problemas con el GPS?________________________________________________________217
Gestión de la voz. TTS (Text To Speech)___________________________________________217
Leer un texto (Text To Speech)________________________________________________217
Reconocimiento de voz______________________________________________________218
Distribución de componentes en la pantalla_________________________________________218
Múltiples pantallas____________________________________________________________219
Trucos para las actividades propuestas_____________________________________________220
Bola mágica, “piedra, papel, tijera”, dados, ..._____________________________________220
Cálculo de la distancia entre dos puntos (mochila)_________________________________221
Bibliografía__________________________________________________________________223
Bibliografía utilizada para realizar este curso_____________________________________223
Introducción
Este documento consiste en una serie de actividades de programación de teléfonos
Android, tablets y dispositivos Android TV. En clase el trabajo se realiza con ordenadores
en los que se encuentra instalado el sistema operativo LliureX, pero puede realizarse
también con Windows, Mac OS X y algunas distribuciones de Linux.
Es conveniente disponer de un teléfono con Android, pero no es imprescindible. Claro
que quien no lo tenga... ¡deseará tener uno muy pronto!
También sirve una tableta con Android o un televisor con Android TV, aunque habrá
actividades que sólo se podrán hacer con un dispositivo móvil y con pantalla táctil. Un
teléfono móvil sin tarjeta SIM, aunque no sirva para llamar por teléfono, servirá también
para este curso.
La metodología empleada es muy simple: se va aprendiendo paso a paso con una
serie de actividades individuales. En cada una de ellas se introducen unos pocos
conceptos nuevo y se utilizan métodos aprendidos en las actividades anteriores. La
estructura de las actividades es siempre la misma, con el objetivo de que tanto el profesor
como los alumnos se sientan cómodos desde el primer momento.
El peor problema asociado a trabajar en distintos idiomas es que después nos resulta
más difícil aprovechar todo el material que hay en Internet para App Inventor. Hay
muchísima bibliografía en forma de libros, PDF, vídeos, ... todo en inglés.
Pero no es esa la única razón. App Inventor es una herramienta que introduce al mundo
de la programación. Cuando iremos a aprender otro lenguaje de programación no
tendremos más remedio que aprenderlo en inglés, porque todos están en inglés, así que
es mejor que nos vayamos acostumbrando.
C
apítulo 1. Preparación del
entorno. La primera
aplicación con Android
Con App Inventor tu trabajo estará siempre a salvo en Internet y disponible allá donde
vayas (siempre que tengas acceso a Internet).
Puedes trabajar con Google Chrome, Safari o Firefox (Internet Explorer no está
soportado y Edge todavía no funciona bien).
Si vas a trabajar con el emulador, tienes que saber que con LliureX 1406 o 1505 y
Firefox o Chrome actualizados a 25 de mayo de 2015 funciona bien (comprobado por el
autor) siempre que el ordenador sea mínimamente potente. Con un ordenador muy poco
potente hay problemas de comunicación entre el navegador y el emulador.
Por lo general, utilizaremos AppInventor con un teléfono o tableta Android, o incluso con
un Android TV, pero también podemos utilizar un emulador para desarrollar. El emulador
es un programa que imita el comportamiento del teléfono para que lo veamos en el
ordenador mientras vamos dando forma a nuestra App.
Aquí vamos a ver las distintas opciones de que disponemos. No son excluyentes:
puede resultar muy cómodo el uso del emulador mientras se está trabajando el aspecto
que tendrá una App y, luego, instalar la aplicación “beta” para comprobar que funciona en
un móvil.
Sea cual sea tu método preferido, al final tendrás que instalar la App en el móvil, y para
eso lo mejor es disponer de una buena WiFi. Sólo entonces podrás disfrutar de tu trabajo
y darte cuenta realmente de si está terminado o de si tienes que continuar trabajando.
instalarás una App que se llama AI Companion, como vamos a explicar enseguida.
El ordenador de desarrollo estará conectado a la misma WiFi que tu Android. También
puedes tener el ordenador en una red cableada, y el Android a la WiFi de esa misma red.
La red WiFi debe estar configurada de manera que permita que dos dispositivos se
comuniquen entre sí, pero no todas lo permiten. Hay administradores de red que, por
motivos de seguridad, configuran la red inalámbrica de manera que esto no sea posible.
Si alguien quiere saber más sobre este tema, puede buscar en Internet “aislamiento WiFi”,
“WiFi Isolation” o “AP Isolation”.
Si no hay WiFi, o la que hay no sirve, pero puedes montar tú mismo una con un punto
de acceso... te lo recomiendo. Naturalmente, si estás utilizando una red que no es tuya,
asegúrate de que tu punto de acceso o router tiene desactivado el servidor DHCP o
crearás problemas en la red.
En tu Android, instalarás la “MIT AI2 Companion App”, que puedes buscar en la Play
Store (https://play.google.com/store/apps/details?id=edu.mit.appinventor.aicompanion3):
extraíble (memoria interna del dispositivo) o dos (la interna y la externa). Si no es así
podemos hacer un par de comprobaciones:
probar un cable diferente. El nuestro podría estar dañado o puede no sea el original
y que, por equivocación, estemos utilizando uno que sólo sirve para cargar
probar en un puerto USB diferente o en otro PC
cambiar en el móvil del modo MTP (transferencia de archivos multimedia) al de
“transferir imágenes”
hace.
También se puede navegar hasta la carpeta donde se encuentra y ejecutar aiStarter con
un doble clic.
Como es natural, cualquier usuario podrá lanzarlo, aunque no sea administrador del
sistema.
Si se va a utilizar mucho, resultará más cómodo añadir ese comando al inicio del
sistema o al inicio de sesión del usuario o, al menos, crear un enlace en el escritorio para
ponerlo en marcha cómodamente.
Windows
Hay que descargarse el instalador de http://appinv.us/aisetup_windows y ejecutarlo.
MAC OS X
Hay que descargarse el instalador de http://appinv.us/aisetup_mac y ejecutarlo.
2. El panel de diseño
Seamos ordenados. Vamos a definir nuestra primera aplicación y necesitaremos varios
archivos de imágenes y de sonido. Prepárate una carpeta para poner todo este material
junto.
Entra en el entorno de desarrollo y busca donde pone “English”. Cambia el idioma a
Español si lo deseas. Verás que no hay muchos idiomas disponibles. En este documento
se intentará trabajar en inglés como se ha explicado en la introducción.
Ahora tienes que pulsar sobre Proyectos (My Projects), en la parte de arriba de la
pantalla y seleccionar “Comenzar un proyecto nuevo...” (New). Acto seguido, hay que
introducir un nombre para el nuevo proyecto y pulsar sobre Aceptar:
el vocabulario con el que nos vamos a encontrar en mucha documentación que hay en
Internet en forma de libros o vídeos.
3. Tu primera pantalla
La pantalla está dividida en varios paneles. Busca el de Componentes (Components)
(si no lo ves, ayúdate de CONTROL-F) y pincha sobre Screen1.
En la derecha quedarán accesibles las propiedades. Aquí puedes ver las propiedades
de un objeto de tipo pantalla:
Ahora, añade un botón arrastrando desde Basic/Button hasta encima de la pantalla del
móvil. Selecciona Button1 en la columna Components. Como ahora tienes seleccionado
el botón, las propiedades de la derecha se refieren a él.
Ponle una imagen haciendo clic en Image. Para que no se distorsione la imagen, es
conveniente que utilices un tamaño en píxeles que vaya a caber bien en este tipo de
pantallas. Utilizar una imagen de mucha resolución sólo servirá para que la aplicación
ocupe más espacio y tarde más en cargarse.
En Text quita la frase “Text for Button1”. Puedes cambiar la forma del botón desde
Shape.
Añade ahora una etiqueta desde Basic/Label y, en Text, escribe “Pulsa sobre la
imagen”:
4. Elementos no visibles
Se denominan no visibles porque no se muestran físicamente en el panel de diseño,
como por ejemplo los archivos de sonido.
Vamos a añadir un sonido. Puedes descargarlo de www.findsounds.com o grabarlo tú
mismo, como prefieras.
Haz clic en el apartado Media y, después, arrastra Sound dentro de la pantalla. Verás
que va a parar debajo de la pantalla que representa al móvil, donde pone “Non-visible
components”. En la columna Properties, busca Source y sube desde ahí el archivo de
sonido descargado previamente.
5. El editor de bloques
Ya hemos terminado el diseño de nuestra aplicación. Tenemos todos los componentes y
ahora vamos a hacer el programa.
Ahora estás viendo la lista de todos los bloques que has añadido en el panel de diseño,
que son Button1, Label1 y Sound1, además del bloque Screen1 que se añade
automáticamente al crear la App. Selecciona Button1 y observa sus opciones, que
aparecerán en forma de piezas de puzzle. Hay tipos de piezas que indican acciones y
otras para componentes. Hay que encajar unas con otras para lograr el comportamiento
deseado:
Vamos a hacer que al pulsar el botón se oiga el sonido que hemos cargado.
Pincha sobre Button1 y, después, sobre Button1.Click. Pincha ahora sobre Sound1 y,
después, sobre Sound1.Play. Tendrás esta figura:
Es importante que el bloque "call Sound1.Play" quede dentro del otro, perfectamente
encajado, como en la figura anterior. Si lo pones donde toca, al soltarlo oirás un "click".
Si lees lo que pone en pantalla, te darás cuenta de que estamos diciendo “when
Button1.Click do call Sound1.Play” que, en cristiano, significa que “cuando se pulse el
botón 1 hay que reproducir el sonido 1”.
6. Probar la aplicación
Ahora hay dos posibilidades, que vemos en los apartados 6.1 y 6.2.
7. Empaqueta tu App
Recuerda pulsar sobre Save de vez en cuando.
Puedes pulsar sobre Checkpoint para establecer un punto al que retornar cuando
consigas un hito.
Una vez tengas terminada la app busca en la esquina superior derecha el menú
Package for Phone, al lado de Open the Blocks Editor:
C Estas
apítulo 2. Aplicaciones básicas
del MIT
aplicaciones son una traducción de lo que hay en
http://appinventor.mit.edu/explore/content/tutorials.html. Aquí se han añadido más
propuestas de mejora al final de cada actividad.
La primera (Hello Purr) equivale a la que ya hemos hecho en el capítulo anterior.
1. La bola 8
¿Conoces la bola mágica de Mattel? Sirve para predecir el futuro. Tú le preguntas algo,
la agitas y ella te responde.
Vamos a preparar una App que sirve para hacer eso mismo: predecir el futuro.
PARTE 1
El diseñador
Accede al diseñador entrando en http://appinventor.mit.edu/explore/front.html y
pulsando sobre el botón “Create apps!”, o entrando en http://ai2.appinventor.mit.edu/
directamente. Identifícate con tu cuenta de GMAIL (la identificación será automática si la
tienes guardada en tu navegador).
Empieza un proyecto nuevo entrando en Projects → Start New Project.
Si estás en clase, podrías llamar a esta aplicación APP01_BOLA8_Nom_Ape (con tu
nombre y apellidos; por ejemplo, APP01_BOLA8_DEMI_MOORE).
Entra en la carpeta “Material Necesario” y verás que hay una subcarpeta con el material
de esta actividad. Si no la tienes, ayudte de otra pestaña en el navegador, descárgate y
guarda la imagen de una bola 8 y un archivo de sonido de
https://sites.google.com/site/appinvmediafiles/magic-8-ball (8 Ball Image 1).
En la columna de la izquierda del diseñador, abre User Interface y arrastra un botón a
la pantalla del móvil. Cambia su imagen por la de la bola 8 que te habías descargado
(propiedad Image en la columna derecha). Quita el texto que hay en la propiedad “Text”.
En la columna de la izquierda, abre Media y arrastra Sound a la pantalla.
Selecciona ahora el componente Screen1 y, en AlignHorizontal, selecciona Center.
El Editor de Bloques
Entra en el editor de bloques (botón Blocks). Desde My Blocks haz clic sobre Button 1 y
arrastra el bloque Button1.Click al área de trabajo.
Desde Sound1 arrastra Sound1.Play dentro de Button1.Click para que encajen:
PARTE 2
Ahora haz clic dentro de Built-In, en Lists y arrastra el componente “pick a random item”
para conectarlo a Label2.Text.
También desde Built-In/Lists, arrastra el bloque “make a list”, sobre el bloque “pick
random item”.
También desde Built-In, pero seleccionando “Text”, arrastra el primer bloque. Haz clic
entre las comillas y escribe el texto que quieras, que será una de las respuestas de tu
bola mágica. Por ejemplo, puedes poner “Puede que sí, puede que no”:
Repite este último paso para añadir más respuestas, tantas como tú quieras. Puedes
sacar ideas en http://es.wikipedia.org/wiki/Magic_8-Ball:
Pero... “make a list” sólo tiene ranuras para dos respuestas. Para añadir ranuras tienes
que hacer un clic sobre su ruedecita dentada y verás cómo te sale un dibujo de ayuda:
Probar
En el emulador o en el teléfono (según sea tu caso) haz clic sobre la bola y verás
aparecer una respuesta al azar, y oirás el sonido asociado.
PARTE 3
Editor de bloques
Busca AccelerometerSensor1 y coge el bloque AccelerometerSensor1.Shaking.
Arrastra todo lo que hay dentro de Button1.Click hacia dentro de
AccelerometerSensor1.Shaking.
Borra Button1.Click haciendo clic encima, pulsando Supr y confirmando.
Comprobar el funcionamiento
En el emulador: lamentablemente no es posible simular movimiento en el emulador.
En el teléfono: agita el teléfono y te saldrá una respuesta, además de reproducirse un
sonido.
Para realizar estas actividades te puede servir de ayuda leer los siguientes apartados
que están más adelante:
Gestión de la voz. TTS (Text To Speech) (página 215)
Bola mágica, “piedra, papel, tijera”, dados, ... (página 218)
2. El bote de pintura
Ahora vamos a pintar con las manos. Mojaremos el dedo en el bote de pintura y nos
dedicaremos a manchar la pantalla.
Hay muchos tipos de App y, sin duda alguna, los de pintar tienen mucho éxito. En este
ejercicio aprenderás a preparar una app para pintar sobre un lienzo con tus dedos, y
también a pintar sobre una fotografía que tomarás desde dentro de la aplicación.
Será posible pintar puntos, dibujar líneas rectas, cambiar de color, borrarlo todo,
cambiar el tamaño del pincel y tomar fotografías para pintarlas después.
Este es un punto de partida estupendo para preparar juegos 2D.
Empezamos
Preparamos el equipo entrando en el navegador en la dirección
http://ai2.appinventor.mit.edu/ y empezando un nuevo proyecto que se llamará
APP02_PINTURA_NomApe (con tu nombre y apellidos).
Lo único que tenemos ahora es la pantalla (Screen1). En la columna derecha,
cambiamos la propiedad Title para que ponga “Bote de pintura”.
Los Arrangement sirven para alinear en horizontal o en vertical, pero también para
hacer tablas. Puedes crear diseños más complejos poniendo unos Arrangements dentro
de otros.
de dibujo (lienzo) que vamos a programar para que responda cuando la tocan (evento
DrawingCanvas.Touched) dibujando un círculo. Cuando alguien arrastre un dedo sobre
esta zona (evento DrawingCanvas.Dragged) dibujaremos una línea.
Ahora indicaremos el radio (en píxeles), que será 5. Pondremos 5. Para lograrlo, debes
pulsar sobre el apartado Math, y coger la pieza . Encájala en la ranura r de
Lienzo.DrawCircle y haz clic sobre el 123 para cambiarlo por un 5.
Bueno, la verdad es que hay una forma más rápida de tener un bloque con el 5 centro.
Simplemente, pulsa el número 5 en tu teclado y pulsa Intro. O escribes "number", pulsas
Intro y luego metes el 5 donde hay un 0.
Tu programa debe tener ahora este aspecto:
Este es un buen momento para comprobar que funciona lo que llevamos hecho: en tu
dispositivo móvil, pon en marcha la App y arrastra tu dedo limpio sobre la pantalla. Si has
instalado AI Companion ahorrarás tiempo, de lo contrario deberás generar el archivo apk
e instalarlo para poder probar.
Este evento se activa cuando alguien arrastra el dedo sobre la pantalla, y nos informa
sobre la posición en la que empezó el contacto del dedo (startX, startY), la posición actual
del dedo (currentX, currentY) y la posición inmediatamente anterior del dedo (prevX,
prevY). Si el usuario ha hecho el arrastre sobre un objeto del dibujo draggedAnySprite
será verdadero (True), pero eso no nos interesa por ahora.
La línea se dibujará desde las coordenadas (x1,y1) hasta las coordenadas (x2,y2). ¿De
dónde sacaremos esas coordenadas?
Sitúate sobre donde pone prevX y verás cómo aparecen dos bloques: "get prevX" y "set
prevX to". Pincha sobre "get prevX" y arrástralo junto al x1 de DrawLine.
Haz lo mismo con el resto de parámetros para que te quede como en la figura anterior.
Ahora puedes probar si funciona: pulsa para dibujar puntitos, arrastra para dibujar
líneas.
Cuando el usuario arrastra el dedo en un programa de dibujo, en realidad se dibujan
muchísimas líneas rectas, aunque el usuario sólo vea una curva por donde va arrastrando
el dedo.
Pulsa ahora sobre Lienzo y haz pulsa sobre set Lienzo.PaintColor to. No te confundas
con Lienzo.PaintColor. Aquí tienes los dos para que te fijes en sus diferencias:
El primero, que tiene un color verde más claro, sirve para informar del color actual. El
Arriba dice que cuando se pulse el BotonFoto se pondrá en marcha la cámara. Abajo
dice que cuando el usuario haya hecho la foto, ésta se guardará en la variable “image”.
Esa imagen se utilizará para sustituir a cualquier cosa que haya dibujada en ese momento
en el Lienzo porque hacemos "set Lienzo.BackgroundImage to image".
¿Te apetece probar cómo va la app? ¿Crees que puedes probarla con el emulador,
teniendo en cuenta que tiene que hacer fotos?
Tenemos que dar un valor a la variable (por eso sale el triángulo con la admiración,
porque no podemos dejarlo así). Para lograrlo, definiremos un bloque number con el valor
2. Esto se puede hacer rápidamente haciendo un clic en una zona vacía de la pantalla,
pulsando el número 2 en el teclado y pulsando intro. Encaja ese bloque en el
GrosorPunto:
Uso de variables
Remata el trabajo
Prueba tu App. Comprueba que has cambiado el icono (Screen.Icon) y el título
(Screen.Title).
La aplicación completa
Actividades
Puedes modificar esta App para que haga otras cosas:
que con los botones BotonGrande y BotonPeque se cambie también el grosor de
las líneas que se dibujan (tendrás que investigar los bloques del componente
Lienzo para ver cómo se hace)
que se muestre en algún lugar de la pantalla el valor de GrosorPunto
que el usuario pueda introducir el valor de GrosorPunto en un componente de tipo
TextBox. La introducción de datos se verá más a fondo en actividades posteriores
que se oiga un sonido cada vez que se pinta algo
que se oiga “Rojo” al pulsar sobre el botón rojo, “Azul” al pulsar el azul, etc
que se oiga “Sonríe” cuando se vaya a hacer una foto (o “¡Guapa!”, “¡Cosita!”,
“Patata, patata”)
que los botones de pintura tengan forma de botes de pintura
que haya más colores (negro, amarillo, …)
que se pueda grabar lo que se ha hecho en un archivo, siguiendo las instrucciones
Empezamos
Pon en marcha App Inventor y empieza un nuevo proyecto. Llámalo
APP03_TOPO_Nombre_Apellido (con tu nombre y apellidos). Cambia el título de la
Utiliza ese botón para subir mole.png. Entra en Screen1 y cambia la propiedad Icon
para que sea esa misma imagen.
Los contadores
Vamos a poner en la pantalla los contadores de aciertos y fallos:
1. Layout/HorizontalArrangement. Arrastra este componente y déjalo caer debajo
del botón Reset. No le cambies el nombre.
2. User Interface/Label. Arrastra dos componentes de estos dentro del anterior. El
primero te resultará muy fácil pero el segundo lo tendrás que hacer con cuidado,
fijándote en la línea azul que te indica a dónde va a ir a parar:
Si quieres que el topo se mueva más deprisa o más despacio, ya sabes cómo hacerlo.
Los marcadores
Recuerda que tienes dos contadores que valen 0 y que hay que ir actualizando.
Utilizaremos el bloque Canvas1.Touched que indica que la zona de juego ha sido tocada,
y nos dice las coordenadas (x,y) del toque, que no nos hace falta esta vez, y si se ha
tocado un sprite, que sí que nos hace falta. Fíjate en lo que tienes que hacer y luego
tendrás la explicación:
Debes fijarte muy bien en cada paso. A estas alturas ya no debes confundir un bloque
“set … to” con un bloque sin las palabras “set” y “to”. Tampoco debes confundir una suma
con una resta ni nada por el estilo.
Abstracción procedimental
Hemos definido un procedimiento por primera vez, el MueveTopo, pero no hemos
explicado qué es exactamente un procedimiento.
Un PROCEDIMIENTO, en programación, es un fragmento de programa al que se pone
nombre para que después se le pueda llamar desde diferentes sitios.
En esta app, el procedimiento MueveTopo es llamado al ponerse en marcha la app y
también a cada segundo. Si no utilizáramos procedimientos, deberíamos haber copiado
las mismas instrucciones en Screen1.Initialize y en Clock1.Timer. El hecho de copiar y
pegar hace que el programa sea más largo y complejo y que nos podamos equivocar con
más facilidad, pues si encontramos un error en las instrucciones repetidas debemos
corregirlo en dos sitios.
Debes saber que App Inventor es un entorno de programación más sencillo que los que
se suelen utilizar profesionalmente.
En un entorno profesional, mientras una persona prepara un procedimiento, como
MueveTopo, otra persona puede estar programando el funcionamiento de
Canvas1.Touched y utilizando el procedimiento MueveTopo, y una tercera persona puede
encargarse de programar Screen1.Initialize y utilizar también el procedimiento
MueveTopo. Sólo la persona que lo define sabe cómo está hecho, las otras dos no
necesitan saber cómo está hecho MueveTopo, sólo necesitan saber qué es lo que hace.
Se llama abstracción procedimental porque quien utiliza el procedimiento no necesita
saber cómo está hecho, sólo lo que hace.
Antes de seguir leyendo piensa en qué necesitas hacer para poder poner los
contadores a cero.
¿Ya lo has pensado? Si es así, sigue leyendo.
Necesitas un bloque "when BotonReset.Click" que, al pulsarlo, ponga un 0 en el
contador de aciertos y otro 0 en el de fallos:
Para crear un bloque “number 0” basta con pulsar un 0 en el teclado y pulsar intro. Para
hacer un set EtiquetaContadorAciertos.Text to puedes buscar dónde lo has utilizado
antes, pulsar sobre él, pulsar después CTRL-C y CTRL-V para copiar y pegar, y, por
último, llevarte la copia a donde te interese.
Actividades
Puedes modificar la aplicación Machacar Topos de muchas formas. Aquí tienes algunas
ideas:
hacer que el topo se mueva cuando lo tocas, porque ahora mismo un jugador hábil
puede tocarlo varias veces sin que se mueva del sitio
añadir un botón que haga que el topo se mueve más deprisa o más despacio
añadir un contador de movimientos, que diga cuántas veces se ha movido el topo
cambia la imagen del topo. No debe ser muy grande y no vale un gif animado. Se
recomienda una de tipo PNG porque soporta transparencia. Así, lo que rodea al
topo no será un rectángulo sino que permitirá ver el terreno de juego
añade un segundo personaje (ImageSprite), por ejemplo una flor o un gatito, que el
usuario no debería machacar; si el jugador lo machaca, le restas aciertos o pones
“game over”
también podrías poner un personaje más malvado que suba puntos
puedes hacer que al machacar el topo se oiga un sonido (como el que hace una
cucaracha cuando la pisas)
puedes cambiar la imagen del topo por la de otra cosa, como por ejemplo una
persona que te caiga mal, o utilizar el componente ContactPicker para que el
usuario pueda elegir la imagen de uno de los contactos que hay grabados en el
móvil. El componente ContactPicker está dentro del apartado Social.
En actividades posteriores aprenderás más técnicas para juegos, como detectar
colisiones entre componentes ImageSprite que se están moviendo. Concretamente, lo
verás en la actividad “6. La Mariquita”.
También puedes utilizar un bloque if para hacer esto porque en la parte else no
estamos haciendo hada. El bloque if se diferencia del ifelse en que no hay else.
Al grano
Pon en marcha App Inventor y empieza un nuevo proyecto. Llámalo
APP04_ARCADE_Nombre_Apellido (con tu nombre y apellidos). Cambia el
título de la pantalla (Title) a “Arcade”.
Piensa un momento cómo podrías hacer que la bola se moviera hacia arriba.
Concretamente, haremos que cada décima de segundo la bola se eleve 100 píxeles.
NO SIGAS LEYENDO y piensa. Si vas a utilizar el emulador, que se vaya poniendo en
marcha mientras piensas.
¿Ya lo tienes? Bien, pues sigue leyendo, a ver si tus ideas coinciden con lo que viene
ahora.
Editor de bloques
Haz esto:
Disparar
Como puedes observar, el misil se mueve sin que nosotros hayamos disparado. Para
que se mueva sólo cuando disparamos, primero debemos ir al diseñador y cambiar la
propiedad TimerEnabled del Clock1 para que la casilla no esté marcada. Así, mientras no
digamos nada, el temporizador estará quieto y no ocurrirá nada cada 100 milisegundos.
Acto seguido, en el editor de bloques, tienes que añadir el bloque NaveAmiga.Touched:
empieza a moverse
Si tenemos el emulador en marcha, veremos que la modificación que hemos hecho ya
funciona: el misil sólo se mueve cuando tocamos la nave amiga.
Ahora le estás diciendo que cuando el usuario toque la nave amiga, se hará visible el
misil y se pondrá en marcha el temporizador.
Como ya habrás adivinado, hacer set Misil.Visible to true es lo mismo que ir al
diseñador y marcar la casilla de la propiedad Visible del Misil, sólo que cuando la App está
en marcha no podemos ir al diseñador a marcar o desmarcar nada.
Por último, haz esto para que el misil deje de verse cuando llegue a la parte superior de
la pantalla:
Paso a paso:
1. Screen. Ponle AlignHorizontal a Center.
2. añades un HorizontalArrangement y le pones Center en Align.
Vale, ahora sigue leyendo para ver si lo que vamos a hacer es lo que tú te imaginabas:
Y haz algo similar para el botón derecho (si utilizas bien CTRL-C y CTRL-V te costará
muy poquito de hacer).
Comprueba en el emulador que los botones funcionan.
Fíjate lo que ocurre cuando disparas... ¿qué te parece?
Ahora tienes que hacer esto para que el misil salga de donde toca, que es desde arriba
de la nave pero desde el centro (siempre que tu nave tenga el lanza-misiles en el centro,
claro está):
Manejar el marcador
Cuando hagamos blanco, que se vea en el marcador:
El misil empieza su vuelo 20 píxeles por encima de la NaveAmiga. Ese 20 habría que
cambiarlo por la cifra que vaya bien con el tamaño del misil y de la NaveAmiga.
Cuando el misil alcanza la nave enemiga, éste debe desaparecer, así que tenemos que
modificar el bloque Misil.CollidedWith:
Actividades
Puedes modificar esta app para mejorarla. Aquí tienes algunas ideas:
que desaparezca la nave enemiga al alcanzarla con el misil
que se oiga una explosión
que antes de desaparecer la nave enemiga su imagen cambie a la de una
explosión
que el terreno de juego no sea una imagen en blanco, sino algo más adecuado
que al hacer blanco el teléfono vibre
que los botones sean más atractivos
que la nave enemiga suba o baje de vez en cuando
Mejoras gráficas:
se puede poner un color en el terreno de juego (Canvas) que no sea blanco. Eso
nos obligará a cambiar las imágenes de nuestras naves porque si no veremos que
están metidas en un rectángulo blanco. El modo de eliminar ese rectángulo
consiste en utilizar un programa como GIMP para cambiar el blanco por
transparencia (añadir canal alfa) y exportar la imagen como PNG (el JPG no
soporta transparencia).
Aunque actualmente los SMS no se utilicen mucho, no es posible hacer una App que
nos lea los WhatsApps, y hacer una que trabaje con Twitter resulta demasiado complejo
en este momento. Esta App sigue siendo muy interesante por los componentes que se
van a manejar por primera vez.
componente TinyDB
cómo utilizar nuestra posición geográfica, con el GPS de nuestro dispositivo
Empezamos
Pon en marcha App Inventor y empieza un nuevo proyecto. Llámalo
APP05_SMS_Nombre_Apellido (con tu nombre y apellidos). Cambia el título de la pantalla
(Title) a “SMS. Si tecleas no conduzcas”.
Diseña la aplicación
El diseño es muy sencillo:
Queremos que el teléfono nos lea en voz alta el mensaje, por eso hemos puesto un
TextToSpeech.
Como queremos que al recibir un SMS nuestro teléfono responda enviando otro SMS
con el texto que hemos puesto en el Label Respuesta, utilizaremos un bloque
SendMessage dentro del MessageReceived:
Para comprobar que el programa funciona no nos sirve el emulador, y tampoco nos
será muy útil una tableta si no es capaz de conectarse a Internet mientras vamos
Además, el componente Texting1 tiene una propiedad un tanto peculiar, que se llama
“ReceivingEnabled”, y que puede tener estos valores:
1 – Off. Cuando vale 1, el componente Texting no recibe mensajes.
2 – Foreground. Cuando vale 2, el componente Texting sólo recibe mensajes si la
App está en pantalla. No los responde si está apagada o si tenemos otra en
pantalla en ese momento.
3 – Always. La App recibirá el mensaje siempre. Si está en pantalla, responderá en
seguida. Si no está en pantalla, Android guardará el mensaje hasta cuando la
pongamos en marcha, y entronces lo recibirá y responderá.
Lo que necesitamos es que la app guarde la frase cuando el usuario la cambie, y que la
lea nada más poner en marcha la app. Pero no podemos guardarla en cualquier sitio. Si la
guardamos en Respuesta.Text al parar la app se pierde su valor, porque es una
MEMORIA TEMPORAL. Necesitamos guardar la frase en una MEMORIA
PERMANENTE, un lugar que no pierde las cosas al parar la app y tampoco cuando
apagamos el Smartphone.
Vamos a utilizar un componente TinyDB. Este componente tiene dos funciones:
StoreValue y GetValue. La primera guarda un valor y la segunda lo recupera.
Para guardar algo necesitamos utilizar una CLAVE.
Veamos cómo tiene que quedar:
¿Lo has entendido? No creo, porque de repente la app se nos ha complicado bastante.
Pero no importa, en seguida comprenderás por qué tenemos que hacerlo así.
Cuando la app empieza, entra en Screen1.Initialize.
Acto seguido, leemos de la base de datos el valor que está guardado con la clave
En el diseño de la aplicación es posible que te dieras cuenta de que había un Label que
se llamaba PosicionActual con Text valiendo “Posición Actual”. Si no es así, añádelo
ahora.
En el editor de bloques:
Con eso es suficiente para que veamos dónde estamos, aunque no nos estén enviando
SMS nadie.
Ahora modificamos el mensaje de respuesta para incluir nuestra última posición
conocida:
Actividades
¿Se te ocurre cómo mejorar tu app?
Como esta app ya es de por sí bastante complicada, no se proponen cambios.
Bueno, pensándolo mejor, como hoy en día los SMS han ido a menos, y para muchos
usuarios no son gratuitos, puedes investigar el componente Twitter. ¿Serías capaz de leer
en voz alta los tweets que te envían? ¿Y de enviar uno de respuesta? En tal caso, te
recomiendo un par de cosas:
que utilices “Save As” para guardar una copia de tu app (o también puedes pulsar
CheckPoint, que sirve paralo mismo). Así, si tus experimentos con Twitter no dan
buen resultado, siempre puedes volver a la versión SMS.
que no elimines los bloques SMS. Simplemente, desactívalos con botón derecho,
Disable Block.
6. La Mariquita
Los juegos son divertidos para el que los utiliza pero también para el que los hace. En
esta app una mariquita irá comiendo pulgones y huyendo de una rana que se la querrá
comer a ella.
Empezamos
En la carpeta “Material Necesario” está el material. Si no la tienes, descárgate las
imágenes de la mariquita (ladybug), el pulgón (aphid) y la rana (frog) del sitio web
http://examples.oreilly.com/0636920016632/, apartado CH05_LadybugChase. También
necesitarás el sonido de la rana (FROG.WAV).
Mientras utilices esta app es probable que necesites desactivar la rotación automática
de la pantalla.
Empieza la APP06_MARIQUITA_NomApe.
Recuerda poner lo que toca en Screen1.Title.
Carga todas las imágenes y el sonido con el botón “Upload new...” que hay debajo de
“Components”, donde dice “Media”. Como icono tienes que poner la de la mariquita.
Poner componentes
Definir el comportamiento
En el editor de bloques, en lugar de sacar los bloques de los apartados que hay a la
izquierda de la pantalla, puedes teclearlos. Prueba y verás. Tienes que definir el
procedimiento ActualizaMariquita y Clock1.Timer como en la figura:
La variable Energia
Define la variable Energia con un valor inicial de 200.
Lo que hace es dibujar primero una línea blanca que va de lado a lado de la pantalla, en
el Canvas IndicadorEnergia. Después dibuja una línea roja que no es tan larga. Dibujar
primero la línea blanca sirve para borrar la línea roja que tal vez habíamos dibujado antes.
Si más adelante queremos cambiar la forma de visualizar la energía, bastará con
modificar el procedimiento VisualizarEnergia, no nos hará falta cambiar nada del resto del
programa.
(en el emulador puedes cambiar Mariquita.Speed a 20 y Mariquita.Heading a 90 para
comprobar)
Prueba ahora tu App. Verás que se gira la pantalla automáticamente, lo que resulta muy
molesto. Podemos hacer que nuestra App no gire con el giroscopio así: en el componente
Screen1 cambia la propiedad ScreenOrientation a Portrait.
Inanición
Morir de inanición es morir de hambre.
A diferencia de las apps que hemos hecho hasta ahora, en este juego hay un final: si la
mariquita no come lo suficiente se acabó, y si la rana se la zampa también.
En ambos casos, la mariquita deberá detenerse. Esto podemos hacerlo poniendo a
Mariquita.Enabled el valor false. También habrá que cambiar la imagen de la mariquita
viva por la de la mariquita muerta. Eso se hace dando a Mariquita.Picture el valor
adecuado, que es el nombre de la imagen que hemos cargado y que se llama
dead_ladybug.png.
Define el procedimiento GameOver así:
Añadir un pulgón
Nuestra mariquita se muere de hambre. Hay que poner un pulgón en el terreno de
juego para que se lo zampe.
otro pulgón. Aunque el jugador se crea que es otro pulgón, para el programador es en
realidad el mismo.
Añade un ImageSprite
Añade ahora la figura del pulgón, y procura no ponerlo encima de la mariquita ni
demasiado cerca. En inglés lo llaman aphid. La traducción real sería áfido y se referiría a
un pulgón o algún otro insecto similar.
Ponle la imagen que toca, el intervalo a 10 (cada 10 milisegundos se mueve) y la
velocidad (Speed) a 2, así no se moverá demasiado deprisa y la mariquita lo podrá cazar.
El resto de propiedades las pondremos en el editor de bloques.
La explicación es esta:
cada tic del reloj Clock1 se ejecutan los procedimientos ActualizaMariquita y
ActualizaPulgón. Esto ocurrirá 100 veces por segundo, porque Clock1.Interval lo
pusimos a 10 milisegundos
en ActualizaPulgón se genera un número fraccionario entre 0 y 1
si ese número es menor que 0'2, cosa que ocurre el 20% de las veces, el pulgón
cambiará de dirección
la nueva dirección se calcula generando un número entero al azar entre 0 y 360
porque queremos que pueda moverse en cualquier dirección
Finalmente, compara tu código con este para ver qué cosas has hecho igual y qué
cosas has hecho diferentes. Tal vez debas corregir algo:
Pulsa otra vez sobre la rueda dentada para que desaparezca la herramienta de
modificación, y a ver si eres capaz de conseguir que que te quede así el procedimiento
ActualizaPulgón:
Así, cuando el juego termina, se pulsa el botón y todo vuelve como al principio, incluso
se devuelve a la mariquita la imagen de una mariquita viva (ladybug.png).
Lo ideal sería que ese botón no se pudiera ver hasta el momento de ejecutar
GameOver.
Añadir la rana
El juego resulta demasiado sencillo ahora mismo, así que necesitamos un depredador.
Vamos a añadir una rana que se va a mover directamente hacia la mariquita. Si la
alcanza, se la come y termina el juego.
Complicado, pero como aquí tienes la solución no hay problema. Ni siquiera hay que
saber qué es una arcotangente.
Con ese código, el 10% de las veces la dirección de la rana cambia directamente hacia
la mariquita.
La resta de las coordenadas Y parece invertida, pero eso se debe a que en Android las
Y crecen hacia abajo, mientras en matemáticas las Y crecen hacia arriba.
Ahora hay que añadir este último procedimiento a “when Clock1.timer do”:
El retorno de la rana
BotonReiniciar.Click ya es capaz de cambiar una mariquita muerta por una viva, pero
nos falta hacer que aparezca en otro lugar. ¿Dudas de si es necesario cambiarla de lugar
o no? ¿Te has parado a pensar qué pasaría si no cambiáramos de
¿Algún problema?
Pues sí, resulta que la mariquita puede aparecer justo encima del pulgón o de la rana.
Mejor aún, pueden aparecer todos unos encima de otros.
Comprueba el funcionamiento de tu app.
Actividades
Aquí tienes formas de mejorar o personalizar el juego (elige alguna, pero no todas):
mejorar la presentación:
pon una imagen de fondo en el terreno de juego que sea el césped de un jardín.
Procura que no tenga más de 100 píxeles de alto.
Edita las imágenes de la mariquita, el pulgón y la araña para sustituir el
recuadro blanco que las rodea por transparente. Esto se puede hacer con
GIMP: herramienta de selección por color, hacemos clic en la zona blanca,
pulsamos Supr y exportamos la imagen resultante sobre el archivo original. Acto
seguido, volvemos a subirlo a App Inventor. El icono también nos quedará mejor
una vez retirado el rectángulo blanco
Bloquea la orientación de la pantalla porque jugar mientras se está girando la
pantalla es una pesadilla. Tendrás que revisar las propiedades del componente
Screen en el diseñador
Más mariquita
Se puede hacer rápidamente cualquiera de las siguientes cosas:
poner un “botón abajo” que, al pulsarlo, haga que la mariquita se mueva hacia
abajo (es útil para el emulador, y también para un dispositivo Google TV) (tendrás
que desactivar el control de dirección actual para que esto funcione)
lo mismo para otras direcciones (8 direcciones)
visualizar la velocidad actual en algún rincón de la pantalla
botón de suicidio. Al pulsarlo termina el juego, igual que si la rana se hubiera
comido a la mariquita
7. Trabajo Libre
Si no quieres hacer un examen, deberás hacer un trabajo libre. Aquí tienes unas ideas
sobre cosas que podrías hacer, o sobre cómo podría ser un examen.
¡¡Ánimo, que tú puedes!!
Utilizamos la Image para poner una imagen que no hace nada, no necesitamos un
botón. La “Image” es un elemento más sencillo, sin tantas opciones.
La etiqueta Label, como el lector recordará, es más simple que el TextBox, y es mejor
cuando no necesitamos que el usuario teclee nada.
El ListPicker veremos en seguida que sirve para mostrar una lista de opciones para
escoger una.
El ActivityStarter es un componente un tanto extraño que sirve para lanzar otra app.
Cuando cerraremos esa otra app nuestro Smartphone o Tableta regresará a nuestra app.
Decimos que es un componente extraño por las enigmáticas instrucciones que requiere
para funcionar.
En ActivityStarter1 debes poner exactamente lo que sigue a continuación, fijándote muy
bien en los puntos, las minúsculas y las mayúsculas, o no te funcionará:
Action: android.intent.action.VIEW
ActivityClass: com.google.android.maps.MapsActivity
ActivityPackage: com.google.android.apps.maps
Añadir comportamiento
Acabas de definir la variable “destinos” y le has dado como valor una lista de textos.
Bueno... en lugar de esos, escribe estos otros (ya cambiarás más adelante):
“Torre Eiffel”
“museo del louvre”
“notre dame”
Más adelante podrás cambiarlos, pero ahora necesitamos poner unos que Google
Maps pueda encontrar con facilidad.
Ahora prueba una cosita para que aprendas un poquito sobre geolocalización: introduce
como destino “39.99406,-0.06745562”. Se trata de unas coordenadas. Verás que Google
Maps te lleva a una dirección eso es así porque el enlace https://maps.google.com/?
q=39.99406,-0.06745562 es una búsqueda de Maps que consiste en ir a esa latitud y
longitud.
La referencia que hemos copiado y pegado es muy larga, y tendrá un aspecto similar a
este:
https://maps.google.es/maps?
q=Torre+Eiffel&hl=es&ll=48.857727,2.29434&spn=0.004002,0.010568&sll=39.316265,-
0.418859&sspn=4.81849,10.821533&oq=torre+eif&t=h&hnear=Torre+Eiffel&z=17.
Pulsando sobre “URL corta” el enlace se reducirá muchísimo y servirá igual:
El segundo ítem debes construirlo tú utilizando Google Maps para localizar tu segundo
destino turístico. Con el eslabón de Google Maps consigue la URL corta y pégala aquí.
El tercer ítem lo debes preparar de la misma forma que el segundo.
Tour Virtual con Web Viewer (versión 2 de App Inventor) – sin terminar
Con ActivityStarter se pone en marcha otra App y el usuario volverá a la nuestra
pulsando el botón de regresar.
Pero con Web Viewer podemos visualizar una página web, incluso de Maps, sin
abandonar nuestra aplicación.
Vamos a mejorar nuestra App de modo que podamos utilizar la posición exacta de lo
que queremos mostrar a nuestro usuario. Imagínate que quieres hacer Geocaching
(búsca del tesoro). Google Maps no sabe dónde has escondido cada tesoro, pero sí que
podrías averiguar las coordenadas y guardarlas en tu App. Por eso no nos vale con decir
a nuestra App que diga a Maps que busque “Torre Eiffel” porque queremos llevarlo a un
sitio sin nombre.
Puedes guardar ahora tu proyecto añadiendo al nombre “v2” para conservar tu App
“versión 1”.
https://www.google.es/maps/@39.9880797,-0.025978,18z
https://goo.gl/maps/eKNZY
En la primera vemos las coordenadas, que podríamos cambiar a nuestro gusto,
pero ahora nos interesa más la segunda, por ser más corta.
Copia la URL corta y pégala así en el editor de bloques:
cuando ya tengas introducidas todas las que quieras, añade el siguiente bloque,
que sirve para mostrar en el mapa de tu App el destino elegido por el usuario:
Actividades
Puedes cambiar la imagen y los destinos de tu actividad para que te guste más. Tienes
total libertad para escoger los que quieras.
No vamos a entretenernos mucho con esta actividad porque nos interesa terminar la
siguiente pronto. Así, con lo que aprenderemos en estas dos, podremos hacer cosas
increíbles.
Empezamos
Prepara un nuevo proyecto y llámalo APP09_MICOCHE_Nombre_Apellidos. Pon el Title
“¿Dónde está mi coche?”. Puedes descargarte la imagen de un coche y utilizarla como
icono de la aplicación.
Tienes que poner los siguientes componentes con los textos que se indican:
Screen1 Casilla “Scrollable” desmarcada (para que se vea todo sin tener
que desplazarse arriba y abajo).
Screen1 Casilla “Sizing”, cambiar de Fixing a Responsive (para que se
vea bien en una tablet)
Label1 “Posición Actual:”
Label2: “Dirección:”
DireccionActual: “desconocida”
Label4: “GPS:”
GPSLatActual: “0”
GPSLongActual: “0”
BotonGuardar “Guardar Dirección Actual”
Label5: “Dirección Guardada”
Label6: “Dirección:”
DireccionGuardada:”desconocida”
Label8: “GPS:”
GPSLatGuardada: “0”
GPSLongGuardada:”0”
Actividades
¿Qué se te ocurre para mejorar esta app?
Haz una lista sin preocuparte mucho de qué cosas son realmente realizables y cuales
pueden ser demasiado complicadas.
Después, examina una a una tus propuestas pensando cuales costarían poco de hacer
y pueden ser interesantes, y descarta el resto.
Puede que te interese echar un vistazo al apartado “Cálculo de la distancia entre dos
puntos (mochila)”, en la página 219.
Haz alguna de las que te han quedado.
Si no se te ocurre nada, aquí tienes algunas ideas:
mejorar el aspecto. Ahora mismo el aspecto de la App es más bien feo. Estamos
poniendo mucha información de texto con unos pocos botones y nos comemos así
más de media pantalla. Sería mejor compactar un poco y decorar los botones con
iconos
mejorar la funcionalidad. Tenemos poco espacio para el mapa. Aunque mejoremos
el aspecto, deberíamos probar nuestra App. A ser posible, en más de un
dispositivo, para ver cómo cambia según el tamaño de la pantalla y, así, mejorar el
diseño
Diseñar la aplicación
Empieza tu nuevo proyecto APP10_DONDE_ESTAIS_NombreApellidos.
También podemos ver que su teléfono guarda la posición con más precisión que los
demás.
Además, se da la circunstancia de que “Pedro” cuando guarda la posición con su móvil
no sólo lo hace con la clave “Pedro” sino también con las claves “Román”, “Juan Manuel”
y “Raquel”. Lo hace porque así esos otros 3 que no tienen móvil Android pueden probar
en su emulador la app. No podrán guardar su posición GPS pero sí que podrán probar
otras cosas con el emulador.
Para saber cómo se preparara un sitio web como http://situaciongps.appspot.com/ hay
que leer el apartado “Anexo I. Cómo Dar de alta un sitio web para TinyWebDB“ en este
mismo documento.
Después, abre otra vez la APP10 (ésta) y pincha en la mochila. Verás que puedes coger
de dentro los bloques que te acababas de guardar. Tendrás que sacarlos y, luego, añadir
el LocationSensor1 y las Label correspondientes.
Cuando se utilice tu App, al pulsar el botón de guardar, deberá guardarse tu posición en
Internet en la clave elegida. Recuerda cómo guardaste esta información en la actividad “9.
¿Donde está mi coche?” porque tienes que hacerlo igual, si bien ahora utilizarás
TinyWebDB1 en lugar de TinyDB1.
Bueno, no exactamente. En lugar de utilizar las claves “dirección”, “latitud” y “longitud”
como allí, vamos a guardar los tres valores en la misma clave, que será la Clave.Text.
Vamos a guardar en el mismo campo todo el contenido. Para conseguirlo, vamos a crear
una lista, de forma parecida a como lo hicimos en la bola 8 :
Del mismo modo que se hizo allí, tienes que hacer que el botón Guardar no esté
habilitado al poner en marcha la app y que se habilite en el momento en que se detecte la
posición GPS, o de lo contrario corres el riesgo de guardar una posición GPS no válida en
la base de datos.
que funciona.
Una vez lo tengas hecho, desactiva la parte de código que abre Google Maps (pero no
lo borres). Añade un comentario para que se sepa qué hace ese código comentado.
Seguimiento
(ahora entregamos al profesor una captura de pantalla del diseñador y dos del editor de
bloques, no una sola porque es mucho lo que hay que capturar)
valdrá.
Cambiamos por lo tanto la pantalla en el diseñador para que quede más clara,
eliminamos el botón recuperar, etc:
Para que el código quede mejor, vamos a utilizar por primera vez un procedimiento con
argumentos. Para definir este procedimiento, buscamos “procedures” dentro de Built-In, lo
utilizamos y le cambiamos el nombre “procedure” por “DibujarRuta”. Después, también
dentro de Built-In/Definition, buscamos el bloque “name” y lo arrastramos como primer
argumento (arg) y lo llamamos LatitudDesde. Repetimos la operación para los
argumentos LongitudDesde, LatitudHasta y LongitudHasta. Cuidado: es muy importante
que respetes el orden de los argumentos.
Como lo que va a hacer es llamar a maps para dibujar una ruta desde el punto inicial
hasta el punto final, copiamos el código necesario desde otro lugar del editor de bloques
donde ya lo tengamos escrito, y cambiamos lo necesario para que dibuje utilizando los
argumentos LatitudDesde, LongitudDesde, LatitudHasta y LongitudHasta. Una vez hecho
esto, el procedimiento DibujarRuta quedará así:
Ahora vamos a ver paso a paso la solución a los demás puntos de la lista anterior.
(Direcion.Text)
Hemos definido MiLista para dejar más claro el código, aunque habría sido posible
hacerlo sin definir esa variable.
Por otra parte, fíjate en que no utilizamos LocationSensor1.CurrentAddress sino
Direccion.Text, y tampoco utilizamos LocationSensor1.latitude ni
LocationSensor1.longitude sino GPSLatitud.Text y GPSLongitud.Text. Aunque parezca
que esto no es importante, sí que lo es. Vamos a imaginarnos una situación un poquito
especial para entender esto. Imagínate que tu teléfono detecta la posición, y la pone en
Direccion.Text, GPSLatitud.Text y GPSLongitud.Text porque se activa
LocationSensor1.LocationChanged. Te sigues moviendo y, en un momento dado, pierde la
señal GPS. Si en ese momento pulsas el botón GUARDAR-POSICION-ACTUAL resulta
que LocationSensor1.CurrentAddress vale “No address available”,
LocationSensor1.latitude vale 0 y LocationSensor1.longitude vale 0. Es mejor hacerlo
como en la figura anterior para que se guarde la última posición válida conocida.
nuestra posición, con el botón correspondiente, lo que hicimos fue guardar una lista en la
que el primer elemento era la dirección, el segundo la latitud y el tercero la longitud.
Sabiendo eso, ya podemos llamar a DibujarRuta con los parámetros apropiados. El
resultado será una ruta en Google Maps desde donde estamos ahora hasta la posición
que habíamos guardado.
La otra posibilidad era que no hubiera ninguna posición guardada. En tal caso,
mostramos el error “No hay una posición válida guardada”.
Al final ponemos también el bloque TinyWebDB1.WebServiceError por si la base de
datos devuelve algún error extraño.
Lo único que tenemos que hacer es pedir a la base de datos que lea la posición
guardada con la clave “Miguel”. En realidad, esa clave la hemos guardado en el diseñador
de la app, en el texto asociado al botón de Miguel, es decir, en botón BotonMiguel.Text.
El bloque TinyWebDB1.GotValue se encargará del resto, como hemos visto en el punto
anterior. Incluso en el caso de que Miguel no haya guardado su posición no pasará nada
malo: sencillamente veremos el error “No hay una posición válida guardada”.
Elimina ahora los botones que sobren y añade los que te falten, teniendo en cuenta los
compañeros que tienes.
voyy
Actividades
Esta app es la más compleja que hemos visto y por eso mejorarla es difícil. Si te
atreves a hacer alguna mejora, copia primero con “Save As” porque es probable que
queriendo mejorarla termines por estropearla.
Se sugieren las siguientes mejoras o cambios:
informar de la distancia desde nosotros hasta un compañero
mostrar los errores en otra ventana. Como nuestra app tiene una ventana muy
recargada, puede ser bueno quitar la etiqueta “Posible error” con su mensaje
MsjError y llevarlas a otra ventana. Necesitarás, en el diseñador, pulsar el botón
“Add Screen”. En el editor de bloques deberás utilizar el procedimiento “Open
Another Screen”. También tendrás que ser capaz de cerrar esa ventana (pulsando
un botón) para volver a la anterior.
Utilizar esta app (cambiada de nombre) para detectar las 7 bolas del dragón.
Primero, un compañero escondería las 7 bolas en diferentes lugares. Para ello,
tendría una app que podría llamarse “Marcar posición de las bolas” y que tendría 7
botones, uno para guardar la posición de cada una de las 7 bolas. Iría a un sitio,
escondería la bola 1 y pulsaría el botón GUARDAR-POSICION-BOLA1. Iría a otro
sitio, escondería la bola 2 y pulsaría el botón GUARDAR-POSICION-BOLA2. Así
hasta 7. después, el segundo jugador utilizaría la aplicación “Buscar bolas”. Para
encontrar la primera pulsaría el botón “BOLA-1” y le saldría la ruta desde donde
está hasta la bola 1. Además, podría utilizar el botón DETECTAR para saber si hay
una o más bolas cerca.
3.2 El Ahorcado
Introducción
En https://youtu.be/nYNKXm4p_HU podemos ver una versión del juego del ahorcado
hecho con App Inventor. Aquí vamos a ver eso mismo pero con unas pocas diferencias:
la versión del vídeo se hizo con la beta de App Inventor, aquí se ha adaptado a App
Inventor 2
los comentarios que se hacen aquí están pensados en la gente que ha seguido
este curso. Por este motivo, hay cosas básicas en el vídeo que aquí se dan por
sabidas, pero se explican otras que en el vídeo no se tratan
aquí se ha procurado mejorar un poco el estilo de programación, quitando código
redundante y convirtiendo variables globales en locales (en App Inventor 1 no
existían)
se han cambiado algunos nombres de variables y de procedimientos para hacer el
código más comprensible
En YouTube, bajo el vídeo, hay un enlace a Ahorcado.zip que hay que renombrar a
"Ahorcado.aia" para poderlo importar en la versión 2 de App Inventor. El contenido
consiste en una App sin nada de código pero con las imágenes que vamos a necesitar
para realizar la actividad. Pero en la carpeta “Material Necesario” que se adjunta a este
PDF podrás encontrar el “Ahorcado_esqueleto.aia” mejorado que debes utilizar.
A trabajar
Localiza el archivo "Ahorcado.aia" que se ha comentado en la introducción e impórtalo
desde Projects → Import project (.aia) from my computer.
Cuando vas a hacer un bizcocho, lo primero que haces es poner el horno en marcha
para no tener que esperar a que se caliente. Pues aquí igual, pero con el emulador: si vas
a trabajar con emulador o con AI Companion, ponlos en marcha y que se vayan
preparando mientras tú sigues leyendo.
un botón con la imagen que podemos apreciar a la izquierda, que está colocado
dentro de un VerticalArrangement
en "Media" tenemos cargadas las siguientes imágenes: 0.png, 1.png, ..., 7.png,
ahorcado.png, inicio.png
como podemos ver en las propiedades de Screen1, el icono de la aplicación es
inicio.png y el título Ahorcado.
no hay nada de código preparado
Parece que eso sea todo, pero aún hay más. En la parte de arriba de la pantalla verás
que Screen1 es un desplegable. Selecciona Juego y verás el resto de componentes:
Para añadir esta segunda pantalla alguien pulsó sobre Add Screen, la llamó Juego y le
puso sus componentes.
Ponte otra vez en Screen1 y empezamos.
La segunda pantalla
Prácticamente todo el juego se va a desarrollar en la pantalla Juego, por lo que vamos
a repasar sus componentes más importantes:
lblintentos. Es el contador de intentos que quedan. Se utiliza una Label para
mostrar el texto y que el jugador no lo pueda modificar.
txtLetra. Es la letra que introduce el usuario. Se utiliza un componente Text porque
necesitamos que el usuario pueda cambiarlo.
btnComprobar. El jugador lo pulsa tras introducir cada letra.
btnEmpezarDeNuevo. Este botón está inicialmente oculto. Tiene la propiedad
Visible desmarcada. Si lo hacemos visible veremos que aparece justo debajo del
botón Comprobar. Se hace visible cuando el juego termina, para poder volver a
empezar.
imagen. Esta imagen irá cambiando según el número de errores. Con cada error
avanzaremos a la imagen siguiente hasta completar el ahorcado.
Notifier1. Notificará al jugador que ha ganado o perdido.
Label1. Tendrá la primera letra de la palabra secreta, la que hay que adivinar. Es la
primera de las 6 casillas vacías.
Label6. Tendrá la sexta letra.
Primero tenemos que tener claro cómo empieza el juego. Puede empezar de dos
formas, o bien cuando se abre la pantalla "Juego" o bien cuando se pulsa el botón
btnEmpezarDeNuevo:
Una vez el programa se ha iniciado, no se hace nada hasta que el jugador pulsa una
tecla y, después, pulsa sobre btnComprobar. Entonces el programa comprobará si la letra
forma parte de la palabra secreta. Si es así, irá destapando cada casilla en la que aparece
esa tecla y comprobará también si ya se ha adivinado la palabra completa, en cuyo caso
termina el juego (FIN). Si, por el contrario, la letra que ha introducido el jugador no está en
la palabra secreta, se dibujará un trocito más del ahorcado y comprobará también si está
completo el dibujo del ahorcado, en cuyo caso termina el juego (FIN).
Si el juego ha finalizado se tiene que habilitar el botón btnEmpezarDeNuevo para que
suceda lo que se ha explicado en el primer diagrama.
No importa qué valores demos ahora a estas variables porque les daremos el valor
inicial en el procedimiento inicializar. Se explicará para qué sirven cuando se utilicen por
primera vez.
Veamos (ya de una) el primer procedimiento:
cuenta que el bloque join une dos textos, en este caso es un "0" (valor de "dibujando") y
".png".
"encontrada" es una variable... ¡que no hemos definido aún! Bueno, pues defínela
ahora, que ya sabes cómo se hace. Más adelante se explicará para qué sirve.
"intentosDisponibles" vale inicialmente 7. Conforme se cometan errores, se reducirá el
número de intentos disponibles.
"txtLetra" lo utilizaremos para... seguramente no nos hará falta y lo eliminaremos.
btnComprobar debe ser visible mientras jugamos, porque el jugador lo necesita.
btnEmpezarDeNuevo no debe ser visible mientras se juega.
lblintentos sirve para mostrar el valor de intentosDisponibles.
elegirPalabraSecreta es el segundo procedimiento, que tenemos aquí:
Se asigna una palabra al azar entre las que hay escritas. Si queremos ampliar el juego
pondremos más palabras de 6 letras escritas en mayúsculas.
Por una parte, declaramos una variable global que se llama "encontrada". No importa el
valor que le demos al declararla en el bloque "initialize global" porque le daremos en cada
momento el valor adecuado.
Limitaciones
Si se quieren introducir más palabras secretas, o hacer alguna modificación en el
programa, deben tenerse en cuenta los siguientes detalles, o el juego no funcionará:
Las palabras secretas deben tener exactamente 6 letras y se deben añadir a la lista
"make a list" escritas sólo con mayúsculas
Las etiquetas en las que se van a mostrar las letras deben tener como texto el
carácter subrayado "_". Son las que se han llamado Label1, Label2, ..., Label6.
Las imágenes deben llamarse "0.png", "1.png", ..., "7.png"
Conclusiones
Actividades
Aquí tienes formas de mejorar o personalizar el juego (elige alguna, pero no todas):
bloquea el giro de la pantalla. La presentación está hecha para jugar en vertical, así
que nos conviene evitar que al usuario se le esté girando continuamente
adapta la presentación a una tablet. El usuario puede tener un teléfono en la mano
para jugar con el ahorcado, o una tablet de 10 pulgadas. Asegúrate de que el
hecho de tener un dispositivo grande no supone ningún problema para jugar
Para hacer estas otras mejoras te harán falta dominar más conceptos:
cuando se juega sin teléfono móvil, un jugador escribe la palabra secreta en un
papel y el otro va tratando de adivinarla. Tienes que hacer posible esta modalidad
de juego poniendo dos botones en la pantalla inicial: MeterPalabraSecretaYJugar o
Jugar. Si se pulsa la primera opción, un jugador introducirá una palabra de 6 letras
y, luego, pulsará un botón de Jugar.
base de datos TinyDB. Al iniciar la aplicación mirará si hay datos guardados. Si no
es así, guardará una serie de palabras secretas para que se pueda jugar. Además,
en la pantalla inicial, habrá un botón que permitirá ver qué palabras secretas hay
introducidas y se podrán añadir o borrar. De este modo, sin tener que modificar el
programa, será posible que juegue un jugador sólo y que pueda meter más y más
palabras.
3.3 Pong
Introducción
El juego Pong es similar al "ping pong" pero aquí hay un solo jugador. Antes de que
existieran las videoconsolas, e incluso los ordenadores personales, se inventó este
videojuego.
Actualmente se enseña a programar el juego Pong en cursos modernos de
programación con cualquier plataforma, y App Inventor no podía ser menos.
Aquí tienes todo lo necesario:
http://www.appinventor.org/content/CourseInABox/drawAnimate/PongTutorial
control de riego
alarma
juegos con dispositivos físicos (cochecito que se maneja con el móvil vía infrarrojos
o Bluetooth)
2 En realidad, se trataba de un Arduino UNO. Más tarde, el autor empezó a trabajar con modelos más pequeños y
baratos (Arduino Mini y Arduino Nano, desde 3 €), pero no son recomendables para alguien que está empezando.
Pero también es fácil copiar un programa escrito por otra persona y pegarlo dentro del
entorno de Arduino para cargarlo en nuestra tarjeta.
Un programa en Arduino consiste como mínimo de dos funciones:
void setup() { }. Lo que se pone aquí dentro se ejecuta una única vez. Es como el
Screen1.Initialize
void loop() { }. Lo que se pone aquí dentro se ejecuta una y otra vez, sin detenerse
jamás.
Borra todas las líneas, copia estas y pégalas en el entorno de Arduino:
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // Enciende la luz
delay(1000); // Espera 1 segundo
digitalWrite(13, LOW); // Apaga la luz
delay(1000); // Espera 1 segundo
}
ATENCIÓN: hay que fijarse en que el lado positivo lo estamos conectando a VIN y el
negativo a GND.
También podemos utilizar una pila de petaca, que son todas de 5V. En este caso el
positivo se conecta al puerto 5V y el negativo al GND que hay justo debajo.
No te confundas: un LED es una luz que vale poquísimo dinero. En Amazon o eBay
puedes comprar un paquete de 75 por poco más de un euro, y te lo envían gratis.
Este montaje es extremadamente sencillo. Fíjate en las patitas de tu LED y verás que
una es más larga que la otra. La más larga es el polo positivo, y debes conectarla en el
PIN 13 de tu Arduino. Está justo al lado de la luz que encendíamos y apagábamos en el
ejercicio anterior. La patita más corta, que es el polo negativo, debes conectarla en el
GND que tienes sobre el PIN 13.
Una vez realizada la conexión, alimenta a tu Arduino y verás lo que pasa.
Aquí puedes ver otra vez el programa con el que estás trabajando:
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // Enciende la luz
delay(1000); // Espera 1 segundo
digitalWrite(13, LOW); // Apaga la luz
delay(1000); // Espera 1 segundo
}
Piensa:
¿crees que sería fácil encender al mismo tiempo dos LED, uno en el pin 12 y otro
en el 13? Pues conecta dos LED y que se enciendan alternativamente: mientras
uno esté encendido, el otro apagado, y al revés
¿crees que sería fácil conectar 5 LED al mismo tiempo al PIN 13 y a GND para que
se encendieran y apagaran todos al mismo tiempo?
Introducción
Con Arduino podemos controlar de un modo sencillo y preciso la velocidad de un motor
de corriente continua.
Material Necesario
Arduino y motor de corriente continua de muy poca potencia. Nos sirve cualquier motor
de juguete con dos cables, que funcione con 3 V o 5 V. En tiendas como Amazon
podemos encontrarlos muy baratos. Busca “motor CC”. Por ejemplo, el “SODIAL(R) Motor
sin Nucleo CC 3.7V 48000RPM + Helice para Juguete de Helicoptero Avion Remoto” vale
menos de 2 € en Amazon, lo envían sin gastos de envío e incluye una hélice que nos será
útil para saber cuándo está girando.
Ecotrucos
Los juguetes con partes móviles utilizan este tipo de motores, así que si tienes uno y no
funciona, desmóntalo y aprovecha las piezas.
Otra opción es utilizar el ventilador de una CPU, o el que hay en el interior de una
fuente de alimentación de PC. Eso sí, esos ventiladores sólo pueden girar en un sentido
así que, cuando hagas el montaje, si no gira, lo primero que debes probar es a
intercambiar los cables.
Si tienes una vieja unidad de CD-ROM que ya no te sirva, incluso si se ha estropeado,
puedes desmontarla y dentro encontrarás uno de estos motores, que se utilizaban para
introducir y extraer la bandeja.
También suelen tener un LED pero sin un soldador será difícil que lo puedas extraer sin
dañarlo.
También encontrarás otros motores pero verás que no funcionan con solo 2 cables. Se
trata de unos motores mucho más difíciles de manejar, con 4 cables o más, que sirven
para producir los elementos rotatorios de los discos. El que hace que se mueva el brazo
lector suele ser también de más de 2 cables, aunque ¿quién sabe? igual tienes suerte y
tiene también 2.
Trabajo a Realizar
1) Montaje
Nuestro motor tiene 2 cables. Uno será de color rojo y el otro será de algún otro color,
seguramente negro. Si montamos las cosas bien, el motor girará en el sentido de las
agujas del reloj. Si lo montamos al revés, girará en sentido opuesto.
Conecta el cable rojo al PIN 11, y el otro cable a cualquier pin marcado como GND. En
Arduino los pines en general dan corriente positiva y el GND es el negativo.
Todos los pines no tienen el mismo comportamiento. El PIN 11 es uno de los que
pueden dar mucha o poca electricidad, mientras otros sólo pueden dar el mínimo o nada
(HIGH/LOW).
2) Programación
Copia este programa en tu entorno Arduino y cárgalo en la tarjeta (te lo puedes
descargar de https://github.com/profesooooor/Arduino.git):
/*
Control_Motor_Simple.ino
void setup() {
// Esto sólo ocurre una vez
pinMode(11, OUTPUT);
}
void loop() {
// Esto se ejecuta toda la vida, una y otra vez:
analogWrite(11, 80); // ¡¡¡PELIGRO!!! para velocidades altas, poner
una resistencia de 330 ohm
// entre el pin 11 y la base del transistor
delay(1000);
analogWrite(11, 0);
delay(1000);
}
© Pedro Felip Belenguer 150
Capítulo 4. El Internet de las cosas Curso de Programación de Android
Introducción
En el apartado anterior hemos visto cómo manejar un pequeño motor, pero Arduino no
tiene fuerza suficiente como para manejar motores potentes, y mucho menos para
manejar varios motores al mismo tiempo.
Pero, además, el montaje anterior tiene la limitación importante de que el motor sólo
puede girar en un sentido o estar parado, y aquí vamos a ver cómo es posible hacerlo
girar en un sentido o en otro.
Por si esto no fuera bastante, utilizaremos un hardware que nos permitirá hacer
montajes más complicados, incluso con corriente alterna, que se verán en la actividad
siguiente.
Todo esto y mucho más se puede hacer de varias maneras, pero aquí vamos a ver la
más sencilla y segura de utilizar para alguien que está empezando: una tarjeta
controladora de relés. ¿Que no sabes qué es un relé? Pues aquí también vas a
aprenderlo.
Material Necesario
Relación:
Arduino
tarjeta controladora con 2 relés. También puede servir una que tenga más de 2.
Sería posible utilizar dos de 1 relé pero no vamos a ver aquí cómo se conectaría, si
bien el lector atento encontrará la manera
un motor (esta vez no nos sirve un ventilador, porque queremos que gire en ambos
sentidos)
pila de petaca
cables
opcionalmente: pinzas de cocodrilo pequeñas
Como controladora aconsejo una de estas: “Tarjeta 2 relés SRD-95-VDC-SL-C” (menos
de 2 €), “Tarjeta 4 relés SRD-95VDC-SL-C” (menos de 4 €).
Esta vez no vamos a poder sustituir el motor por un ventilador, porque el motor
queremos que gire en un sentido o en otro, y eso los ventiladores “normalitos” no pueden
hacerlo.
Los cables se pueden comprar (mejor si son “cables de protoboard” macho/macho y
macho/hembra) o aprovechar cables telefónicos o informáticos (Ethernet). También nos
serán útiles cables que sean hembra por un lado, para conectarlos a la controladora.
Las pinzas de cocodrilo, que se llaman así porque recuerdan a la boca de un bicho de
esos, se pueden adquirir fácilmente en Amazon, eBay, o cualquier tienda de electrónica.
No son necesarias, pero ayudan a fijar cables de manera que no se nos suelten.
Ecotrucos
Vamos a necesitar cables que son hembra por un lado. Podemos aprovechar los cables
de audio que se utilizaban para unir las controladoras de CD-ROM con las tarjetas de
sonido, que son hembra por ambos lados.
Para convertir a macho una conexión hembra, podemos utilizar un cable macho/macho.
Para convertir a hembra una conexión macho, podemos utilizar un puente (jumper) de
los que abundan en las placas base y circuitos impresos en general.
Trabajo a Realizar
El montaje físico
Fíjate en esta fotografía:
plástico al que se han pintado unos puntitos para poder ver fácilmente cuándo está
parado o girando.
Arduino. Está conectado vía USB al ordenador, además de los cuatro cables que
van hacia la controladora.
Controladora. Si la miramos en la posición de la foto, podemos ver que tiene cuatro
“cajitas azules”. Son los relés. Este modelo tiene 4.
los relés:
relé 1. Vamos a fijarnos en el lado de los tornillos.
Vemos que pone K1. Esto significa que es el relé 1
de esta controladora. El dibujo que tiene representa
que, mientras no hagamos nada, el tornillo 1 (el de
más abajo) está conectado con el tornillo 2. Cuando
proporcionemos alimentación al relé, el tornillo 2
dejará de estar conectado al tornillo 1 y pasará a
estar conectado al tornillo 3. Efectivamente, el relé
es un conmutador en el cual el tornillo 2 está
siempre conectado o bien al tornillo 1 o al 3. La posición del conmutador no
cambia a mano con una palanca, sino dando o no dando electricidad al relé.
relé 2. Está identificado como K2.
Los pines de control:
miramos ahora abajo a la derecha y
vemos unos pines macho, que vamos a
conectar a Arduino. Lo ideal es utilizar
cables que son hembra por el lado de
esta controladora, y macho por el lado de
Arduino.
GND. Este es el negativo. Lo conectaremos a cualquier GND de Arduino.
VCC. Es el positivo. Lo conectaremos a 5V de Arduino.
IN1 (entrada del relé 1). Cuando se reciba corriente por este pin, el relé 1 se
activará, lo que significa que su conmutador interno cambiará de posición y
el tornillo central pasará a estar conectado con el tornillo 3. Para ver que
funciona, podemos conectar manualmente el cable VCC con el IN1.
IN2. Es la entrada del relé 2.
Los ledes de posición de los relés. Cuando
un relé estará activado, su LED
correspondiente permanecerá iluminado. En la fotografía del principio de esta
actividad se puede apreciar cómo hay dos relés activados, el 1 y el 2, porque
los dos primeros ledes se ven iluminados.
Conexiones entre la pila y los relés.
Positivo. El positivo de la pila está conectado con el tornillo 1 del relé 1, y
El relé 2 sigue en su posición inicial, por lo que el otro borne del motor sigue
conectado al positivo de la pila.
Resumiendo: al motor llega negativo por un lado y positivo por otro. Como
consecuencia, el motor gira.
Arduino activa PIN 2 (pero no PIN 1). Cuando mediante nuestro programa
hagamos que Arduino envíe corriente por el PIN 2 ocurrirán un montón de
cosas:
PIN 2 envía corriente a IN 2.
Se ilumina el LED IN2.
Se activa el relé 2.
Como consecuencia, al motor llega positivo por un lado y negativo por otro.
Como consecuencia, el motor gira en sentido inverso a como lo hace
El código
Aquí tienes el programa. Se ha partido en dos trozos para facilitar la impresión de este
documento, pero tienes que copiar la primera mitad y, a continuación, la segunda.
Puedes descargarlo de https://github.com/profesooooor/Arduino.
Aquí tienes la primera parte:
/*
EEE_T05_2Reles_1V.ino
Montaje físico:
GND de Arduino a GND de placa
5V de Arduino a VCC de placa
pin 1 de Arduino a IN1 de placa
pin 2 de Arduino a IN2 de placa
void setup() {
© Pedro Felip Belenguer
pinMode(in1, OUTPUT); 157
pinMode(in2, OUTPUT);
}
Capítulo 4. El Internet de las cosas Curso de Programación de Android
Y la función loop:
void loop() {
// Giramos hacia la derecha durante 1 segundo
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
delay(1000);
// Paramos 1 segundo
digitalWrite(in1,LOW);
digitalWrite(in2,LOW);
delay(1000);
// Paramos 1 segundo
digitalWrite(in1,LOW);
digitalWrite(in2,LOW);
delay(1000);
}
Breve explicación:
utilizamos dos VARIABLES GLOBALES, que se llaman in1 e in2, y las
inicializamos a 1 y a 2.
En el setup() decimos que el pin in1, que es el 1 porque es lo que vale la variable
global in1, se va a utilizar para enviar corriente. Luego decimos lo mismo del pin
in2, que es el 2.
en el loop() hacemos digitalWrite(in1, HIGH); y también digitalWrite(in2, LOW). Esto
hace que por el PIN 1 se envíe corriente y por el PIN 2 no se envíe. Como
consecuencia, IN1 de la tarjeta se activará y el relé K1 cambiará de posición. Sin
embargo, el relé K2 continuará desactivado. Esto hará que el motor empiece a
girar.
delay(1000) hará que nada cambie durante 1 segundo, así que el motor seguirá
girando.
digitalWrite(in1,LOW); digitalWrite(in2,LOW) hará que los dos relés se desactiven, y
el motor se parará. Nuevamente, un delay(1000) hará que el motor permanezca
parado un segundo.
digitalWrite(in1,LOW); digitalWrite(in2,HIGH) hará que el motor gire hacia el lado
inverso.
El resto de loop() no necesita más comentarios.
Al terminar loop() vuelve a empezar y se repite la secuencia.
Introducción
Vamos a aprovechar los conocimientos adquiridos en la actividad anterior para hacer
esta. Es muy recomendable haber terminado con éxito la otra actitud porque ahora vamos
a jugar con fuego. Si no has entendido cómo funciona un relé o si no te ha salido bien la
actividad anterior, vuelve a intentarlo.
Aquí sí que hay peligro. Vamos a utilizar corriente de 220 voltios, la que hay en
cualquier casa. Una conexión mal hecha tendrá como consecuencia lesiones y también
averías en la instalación eléctrica.
ATENCIÓN: este ejercicio debe realizarse únicamente bajo la supervisión de un adulto
responsable (un adulto irresponsable no nos vale).
Material Necesario
Nos va a hacer falta todo esto:
Arduino
tarjeta controladora de relés con, al menos, 1 relé
cables para conectar la tarjeta controladora con el Arduino
regleta con interruptor
bombilla con portalámparas y cable eléctrico grueso, del que
se utiliza para conectar lámparas o electrodomésticos a la red
eléctrica
todas las conexiones de los cables de 220 voltios deben estar bien hechas. Un
cable demasiado fino o una conexión mal hecha tendrá como resultado que el
cable se recalentará, o incluso podrá quemarse y producir fuego
Trabajo a Realizar
Montaje Eléctrico
Si quieres, puedes cargar primero el programa en el Arduino sin tener nada conectado,
pero también podrás hacerlo después si tomas las debidas precauciones.
Aquí tienes una vista completa del montaje, con la regleta apagada:
Descripción
Los pines
detallada
de control.
del montaje:
En este caso tenemos GND, IN1, IN2, VCC porque sólo
hay dos relés.
Regleta. Un cable va directo al portalámparas y el otro al relé.
GND. Este es el negativo. Lo conectaremos a cualquier GND de Arduino.
Portalámparas. Un cable va a la regleta y el otro al relé. Cuando reciba
alimentación
VCC. Esporellos
positivo.
dos lados,
Lo conectaremos
la bombilla seaencenderá.
5V de Arduino.
Controladora.
IN1 (entrada
Si nosdelfijamos
relé 1).
enCuando
la foto, veremos
se recibaque
corriente
esta tiene
por este
dos relés,
pin, elno
relé
cuatro
1 se
como en
activará,
el ejercicio
lo que
anterior.
significa
Funciona
que su exactamente
conmutador interno
igual quecambiará
la de 4: de posición y
el tornillo central pasará a estar conectado con
los relés. Esta tarjeta tiene 2, por lo que tenemos
el tornillo 3. Para
hastaver que funciona, podemos
desde el relé K1 el K2.
conectar manualmente el cable VCC con el
IN1.
Ledes de posición de relés. Tenemos dos.
Arduino. Mientras hacemos el montaje lo tenemos
desconectado del ordenador.
Conexiones entre Arduino y la controladora. Arduino dará las órdenes a la
controladora, y ésta a los relés.
En este caso estamos aprovechando un cable hembra/hembra reciclado de
una unidad CD-ROM para facilitar las conexiones. Aunque tiene cuatro
conexiones, que encajan perfectamente con los pines de la controladora,
utilizamos solo 3
GND de Arduino (cualquier GND) a GND de la controladora
5V de Arduino a VCC de la controladora. Utilizamos el cable rojo porque
siempre que se pueda el rojo debe utilizarse para la alimentación positiva
/*
Bombilla_Rele_1V.ino
Montaje físico:
GND de Arduino a GND de placa
5V de Arduino a VCC de placa
pin 1 de Arduino a IN1 de placa
void setup() {
pinMode(in1, OUTPUT);
}
void loop() {
// Encendemos
digitalWrite(in1, HIGH);
delay(200);
// Tras 2 décimas de segundo apagamos
digitalWrite(in1,LOW);
delay(200);
Ahora ya sólo falta dar la luz con el interruptor de la regleta y comprobar que todo
funciona como cabía esperar. Pero esto tiene mucho peligro, así que asegurate de que la
regleta está sobre un papel o cartulina, como en la fotografía. Aún así, podrías tener una
avería en tu ordenador. ¡Uf, no por favor! Pues sigue leyendo antes de dar la luz.
Libre Arduino
Este sería un buen momento para hacer un trabajo libre en el que se combinen las
cosas aprendidas hasta ahora con Arduino para hacer un programa que haga algo
diferente.
¿Qué se te ocurre?
Habría que preparar dos archivos:
Libre Arduino.odt, que sería un archivo de texto en el que explicaríamos el
proyecto, el material necesario y cómo hay que realizar el montaje, explicando
cada conexión. Si el archivo de texto se prepara con Writer acabará en .odt y, si se
prepara con Word, acabará en .docx
Libre Arduino.ino, que sería el programa a cargar en el Arduino
Podría ser interesante realizar alguna fotografía o vídeo del proyecto ya funcionando.
Introducción
¡Por fin vamos a poder utilizar nuestro Android con Arduino!
Ya has aprendido lo imprescindible para poder controlar cosas con Arduino, la magia
empieza cuando puedes manejarlo con tu móvil porque convertirás en “inteligentes” a las
cosas más estúpidas, siempre que funcionen con electricidad.
Material Necesario
Pilas, porque con USB no va a ser posible trabajar.
HC-05 o HC-06 (el autor de este documento ha utilizado únicamente HC-05). Puedes
encontrarlo en eBay como “Wireless Serial 6 Pin Bluetooth Transceiver Module HC-05
/*
T09_Pruebas_Bluetooth_switch.ino
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop() {
if (Serial.available()) {
switch(Serial.read()) {
// Encender
case 'e':
case 'E':
digitalWrite(13, HIGH);
break;
// Apagar
case 'a':
case 'A':
© Pedro Felip Belenguer 168
digitalWrite(13,LOW);
break;
}
}
}
Capítulo 4. El Internet de las cosas Curso de Programación de Android
Ese programa
RS232 hará que
Master Slave se encienda
FHRG” por algounmás
LEDdecuando
4 €. Arduino
Lo buenoreciba
es una
que 'e' (minúscula
lleva o
4 cables
mayúscula) por que
macho/hembra el puerto
van deBluetooth, y que
perlas para se apague
conectarlo cuandodirectamente.
a Arduino reciba una 'a'.
Si quieres...
Antes de hacer el montaje físico puedes hacer una cosa que te ayudará a entender el
programa anterior, y a comprobar que está cargado en tu Arduino.
Es muy sencillo.
Teniendo tu Arduino conectado, y una vez le has cargado el programa anterior, entra en
Herramientas → Monitor Serie.
Pulsa la letra E seguida de INTRO. Verás cómo se enciende el LED de tu Arduino, ese
que está soldado en la placa y que está junto al pin 13.
Pulsa ahora la letra A seguida de INTRO y verás cómo se apaga.
El montaje físico
Antes de hacer el montaje desconecta el cable USB de tu Arduino.
Este es el esquema:
Si nos fijamos, veremos que el pin RX del HC-05 lo estamos conectando al pin TX de
Arduino (que es, al mismo tiempo, el pin digital 0). También estamos conectando el RX del
HC-05 al TX de Arduino.
Además, estamos conectando 5V y GND al HC-05, que es la alimentación que necesita
para funcionar.
Aunque la placa Arduino tiene un LED en el PIN 13 siempre soldado en la propia placa,
podemos poner un LED de tamaño real conectado al PIN 13 y a GND.
Desconectar Arduino de USB y utilizar pilas
Mientras tengamos conectado el USB las transmisiones con el HC-05 no funcionarán
por la forma en que está diseñado Arduino. Y también ocurre al contrario: si el HC-05 está
montado, no podremos cargar ningún otro programa a Arduino porque no funcionarán las
comunicaciones USB.
Explicación: Arduino mira si hay algo conectado a los pines 0 y 1. Si no hay nada
conectado, utiliza dos conductores que hay dentro del USB (que contiene 5 cables) para
enviar y recibir, como si fueran los pines 0 y 1, que se llaman también RX y TX. Pero
cuando Arduino ve que hay algo conectado en 0 y 1, ya no utiliza esos cables USB para
comunicarse. Como consecuencia, le herramienta Monitor Serie deja de funcionar. Pero
no sólo eso, tampoco es posible cargar otro programa a Arduino porque no puede enviarlo
vía USB.
Por este motivo, debemos desconectar ahora el puerto USB y alimentar el Arduino con
pilas.
pueda llamarse de otra forma y para cambiarle el PIN, pero queda fuera del ámbito
de este documento explicar cómo se hace
el HC-05, además, viene configurado como un esclavo. Los dispositivos Bluetooth
pueden funcionar en modo maestro, como un ordenador, o en modo esclavo, como
unos auriculares. Cambiar de esclavo a maestro es algo que se hace también con
esos pines extra
Diseño
Tenemos que hacer un diseño con botones. Como, de momento, sólo vamos a controlar
una bombilla, pondremos los siguientes componentes (explicados después):
Componentes:
icono de la aplicación con un dibujo de Arduino UNO (buscar por Internet)
btnBombilla, botón con imagen de una bombilla apagada (Bombilla_Apagada.png)
aunque no se vea, cargamos también una imagen de una bombilla encendida
(Bombilla_Encendida.png)
ListaDispositivos, parece un botón pero es un ListPicker, donde pone “Seleccionar
Arduino”
LblDispositivo, una etiqueta para informar al usuario
BluetoothClient1, es un BluetoothClient sacado de Conectivity
Bloques
Cuando se pulse sobre el texto “Seleccionar Arduino”, se estará pulsando realmente
sobre un ListPicker que se llama ListaDispositivos. Se mostrará entonces la lista de
dispositivos para que el usuario seleccione el HC-05 de su Arduino:
Ya sólo nos falta programar el botón BtnBombilla. Cuando se haga clic se comprobará
si está seleccionado el dispositivo Bluetooth. No podemos comprobar que sea el HC-05
de nuestro Arduino, pero al menos sí que podemos saber si estamos vinculados con un
dispositivo Bluetooth (sigue la explicación después de la figura):
Actividades adicionales
Sería muy interesante que hicieras estas:
haz una mezcla de esta actividad con la “4.5 Arduino: control de una lámpara de
220 V” (página 155) así: conecta un relé al pin 13, es decir, VCC del relé a +5V de
Arduino, GND del relé a cualquier GND de Arduino y IN del relé al pin 13. Por el
otro lado del relé, conecta la bombilla como hiciste entonces. Comprueba que tu
App Control_Arduino es capaz de activar y desactivar el relé. Si lo hace bien, dale
luz a la bombilla y ya tienes hecho un control de una lámpara desde el móvil.
modifica el programa para que, si se pulsa una “p” (minúscula o mayúscula) el LED
parpadee así: encendido durante 200 milisegundos, apagado 200 milisegundos,
encendido 300 milisegundos, apagado. Mientras parpadea, podrías poner una
bombilla de otro color en la pantalla (mejor si preparas tú mismo las imágenes de
las bombillas partiendo de una sola y retocándola con un programa de edición de
imágenes).
Para modificar el programa de Arduino con éxito, tienes que fijarte cómo se ha hecho
para así poder añadir órdenes asociadas a teclas. Cada opción empieza con uno o más
“case”, luego están las instrucciones que dan las órdenes a los pines, y luego está el
“break”.
Actividad “libre”:
añade controles para hacer más cosas.
Introducción
El autor de este documento ha preparado un cochecito con un kit de Arduino que
incluye el chasis, las ruedas, los motores, un interruptor, un espacio para las pilas y
algunos cablecitos. A eso le añadió un Arduino UNO, una controladora L298N, un
adaptador de Bluetooth HC-05, unas cuantas pilas y unos pocos cables.
En el Arduino se cargó un programa que responde a las siguientes órdenes:
w para avanzar
a para girar a la izquierda
s para parar
d para girar a la derecha
x para retroceder
Para acelerar basta con repetir la misma orden: una “w” es ir hacia adelante. Otra “w”
hace que siga hacia adelante, pero más rápido. Y, así, sucesivamente.
Lo mismo ocurre cuando queremos que gire o que retroceda más deprisa.
Aunque se puede conducir mediante un terminal Bluetooth desde cualquier sistema
operativo, vamos a hacer una App que lo controle.
Aprovecharemos, además, para aprender a adaptar el aspecto de nuestra App al
tamaño y forma de la pantalla del dispositivo Android, como se hace cuando se
programan páginas web (responsive design).
El diseño básico
Este podría ser el diseño inicial de la aplicación:
Sin programación
Preparamos un TableArrangement de 3 filas y 3 columnas y nos
aseguramos de que la altura y la anchura están en Automatic. De
esta manera, el tamaño de la tabla se adaptará automáticamente
a lo que tenga dentro.
Metemos cada botón donde le corresponde, pero nos
encontramos con una sorpresa: por defecto, el tamaño del botón
es Automatic, y eso hace que nuestros botones ocupen más o
menos espacio según los píxeles que tenga la imagen que hemos
escogido. El resultado es que los botones no nos caben en la
pantalla (si tienen muchos píxeles) o que se ven bien, si la pantalla
es grande. Aquí podemos ver dos botones “iguales” que sólo se
diferencian en el número de píxeles:
Con eso tendremos un aspecto “decente” para cualquier tamaño de pantalla, mientras
esté vertical. En el componente Screen, en el diseñador, hay una propiedad que se llama
ScreenOrientation y que, por defecto, vale Unspecified. Eso hace que el usuario pueda
decidir si quiere trabajar en vertical o en apaisado. Nosotros podríamos fijar el valor
Portrait para asegurarnos de que siempre se utiliza en vertical, pero hay usuarios a los
que les molesta no poder girar la pantalla y que los obliguen a trabajar en vertical.
El autor de este documento prefiere dejar al usuario final si quiere bloquear el sensor de
rotación de su dispositivo y trabajar siempre en vertical, o no bloquearlo, así que yo lo
dejaría en “Unspecified”.
Aún así, ponerlo en Landscape (apaisado) un momento nos servirá para ver el aspecto
que tendrá nuestra App cuando se gire la pantalla.
Con programación
Con programación se puede llegar más lejos, naturalmente. Unas pocas matemáticas
nos servirán para saber cuál es el ancho que debería tener cada botón a partir del ancho
de la pantalla. Un 30% estaría bien.
Después calcularíamos cuál es el alto que debería tener. Un 20% estaría bien.
Después veríamos cuál de las dos cifras es la más pequeña. Llamemosla
DiametroBotón. En el bloque “when Screen1.Initialize” pondríamos:
BtnIzq.Width=DiametroBotón
BtnIzq.Height=DiametroBotón
pero para todos los botones. Así, sí que serían redondos y cabrían bien en la pantalla.
90 es tan inclinado hacia adelante que alcanza la vertical. Los valores negativos
indican inclinación hacia atrás, siendo -90 el máximo.
Nuestro coche no debe ser hipersensible, así que podemos calcular con arreglo a estos
valores:
Izquierda: 10 < Roll < 70 (0 es horizontal, 90 es vertical)
Derecha: -70 < Roll < -10 (-90 es vertical)
Adelante: 10 < Pitch < 70 (90 es vertical)
Atrás: -70 < Pitch < -10 (-90 es vertical)
Si el Roll no está comprendido entre esos valores, no iremos ni a la izquierda ni a la
derecha.
Si el Pitch no está comprendido entre esos valores, no iremos ni adelante ni atrás.
Mirando los dos valores podemos determinar hacia dónde debe ir el coche, o si debe
estar parado.
Pero atención: si utilizamos el inclinómetro tendremos que fijar la orientación de la
pantalla, o el usuario se volverá “loco” porque no parará de girar la imagen conforme vaya
conduciendo. En este caso, es recomendable poner Screen1.ScreenOrientation a
LandScape en el diseñador.
Arduino BT Terminal
Esta App se comunica con nuestro Arduino. Primero emparejamos nuestro Android con
el HC-05 (o HC-06) de nuestro Arduino. Después, dispondremos de varios teclados
virtuales a elegir, que se pueden personalizar. Por ejemplo, podemos utilizar uno con 9
botones así:
Luz delante on adelante Luz delante off
Izquierda Parar derecha
Luz atrás on atrás Luz atrás off
Mediante los menús de la App hacemos que, según el botón que se pulse, se envíe a
Arduino un carácter diferente. Por ejemplo, los números del 1 al 9.
Firmata
En el entorno de Arduino podemos encontrar Archivo → Ejemplos → Firmata →
StandardFirmata. Cargamos eso en nuestro Arduino y, luego, en Android instalamos la
App correspondiente.
La conexión puede realizarse vía USB, Bluetooth o WiFi (si, previamente, hemos
instalado WiFi en Arduino).
Por último, en la App, veremos un botón para cada PIN. Podremos poner en ON el PIN
13 con su botón, o cualquier otro PIN, o apagarlo. Eso equivale a hacer un digitalWrite(13,
4.11 Raspberry Pi
Raspberry Pi es parecido a Arduino, pero diferente.
hay dentro.
Para que funcione firmata antes hay que cargar el software. Además, se hace en dos o
más pasos, así que mira lo que pone aquí: https://github.com/rwaldron/johnny-
five/wiki/Getting-Started-with-Johnny-Five-and-HC-05-Bluetooth-Serial-Port-Module
(Johnny Five es el nombre de una versión de Firmata).
Probablemente será posible manejar Arduino S4A y Firmata, pero eso queda totalmente
fuera de este curso de Android.
Los dispositivos Android también se pueden programar y controlar desde Windows 10.
Lo más sencillo es hacerlo con el IDE de Arduino que hemos visto aquí, aunque también
se puede hacer desde VisualStudio.
Y se pueden manejar con la App “oficial” para estas cosas, o utilizar un terminal
Bluetooth.
http://ms-iot.github.io/content/en-US/GetStarted.htm tiene un apartado para Arduino. De
ahí se salta a http://ms-iot.github.io/content/en-US/win10/Lightning.htm.
Aquí hay un ejemplo de lo parecido que puede ser programar una Raspberry Pi con
VisualStudio, a programar un Arduino: http://ms-iot.github.io/content/en-
US/win10/samples/arduino-wiring/HelloBlinky.htm.
Capítulo 5. mBot
Introducción
El mBot es un interesante robot que se puede manejar sin saber nada de mecánica,
robótica, ni electrónica.
En este capítulo vamos a aprender a manejarlo desde App Inventor pero, antes de
empezar, vamos a saber con más detalle qué es un mBot.
Entramos en https://www.makeblock.es/. De ahí, pasamos a la pestaña Tienda.
Veremos que hay varios modelos y accesorios.
En Internet podemos encontrar muchas imágenes y vídeos sobre el mBot.
Entramos ahora en https://www.makeblock.es/productos/robot_educativo_mbot/. Las
aplicaciones que siguen van a suponer que éste es el modelo que tenemos: un modelo
básico con el módulo de Bluetooth instalado.
El sensor de distancia (ultrasonidos) deberá estar conectado en el puerto 3 y el
seguidor de líneas (line follower) en el 2, como en esta figura:
¡Ah, se me olvidaba! Para que todo esto funcione, el mBot debe tener cargada la
aplicación por defecto, la que viene de la fábrica. Si algún manitas se la ha cargado
(programando el Arduino que lleva dentro “a pelo”), deberá restaurarla antes de poder
continuar.
Esa aplicación por defecto convierte al mBot en un esclavo que obedece las órdenes
que le llegan por Bluetooth (también por infrarrojos o por USB, aunque eso no nos
interesa ahora). Eso nos permitirá hacer Apps que le enviarán órdenes por esta vía.
Pero no solo acata las órdenes, sino que también es capaz de decirnos lo que “sienten”
sus sensores. Por todo esto, no es un simple cochecito, es UN ROBOT.
Introducción
Vamos a hacer una aplicación que nos servirá de base para las que haremos a
continuación y, mientras la haremos, aprenderemos lo básico sobre la comunicación mBot
↔ Android.
En http://learn.makeblock.com/en/use-mbot-with-app-inventor/ están las instrucciones
que vamos a seguir. El contenido de esa página web podría ser cambiado, eliminado o
cambiado de sitio, así que, de momento, será mejor ceñirnos al documento que estás
leyendo.
¡¡A trabajar!!
Empieza un proyecto nuevo y llámalo APPM01_INSTALA_Nombre_Apellido (con tu
nombre y apellidos). Cambia el título de la pantalla (Title) a “mBot”.
Así, antes de pulsar sobre “Conectar con mBot”, nuestro móvil buscará los robots que
haya en las cercanías con el Bluetooth activado.
Acto seguido, el usuario elegirá uno de los robots en una lista que le saldrá por pantalla.
Añade ahora estos bloques:
Con estos nuevos bloques, Android conectará con el robot que hayamos elegido.
Desconectar el mBot
Ahora deberíamos añadir un bloque de desconexión, para poder así liberar el mBot y
que otro lo utilizara. Pero, vaya, ¡a los que hicieron la extensión se les olvidó!
Movimientos básicos
Vamos a añadir ahora unos movimientos básicos para que podamos comprobar que la
comunicación funciona.
Añade botones para ir arriba, abajo, a la izquierda, a la derecha y parar. Lo
recomendable es poner un componente TableArrangement, del apartado Layout, con 3
filas 3 y 3 columnas para, así, situar cada botón donde le corresponde:
Introducción
Ya somos capaces de manejar un mBot, pero solo los movimientos básicos.
El mBot es capaz de hacer muchas más cosas. Aquí vamos a aprender dos: cómo
emitir sonidos, y cómo detectar la distancia que hay desde el mBot hasta el obstáculo más
cercano que tiene delante.
El sensor de ultrasonidos funciona como el eco de un murciélago: emite un sonido y,
basándose en el tiempo que tarda en recibir ese mismo sonido “rebotado”, deduce la
distancia hacia el obstáculo más cercano.
En realidad, no es una medición muy precisa, y tiene poco alcance, pero igual le
sacaremos un buen partido. Este es solo el principio...
Trabajo a Realizar
Detectar la distancia
Vas a hacer una App que hará que el mBot emita un sonido cuando haya un obstáculo
cerca. Concretamente, a 10 cm. El resto del tiempo, permanecerá callado.
¿Sabes cómo hacerlo?
¿No?
Pues ahí va una pista: cada 200 milisegundos, comprobarás la distancia hasta el
obstáculo más próximo al mBot.
Si tienes un buen profesor, ahora mismo debes estar intentando resolver esto sin
ayuda. De hecho, antes de leer este párrafo, ya habrás puesto un Clock y habrás buscado
en el componente MBot un bloque que sirva para detectar la distancia y otro para emitir
sonido.
Para utilizar el sensor de distancia tendrás que saber en qué puerto está conectado. Es
Prueba tu App.
Si te funciona, enhorabuena.
Si lo has intentado pero no lo has conseguido, enhorabuena también.
Si no has intentado nada, lo siento.
Aquí está el código de la App casi completa. Está todo menos los botones de
movimiento:
Introducción
Nuestro mBot ya hace más que un coche normal pues, además de conducirlo, detecta
distancias.
Claro que podemos hacerlo más útil.
En esta App añadiremos cosas que van a hacer nuestro coche más interesante,
utilizando los LED de a bordo.
Trabajo a Realizar
Esta App va a suponer un reto.
¿Estás en clase? Muy bien, el reto consiste en ser el primero en terminar la App.
Preparar el proyecto
Abre el proyecto anterior y guárdalo con el nombre APPM03_NOCHOCAR_NomApe.
Cambia Screen1.Title convenientemente.
Luz de freno
Tienes que hacer que, al pulsar el botón BtnParar, se enciendan las dos luces en color
rojo (además de pararse el coche).
Intermitentes
Tienes que hacer que, al pulsar BtnIzquierda, se encienda el led de la izquierda en color
amarillo. No será intermitente, será una luz fija.
Lo mismo para BtnDerecha.
Adelante
Con BtnAdelante se apagarán los ledes, si estaban encendidos. Si estaban apagados,
permanecerán apagados.
Si se detecta un obstáculo a menos de 10 centímetros se detendrá el coche.
Pitido al frenar
Con BtnParar, además de todo lo anterior, el coche pitará brevemente.
Mejoras posibles
Si has sido de los primeros en terminar, puedes intentar algunas de estas mejoras:
al empezar la App se oirá esta melodía (si te gusta la música, que sepas que esto
es B3,B3,B3,C4,E4; B3,B3,B3,C4,E4; C4,C4,B3,B3,A3,A3,G3 traducido con ayuda
de http://www.phy.mtu.edu/~suits/notefreqs.html. Por ejemplo, C4 es 262):
Introducción
En la actividad anterior hay una mejora propuesta que sirve para hacer música.
En esta actividad vamos a hacer lo mismo pero, en lugar de la melodía de “La
cucaracha”, vas a elegir tú la que prefieras.
Buscaremos primero la melodía, nos aseguraremos de que disponemos de la partitura
y, con ayuda de una página web que nos permita convertir notas de música en
frecuencias de ordenador, haremos la “traducción” de la partitura a lo que entienda
nuestro mBot.
Trabajo a Realizar
Preparar un proyecto nuevo que se llame APPM04 que haga que el mBot reproduzca
una música breve.
Introducción
En las fábricas de cerámica hay robots que circulan sobre un circuito para transportar
boxes con azulejos desde el horno hasta la zona de espera, y de ahí a la de clasificación
y encajado.
Esos robots circulaban antiguamente sobre raíles.
Después, lo hacían siguiendo unos cables instalados bajo el suelo.
Nosotros vamos a programar el mBot de manera que se mueva por un circuito que
dibujaremos nosotros. Podemos pintar el circuito sobre un papel blanco, o utilizar una
cinta adhesiva negra para diseñar el recorrido.
Trabajo a Realizar
¿Quieres ver mejor cómo funciona? Enciende el mBot y mueve un dedo por debajo.
Veras cómo se encienden y apagan las luces del seguidor de líneas. En seguida
entenderás su funcionamiento.
Trabajo a Realizar
Parada de emergencia
Vamos a necesitar el botón de parada. Así, mientras jugamos, en caso de problemas
podremos detener nuestro mBot, en lugar de tener que ir corriendo a cogerlo, si vemos
que se aleja o va caerse de una mesa.
Más tarde le daremos un aspecto más atractivo a este botón.
Solución
Vamos a ir por partes, viendo la tabla.
Parte 1. LineFollower=0.
Estamos sobre la línea y debemos avanzar.
Vamos a utilizar una variable que llamaremos “seglin” para que el código quede más
claro, y para evitar estar consultando el sensor más veces de las necesarias:
Solución
añadir un componente Clock y poner dentro toda la lógica de movimiento
ese Clock1 hará “tic” para 100 ms. No lo dejamos en 1000 ms porque sería
demasiado lento para reaccionar, pero tampoco queremos exagerar
al empezar el juego, el Clock1 estará parado (TimerEnabled = false en el
diseñador), se pondrá en marcha al conectar con el mBot y se parará con el botón
de parada
Parte 1. Poner en “when Clock1.Timer” toda la lógica del movimiento.
Parte 2. Que el ListPicker1.AfterPicking ponga en marcha el reloj.
7) si3.noQue
Parte va aelfuncionar, volver alpare
botón BtnParada pasoel4reloj y el coche (primero el reloj).
8) probar
Otras Mejoras
Mejoras a realizar (recuerda que debes hacer, al menos, dos):
Calibración. Si el negro de la pista es fino, el coche se deberá mover más despacio
para no salirse. Si es más grueso, podrá avanzar más deprisa. ¿Podrías añadir
algo a tu App para que el jugador pudiera calibrar el funcionamiento del cochecito?
Así ganaría a otros cochecitos en pistas anchas.
Android: que muestre lo que detecta el seguidor de líneas. Podrías poner un
“sensor” izquierda y un “sensor” derecha. Que estén los dos negros. Cuando el
sensor izquierdo no detecte el negro debajo, que se muestre como blanco en la
Introducción
De la misma manera que se puede hacer un programa para seguir una línea negra,
también se puede hacer un programa para que el mBot siga una línea blanca.
En este caso, el circuito será todo negro, menos una zona blanca. Puedes prepararlo
con una cartulina negra en la que pegas tiras de papel blanco. O solo con tiras de papel
blanco, pintando de negro los laterales.
El programa será casi igual como el de seguir la línea blanca, pero tendrás que pensar
un poco porque, igual que antes seguía recto cuando los dos sensores detectaban color
negro debajo, esto será lo que hará ahora cuando los dos sensores detecten color blanco.
Lo que antes servía para girar a la izquierda, ahora servirá para girar a la derecha, y
viceversa.
Trabajo a Realizar
Modificar el programa
Si piensas sabiamente, resolverás este problema con rapidez.
Si actúas sin pensar... jamás lo conseguirás.
Mejoras
No se proponen mejoras para esta App.
Introducción
Todo el mundo sabe qué es una lucha de sumo. Es ese deporte japonés en el que los
dos contendientes se cogen y se empujan para echar al adversario de un círculo. El más
pesado tiene ventaja porque es más difícil de desplazar.
En el mundo de los robots, la lucha de sumo es parecida. Se trata de localizar al
enemigo y lanzarse a por él para echarlo, pero tendremos que detectar los límites del
terreno de juego para no salirnos.
Trabajo a Realizar
Reglas
Regla número 1: el terreno de juego es circular. Tiene color blando y sus límites están
dibujados en color negro.
Regla número 2: el que se salga del terreno de juego, pierde. Si se salen los dos, hay
empate.
Regla número 3: cada jugador puede, y debe, empujar al oponente para echarlo fuera.
Fin del juego: el juego termina cuando uno de los dos jugadores, o ambos, se encuentra
totalmente fuera del terreno de juego (o cuando una avería impide continuar).
un obstáculo, supondremos que es nuestro enemigo, pues no puede haber nada más en
el terreno de juego, excepto nuestro enemigo.
Cuando lo detectemos, pisaremos a fondo el acelerador, pues a mayor velocidad,
mayor probabilidad de echarlo fuera. Y sólo si está dentro del terreno de juego
empezaremos nuestro ataque.
De todos modos, durante el ataque, seguiremos vigilando que no nos salgamos del
terreno de juego.
Página 59:
Bibliografía
Mirar en la página 57 de “divirtiendome_con_mbot__español.pdf”.
Windows
Android Studio funciona mejor, de momento, en Windows que en LliureX. La forma de
trabajar viene a ser la misma, pero en LliureX es probable que nos encontremos con
LliureX (o Ubuntu)
Si, una vez has terminado un proyecto, lo cambias de carpeta, luego no podrás
ejecutarlo, de modo que hay que intentar ponerlo desde el principio en la carpeta
definitiva.
Ejercicios Recomendados
Una vez salvados los problemas de instalación, se puede proceder a realizar los
siguientes ejercicios. Están comprobados en Windows.
Además, en la figura anterior, se puede ver que estoy editando el archivo Screen1.java.
Pues bien, en ese archivo tenemos que fijarnos en dos cosas (con CTRL-F podemos
buscar lo que queramos):
en cierto sitio pone:
redButton.Text("TURN RED");
redButton.BackgroundColor(COLOR_GREEN);
casi al final pone:
public void RedButtonClick() { redButton.BackgroundColor(COLOR_RED); }
...
public void RedButtonClick()
{
int numLLamadas = Integer.parseInt(redButton.Text());
redButton.BackgroundColor(COLOR_RED);
redButton.Text(String.valueOf(++numLLamadas));
}
Una solución para usuarios más avanzados consiste en poner lo que queramos en el
botón, y llevar la cuenta en una variable estática. En Java esa variable hay que declararla
en la clase, no se puede hacer dentro de la función, de modo que quedaría así:
...
private Button redButton;
private static int numLLamadas = 0;
...
redButton.Text("PULSA ESTE BOTÓN VERDE Y SE VOLVERÁ ROJO");
redButton.BackgroundColor(COLOR_GREEN);
...
public void RedButtonClick()
{
redButton.BackgroundColor(COLOR_RED);
redButton.Text(String.valueOf(++numLLamadas));
}
Generar el apk
Dentro de Android Studio es posible probar la aplicación sin generar el apk, igual que en
App Inventor. Todavía no sé cómo se genera un apk.
Dicen que se genera sólo y se queda dentro de "bin".
También que se puede generar con Build --> generate signe apk
Como puedes ver, te permite consultar un valor (Get value), guardar un valor (Store a
value) y ver todo el contenido de tu base de datos.
Cada par “clave”, “valor” viene acompañado de la fecha y hora en que se guardó, y se
proporciona un botón “Delete” que sirve para borrar, cosa que no puede hacerse desde la
app.
Se accede a las voces desde Ajustes → Idioma y entrada de texto → Voz/Texto para
pronunciar. Ahí salen las diferentes opciones. Siempre sale “Síntesis de Google” pero,
dependiendo de lo que nos hayamos instalado, pueden salir otras más:
Reconocimiento de voz
Disponemos también del componente SpeechRecognizer. Hay teclados que tienen un
botón para dictar lo que queremos que escriba Android.
Por ejemplo, puedes estar en WhatsApp y contestar hablando, en lugar de teclear.
Para activar este botón hay que entrar en ajustes → idioma y entrada de texto. Luego
eligfes el teclado y buscas la opción correspondiente:
en Swiftkey, escritura → voz y otras entradas → entrada de voz
en un Samsung S6, teclado Samsung → … (no existe esa opción)
en un LG, teclado LG / tecla de escritura por voz (dependiendo del modelo y
versión de Android, puede que salga o que no salga esta opción).
Vamos a ver cómo funciona esto con la aplicación de la bola 8, donde tenemos los
siguientes componentes:
Se trata de una pantalla (como siempre), un botón que tiene la imagen de la bola de
billar con su 8 encima, y un VerticalArrangement, que viene a ser una matriz de una sola
columna donde todos los componentes que pondremos quedarán uno debajo del otro.
Vamos a partir de la figura siguiente, donde Screen1 tiene AlignHorizontal en Left:
Múltiples pantallas
En el diseñador tenemos “Add Screen” a la derecha de “Checkpoint”. Así podemos
añadir pantallas. Luego, en el editor de bloques, utilizaremos “Open Another Screen”.
Como puedes ver, podemos utilizar el bloque set Button1.Image to para cambia la
imagen que aparece sobre el botón Button1. El valor que le ponemos es el nombre de la
imagen que previamente hemos subido con el diseñador de la app.
Las imágenes originales tienen distintas extensiones (jpg y jpeg) y, lo que es peor,
diferentes tamaños. Además, sus nombres no nos dicen nada. Lo ideal es cambiar los
nombres por bola8_arriba.jpg y bola8_abajo.jpg, además de cambiar con GIMP o
Photoshop la imagen de la bola8_abajo.jpg para que tenga exactamente el mismo tamaño
que la bola_arriba.jpg.
Lo que pasa es que queremos que aparezca una u otra imagen según las
circunstancias.
La verdad es que, en el caso de la bola mágica, el comportamiento debería ser este:
1. Empieza la app. Se ve la bola con el 8 encima.
2. El usuario agita. La bola “se gira”, mostrando la otra imagen, y hace su predicción.
3. La bola ignora todo lo que hace el usuario, agitar o lo que sea, hasta que el usuario
pulsa sobre la bola.
4. Cuando el usuario pulsa sobre la bola, se vuelve al momento inicial, es decir,
aparece la imagen de la bola con el 8 encima y está lista para hacer otra
predicción.
Si no hacemos esta corrección, al agitar la bola un poco más de la cuenta empieza a
hacer predicciones sin parar.
Para poder programar este nuevo comportamiento necesitaremos utilizar un bloque
ifelse, que está en Built-In/Control:
1. Agitar.
a) Si al agitar el usuario la bola, la imagen es la del 8 se realiza la predicción y se
cambia la imagen de la bola a la del triángulo.
b) En caso contrario, no se hace nada.
2. Clic sobre Button1.
a) Si al hacer clic el usuario sobre la bola, la imagen es la del 8, no se hace nada.
b) En caso contrario, se cambia la imagen de la bola a la del 8.
Introducción
¿Quieres saber cuál es la distancia en línea recta entre dos puntos del mapa? Eso
puede tener múltiples usos en Apps de geolocalización.
Con Google Maps puedes conocer la distancia entre dos puntos teniendo en cuenta
carreteras y caminos, pero en un juego en el que tienes que ir hacia un objetivo en campo
abierto, querrás saber cuál es la distancia en línea recta porque eso te permitirá orientarte
rápidamente.
La teoría
En matemáticas, cuando queremos calcular la distancia entre dos puntos, disponemos
de las coordenadas de ambos. Si las del primero son (x 1,y1) y las del segundo (x2,y2) la
distancia se calcula así:
√( x1−x2)2 +( y1− y2)2
Si tenemos en cuenta también la altura, cada punto tiene tres coordenadas, así que
tendríamos (x1,y1),z1) y (x2,y2,z2) y la fórmula sería:
√( x1−x2)2 +( y1− y2)2+(z1−z2)2
Genial, pero resulta que la latitud, la longitud y la altitud que nos da un sistema de
posicionamiento GPS no se corresponde con un sistema de coordenadas como estas,
sino que se trata de coordenadas geográficas, y son distancias angulares que se miden
en grados, minutos y segundos.
Los cálculos de la distancia se basan en la fórmula del Haversine.
La práctica
Pero vamos a dejar ya la teoría y veamos la fórmula de la distancia entre dos puntos,
en millas:
Acto seguido, debes entrar en el proyecto en el que te hace falta ese procedimiento (por
ejemplo, 10. ¿Dónde estáis?, en la página 104), abrir la mochila (haciendo clic sobre ella)
y sacar de allí el procedimiento.
Biografía: http://www.appinventor.org/bookChapters/chapter21.pdf.
Bibliografía
Para la siguiente versión de este documento hay que tener en cuenta lo siguiente:
“Guía turística de París” debería ser “Guía turística del desierto de las palmas”.
http://programamos.es/crea-tu-propio-videojuego-para-moviles-android/ es
excesivamente simple pero el hecho de que funcione con angry birds lo hace
interesante. En http://studio.code.org/hoc/1 está la idea completa de la que han
partido para hacer eso.
animar a que los alumnos vean lo que hay en la búsqueda dentro de YouTube “app
inventor juego” y que elijan qué juego les gustaría más hacer. Hay de todo. Es
curioso el caso de “Tutorial 73 - Android - AppInventor” por el número. Tal vez
“Videotutorial 04 (Parte1): Desarrollando un Juego – Layout Game” sea mejor, con
sus más de 9000 visualizaciones.
http://explore.appinventor.mit.edu/ai2/minigolf es una App que parece interesante (y
está explicada paso a paso, e incluso te puedes descargar el código fuente).
En https://sites.google.com/a/jcu.edu/cs128fall2012/ hay un enfoque tradicional
mezclado con moderno que tal vez amplíe la segunda parte del pdf de app
inventor, y que tiene como objetivo dirigirse hacia Python.
Nuevas Apps
Apps normalitas:
Araña. Es la del examen “EXAMEN_28JUN16” de 3ESO, pero hay que añadirle
cosas. Que haya que matar a las arañas antes de llegar a un borde. Que empiecen
su camino en un lugar aleatorio pero siempre a cierta distancia del centro (lejos de
los bordes). Si se matan al menos dos arañas, se sigue jugando. Habrá un
marcador de pantallas superadas.
Para los usuarios avanzados hay que preparar nuevas aplicaciones:
Otras, que tienen que hacer ellos mismos. Véanse los vídeos de YouTube que
Para que una App de AppInventor pueda “hablarse” con Twitter debe cumplir los
siguientes requisitos:
1. Que sea utilizada fuera de un centro de Conselleria, puesto que su red no permite
trabajar con Twitter (ni con Facebook ni muchos otros sitios web).
2. Que sea dada de alta en https://apps.twitter.com/. Para lograrlo, su nombre no
podrá contener la palabra “Twitter”. Por lo tanto, T5_TwitterSinManos no es válido,
aunque T5_PajaritoSinManos sí.
3. En el apartado Permissions deberá ponerse “Read and Write”, aunque yo prefiero
poner “Read, write, and direct messages”, si queremos que haga algo más que leer
mensajes. Al cabo de unos segundos, refrescar para ver si salen ya los permisos
cambiados pues, por defecto, son de sólo lectura.
4. En el apartado “API Keys” creo que hay que generar un “Token”. Sólo así
estaremos permitiendo que nuestra App esté autorizada para funcionar con nuestra
cuenta. Así que hay que pulsar sobre “Create my access token”. Al cabo de unos
segundos, refrescar para ver si sale ya la información correspondiente pero no
enseñarle a nadie tu “Access token secret”:
Guía didáctica
Se pueden utilizar para exámenes:
buscar "más mariquita", que son una serie de cosas a añadir rápidamente a la
mariquita. Se podría proporcionar con ".aia" todo lo necesario para ponerse manos
a la obra.
hacer una App que sea capaz de escuchar lo que dices y escribirlo, es decir, una
aplicación para dictar a Android un texto. Añadirle un botón para que lea lo que ha
escrito.
hacer una App de dibujo: rojo, avanza, derecha, avanza, avanza, amarillo, avanza.
Lo que publiqué
Acabo de subir "Curso de programación de Android.zip" a la carpeta de "Recursos y materiales", apartado
"Programación (1)".
Lo encuentro indicado para 3ESO, 1BACH, 2BACH. Los de 3ESO harían sólo las primeras actividades, en
1BACH podrían hacerse todas excepto las de Internet de las Cosas y Android Studio, y 2BACH todas.
Se trata de un curso de programación para Android con App Inventor con el siguiente contenido:
•buena parte del trabajo es una traducción del libro de O'Reilly al que he añadido actividades
adicionales. Se trata de actividades progresivas que van introduciendo conceptos a un ritmo que
cualquiera puede seguir
•está adaptado a la versión 2 de Inventor
•hay actividades adicionales, como la del "ahorcado"
•tiene un apartado dedicado al internet de las cosas, donde se ve cómo Arduino y Android pueden
convivir. Desde App Inventor prepararemos apps que manejarán a Arduino, el cual a su vez dará las
órdenes a otros dispositivos
•tiene también un apartado dedicado a Android Studio para hacer más fácil la transición de Inventor a
una herramienta más profesional