Hace un año que surgió endleZZ en una sala de espera sin cobertura, como una forma de desarrollar un juego offline que no requiriese nada especial: solo un navegador y un fichero .html en tu móvil.
La idea es genial, me ha servido muchas veces para matar el tiempo, pero se merecía una mínima actualización visual y funcional.
Así que aquí está la versión 0.2: actualización de aniversario! 🎉
Contenido
Versión web
Accede a la versión web oficial que hospedo en este servidor:
Tras varios artículos sobre el uso de información satélite vamos a ver cómo unirlo (casi) todo en un ejemplo práctico e impactante. Y es que el tamaño de los últimos incendios ocurridos en España han llamado mucho mi atención y no era capaz de hacerme una idea de lo brutales que han sido (aunque nada que ver con otros sitios como Chile, Australia, o EEUU). Pero hagamos el ejercicio sin gastar demasiados GB de información geográfica.
Lo que quiero es mostrar la extensión del incendio ocurrido en Asturias en marzo, pero quiero también intentar mostrar el impacto retirando los árboles afectados por el fuego. ¡Vamos allá!
Contenido
Descarga de datos
Usaré un Modelo Digital de Superficies (que incluye árboles y estructuras), una ortofoto tomada durante el incendio, y un Modelo Digital del Terreno (al que han eliminado los árboles y las estructuras) para reemplazarlo por las zonas afectadas por el incendio.
1. Modelos del terreno
Usaré los modelos del genial IGN, descargando los productos MDS5 y MDT5 de la zona.
Usaremos el proceso i.group de GRASS en QGIS para agrupar las distintas bandas capturadas por el satélite en un único ráster RGB, tal y como vimos en este post:
Tendremos que hacerlo para cada una de las regiones descargadas, cuatro en mi caso, que luego volveremos a unir usando el proceso Construir ráster virtual.
1. Imagen de color verdadero (TCI)
Combinamos las bandas 4, 3, 2.
2. Imagen de falso color
Combinamos las bandas 5, 4, 3.
3. Ajuste de la tonalidad
Para obtener un mejor resultado, puedes regular los valores mínimos y máximos que se consideran en cada banda que compone la imagen. Estos valores se encuentran en el Histograma de las propiedades de la capa.
Aquí te dejo los valores que yo he usado para obtener el resultado de arriba:
Banda
TCI min
TCI max
FC min
FC max
1 Rojo
-100
1500
-50
4000
2 Verde
0
1500
-100
2000
3 Azul
-10
1200
0
1200
Extensión del incendio
Como ves, la imagen en falso color nos muestra claramente la extensión del incendio. Con ella, vamos a generar un polígono que delimite el alcance del incendio.
Primero consultaremos los valores de la banda 1 (rojo) que ofrece mayor contraste para la zona del incendio. Más o menos están en el rango 300-1300.
Usando el proceso Reclasificar por tabla, asignaremos el valor 1 a las celdas dentro del rango, y el valor 0 al resto.
Vectorizamos el resultado con el proceso Poligonizar y, contrastando con la imagen satélite, seleccionamos aquellos polígonos que correspondan con el incendio.
Usaremos la herramienta Disolver para unir todos los polígonos en un elemento, y Suavizar para redondear ligeramente los contornos.
Ahora obtenemos su inverso. Extraemos la extensión de la capa Landsat y, posteriormente, hacemos la Diferencia con el polígono del incendio.
Procesar terreno
1. Combinar los datos del terreno
Lo primero que haremos es combinar los distintos archivos que conforman los modelos en un archivo único (un único fichero MDS y un único fichero MDT).
Usamos el proceso GDAL - Miscelánea ráster - Construir ráster virtual
2. Extraer datos del terreno
Extraemos los datos que nos interesan de cada modelo:
Del MDS extraemos la superficie afectada por el incendio, de modo que quitaremos los árboles que hayan en él.
Con el MDT hacemos lo inverso: dejamos el terreno (sin árboles) de la zona del incendio, para sustituir los huecos generados en el otro modelo.
Usaremos el proceso Cortar ráster por capa de máscara empleando las capas generadas en el apartado anterior.
Finalmente unimos ambas capas ráster, para que rellenen una a la otra, usando Construir ráster virtual.
Dale vida con Cesium JS
Ya deberíamos tener un modelo de superficies sin árboles en la zona del incendio, pero vamos a intentar verlo de forma interactiva.
Ya mostré un ejemplo parecido, usando un Modelo Digital del Terreno personalizado, así como una imagen satélite reciente, del volcán Tajogaite de La Palma:
En este caso volveré a usar Cesium JS para poder interactuar fácilmente con el mapa (sigue el post anterior para ver cómo subir tus ficheros personalizados al visor Cesium JS).
Para esta ocasión he creado una pantalla dividida (usando dos instancias de CesiumJS) para poder comparar el antes y el después del incendio. Aquí tienes una vista previa:
Espero que te guste! Aquí tienes el código completo y el enlace a github para que puedas descargarlo. Y recuerda, comparte tus dudas o comentarios en twitter!
Hay veces que un Modelo Digital del Terreno (MDT) se queda corto o no está muy limpio. Si tienes acceso a datos LIDAR, puedes generar tú mismo un modelo del terreno y sacarle más partido obteniendo mayor detalle de las zonas que te interesen. Vamos a ver cómo.
Contenido
1. Descarga de datos
Nube de puntos
Voy a usar los magníficos datos públicos del Instituto Geográfico Nacional (IGN, España) obtenidos mediante vuelos que utilizan técnicas de medición láser (LIDAR).
Accede a los datos LIDAR del Centro de Descargas del IGN.
Descarga los archivos PNOA-XXXX...XXXX-RGB.LAZ. RGB emplea color verdadero; ICR, infrarrojo. Pero ambos son válidos.
TIP! Descarga todos los ficheros a la vez utilizando el fichero el applet del IGN. Es un fichero .jnlp que requiere JAVA instalado en Windows o IcedTea en Linux (sudo apt-get install icedtea-netx)
2. Procesado de nube de puntos LIDAR en QGIS
Visualización directa
Desde las últimas versiones (p.e.: 3.28 LTR Firenze), QGIS permite visualizar directamente los ficheros de nube de puntos.
En el menú Capa -> Añadir capa... -> Añadir capa de nube de puntos...
Se mostrarán los datos que hemos descargado en color verdadero, que podemos clasificar en las Propiedades de Simbología, eligiendo la representación de Clasificación por tipo de datos:
Vista 3D
Otra función que trae ahora QGIS por defecto es la visualización de la información en 3D.
Vamos a configurar las propiedades 3D de la capa LIDAR para triangular las superficies y obtener un mejor resultado.
Ahora creamos una nueva vista en el menú Ver -> Vistas del Mapa 3D -> Nueva vista del mapa 3D. Con SHIFT+Arrastrar rotaremos la vista en perspectiva.
Complemento de LAStools
Para utilizar la información fácilmente usaremos las herramientas del plugin LAStools, que instalaremos de la siguiente manera:
TIP! En Linux es recomendable tener instalado Wine para trabajar con los ficheros .exe o será necesario compilar los binarios.
Accede a la web de LAStools y navega a la parte inferior:
La herramienta completa es de pago, pero puedes acceder a la descarga pública para utilizar las funciones básicas que necesitamos.
Descomprime el fichero .zip en una carpeta sencilla (sin espacios ni caracteres especiales)
Ahora abre QGIS, busca el complemento LAStools e instálalo.
Por último, configura la ruta de instalación de LAStools (si es distinta de su valor por defecto C:/ ). La configuración mostrada abajo sirve para Linux con Wine instalado (en mi caso uso PlayOnLinux).
Extraer tipos de datos LIDAR
Con LAStools podemos extraer información de los distintos tipos de datos que componen la nube de puntos. Por ejemplo, vamos a extraer solo los datos clasificados como Suelo (que se corresponden con el valor 2).
Con el proceso las2las_filter podremos crear una nueva nube de puntos filtrada:
Selecciona el fichero a filtrar.
En filter, elige la opción keep_class 2 para conservar solo el tipo de datos 2 (suelo)
Deja lo demás por defecto, e introducir 0 en los campos que requieren un valor value (de lo contrario devolverá un error).
Por último, guarda el fichero con formato .laz en una ubicación conocida para encontrarlo fácilmente.
Al finalizar solo tendrás que cargar el fichero generado para ver la nueva nube de puntos con valores exclusivamente del terreno (edificios y vegetación eliminados).
Conversión de LIDAR a vectorial
Ahora usaremos el proceso las2shp para transformar la nube de puntos a formato vectorial y poder operar normalmente con otras herramientas de GIS:
Elige el fichero de nube de puntos filtrado anteriormente.
Especifica 1 punto por registro para extraer todos los puntos de la nube.
Guarda el fichero con formato .shp en una ubicación conocida para encontrarlo fácilmente.
Y esta será tu nube de puntos filtrada en el formato clásico vectorial.
Como verás, la tabla de atributos no cuenta con ningún campo específico. Yo voy a crear un campo ELEV para guardar las coordenadas Z (o cota) y utilizarlas para generar un Modelo Digital del Terreno a continuación.
3. Creación del Modelo Digital del Terreno
Raster a partir de capa de puntos vectorial
Gracias a la integración de GRASS GIS, disponemos de potentes herramientas de procesado vectorial y ráster. Vamos a usar v.surf.idw para generar una malla regular a partir de la interpolación de los datos de una capa de puntos (en este caso se ponderan los valores obtenidos mediante el inverso de la distancia, pero también hay algoritmos para emplear splines).
Seleccionamos la capa vectorial de puntos.
Elegimos el número de puntos para emplear en la interpolación (en este caso los puntos son bastante densos así que elijo 50). Cuantos más elijas, más suavizado será el resultado, pero perderás el detalle de la densidad de la información.
Dejamos la potencia del inverso de la distancia en 2, para emplear el "inverso de la distancia al cuadrado".
Seleccionamos el campo de datos que usará la interpolación (ELEV).
Definimos el tamaño de celda de la malla. Elijo 2 para poder comparar el resultado con el producto MDT 2 metros del IGN.
4. Resultado
Vamos a quitar zoom para ver cómo ha quedado todo:
Nube de puntos LIDAR en RGBMDT de 2 metros a partir de LIDAR
Y ahora veamos un poco más el detalle.
Aplicamos la misma rampa de color al MDT que hemos generado y al producto descargado del IGN para comparar el resultado obtenido. En general es muy bueno, con algunas diferencias en zonas arboladas, siendo más razonable el resultado de nuestro procesado.
MDT 2m LIDARMDT 2m IGNLIDAR + SatIGN + Sat
¡Y eso es todo! Cualquier duda o comentario lo puedes dejar en Twitter!
La moda de la IA va para largo, y hoy se habla mucho de Vall-E y su futura combinación con GPT-3. Pero hay que recordar que todos estos productos de Inteligencia Artificial provienen de investigaciones colaborativas que han sido de código abierto, por lo que siempre encontraremos un equivalente de software libre, y deberíamos estar agradecidos por ello.
Es el caso de TorToiSe-TTS (text to speech), un generador de voz a partir de texto mediante IA totalmente gratuito para usar en tu ordenador.
Solo tendremos que iniciar sesión e ir dándole al "play" ▶ para ejecutar cada bloque de código.
Pero seguro que quieres ejecutar TorToiSe-TTS de forma local, sin necesidad de internet, y guardar los audios en tu disco duro, así que seguimos.
Instalar python3
Como muchas aplicaciones de IA, TorToiSe-TTS se ejecuta en python, por lo que debes instalar python3 en tu ordenador. Ya sabes que yo siempre recomiendo el uso de Linux, pero podrás ejecutarlo también en un terminal de Windows.
También puedes descargar mi repositorio, donde añado instrucciones más detalladas, un lanzador de interfaz en terminal y las voces de prueba de Ultrón (si, el androide maligno de Tony Stark) que verás más abajo.
A continuación tendremos que instalar una serie de módulos necesarios para arrancar TorToiSe-TTS, pero antes vamos a crear una versión virtual de python, para que la instalación de esos módulos no afecte al resto de la instalación de python. Verás que al final esto es muy útil cuando utilizas diferentes apps de IA que utilizan distintas versiones de cada módulo.
En un terminal escribimos lo siguiente, de forma que creamos el entorno "TTS":
cd tortoise-tts
python3 -m venv TTS
Y lo activamos así:
source TTS/bin/activate
Ahora verás que tu terminal hace referencia al entorno TTS:
(TTS) abc@123:~$ |
Instalar módulos de python
Vamos a instalar los módulos de python necesarios, siguiendo las indicaciones del collab:
-v: voz a utilizar para convertir el texto. Debe ser el nombre de una de las carpetas disponibles en /tortoise/voices/
-V: especifica una carpeta para las voces, para el caso de usar una personalizada. Podemos crear nuevas carpetas en /tortoise/voices/
--seed: semilla para caracterizar el algoritmo (cualquier número vale)
-p: modo predefinido para determinar la calidad ("ultra_fast", "fast", "standard", "high_quality").
-o: ruta y nombre del fichero de salida. Se debe especificar el formato del archivo, que será .wav
Si usas el script de mi repositorio TTS.sh se te pedirán estos argumentos por pantalla y se ejecutará el algoritmo automáticamente.
Añade tus propias voces
Puedes añadir más voces a TurToiSe-TTS. Yo por ejemplo he querido añadir la voz de Ultrón, el supervillano de Marvel, siguiendo las indicaciones del desarrollador Neonbjb:
Debes recopilar unas 3 grabaciones "limpias" (sin ruidos de fondo ni música, preferiblemente) de unos 10 segundos de duración.
El formato debe ser WAV de 16bits de coma flotante con 22500 de frecuencia de muestreo (puedes usar Audacity)
Crea una nueva carpeta en la ruta /tortoise/voices (o realmente donde quieras) y guarda ahí las grabaciones.
Al ejecutar TorToiSe-TTS, deberás indicar la ruta de la carpeta de voces con el argumento -V y la nueva voz con el argumento -v
Por ejemplo, para usar mis grabaciones de Ultrón:
python3 sripts/tortoise_tts.py "This is The Roaming Workshop" -V "./tortoise/voices" -v "ultron-en" -p "fast" --seed 17 -o "./wavs/TRW_ultron3.wav"
Que suena así:
Yo he tomado recortes de una escena de Vengadores: la era de Ultrón, tanto en inglés (ultron-en) como en español (ultron-es) que puedes descargar de mi repositorio.
"Ultron supervillain" by Optimised Stable Diffusion + Upscayl 2. The Roaming Workshop 2023.
Por ahora el modelo de TorToiSe-TTS está entrenado solo en inglés, por lo que solo funciona adecuadamente en este idioma.
Puedes introducir texto en otro idioma, y la IA intentará leerlo, aunque usará la pronunciación que ha aprendido del inglés y sonará bastante extraño.
Si te animas a entrenar un modelo para tu idioma (necesitas mucha GPU y varios meses), contacta con el desarrollador, ya que tiene bastante interés en ampliar el proyecto.
Mientras tanto, puedes dejar tus dudas y comentarion en 🐦 Twitter o 🐤 Koo!
La generación de imágenes mediante IA tiene un alto coste computacional. Que no te engañe la velocidad de la API de Dall·E 2 que vimos en este otro post; si estos servicios habitualmente son de pago es por algo y, fuera de los servicios online que ya vimos, ejecutar IA en tu ordenador no es tan sencillo.
Después de probar, en vano, algunas alternativas open-source como Pixray o Dalle-Flow, finalmente te traigo la más simple de todas: dalle-playground. Esta es una versión primeriza de Dalle, por lo que no se obtienen los mejores resultados.
Aun así, pronto traeré una alternativa a Dall·E (Stable Diffusion de stability.ai), que también cuenta con una versión optimizada por la comunidad para PCs con pocos recursos.
«Underwater life» from dalle-playground (Dalle mini)«Underwater life» from Optimised Stable-Diffusion
Contenido
Requisitos
"Computer hardware elements" by dalle-playground
Hardware
Para que te hagas una idea, Pixray recomienda mínimo 16GB de VRAM y Dalle-Flow 21GB. VRAM o virtual RAM es la memoria de acceso rápido que tiene tu tarjeta gráfica (no confundir con la memoria RAM de toda la vida).
Un portátil estándar como el mío tiene una Nvidia GeForce GTX1050Ti con 3GB de VRAM dedicada, más luego 8GB de RAM en placa.
Con este requisito mínimo, y un poco de paciencia, podrás ejecutar Dalle-playground localmente en tu PC, aunque también requiere una conexión a internet para comprobar que los módulos python y el punto de control de la IA están actualizados.
Si tienes alguna o varias gráficas más potentes yo te recomiendo probar Pixray, ya que se instala relativamente fácil y está muy extendido y documentado.
Los requisitos de software tampoco son triviales. Principalmente necesitarás python y Node.js. Yo enseñaré los pasos principales de Linux, que tiene mucha más flexibilidad a la hora de instalar todo tipo de paquetes de este tipo, pero es igualmente válido para Windows o Mac si te manejas con la terminal o usando docker.
Descarga dalle-playground
Casualmente descubrí este repositorio antes de que fuese actualizado a Stable Diffusion V2 (allá por noviembre de 2022) y tuve la perspicacia de clonarlo.
Accede y descarga todo el repositorio desde mi github:
Yo renombré el directorio simplemente a dalle-playground.
Instala python3 y los módulos requeridos
Todo el algoritmo trabaja con python en un backend. En el repositorio solo se menciona el uso de python3, por lo que asumo que versiones anteriores no funcionarán. Comprueba tu versión de python con:
>> python3 -V
Python 3.10.6
O instálalo, si no lo tienes, de su fuente oficial (creo que ya vamos por python 3.11, así que comprueba cuál es la última disponible para tu sistema operativo):
También necesitarás el módulo venv para virtualizar el entorno de trabajo de dalle-playground y no alterar toda tu instalación de python (lo siguiente es para Linux, en Windows viene incluído en su instalador):
sudo apt-get install python3.10-venv
En la carpeta de backend, crea un entorno virtual de python, que yo llamaré dalleP:
cd dalle-playground/backend
python3 -m venv dalleP
Ahora, activa este entorno virtual (verás que aparece el nombre al inicio de la línea del terminal):
(dalleP) abc@123: ~dalle-playground/backend$
Instala el resto de módulos de python que requiere dalle-playground y que se indican en el fichero dalle-playground/backend/requirements.txt
pip3 install -r requirements.txt
Aparte, si no lo tienes ya, necesitarás pyTorch:
pip3 intall torch
Instala npm
Node.js ejecutará un servidor web local que servirá de app. Instálalo de la fuente oficial:
Ahora ve a la carpeta del frontenddalle-playground/interface e instala los módulos necesarios de Node.js :
cd dalle-playground/interface
npm install
Lanzar el backend
Con todo instalado lanzamos los servidores, empezando por el backend.
Primero activamos el entorno virtual de python3 en la carpeta dalle-playground/backend (si acabas de instalarlo, lo tendrás ya activado del paso anterior)
cd dalle-playground/backend
source dalleP/bin/activate
Lanzamos la aplicación de backend:
python3 app.py --port 8080 --model_version mini
El backend tardará varios minutos en arrancar (de 2 a 5 min). Esperamos a que salga un mensaje como el siguiente y nos fijamos en las direcciones IP que nos aparecen al final:
--> DALL-E Server is up and running!
--> Model selected - DALL-E ModelSize.MINI
* Serving Flask app 'app' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8080
* Running on http://192.168.1.XX:8080
Lanzar frontend
Ahora lanzamos el servidor web local de Node.js, para lo que ejecutamos una nueva terminal:
cd dalle-playground/interfaces
npm start
En cuanto acabe, se abrirá un navegador web y nos mostrará el menú gráfico de la aplicación.
Lanzador automático
En Linux puedes usar mi script launch.sh que lanza backend y frontend automáticamente siguiendo los pasos de arriba. Solo siéntate a esperar a que cargue.
launch.sh
#!/bin/bash
#Launcher for dalle-playground in Linux terminal
#Launchs backend and frontend scripts in one go
$(bash ./frontend.sh && bash ./backend.sh &)
#Both scripts will run in one terminal.
#Close this terminal to stop the programm.
backend.sh
#!/bin/bash
#Backend launcher for dalle-playground in Linux terminal
#move to backend folder
echo "------ MOVING TO BACKEND FOLDER ------"
cd ./backend
#set python virtual environment
echo "------ SETTING UP PYTHON VIRTUAL ENVIRONMENT ------"
python3 -m venv dalleP
source dalleP/bin/activate
#launch backend
echo "------ LAUNCHING DALLE-PLAYGROUND BACKEND ------"
python3 app.py --port 8080 --model_version mini &
frontend.sh
#!/bin/bash
#Frontend launcher for dalle-playground in Linux terminal
#move to frontend folder
echo "------ MOVING TO FRONTEND FOLDER ------"
cd ./interface
#launch frontend
echo "------ LAUNCHING DALLE-PLAYGROUND FRONTEND ------"
npm start &
App dalle-playground
En el primer campo introduciremos la dirección IP del servidor de backend que vimos anteriormente. Si accedes desde el mismo PC puedes usar la primera:
http://127.0.0.1:8080
Pero puedes acceder desde otro dispositivo de tu red local mediante la segunda:
http://192.168.1.XX:8080
Ahora introducimos la descripción de la imagen a generar en el segundo campo, y por último definimos el número de imágenes que queremos que se generen (a mayor número, más tiempo tardará).
Pulsamos [enter] y esperamos a que se genere la imagen (sobre 5 minutos por imagen).
Y aquí está nuestra primera imagen generada por IA en nuestro ordenador. Yo os dejo una pequeña galería de resultados. Y en el próxmo post veremos cómo obtener mejores resultados mediante Stable Diffusion, también usando menos de 4GB de VRAM.
Ya sabes que espero tus dudas y comentarios en 🐦 Twitter!
Tenía un Shelly Dimmer incrustado en la caja del enchufe en la pared, pero un buen día dejó de funcionar (probablemente por las altas temperaturas, soporta hasta 35ºC). Buscando un repuesto, vi que Sonoff había sacado su equivalente y por 1/3 del precio del Shelly.
Al final, lo barato sale caro, y es que resulta bastante más complicado de configurar que el Shelly Dimmer y tiene un mayor tamaño.
Después de muchas pruebas, y debido a la mala documentación, aquí explico cómo configurar el Sonoff D1 Dimmer para usar su API local y no depender de la aplicación e-weLink.
Además, por su tamaño, no encontrarás mucho sitio en tus cajas de conexiones para incrustar el Sonoff Dimmer, así que te doy la idea de montar un alargador para conectarlo de manera externa.
Contenido
Requisitos
Sonoff D1 Dimmer.
Cable eléctrico de dos hilos (fase y neutro).
Clavija de enchufe macho.
Clavija de enchufe hembra.
Mando Sonoff RM-433 (muy recomendado).
Material para ensamblar una carcasa (impresora 3D, madera, etc).
Conexión eléctrica
Lo primero que necesitarás es conectar el D1 a la red de 220V de tu casa, según el esquema de montaje que nos facilitan en su manual:
El esquema de conexión anterior sigue más o menos la norma Europea:
Fase (positivo): negro, marrón o gris (en este caso rojo...)
Neutro (negativo): azul.
También te digo que el Shelly Dimmer es mucho más compacto y cabe sin problemas en las cajas que normalmente se usan para alojar los enchufes de pared. En este caso no, así que yo lo voy a conectar de forma externa mediante un cable alargador, y luego detallaré una sencilla carcasa para su ensamblaje.
TIP! Si no tienes mucha experiencia con la electricidad, más vale que investigues un poco y tomes todas las precauciones. No es agradable pegarse un calambrazo con un cable de la red doméstica. Si realizas la conexión de manera externa, como en este caso, no corres tanto peligro.
Por ahora con esto ya podemos hacerlo funcionar.
Conexión a internet
Ahora viene lo complicado, y es que en tanta carcasa se ve que no cabía un simple botón para las habituales tareas de encender/apagar/restaurar.
Si tienes suerte, tu Sonoff no vendrá preconfigurado y podrás conectarte a él de primeras. Si viene preconfigurado, posiblemente porque se haya comprobado su funcionamiento en otra red, el dispositivo ya no es detectable ni si quiera mediante la app e-weLink, a menos que estes en la red donde se configuró.
Para reconocerlo, se deben restaurar los valores de fábrica y para ello tenemos dos opciones:
Restaurarlo mediante app e-weLink desde la red donde se configuró (muy poco probable que tengas acceso a ella).
Restaurarlo mediante el mando Sonoff RM-433 (al final acabarás teniendo que comprarte este accesorio extra).
Emparejar mando Sonoff RM-433
Al final, el humilde precio del D1 se ha duplicado por la necesidad de comprar el mando RM-433, pero bueno, su precio tampoco es descabellado. Aquí su manual:
Lo primero que debemos hacer es emparejar el mando con el D1:
Conectamos el D1 a un enchufe.
Mantenemos el botón 7 pulsado durante unos 5 segundos, hasta que se oiga un pitido (esto elimina la asignación de radiofrecuencia anterior).
Desenchufamos y enchufamos el D1 para reiniciarlo.
Pulsamos cualquier botón del mando para que se asigne al D1.
Se oirá un pitido y el mando queda emparejado, pudiendo manejarse el D1 con él.
Restaurar red WIFI
Ahora necesitamos restaurar también la red asignada al D1.
Para ello, mantenemos pulsado el botón 8 durante unos 5 segundos, o más bien, hasta que veas que empieza a parpadear de la siguiente manera:
Modo "respiración" o breath. Dos pulsos rápidos, uno lento.
Has eliminado la red anterior. Ahora hay que ponerlo en modo emparejamiento.
Volvemos a pulsar el botón 8 durante unos 5 segundos, o más bien, hasta que veas que empieza a parpadear constantemente:
Modo emparejamiento. Pulsos constantes.
De esta forma el dispositivo inicia un Punto de Acceso WIFI (WIFI AP) que tendrá un nombre en la forma ITEAD-XXXXXXXXXX.
Emparejar con e-weLink
Ahora, si quieres el camino fácil, deberás descargarte la aplicación e-weLink y pulsando el botón emparejamiento rápido tendrás tu D1 disponible para usar mediante esta app.
Emparejar en modo DIY
Pero ya sabrás que a mí me gusta complicarme y quiero habilitar el modo DIY (Do It Yourself) para poder acceder a la red del dispositivo y manejarlo mediante los comando de la API HTTP desde mi propia web app.
Para esto, buscamos la red ITEAD-XXXXXXXXXX creada por el dispositivo y nos conectamos introduciendo la contraseña 12345678.
Ahora abrimos un navegador web y accedemos a la dirección http://10.10.7.1 donde veremos las siguientes pantallas.
Aquí introduciremos el nombre (SSID) y la contraseña de nuestra red WIFI, y el dispositivo quedará ya vinculado a ella.
Ensamblaje
Antes de entrar en el detalle del manejo de la API HTTP, te dejo un diseño de carcasa impresa en 3D para evitar que se queden los cables y las conexiones al aire.
Cuenta con dos piezas de PLA (base y tapa) para poder atornillarlas entre sí y las puedes descargar desde mi servidor:
Para usar los comandos de la API HTTP deberás conocer la IP del dispositivo en la red local.
Averiguar IP mediante router
Puedes acceder al mapa de red de tu router, normalmente mediante la dirección http://192.168.1.1
Tanto la dirección como la contraseña de acceso deberían aparecer en una pegatina en tu router. Luego verás tu dispositivo con algún nombre tipo ESP-XXXX derivado del dispositivo WIFI que porta (aquí yo ya lo he renombrado):
Averiguar IP mediante nmap
Mediante un terminal, puedes usar el programa nmap para escanear tu red local.
Descárgalo si no lo tienes: sudo apt-get update sudo apt-get install nmap
Escanea tu red (con sudo aportará también la dirección MAC, útil por que la IP podría llegar a cambiar al reiniciar tu router) sudo nmap -v -sn 192.168.1.0/24
Enviar solicitudes HTTP al dispositivo
La API HTTP del Sonoff D1 viene documentada en su web:
Para poder comunicarte con el dispositivo necesitas enviar solicitudes HTTP mediante algún programa tipo Postman o mediante curl o wget en un terminal.
La solicitud se hará a la IP del dispositivo, en el puerto por defecto 8081, y además deberemos incluir la id del dispositivo en el cuerpo o body de la solicitud (la id coincide con el código XXXXXXXXXX que tenía la red WIFI ITEAD-XXXXXXXXXX).
Veamos algunos casos usando curl y Postman.
Información del dispositivo
http://[ip]:[port]/zeroconf/info
curl
curl -X POST 'http://192.168.1.34:8081/zeroconf/info' --data-raw '{"deviceid": "XXXXXXXXXX","data": {}}'
curl -X POST 'http://192.168.1.34:8081/zeroconf/switch' --data-raw '{"deviceid": "XXXXXXXXXX","data": {"switch":"on"}}'
Postman
Respuesta
{
"seq": 9,
"error": 0
}
Ajuste del brillo
http://[ip]:[port]/zeroconf/dimmable
curl
curl -X POST 'http://192.168.1.34:8081/zeroconf/dimmable' --data-raw '{"deviceid": "XXXXXXXXXX","data": {"switch":"on","brightness":50,"mode":0,"brightmin":0,"brightmax":100}}'
Postman
Respuesta
{
"seq": 14,
"error": 0
}
Y con esto ya puedes programar tu propia aplicación y controlar tu D1 a tu gusto de forma totalmente privada. Espero que te resulte útil, pero si te surgen dudas o comentarios, no dudes dejarlos en Twitter 🐦!
Después de muchas idas y venidas, pruebas, rediseños, quemaduras, cortes y alguna que otra pequeña explosión, por fin traigo un del reloj de mesa inteligente en el que llevo dos años trabajando. Hacer un tutorial completo y detallado sería todavía más largo y tedioso, pero espero que estas pinceladas sean de ayuda para hacer el tuyo propio. Aviso de que se requiere mucho tiempo y práctica y no se puede hacer a la ligera…
Contenido
Qué es Temps-i 7?
Desgranemos su nombre:
Temps es tiempo en valenciano,
i de internet, que es de donde obtiene la hora,
7 de la pantalla que utiliza, de 7 segmentos para cada dígito.
Estos tres conceptos definen a este compacto reloj de sobremesa, con conectividad WIFI, sensor de temperatura y buena autonomía.
Vamos a ver cómo se hace!
Componentes
Primero, veamos los ingredientes de la receta y qué hace cada uno:
Sparkfun Esp32 ThingPantalla de segmentosBMP-280ResistenciasPCB personalizadaLiPo 3.7v 1000mAh
Placa ESP32-Thing de SparkFun >>Microcontrolador de altas prestaciones con conectividad WIFI y Bluetooth gracias al chip ESP32 integrado, ideal para proyectos de IoT.
Pantalla de 4 dígitos de 7 segmentos de color rojo. >>Mostrará la hora y la temperatura.
Módulo BMP-280 >>Sensor digital de temperatura y presión barométrica muy compacto.
Resistencias de 100 Ohm. >>Necesarias para reducir la corriente en la pantalla, sin disminuir excesivamente su brillo (admite hasta 1k Ohm, pero así sería difícilmente visible con la luz del día).
Placa PCB con circuito impreso personalizado. >>Simplifica la conexión de la pantalla y las resistencias al microcontrolador.
Batería LiPo 3.7v 1000mAh >>Asegura una autonomía de más de 48 horas sin alimentación externa.
Cables puente. >>Para realizar conexiones adicionales con los módulos externos.
Pulsador >>Usado para alternar el programa mostrado en pantalla.
Diseño electrónico
Es muy importante estudiar los componentes electrónicos que vamos a utilizar, leer todas las especificaciones y prototipar con todas las precauciones antes de ponernos a soldar como locos.
Elección de los componentes
Los componentes arriba listados no son mera casualidad ni copia de ninguna otra parte. Simplemente son la prueba más exitosa de muchas otras y que cumplen todas las necesidades del proyecto:
La pantalla de 4 dígitos muestra exclusivamente lo que busco ver: la hora. Si además puedo aprovechar para mostrar la temperatura, pues mejor. Pero una pantalla de más calidad, de tipo LCD, generaría un mayor consumo realmente innecesario ya que otra de las características fundamentales es la autonomía.
El microcontrolador cuenta con conexión a internet, así como suficiente capacidad de cómputo. Además, tiene suficientes pines entrada/salida para manejar la pantalla sin necesidad de un expansor de pines. Otras opciones que he probado:
Microcontroladores más compactos: Teensy 4, Digispark, SparkFun Pro Micro. Necesitan expansor de entrada/salida (PCF8574) y/o módulo WIFI (ESP-01). Además, requiere demasiadas conexiones.
Microcontralor con conexión WIFI integraday suficientes E/S, como la NodeMCU con Esp8266. Faltaba potencia en el procesador y se retrasaba casi 4 segundos en cada minuto.
Prototipado del circuito eléctrico
Una vez estudiados y obtenidos los componentes, los conectamos en una placa de prototipos (o protoboard) para probar su funcionamiento.
En mi caso, tras varias combinaciones de pines, la forma más organizada me ha resultado ser la siguiente:
ESP32-Thing
Componente
VBAT
LiPo +
3V3
BMP-280 3V3
GND
LiPo - BMP GND BMP SD0 Pulsador -
GPIO21
BMP SDA
GPIO04
BMP SCL
GPIO32
Pulsador +
GPIO17
Pantalla Dígito 1
GPIO23
Pantalla Dígito 2
GPIO19
Pantalla Dígito 3
GPIO25
Pantalla Dígito 4
GPIO15
Pantalla Segmento A
GPIO22
Pantalla Segmento B
GPIO27
Pantalla Segmento C
GPIO12
Pantalla Segmento D
GPIO13
Pantalla Segmento E
GPIO18
Pantalla Segmento F
GPIO26
Pantalla Segmento G
GPIO14
Pantalla Segmento P (punto)
Esquema de patillaje
Una vez tengamos el prototipo montado, es bueno pasarlo a un esquema con un programa de EDA (automatización de diseño electrónico) como Kicad, donde también podremos generar un diseño de PCB para mandar a fabricar. Si no, siempre puedes hacer el esquema en papel, ya que dentro de dos meses no vas a recordar dónde iba cada cable...
Kicad tiene su truquillo y es bueno practicar antes con proyectos más sencillos. Aun así, es asequible para usuarios medios, ya que básicamente consiste en buscar y elegir símbolos de nuestros componentes y conectar sus pines correctamente según sus especificaciones.
Yo, para no liar la cosa de cables en el papel, he usado nombres en cada conexión, que también es válido en Kicad. Además, verás que la ESP32-Thing está compuesta por dos tiras de 20x pines, ya que no encontré ningún símbolo que me funcionara y no tenía tiempo de diseñarlo como toca. Lo importante es que nuestro diseño funcione y sea coherente con la realidad.
Esquema de Kicad
Lo siguiente es asignar huellas realistas (o footprints) a cada símbolo de componente, y entonces podremos diseñar una placa de circuito impreso (o PCB) que podemos enviar a fabricar (normalmente a China) por unos 15€ / 5 placas.
No hay que volverse muy locos con esto, especialmente si no somos expertos. Yo solo lo uso para facilitar las soldaduras cuando hay muchas conexiones, como es este caso donde se realizan unas 90 soldaduras pero se mantiene un formato bastante compacto.
Diseño de PCB en KicadVisor PCB en 3DPCBs encargadas
Programación del reloj
La mayoría de microcontroladores, como el ESP32-Thing, son compatibles con el IDE de Arduino, lo cual facilitará la conexión con la placa para enviarle un programa de reloj.
Antes de empezar, es importante hacer un pequeño listado de las tareas y funciones que queremos incluir en el programa e irlo modificando mientras las programamos. De esta forma podremos probar las distintas funciones por separado, y debuguear los distintos pasos para corregir errores más rápidamente. En mi caso, de nuevo tras muchas pruebas, quiero que el programa conste de lo siguiente:
Definición de librerías y variables.
Configuración de pines.
Conexión WiFi.
Obtener fecha por SNTP.
Desconexión y apagado de WiFi (ahorra batería).
Conversión de fecha a dígitos.
Muestra de dígitos en pantalla.
Iniciar temporizador.
Iniciar lectura de pin de cambio de programa.
Cambio de programa al activar el pulsador.
Lectura de sensores.
Muestra de temperatura en pantalla.
Actualizar hora al finalizar el temporizador (cada minuto).
Reiniciar temporizador.
No me quiero entretener mucho con el código, y encima no es el más ordenado que tengo, pero lo dejo aquí incrustado para quien lo quiera copiar, o también en github:
Ten en cuenta que se hace uso de las siguientes librerías adicionales que deberás instalar usando el IDE de Arduino:
Gestor de placas esp32 de Espressif
Librería WiFiMulti
Librería Adafruit_BMP280
(el resto de librerías se derivan de las anteriores)
Deberemos probar constantemente el funcionamiento del código durante la fase de prototipado para poder cambiar la asignación de pines en caso de algún mal funcionamiento. Si ya está todo soldado y nos falla algo, será bastante más complicado encontrar y resolver el error, de ser en alguna conexión.
Ensamblaje
Soldaduras
Una vez comprobado el código y diseñada la PCB, ya podemos empezar a soldar, teniendo claro donde va cada cosa y tomando mucha precaución, porque una mala soldadura puede arruinarte cualquier módulo o generar errores en el programa.
BMP-280 soldada a la placaEsp32-Thing soldada a la palcaPantalla soldada a la placaResistencias soldadas a la placa
Diseño de carcasa
Con todo soldado y montado ya tenemos una mejor idea del volumen real del dispositivo. Yo lo voy a medir todo milimétricamente con un pie de rey para hacer un modelo 3D de la placa ya montada.
Modelo 3D en Blender de los componentes conectados en su posición final
Así puedes diseñar una carcasa alrededor del modelo y fabricarla con una impresora 3D, pero puedes buscar otros tipos de ensamblajes con madera o metal laminados.
Yo suelo usar dos piezas (una de base y otra de tapa) para poder atornillar la una a la otra. También voy a incluir distintos huecos para permitir la conexión del cable USB, para añadir el pulsador de cambio de programa y para añadir un soporte rotatorio que encajará el reloj en una ranura del televisor.
Además usaré PLA blanco en una pieza y gris en otra para darle algo más de vida al diseño, quedando todo así:
Y eso es todo. Espero que te haya gustado y te sea útil. ¡Lánzate a montar tu propio reloj WIFI! Cualquier duda sobre este reloj, al Twitter! 🐦
Todo va aparentemente bien, hasta que al ejecutar el programa te aparece esto:
>> unityhub
This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason:
ConnectionLost: Timeout! Cannot connect to Licensing Client within 60000ms
at Function.fromType (/opt/unityhub/resources/app.asar/node_modules/@licensing/licensing-sdk/lib/core/ipc/licensingIpc.js:51:16)
...
Por suerte, surfeando por la web sueles encontrar la solución, y en el propio forum de Unity han dado con una:
Seguimos los pasos oficiales de su web (primer enlace del post):
Añade el repositorio de Unity a la lista de fuentes de paquetes de Linux: sudo sh -c 'echo "deb https://hub.unity3d.com/linux/repos/deb stable main" > /etc/apt/sources.list.d/unityhub.list'
Añade la clave pública para hacerlo confiable: wget -qO - https://hub.unity3d.com/linux/keys/public | sudo apt-key add -
Actualiza tus repositorios: sudo apt update
Instala UnityHub: sudo apt-get install unityhub
Todo debería ir bien, a pesar de un error al abrir una supuesta carpeta «chrome-sandbox». Aun así, ese no es el error, al ejecutar unityhub desde el terminal nos aparece el error de arriba.
Instalar libssl1.1
El problema está en que Ubuntu 22 usa una versión más reciente del paquete libssl, pero podemos descargar la versión utilizada por Ubuntu 20.
Tenía esto en el tintero desde hace tiempo, y es que a raíz de algunos Tweets y del proyecto GOIA de Iker Jiménez, me parecía que la generación de imágenes mediante IA se había vuelto bastante accesible. Y lo es. Se avanza a pasos de gigante. Pero todo tiene un precio.
La generación de imágenes de OpenAI, uno de los gigantes de Elon Musk, bautizada como Dall·E, lanzó su API abierta para que todo el mundo la pruebe.
Tienes 18$ para usar durante 3 meses solo con registrarte. El resto hay que pasarlo por caja, pero te dará para bastantes pruebas, y luego solo cuesta 0.02$ la imagen. Además es bastante fácil de usar y los resultados son geniales.
Merece la pena probarlo para saber cuál es el top y al final os diré qué podemos usar el resto de los mortales para el día a día.
Pero antes… arrancamos con una imagen del volcán Teide en Tenerife. ¿Es real o es virtual?
Foto del Teide, Tenerife, creada con Dall·E 2 de OpenAI. The Roaming Workshop 2022.
Contenido
OpenAI API
Bueno, rápidamente, OpenAI es el megaproyecto de Inteligencia Artificial (IA) de Elon Musk & Co. Dentro de las muchas capacidades de estas redes neuronales virtuales está la generación de imágenes a partir de un texto en lenguaje natural, pero hay mucho más.
La IA va a facilitar muchas cosas en el futuro, así que échale un vistazo a todos los ejemplos que hay abiertos en sus pruebas Beta:
Básicamente se "entrena" a un ordenador con ejemplos reales bien caracterizados para que, a partir de ellos, pueda generar contenido nuevo siguiendo una petición.
La máquina no va a generar lo que tú quieres o piensas, algo esperable, sino que a partir de tu orden y su aprendizaje, generará un resultado propio.
La generación de imágenes a partir del lenguaje natural es quizás la aplicación más gráfica, pero el potencial es inimaginable. Arriba simplemente le pedí a Dall·E la palabra "Teide". Pero, ¿qué pasa si nos planteamos cosas que no han ocurrido, que no hemos visto, o simples elucubraciones? Pues que la IA es capaz de darle vida a nuestro pensamiento. Lo que imaginamos en nuestra mente se traslada a la pantalla.
El Teide en erupción, según Dall·E 2 de OpenAI. The Roaming Workshop 2022.
Pero bueno basta de rollo filosófico y vamos al grano.
Dall·E 2 API
Para "vendernos" el futuro, OpenAI nos lo ha puesto muy fácil. Disponemos de muchísima documentación para curiosear una versión de pruebas Beta completamente abierta durante tres meses, y solo tendremos que darles nuestro correo electrónico.
Regístrate para usar Dall·E 2 a través de su página web, pulsando el botón de Sign Up.
Tendrás que verificar tu correo electrónico y ya podrás entrar a tu cuenta. Cuidado por que te puede redirigir a la página comercial https://labs.openai.com
Donde deberemos introducir nuestra clave secreta en lugar de YOUR_API_KEY.
También indicaremos en prompt la descripción de la imagen que queremos.
Con n definimos el número de imágenes a generar con esta orden.
Y size es el tamaño de la imagen, estando disponibles 256x256, 512x512, o 1024x1024.
Yo voy a probar con "un mapa de Marte en papel".
curl https://api.openai.com/v1/images/generations -H "Content-Type: application/json" -H "Authorization: Bearer sk-TuApiKeyAqui" -d "{\"prompt\":\"A map of Mars in paper\",\"n\":1,\"size\":\"1024x1024\"}"
TIP! Copia y pega este código en tu terminal, cambiando tu clave secreta "sk-..." y el prompt.
Obtendrás una URL como respuesta al comando, que es un enlace web a la imagen generada.
Abre el enlace para ver el resultado:
"Un mapa de Marte en papel" con OpenAI. The Roaming WorkShop 2022.
¡Impresionante!
Tarifas
Bueno, bueno... Volvamos ahora a la Tierra. No pensarás que esta rapidez y esta calidad van a ser gratis, ¿verdad? Si vuelves a tu cuenta de OpenAI, podrás ver el uso que haces de la API y cómo vas gastando tu crédito.
Como decía anteriormente, la Beta ofrece 18$ para gastar durante 3 meses y cada imagen a 1024px sale a unos 0,065$.
Todas las grandes plataformas de este estilo (Midjourney, Nightcafe, DreamAI, etc) funcionan de esta manera, a base de crédito por uso, y es que los procesadores que generan estas imágenes tan espectaculares son muy potentes.
Alternativas (gratuitas)
Hay varias alternativas de código abierto y totalmente gratuitas. Yo te invito a probarlas todas y elegir la que más te guste, pero te advierto que los requisitos de software y hardware son muchos; sobre todo necesitas una buena, o incluso varias, tarjetas gráficas. Al fin y al cabo pon en la balanza cuánto vas a usar la IA, y si no te merece más la pena pagar unos pocos céntimos por 4 imágenes de alta calidad cada par de meses.
De las 4 recomendaciones que te voy a hacer solo he probado con éxito las dos últimas y más flojas:
Se presenta prometedor por la simplicidad de la instalación y del uso. Aunque no te fies de la imagen de arriba (es su módulo de pixelado) porque cuenta con complejas opciones de generación de imágenes detalladas.
Existe además buena documentación hecha por los usuarios y con soporte en Discord.
Por otro lado, recomiendan unos 16GB de VRAM (RAM virtual de la GPU de tu tarjeta gráfica). A mi me petó por falta de memoria sin poder ver el resultado...
Muy técnico y complicado. Los resultados parecen brillantes, pero no he pasado de la instalación. Usa varios paquetes muy específicos de python que supuestamente se ejecutan en Google Colab. O no tiene continuidad y está roto, o la documentación es mala o yo soy un auténtico inútil... Además recomiendan unos 21GB de VRAM aunque por lo visto mediante Colab se puede repartir esta carga... nunca lo pude comprobar.
Uno de los muchos repositorios derivados de dalle-mini, en este caso en un práctico paquete que podremos usar libremente y de forma gratuita en nuestro PC de casa con muy pocos requisitos de hardware o software. Se ejecuta como una webapp local en tu navegador generando un servidor para que puedas acceder desde cualquier parte de tu red.
Junto con Upscayl, hacen un buen tándem para generar imágenes de IA en tu propio PC de forma gratuita.
Galería: Dall·E 2
"A walk in the rain""A walk in the rain""A map of Mars in paper""River photograph""Show me some stars""Teide"Teide eruption" 1"Teide eruption" 2"The chinese wall seen from space"
Estaba preparando un artículo donde quería insertar un modelo 3D para ilustrarlo mejor, y pensaba incluso en hacer un visor yo mismo. Pero no tuve que surfear mucho para encontrarme con Three.js.
Para este ejemplo, haremos un visor "portable" enlazando las librerías al CDN oficial, en lugar de tener que descargarnos los ficheros a nuestro servidor.
De esta forma, el archivo de ejemplo te servirá en cualquier lugar con conexión a internet. Vamos a crear un fichero .html básico como el que nos sugieren en la documentación:
Vamos a seguir con el ejemplo y rellenamos el segundo bloque <script> definiendo una escena con un cubo animado en rotación:
<script type="module">
import * as THREE from 'three';
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
const renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
const geometry = new THREE.BoxGeometry( 1, 1, 1 );
const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
const cube = new THREE.Mesh( geometry, material );
scene.add( cube );
camera.position.z = 5;
function animate() {
requestAnimationFrame( animate );
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render( scene, camera );
};
animate();
</script>
Todo eso, junto, queda así:
Añade controles de arrastre y un fondo
Ahora tenemos una base para trabajar. Puede añadir más funcionalidad insertando el módulo OrbitControls que maneja la rotación del modelo y de la cámara.
//Importa nuevos módulos al principio del script
import { OrbitControls } from 'https://unpkg.com/[email protected]/examples/jsm/controls/OrbitControls.js';
//luego, añade los controles del cursor después de declarar la cámara y el renderizador
const controls = new OrbitControls( camera, renderer.domElement );
También puedes modificar el fondo fácilmente, pero necesitas hospedar la imagen junto a la aplicación en un servidor, o ejecutarlo localmente, debido al CORS. Yo usaré la imagen de la cabecera del blog, que saqué de Stellarium.
Primero, define una textura. Luego, añádela a la escena:
//añade esto antes de renderizar, mientras defines la escena
//define la textura
const texture = new THREE.TextureLoader().load( "https://theroamingworkshop.cloud/demos/Unity1-north.png" );
//añade la textura a la escena
scene.background=texture;
Código completo:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My first three.js app</title>
<style>
body { margin: 0; }
</style>
</head>
<body>
<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
<script type="importmap">
{
"imports": {
"three": "https://unpkg.com/[email protected]/build/three.module.js"
}
}
</script>
<body style="margin: 0; width:100%;height:300px;">
<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
<script type="importmap">
{
"imports": {
"three": "https://unpkg.com/[email protected]/build/three.module.js"
}
}
</script>
<script type="module">
import * as THREE from 'three';
import { OrbitControls } from 'https://unpkg.com/[email protected]/examples/jsm/controls/OrbitControls.js';
const scene = new THREE.Scene();
const texture = new THREE.TextureLoader().load( "https://theroamingworkshop.cloud/demos/Unity1-north.png" );
scene.background=texture;
const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
const renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
const controls = new OrbitControls( camera, renderer.domElement );
const geometry = new THREE.BoxGeometry( 1, 1, 1 );
const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
const cube = new THREE.Mesh( geometry, material );
scene.add( cube );
camera.position.z = 5;
function animate() {
requestAnimationFrame( animate );
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render( scene, camera );
};
animate();
</script>
</body>
</html>
Insertar un modelo 3D
Ahora vamos a sustituir este cubo por un modelo 3D propio, que en el caso de Three.js, debe tener un formato glTF (.GLB o .GLTF), que es el formato más soportado y que renderiza más rápidamente (aunque también hay soporte para .fbx, .stl, .obj y demás).
Yo exportaré a .glb esta carcasa básica de Raspberry Pi 4B que hice hace un tiempo usando Blender:
Ahora, para insertar el modelo sustituimos el bloque <script> anterior basándonos en el ejemplo "webgl_loader_gltf" que se ve al inicio del post: