Archivo de la categoría: Didáctica

Novedades sobre App Inventor y Play Store

Google lanzó recientemente una nueva política de Play Store que afectará a algunas aplicaciones de App Inventor.

Todas las aplicaciones que utilizan el componente de mensajes de texto o llamada telefónica y se publican en Play Store deben reconstruirse. El equipo de MIT App Inventor está realizando un cambio en PhoneCall y Texting para ayudar a nuestros usuarios a lidiar con esta política de Google.

¿Cómo afectará esto a mis aplicaciones de App Inventor y qué debo hacer?

Con el cambio de Google, si crea una aplicación App Inventor que utiliza componentes de teléfono o mensajes de texto, no podrá enviarla a Google Play.

El equipo de MIT App Inventor está cambiando los componentes de Texting y PhoneCall para que las aplicaciones recién creadas cumplan con las restricciones de Google y puedan enviarse a Play como antes. Actualmente estamos probando los cambios y los lanzaremos en App Inventor pronto, en febrero de 2019.

Google también planea eliminar de Play las aplicaciones que violan su política. Si eso te sucede, deberás esperar el cambio a App Inventor, y luego reconstruir tu aplicación y volver a enviarla a Play.

¿Cuál es el cambio de política de Google Play Store?

El cambio de Google es que ya no permitirán aplicaciones en Play Store que envían directamente mensajes de texto (SMS) o hacen llamadas telefónicas. En su lugar, debe invocar la aplicación integrada de mensajes de texto (o llamada telefónica) del dispositivo. Por ejemplo, ya no será aceptada en Play Store una aplicación que envíe periódicamente mensajes de texto sin notificar al usuario del teléfono, y Google también puede eliminar las aplicaciones que se encuentran actualmente en Play Store. Google también ha creado un proceso en el que los desarrolladores pueden completar un formulario solicitando que se permita su aplicación como una excepción a la política.

Busque aquí la información que Google ha proporcionado:

https://support.google.com/googleplay/android-developer/answer/9047303

¿Se comportarán mis aplicaciones de manera diferente después de que se cambie App Inventor?

Sí, habrá un cambio. Cuando use Texting.SendMessage, el teléfono ahora dirigirá el mensaje a la aplicación normal de envío de mensajes de texto del teléfono. Del mismo modo para Phone.MakePhoneCall.

¿Puedo seguir utilizando App Inventor para crear aplicaciones que violen la política de Google para Play?

Sí.

El cambio de MIT a App Inventor incluirá versiones alternativas de Texting.SendMessage y Phone.MakePhoneCall que envían directamente mensajes de texto y hacen llamadas telefónicas. Puede crear aplicaciones con estas versiones alternativas y compartirlas con sus amigos y familiares. Pero necesitaría pedirle a Google una excepción de política para publicar esas aplicaciones en Play Store.

El MIT publicá un aviso cuando estas funciones estén en la página de App Inventor.

Más información sobre posibilidades de desarrollo con App Inventor

Arduino: Usando la función millis() en lugar de delay()

El código que sigue es un típico ejemplo de escritura a través de la comunicación serie de Arduino. Escribe “Hola” a través del puerto COM serie (visible con el Monitor Serie de Arduino, en la pestaña Herramientas), y espera durante 1000 milisegundos (1 segundo) al final de cada iteración del bucle.

La función delay() es muy fácil de usar para crear esperas, pero tiene un inconveniente: deja al microcontrolador “atrapado” dentro de la ejecución de esta función durante el tiempo que se ha indicado. Si hubiese un cambio en un pin que debería detectar, o si llegase información a través de cualquiera de las comunicaciones posibles (serie, I2C o SPI) el microcontrolador sólo se enteraría luego de completarse el retardo.

Una solución es crear un retardo que no deje insensible al sistema durante un tiempo tan extenso.

La función millis()

millis() devuelve el número de milisegundos desde que la placa Arduino empezó a ejecutar, luego de un reinicio o el encendido. Este número se desbordará (volverá a cero), después de aproximadamente 50 días.

Retorna la cantidad de milisegundos en un valor long sin signo (unsigned long).

Nota: Tenga en cuenta que como el valor de retorno para millis() es un long sin signo (unsigned long), pueden producirse errores lógicos si un programador intenta hacer operaciones aritméticas con tipos de datos más pequeños, como de tipo int. Incluso con los long con signo se pueden producir errores ya que su valor máximo es la mitad que la de su contraparte sin signo.

Ejemplo de texto “Hola” utilizando la función millis()

Hacerlo de esta manera solo tiene sentido como ejemplo, ya que es evidente que en este caso directamente se puede usar una función delay(1000). Pero de todos modos la diferencia entre este ejemplo y el código que usa la función delay(1000) es que el ciclo del código que usa la función millis() se ejecutará una vez por segundo con la máxima precisión posible. El bucle en un código con delay(1000) se ejecutará en algo más de tiempo, ya que se produce un retardo al ejecutar Serial.println(“Hola”). Ocurrirá igual con cualquier otra serie de instrucciones que se incluyan dentro del bucle.

¿Por qué usar millis() en lugar de delay()?

Presentaré dos ventajas al utilizar millis() para crear retardos, en comparación con el uso habitual de delay().

1. Cronometraje preciso

La primera ventaja que discutiremos es la exactitud en el tiempo.

Con millis() podemos garantizar que el bucle se ejecute tantas veces como queramos dentro del retardo sin afectar su extensión, independientemente del tiempo de ejecución (obviamente, siempre que el tiempo de ejecución de todas las instrucciones sea menor al retardo deseado).

Con delay() esto no es posible, ya que no sabemos cuánto tiempo durará el tiempo de ejecución de todas las instrucciones de programa que están dentro del ciclo.

Una sincronización precisa como esta es muy útil cuando se muestrea a una cierta frecuencia, o cuando se utilizan filtros, entre otras cosas.

2. Sin bloqueo

La ventaja principal de la función millis() es que no nos impide ejecutar otro código mientras estamos “esperando”.

Ejemplo: digamos que queremos imprimir “Hola” en el puerto serie una vez por segundo mientras hacemos otras cosas. Esto no es posible con delay(), ya que entrar a la función delay() pausa todo el código.

Aquí hay una manera de hacer esto:

Este fragmento de código es bastante similar al primer ejemplo que mostramos, excepto que este no bloquea el resto del programa mientras no se está imprimiendo hacia la línea serie.

3. Un simple secuenciador

Vamos a escribir un ejemplo simple en el que creamos un planificador que imprime ciertos trozos de texto a través de la línea serie a diferentes intervalos.

Así es como se ven los primeros 60 segundos en el Monitor Serie:

Esta es una manera agradable y fácil de sincronizar las ejecuciones en su código. También se puede ejecutar otras partes de código simultáneamente.




4. Una nueva función delay()

La función delay() estándar podemos reemplazarla por una implementada con la función millis(). Si bien parece que es lo mismo, ya veremos a continuación qué ventaja nos puede ofrecer su estructura de programa:

Además de esperar el tiempo indicado, esta función monitorea un pin de entrada del Arduino que haya sido cableado para detectar que ha sucedido algún evento externo. Si esa señal va a nivel BAJO (LOW), se interrumpe el retardo.

Para conectar varias entradas capaces de interrumpir el ciclo de retardo, se pueden agregar más elementos en la comparación de cierre del while, por ejemplo

while (Contador<=millis() && digitalRead(12)==HIGH) && digitalRead(11)==HIGH);

O se puede conectar a la entrada por el pin 12 (u otro pin elegido) un circuito como el que sigue, un AND realizado con lógica de diodos de señal (1N914 o 1N4148), que tiene la ventaja de que se puede ampliar indefinidamente. También se puede implementar con un circuito integrado compuerta AND.

Nota: quede claro que el circuito se representa con pulsadores, pero cada una de estas entradas puede ser un microswith, los contactos de un relé, o cualquier otro sensor que cierre circuito hacia GND (tierra o común).

Función micros() y desbordamiento

Al igual que delay() tiene una versión en microsegundos llamada delayMicroseconds(), la función millis() tiene como compañera para tiempos breves la función micros(). Si necesitamos una mejor resolución, micros() puede ser el camino a seguir. Sin embargo, tenga en cuenta que el valor devuelto por micros() se desbordará (volverá a cero) después de aproximadamente 70 minutos, en comparación con los 50 días de millis(). “Desbordamiento” significa que el conteo llega a su máximo, y entonces los valores de retorno de la función recomienzan desde cero.

Resumen

millis() y micros() son funciones realmente útiles para usar en tareas relacionadas con el tiempo. La opción inicial y típica de un programador de Arduino es usar delay(), que no siempre funcionará tan bien, principalmente cuando se programan muchas funciones que tienen que ver con el tiempo y existen eventos que no se pueden perder.

VL53L0X: Sensor de distancia que mide por la velocidad de la luz (Time-of-Fly)

El VL53L0X es un producto novedoso basado en el sistema FlightSense de la empresa ST Microelectronics. Es una tecnología innovadora que permite medir distancia con independencia de la reflectividad del objetivo.

En lugar de calcular la distancia midiendo la cantidad de luz reflejada desde el objeto (en lo que influye significativamente el color y tipo de superficie), el VL53L0X mide con precisión el tiempo que tarda la luz en viajar desde el objeto más cercano y volver reflejada hasta el sensor (un proceso llamado Time-of-Fly, o Tiempo de vuelo).

Debido a que utiliza una fuente de luz con un haz muy estrecho, es bueno para determinar la distancia de solamente la superficie que está directamente delante. A diferencia de los sonares ultrasónicos que hacen rebotar sus ondas de sonido, en este caso el “cono” de la detección es muy estrecho. A diferencia de los sensores de distancia IR que intentan medir la cantidad de luz que regresa, el VL53L0x es mucho más preciso y no tiene problemas de linealidad o “imágenes dobles”, en las que no se puede saber si un objeto está muy lejos o muy cerca.

Puede medir distancia con un alcance de hasta 2 m.

El control del procesador y la lectura de los resultados se realizan por medio de una interfaz I2C.

Características clave

  • Emisor infrarrojo: 940 nm
  • Distancia: hasta 2000 mm
  • Dirección I2C: Programable
  • Fuente de luz VCSEL (Vertical-cavity surface-emitting laser = Láser de emisión de superficie de cavidad vertical)
  • Sensor de rango con avanzado microcontrolador
  • El chip mide sólo 4,4 x 2,4 x 1,0 mm
  • Medición de distancia rápida y precisa
  • Mide rango absoluto hasta 2 m.
  • El rango reportado es independiente de la reflectividad del objetivo
  • Compensación óptica cruzada integrada avanzada para simplificar la selección del vidrio de cobertura
  • Seguro para el ojo humano
  • Dispositivo láser de clase 1 que cumple con la última norma IEC 60825-1: 2014 – 3ª edición
  • Fácil integración por el sistema de montaje de soldadura del chip
  • No tiene óptica adicional
  • Fuente de alimentación individual
  • Regulador de voltaje integrado en la plaqueta
  • Interfaz I2C para control de dispositivos y transferencia de datos
  • Pines de entrada salida de uso general Xshutdown (para reinicio) e Interrupt (interrupción)
  • Dirección I2C programable

Conexión con Arduino

  • VCC (en algunos fabricantes VIN) es la fuente de alimentación, el módulo acepta de 3 a 5V de alimentación. Use el mismo voltaje en el que se basa la lógica del microcontrolador. Para la mayoría de los Arduinos es 5V.
  • Conecte GND a tierra/alimentación común (marcado también GND en el Arduino).
  • Conecte el pin SCL al pin SCL (señal de reloj I2C en su Arduino. En un Arduino UNO también se conoce como pin A5, aunque está disponible del lado de los pines digitales. En un Mega es el digital 21 y en un Leonardo es el digital 3.
  • Conecte el pin SDA al pin SDA (datos I2C) en su Arduino. En un Arduino UNO también se conoce como pin A4, en un Mega es el digital 20 y en un Leonardo es el digital 2.

Los pines adicionales son:

GPIO1: este es un pin que usa el sensor para indicar que están listos los datos. Es útil para cuando se realiza una detección continua. Tenga en cuenta que no hay ajuste de nivel en este pin, es posible que no se pueda leer el voltaje de nivel lógico de 2,8V en un microcontrolador de 5V (podríamos en un Arduino UNO, pero no es seguro). La biblioteca de Adafruit no hace uso de este pin, pero está ahí para usuarios avanzados.

XSHUT – es el pin de apagado/reinicio para el sensor. Por defecto es alto. Hay un diodo de cambio de nivel para que se pueda usar la lógica de 3,3 – 5 V en este pin. Cuando el pin va a nivel bajo, el sensor entra en modo de apagado.




Abra el IDE de Arduino. Mantenga siempre actualizado a la última versión.

Abra en el menú HERRAMIENTAS la opción ADMINISTRAR BIBLIOTECAS.

Búsqueda y carga en el IDE Arduino de la biblioteca del VL53L0X

La elección ADMINISTRAR BIBLIOTECAS abrirá la siguiente ventana del Gestor de Bibliotecas:

En esa ventana tenemos, en la parte superior derecha una ventana de editor con la leyenda “Filtre su búsqueda…“, donde debemos escribir el nombre del dispositivo:

Esta búsqueda nos ofrece varias bibliotecas. Para Arduino UNO y relacionados tenemos la de Adafruit y la de Pololu. En artículos en la web recomiendan la de Pololu, porque es más simple que la del otro fabricante. De todos modos, podemos instalar ambas. No hay conflictos en esto. El botón que dice “Instalar” aparece cuando se coloca el puntero del mouse en la biblioteca elegida. Si no aparece, es porque ya está instalada. Si no fuese así, recurra a el enlace “More info” y descargue la biblioteca desde el sitio GitHub, en formato ZIP, y proceda a instalarla con las instrucciones que ofrecen AQUÍ.

El gestor nos indicará que la biblioteca está lista con un cartel remarcado “INSTALLED”.

Las bibliotecas quedan listas para ser utilizadas. La que corresponde a Pololu se llama VL53L0X, mientras que la de Adafruit se llama igual y está dentro de todas las bibliotecas de este fabricante, que llevan su nombre comercial como prefijo.

Dirección para el bus I2C

La dirección por defecto de I2C es 0x29, pero recuerde que es posible programar esta dirección en el VL53L0X. Con la biblioteca Adafruit, hay dos maneras de establecer la nueva dirección. Durante la inicialización, en lugar de llamar a lox.begin(), se llama a lox.begin(0x30) para establecer la dirección en 0x30. O se puede, más adelante, llamar a lox.setAddress(0x30) en cualquier momento. Es importante realizar esta operación con una sola placa VL53L0X conectada al bus I2C, o todas quedarán cambiadas.

Programas de prueba

“Continuous”, de Pololu
(Este ejemplo muestra cómo usar el “modo continuo” para tomar mediciones de distancia con el VL53L0X. La información se muestra en la pantalla emergente del Monitor Serie, que debe estar fijado en 9600 baudios.)

Y el que sigue es un ejemplo con la biblioteca de Adafruit, con los comentarios traducidos. Siempre con la misma conexión del diagrama de arriba.

En el programa que sigue, para reducir el ruido de la medición se muestra el promedio de varias medidas. Las líneas comentadas muestran los distintos modos de funcionamiento.

Imprimen en 3D partes mecánicas útiles con polvo similar al de la Luna

Un futuro en la luna

Para respaldar una base lunar futura y potencial, los investigadores de la Agencia Espacial Europea (ESA) imprimen en 3D y hornean polvo similar al de la Luna para formar tornillos, engranajes e incluso una moneda.

Tanto las agencias espaciales privadas como las gubernamentales han expresado serias intenciones y comenzaron a desarrollar planes para construir una base habitada por humanos en la Luna. Pero se necesita mucho combustible, capacidad de carga y dinero para lanzar cosas al espacio y bajarlas en la luna. Y construir una base lunar desde cero requerirá una gran cantidad de materiales. Por lo tanto, sería extremadamente caro llevar todas estas partes de la Tierra a la Luna, especialmente porque el mantenimiento requerirá piezas de respaldo para las reparaciones.

Es por esto que los investigadores están investigando una opción más sostenible. En lugar de llevar cosas, podríamos hacerlas usando polvo de Luna o regolito, como alimentación para una impresora 3D. De esta manera podrían crear materiales de construcción de forma económica y sencilla en la propia Luna.

Para practicar, el equipo de la ESA imprimió en 3D artículos como tornillos y engranajes con polvo lunar falso. Aunque sus propiedades difieren de las del suelo terrestre, el regolito lunar no es demasiado difícil de simular, y se le puede dar forma de objetos utilizables a los óxidos de silicio, aluminio, calcio y hierro presentes.

Cómo imprimir en 3D con polvo lunar

Para imprimir en 3D con polvo de luna falso, el equipo comenzó con un regolito hecho por el hombre. El polvo se trituró hasta el tamaño de partícula y los granos resultantes se mezclaron con un agente aglutinante que reacciona a la luz. Luego, una impresora 3D colocó la mezcla en capas hasta que tomó forma el objeto deseado. Luego se expuso el artículo a la luz para que se endureciera, y se coció en un horno para solidificarlo por completo.

El producto terminado es como una pieza de cerámica de polvo de Luna, dice la ESA en un comunicado. Estas piezas iniciales han demostrado que es probable que se impriman con el regolito real de la Luna en una base lunar, y son parte del proyecto URBAN, más grande, que examina cómo la impresión 3D podría ayudar a la colonización lunar.

VER VIDEO

“Si uno necesita imprimir herramientas o piezas de maquinaria para reemplazar las piezas rotas en una base lunar, la precisión en las dimensiones y la forma de los elementos impresos será vital”, dijo el ingeniero de materiales de la ESA Advenit Makaya en el comunicado.

Esta será una ventaja crítica para futuras misiones con destino a la Luna. Especialmente, para estadías prolongadas proyectadas en el satélite terrestre, aquellas cosas están destinadas a romperse o fallar. Si un solo tornillo se pierde o se rompe, es posible que la cuadrilla no tenga tornillos adicionales con la forma y el tamaño exactos necesarios. Al crear la pieza exacta requerida usando el regolito que los rodea, la tripulación podría mantener de manera sostenible las reparaciones en una base lunar.


Comparación entre placas Arduino

Comparación entre modelos de Arduino

Especificaciones de placas Arduino retiradas del mercado