Presentación

Presentación

Mi trabajo y mis hobbies están muy relacionados con el uso de dispositivos electrónicos de todo tipo, así que suelo apuntarme en ficheros Le...

sábado, 14 de septiembre de 2019

ESP8266

Existe numerosa bibliografía sobre este magnífico chip que es un micro con WiFi. Lo podemos encontrar formando parte de otras tarjetas como nodemcu o casi sin nada, como ESP-12E. Pongo aquí algunas referencias y resúmenes de cosas que son interesantes al iniciar un proyecto y que no están del todo bien descritas en otros documentos.

Lo normal es usar Arduino. Los detalles de implementación de la librería de ESP8266 para Arduino están en https://github.com/esp8266/Arduino y la documentación en https://arduino-esp8266.readthedocs.io/en/2.5.2/

Pines

Lamentablemente nos encontramos con un número limitado de entradas y salidas de propósito general y varias de ellas tienen además funciones compartidas. Esto es un resumen de lo imprescindible sobre pines (Dx es lo que aparece en la serigrafía en GPIOx es el nombre real del pin en el micro):

D0 GPIO16 normal, pero saca un 1 al arrancar, también puede que esté conectado a RST (según tarjeta) para volver de deep_sleep
D1 GPIO5 SCL (I2C)
D2 GPIO4 SDC (I2C)
D3 GPIO0 normal, pero esta pull-up a VCC para arranque normal (si se pone a 0 en inicio, entra en modo programación flash)
D4 GPIO2 normal, pero está pull-up a VCC para arranque normal (si está a 0 inicialmente, no arranca) Está conectado al LED (activo nivel bajo)
D5 GPIO14 normal
D6 GPIO12 normal
D7 GPIO13 normal
D8 GPIO15 normal, pero está pull-down a GND para arranque normal (si se pone a 1 en inicio arranca desde SD)
GPIO6-11 FLASH, no usar
TX GPIO1 Serie, no usar si se va a programar on board. Se conecta al RX del USB-Serie externo, si se usa uno externo.
RX GPIO3 Serie, no usar si se va a programar on board. Se conecta al TX del USB-Serie externo, si se usa uno externo.
RST reset a nivel bajo
CH_PC/ENABLE Habilita el micro.
A0/ADC0 Analog Input rango 0.0-1.0 voltios, salvo que se use una tarjeta con divisor, que son casi todas (en ese caso 0-3.3V).

Aparte del GPIO16 parece que el 1,3,9 y 10 también están en alto, pero estos no se usan normalmente así que da igual.
Parece que el resto pueden estar a nivel bajo, salvo GPIO4 y 5 que serían los más seguros para conectar Relés (aunque ya están ocupados con el I2C).
GPIO12-14 Pueden utilizarse como interfaz SPI junto con GPIO15 que hace de CS.
Todos admiten interrupciones salvo el GPIO16
Todos admiten PWM.
En Arduino los pines se referencian con un entero igual al número de GPIO (Las etiquetas Dx de algunas tarjetas no sirven).

Información adicional sobre tarjetas y pines:
https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/
https://www.forward.com.au/pfod/ESP8266/GPIOpins/index.html

Modos de bajo consumo

El chip consume unos 10-20 mA en modo normal y unos 70 mA mientras usa la WiFi. Por defecto, el chip ahorra energía si no estamos usando la WiFi, entrando en modo ahorro automáticamente (MODEM_SLEEP) por lo que si no hay requisitos fuertes de consumo, el chip consumirá poco. Los modos de bajo consumo están disponibles sólo en modo estación; en modo Access Point, debe estar siempre dando servicio y no puede consumir poco. A continuación los diferentes modos, cómo activarlos y su consumo.

El modo por defecto en el que se pone el chip se fijan con  WiFi.setSleepMode() por defecto es WIFI_MODEM_SLEEP.

Nota: Los consumos que se citan suponen el chip sin apenas componentes externos (Ej. ESP-12). En placas como nodemcu, entre otras, hay circuitos como el USB a serie y el regulador de 3.3 V que consumen entre 2 y 10 mA dependiendo de la versión.

modem_sleep

Es el modo por defecto y entra en él de forma automática. No obstante, entra y sale de este modo continuamente para mantener el contacto con la estación y se producen picos esporádicos de consumo que se pueden evitar si forzamos la parada total de WiFi y apagamos el modem completamente. Esto se realiza con una llamada a WiFi.forceSleepBegin() que nos desconectará completamente y apagará el modem (será necesario reconectar de nuevo al volver de sleep).
En este modo el chip trabaja normalmente y el consumo es de unos 20 mA.
Para volver a usar la WiFi debemos hacer WiFi.forceSleepWake() y volver a conectar al AP.
Nota: forceSleepBegin() puede tardar un tiempo en ejecutarse y en algunos casos produce un reset por soft watchdog timeout. Esto ocurre especialmente en aquellos casos en los que no se ha podido establecer conexión con un cliente TCPIP, por ejemplo. En estos casos, resulta conveniente añadir un delay de al menos unos 200 ms antes de llamar a forceSleepBegin (si todas las conexiones que se hicieran durante la sesión han ido bien, no es necesario añadir este tiempo). También se podría deshabilitar el soft watchdog antes de llamar a esta función y habilitarlo cuando acaba.
Este modo es interesante forzarlo cuando se realizan conexiones esporádicas a un servidor, pero la CPU debe estar haciendo cosas entre conexión y conexión. Por ejemplo, una estación de sensores que recoge datos cada pocos segundos y envía el resumen cada minuto.

light_sleep

En este modo, el chip entra en suspensión y no hace nada. El consumo cae a menos de 1 mA. Este modo resulta interesante pues aunque todo está completamente parado, no es necesario desconectarse del AP y volverse a conectar, pues sigue conectado (salvo que pase mucho tiempo y el router nos desconecte). Lamentablemente tiene dos características que impiden que se pueda explotar todo el potencial de este modo:
  • No podemos forzar entrar en este modo. En nuestro programa habremos puesto  WiFi.setSleepMode(WIFI_LIGHT_SLEEP,1) para que light_sleep sea el modo por defecto, pero no podemos controlar cuando el chip decidirá entrar en ese modo. Normalmente, si ponemos un loop con un delay de al menos 100 ms entrará en light_sleep, pero con menos es posible que no entre.
  • No podemos decidir internamente cuándo volver. El modo light_sleep es para siempre y la única forma de seguir con la ejecución es habilitar algún pin externo y producir externamente un pulso. Se puede hacer un sencillo circuito RC conectado a un pin para que se active a intervalos más o menos regulares (se necesita otro pin para resetear el circuito RC). La instrucción para configurar este pin especial es gpio_pin_wakeup_enable(GPIO_ID_PIN(gpiopin), GPIO_PIN_INTR_LOLEVEL). Otra forma de salir es mediante un reset, pero entonces mejor usamos el siguiente modo de bajo consumo.

deep_sleep

En cualquier instante podemos entrar en este modo con ESP.deepSleep(microseconds, mode). En este modo el consumo es de unos pocos uA, es decir, prácticamente nada pues todo está parado y ningún dispositivo interno recibe alimentación salvo un contador que es el que sirve para volver.
Lo único que sucede cuando han pasado los microsegundos especificados, es que se activa a 0 la salida GPIO16, nada más. Si esta salida la conectamos al reset (RST) entonces el chip se reinicia. Es decir, este modo sirve para apagar el chip y poderlo encender más adelante, comenzando el programa desde el principio.
Este modo es especialmente interesante en aquellas aplicaciones donde el chip se despierta a intervalos regulares, realiza cualquier cosa (siempre la misma) y vuelve a dormir, ahorrando mucha energía entre acción y acción. Ejemplo, un sensor de temperatura que envía sus datos cada minuto.

Conexión WiFi óptima

Velocidad

Si se usan los modos modem_sleep y deep_sleep interesa conectar con el AP lo más rápido posible. Se puede obtener tiempos de conexión-envío-desconexión del orden de 250 ms. Para ello hay que configurar todos los parámetros del router, con la instrucción WiFi.config(...) donde se especifica una IP estática, puerta de enlace, máscara, servidor de nombres, etc.
El retraso en la conexión se puede reducir incluso más si incluimos la información del canal del AP y su MAC en los argumentos de WiFi.begin(). Como estos dos parámetros no se conocen, se puede hacer una primera conexión normal, averiguar el canal con WiFi.channel() y la MAC con WiFi.BSSID(). Estos valores se pueden guardar en la memoria RTC, pues se conserva incluso en deep_sleep. Si con estos valores no conecta, se puede intentar conectar sin ellos y obtener los nuevos valores de canal, si hubiera cambiado.

Persistencia

Por defecto, las librerías guardan varios de los parámetros de conexión WiFi en Flash para poder reconectar rápidamente. Esto significa que cada vez que el chip se conecta a internet escribimos en la Flash, con lo que, dependiendo de la aplicación, la FLASH podría degradarse en relativamente poco tiempo (Ejemplo, un chip que se conecta cada minuto para enviar algo). Afortunadamente podemos deshabilitar esta escritura haciendo:

  WiFi.persistent(false);

Si guardamos nosotros los datos tal como se pone en el apartado de velocidad, no hace falta tener habilitado esto para obtener el máximo rendimiento y además conservaremos la FLASH por mucho tiempo.

Conexión con un cliente y lectura de datos

Dependiendo de la versión de librería de ESP8266 para Arduino, las funciones WiFiClient.connected() y WiFiClient.available() han tenido diferentes significados y funciones. En la última, que además ofrece un rendimiento óptimo, las cosas disponibles pueden aparecer incluso después de cerrada la conexión. Con todo esto, la forma adecuada de conectar y leer algo sería la siguiente:

WiFiClient TCPcli;
if (TCPcli.connect("xxx.yy.com", 80))
{
  TCPcli.print("GET / HTTP/1.1\r\n");
  TCPcli.print("Host: xxx.yy.com\r\n");
  TCPcli.print("Connection: close\r\n\r\n");
  while(TCPcli.connected() || TCPcli.available()) // ambos
  {
    if (TCPcli.available()>0) {
      char c = TCPcli.read();
      ...
    }
  }
}
TCPcli.stop();


miércoles, 7 de agosto de 2019

IPTV, Tvheadend, Synology, Canales Españoles en Kodi

Aunque la plataforma utilizada en este tutorial es un NAS de Synology, muchos de los pasos enumerados aquí pueden ser útiles en otros NAS y en ordenadores con Linux (como la Raspberry Pi). En este tutorial se presentan algunas pautas para no fracasar en el intento de instalar Tvheadend en un NAS de Synology, y de esta manera poder ver y grabar los canales TDT españoles mediante IPTV. La idea es que el NAS, o el ordenador donde se instale TvHeadend, se encargue de las grabaciones y dar servicio de TV mediante streaming a cualquier cliente, como por ejemplo Kodi, instalado en cualquier plataforma,

Instalación de Tvheadend en el NAS

La web oficial de Tvheadend es https://tvheadend.org/ pero para el NAS de Synology ya hay un paquete oficial preparado para ello, por lo que basta con it al centro de paquetes, buscar tvheadend, apretar un botón para instalarlo y ya lo tenemos. En otras plataformas, siempre basadas en Linux, tendremos que bajar el paquete de instalación e instalarlo, si es que no está disponible directametne en el repositorio de la distribución. A continuación se describe cómo instalar la lista de canales españoles en tvheadend, una vez instalado en la plataforma.

Canales Españoles IPTV

Desde hace algún tiempo hay un equipo de entusiastas de la TV que mantienen y actualizan una lista de enlaces IPTV de las emisoras que emiten en abierto a través de la red. Según comentan, estos enlaces son legales pues son los que ofrecen las propias compañías. Los listados se ofrecen en varios formatos y se encuentran en https://github.com/LaQuay/TDTChannels

A nosotros nos interesa el listado de canales IPTV en formato m3u8 que se encuentra en http://www.tdtchannels.com/lists/channels.m3u8

El procedimiento habitual para incorporar una lista IPTV a Tvheadend consiste en importar directamente la lista de canales anterior, sin embargo, muchos canales no funcionarán y los que funcionen puede que empiecen en el pasado. Para evitarlo, es necesario transcodificar los canales para que pueda entenderlos tvheadend.

Transcodificación previa

Si piensas que tvheadend va a entender los codecs de la lista de programas, puedes saltarte este paso e importar la lista directamente tal como se explica en el apartado posterior. Igual en Linux funciona sin transcodificar, o quizá funcione con la última versión de tvheadend, pero en el NAS de synology y con la versión de tvheadend de 2019, era necesario transcodificar.

La transcodificación se realiza mediante ffmpeg. Suponiendo que tenemos ffmpeg instalado (ver el correspondiente subapartado más adelante) debemos modificar el listado original de la siguiente manera:
  • Descargamos el listado de canales a partir del enlace de arriba y lo guardamos en local.
  • Lo abrimos con un editor de texto y veremos que hay dos lineas por cada canal, la primera empieza por #EXTINF y contiene parámetros que describen el canal. No lo tocaremos salvo que queramos cambiar algo sabiendo lo que hacemos.
  • La segunda línea es una url sin más y esta línea es la que deberemos cambiar. Suponiendo que en la linea había algo como
    • https://unacosa.ejemplo.es/ejemplolist.m3u8
  • lo cambiaremos por
    • pipe:///usr/local/ffmpeg/bin/ffmpeg -i https://unacosa.ejemplo.es/ejemplolist.m3u8  -c copy -f mpegts pipe:1
  • Estamos suponiendo que el ejecutable ffmpeg se encuentra en /usr/local/ffmpeg/bin/ffmpeg que es lo habitual en el NAS de synology, pero que puede ser otra cosa en otro sistema.
  • Esta acción se repetirá para cada canal que sepamos que falla y que necesita un codec especial.
  • Una vez se tiene el nuevo listado, se puede incorporar a Tvheadend tal como se describe en el siguiente apartado, para ello habría que subir dicho fichero a un servidor web y poner la url correspondiente.
  • Otra opción consiste en copiar dicho fichero a un directorio compartido del NAS, en cuyo caso especificaremos el path (camino) completo a dicho fichero. Si el directorio compartido se llama por ejemplo "prueba" y el fichero de canales "canales.m3u8" el camino completo suele ser /volume1/prueba/canales.m3u8 aunque puede variar según la configuración del NAS. En otros sistemas podremos poner ese fichero en algún sitio del sistema con permisos de lectura.
Aunque algunos canales no necesitan transcodificarse, resulta conveniente hacerlo pues Tvheadend parece que tiene un bug y empieza a reproducir los streams donde le parece en lugar del punto en directo. Si estos canales se filtran con ffmpeg, este problema desaparece.

Importación de la lista en tvheadend (transcodificada o no)

Este procedimiento es el común para importar cualquier lista IPTV a Tvheadend, tanto si se utiliza transcodificación como si no.

El listado se puede incorporar a Tvheadend de la siguiente manera:
  • Vamos a Configuration > DVB Inputs > Networks y pulsamos sobre el icono +Add
  • En el primer formulario ponemos "IPTV Automatic Network"
  • En el segundo formulario solo tenemos que poner un nombre a la red (Network name, el que queramos) y en la URL pegamos la dirección donde se encuentra el listado de canales (puede ser una dirección web o un camino al sistema de ficheros local). El resto de opciones las podemos dejar como vienen.
  • Pulsamos en +Create y se creará el canal.
  • Una vez creado el canal veremos que nos aparecen varios muxes (uno por canal) y una vez hagamos el mapeo tendremos los servicios, que son los canales que finalmente veremos en nuestro cliente.
Una vez se tienen los servicios (puede tardar un rato, paciencia) ya se tiene acceso a los canales que funcionen desde un cliente. Lo normal es acceder desde Kodi, para ello hay que instalar en Kodi el plugin correspondiente a tvheadend (no viene instalado por defecto, pero está en el repo oficial dentro del grupo PVR o video).

La guía de programa, EPG, habrá que instalarla tal como se describe en el apartado correspondiente más adelante.

Instalación ffmpeg en Synology NAS

Es posible que haya un ffmpeg ya instalado en el NAS e incluso esté en el path, pero lo normal es que esté anticuado y no funcione bien, por lo que se recomienda instalar un paquete específico de ffmpeg con el gestor de paquetes del NAS.

El paquete ffmpeg es de la comunidad, por lo que debemos incluir el repositorio de la comunidad y permitir fuentes de terceros en el gestor de paquetes. Todo esto se explica en https://costigator.com/system-administration/how-to-enable-dts-support-on-synology/

En otros sistemas basados en Linux debería ser muy sencillo instalar la última versión de ffmpeg desde el propio gestor de paquetes de la distribución.

Canales GEO y no GEO (Geolocalizados)

En la siguiente dirección se encuentran las dudas resueltas sobre estos dos tipos de enlaces: https://github.com/LaQuay/TDTChannels/wiki/FAQs#diferencia-entre-una-emisi%C3%B3n-geo-y-no-geo

Lo siguiente es lo que observé en su momento respecto de este tema, pero seguramente está anticuado respecto de lo que viene en el enlace anterior: Para varios canales se puede observar que existen dos versiones, una geo y otra sin geo. La geolocalización le permite a los distribuidores poder lanzar contenidos que están licenciados en una región bloqueando el acceso a las regiones para las cuales no tienen permiso de emisión . Por lo que he visto hasta ahora, parece que los que no tienen "geo" ofrecen más contenido que los otros y en directo, pero me parece que no siempre es así. También he visto que para algunos canales, sólo funcionan los geo, pero en este caso los contenidos sí que se ven en directo. Si estamos en España no deberíamos tener problema en acceder a todos los contenidos, probablemente a través del canal sin "geo".

Guía de Televisión (EPG, Electronic Program guide)

Una vez tenemos los canales funcionando resulta imprescindible añadir la guía de programación (EPG). Esto nos va a permitir poder grabar programas a partir de la guía.

En la misma web donde hemos conseguido la lista de canales, también ponen a disposición una guía de canales en xml que Tvheadend puede importar. Esta guía la actualizan al menos una vez al día. El procedimiento está basado en lo que pone en https://github.com/nurtext/tv_grab_file_synology y aunque es específico para synology, puede servir probablemente para cualquier sistema Linux:
  • Bajamos el fichero  https://raw.githubusercontent.com/nurtext/tv_grab_file_synology/master/src/remote/tv_grab_file y lo guardamos en como tv_grab_file
  • Modificamos la url de ejemplo que viene (http://example.com/path/to/epg.xml) y la sustituimos por la url de la guía que queremos incorporar (https://raw.githubusercontent.com/HelmerLuzo/TDTChannels_EPG/master/TDTChannels_EPG.xml)
  • Guardamos este fichero en un directorio compartido de nuestro NAS.
  • Entramos en el NAS mediante SSH con un usuario con privilegios de administración y que se pueda hacer pasar por root. (Busca en internet cómo habilitar el acceso ssh al NAS de synology pues no está habilitado por defecto).
  • Como root hay que hacer lo siguiente (suponemos que el directorio compartido se llama "public", se puede cambiar por lo que toque, igual que el camino completo que puede depender de la configuración del NAS):
    • ln -s /volume1/public/tv_grab_file /usr/bin/tv_grab_file
  • Si el enlace simbólico no funciona por alguna razón, se puede copiar directamente el fichero tv_grab_file en /usr/bin pero se recomienda usar el enlace.
  • Posteriormente hay que darle permisos de ejecución y lectura (siempre como root):
    • chmod a+xr /usr/bin/tv_grab_file
  • Ahora hay que reiniciar Tvheadend para que detecte este nuevo fichero. El reinicio se hace desde el gestor de paquetes del NAS, seleccionando el paquete de TVheadend, deteniéndolo y volviéndolo a iniciar.
  • Abrimos Tvheadend y si vamos a Configuration > Channel/EPG > EPG Grabber Modules veremos que hay uno nuevo (o dos) con el nombre "Internal: XMLTV: Remote". Elegiremos el que tiene como Path "/usr/bin/tv_grab_file" y activaremos la casilla de Enable (podemos poner la prioridad a 1 si tenemos otros grabbers y queremos que éste prevalezca).
  • Si no aparece, es posible que haya que reiniciar de nuevo TVheadend; a veces tarda en detectar el tv_grab_file y no lo hace a la primera (también podemos probar a cambiar el enlace por el fichero en sí).
  • Una vez seleccionado el grabber, veremos al poco tiempo que nuestros canales se mapean automáticamente con los de la guía, pero van a pasar varias horas (incluso un día) hasta que veamos contenido en la guía, así que paciencia (reiniciar Tvheadend quizá ayude).
  • Como esta guía de programa ya viene preparada para la lista de canales de TDTChannels, no es necesario hacer un mapeo explícito, aunque la guía en sí va a tardar en aparecer.


lunes, 15 de octubre de 2018

Sky-Watcher AZ GTI GOTO

Montura SkyWatcher Mini AZ Goto Wifi AZGTi
Enlaces, utilidades y cosas para la montura Sky-Watcher AZ GTI goto. Se trata de una montura para telescopio que se controla a través de WiFi. Tiene unas prestaciones bastante interesantes y soporta hasta 5 Kg de telescopio (no parece que sea buena idea montar nada mayor de 127 mm de diámetro).

ACTUALIZACIÓN: (22/07/2020) Parece que desde la versión 19.3 Stellarium ya permite la conexión directa del plugin de control de telescopio a ASCOM, por lo que ya no hace falta el programa StellariumScope, salvo que se necesite alguna de sus características. He modificado el procedimiento abajo.

El producto:
Para trastear (ver más abajo):
  • https://ascom-standards.org/Downloads/Index.htm Es la plataforma ASCOM, que es el estándar que utilizan muchos fabricantes para comunicarse con sus dispositivos de astronomía. Es abierto, así que hay muchas cosas por ahí para hacer interfaz con esto.
  • http://skywatcher.com/download/software/ascom-driver/ Enlace a los drivers ASCOM de Sky-Watcher para sus productos. El primero de ellos (para la "App") se conoce como ASCOM driver for SynScanMobile y es lo que sirve para comunicarse con la montura por WiFi. El segundo, es el driver para el control manual (no lo necesitamos en este caso).
  • https://github.com/skywatcher-pacific/skywatcher_open Parece la API de las comunicaciones de Sky-Watcher. Hace mucho que no se actualiza pero es probable que funcione bien (es básicamente la documentación y ejemplos).

Montaje y alineamiento

A veces se lía todo y no es fácil de alinear con las estrellas, especialmente si no se ha montado bien, y en las instrucciones no pone hacia dónde debe apuntar el telescopio para hacer el montaje correcto, así que lo pongo aquí. Con un montaje correcto, el alineamiento debería ser sencillo.

Montaje:
  • Ajusta el trípode y la montura para que el conjunto quede vertical (sirve la burbuja que tiene la montura y/o el trípode).
  • Antes de colocar el tubo, soltar todos los tornillos de embrague para que los ejes queden sueltos.
  • Gira el eje donde va el tubo para que el tornillo que sujetará el tubo quede arriba del todo.
  • Mirando a la montura por la parte del interruptor rojo, coloca el tubo en horizontal de manera que el espejo quede a la izquierda y la apertura a la derecha.
  • Aprieta levemente el tornillo que sujeta el tubo y comprueba que está equilibrado. Mueve el tubo a derecha e izquierda hasta que esté equilibrado del todo y se mantenga horizontal. Aprieta el tornillo del todo.
Alineamiento:
  • Es posible que sea necesario 
  • Conecta la montura a SynScan y ve al menú de alineación (alineamiento).
  • Creo que no es necesario, pero quizá sea conveniente hacer un reset del alineamiento (es un botón del menú).
  • Elige la opción de alineamiento con dos estrellas con nivelación norte (el resto de opciones pueden ofrecer mayor precisión, pero son más lío si no sabes dónde están los objetos de referencia y sus nombres en el cielo).
  • Aparecerá un menú con las estrellas más brillantes al alcance, elige las dos primeras por ejemplo (luego puedes confirmar su posición con un programa con el mapa estelar).
  • A continuación debes poner el telescopio en horizontal apuntando al norte. Hazlo soltando previamente los embragues de los dos ejes para que el telescopio quede suelto. Una vez apunte al norte, aprieta bien los tornillos para que sean los motores los que muevan el telescopio.
  • Selecciona la primera estrella. El telescopio se moverá hacia donde esté. Ajusta con las flechas la posición para que la estrella caiga justo en medio del visor. Dale al botón correspondiente (está en medio de la pantalla) para guardar esta calibración.
  • Repite la misma operación con la segunda estrella.
  • Ya está alineado. No deben soltarse los embragues o se perderá la alineación.
  • Se puede activar los encoders (vienen desactivados por defecto) y en ese caso se puede embragar y desembragar sin perder la alineación, siempre y cuando los motores actúen cuando los ejes están fijos, de otra manera igual no va bien.

Sincronizar la montura con Stellarium

Aunque el programa que sirve para controlar la montura con el móvil o PC está bastante bien (SynScan), no ofrece la posibilidad de ver la bóveda celeste. Para esto hay excelentes programas que nos muestran todo el cielo nocturno con todos sus elementos y lo ideal es poder conectar  nuestra montura a uno de ellos. Parece que Safary Sky permite la conexión directa de esta montura, pero se trata de un software de pago por el que probablemente vale la pena pagar, aunque yo no lo he usado. Un programa extraordinario es Stellarium y es gratuito, aunque conectar esta montura a Stellarium es algo lioso pero no imposible si se siguen estos pasos.

Lo primero es tener la app SynScan Pro instalada, bien en el PC o bien en el móvil, da igual. Lo importante es saber la IP del dispositivo donde lo tengamos conectado, pues la comunicación entre Stellarium y la montura se realizará a través de esta aplicación.

Lo segundo es tener la última versión de Stellarium instalada en el PC (probado con la 0.18.2 hasta la 0.20). Se descarga de https://stellarium.org/ y es gratis. Debemos ejecutarlo al menos una vez para que se creen los ficheros de configuración. Además debemos activar el "plugin de control del telescopio" . Para ello se puede ir al menú de configuración con F2 y luego seleccionamos la pestaña de plugins y en la lista de la izquierda veremos el "Control de telescopio" o su equivalente en el idioma que hayas seleccionado. En principio habría que seleccionar que se arranque al inicio y poco más. Hay que cerrar y volver a abrir Stellarium para que se creen los ficheros de configuración, pues de otra manera no podremos configurar el plugin para añadir el telescopio.

Con esto listo hay que instalar el software de ASCOM. Se descarga del enlace que aparece arriba.

Una vez instalada la plataforma de ASCOM hay que instalar el driver de la montura para ASCOM. El enlace se encuentra al inicio del artículo y lo ofrece el fabricante de la montura.

En este momento hay programas que ya pueden acceder directamente a ASCOM y que por tanto podrían conectarse con la montura, como Cartes du Ciel o TheSky, y Stellarium no tenía acceso directo a ASCOM antes de la versión 19.3, pero las nuevas ya lo tienen. Si de todas formas quieres utilizar un programa intermedio al final explico también cómo hacerlo.

Entra en Stellarium y ve al plugin de control del telescopio tal como has hecho antes. En configuración del plugin puedes añadir un telescopio. En el formulario verás que aparece ASCOM como opción. Si no te aparece ASCOM en la lista de tipos de telescopio es porque no has instalado la plataforma ASCOM o está mal instalada (puede pasar) en ese caso deberás desinstalarla y volverla a instalar. En ese mismo formulario aparece el botón "Elegir telescopio ASCOM", lo pulsas y entonces debes elegir el "SynScan App Driver" y configurar la conexión con el botón "Properties". Debes poner las propiedades para que el driver se conecte a la app de SynScan dependiendo de dónde la estés ejecutando (en el equipo local, en el móvil, etc.). Una vez añadido el telescopio puedes conectarte a él pulsando en el botón de conectar. En ese momento ya debería comunicarse stellarium y la app SynScan. Recuerda que para que funcione el programa Synscan debe estar corriendo y debe estar conectado a la montura. La cadena de conexión entre programas sería el siguiente:

Stellarium <> Plataforma ASCOM <> SynScan ASCOM driver <> SynScan <> Montura

Si prefieres usar un programa intermedio, este sería el procedimiento:

El programa StellariumScope sirve para hacer de interface entre Stellarium y ASCOM, de manera que puedan comunicarse finalmente Stellarium y la montura. La cadena sería esta:

Stellarium <> StellariumScope <> ASCOM <> SynScan ASCOM driver <> SynScan <> Montura

Se descarga el ejecutable de la web de StellariumScope y se instala en el PC.
Se puede configurar siguiendo los pasos que aparecen en esa misma web, aunque lo cierto es que es bastante intuitivo y las opciones por defecto suelen funcionar a la primera, siguiendo estas sencillas indicaciones:

Con el Stellarium apagado y el SynScan encendido, se ejecuta StellariumScope por primera vez y se siguen las indicaciones que van apareciendo. Básicamente es todo tal cual viene por defecto, salvo la pestaña donde debemos elegir la montura, que debemos elegir la SynScan de ASCOM (si todo lo anterior lo hemos hecho bien). Por defecto buscará la comunicación con el SynScan del equipo local pues la IP por defecto es la local, pero si estamos usando el SynScan del móvil, deberemos cambiar la IP en la ventana correspondiente del driver SynScan para ASCOM (se puede hacer desde el propio StellariumScope). El programa StellariumScope debe estar en marcha para no romper la comunicación.

Si ahora arrancamos Stellarium, debería aparecer la marca de donde apunta el telescopio en el cielo. Ctrl-1 hace "goto" del objeto celeste que tengamos seleccionado, Ctrl-3 sincroniza (alinea) y Ctrl-5 detiene la operación actual. Funciona realmente bien, aunque a veces podemos ver ciertos desajustes, especialmente si la hora del PC o del móvil no es exactamente la real.

Si algo falla, estos enlaces pueden ayudar a resolverlo:

Cosas que no  funcionaron (creo):

Elegir EQMOD como interface en stellarium, pues EQMOD usa ASCOM y lo mismo va sin StellariumScope.

SkyWatcher parece tener el mismo protocolo que NexStar en Stellarium, pero me parece que eso es solo para la comunicación por cable, así que no creo que cambie nada, después de todo, la última versión de Stellarium ya trae el AZ mount (cableado).



jueves, 20 de septiembre de 2018

Adafruit Feather WICED

En al búsqueda de una plataforma óptima para una cámara especial con transmisión WiFi he podido analizar la tarjeta Adafruit Feather WICED.

Enlaces
La tarjeta tiene el micro por un lado (¨STM32F205RG ) y el WiFi por otro (BCM43362). Aunque son chips separados, la placa ocupa muy poquito. Es interesante tener ambas cosas separadas pues, en otros que lo llevan todo junto, como los ESP8266 y ESP32 de Espressif, mezclan unas cosas con otras y el WiFi acaba influyendo en varios periféricos, como el ADC, lo que complica ciertas aplicaciones donde quieres usarlo todo. Me da la sensación igualmente que la radio integrada en el chip introduce bastante ruido en la parte analógica.

WiFi

La librería no es directamente compatible con Arduino aunque incluye funciones muy similares y cambiar de una a otra es absolutamente inmediato. Los experimentos de velocidad en transmisión alcanzan los 1.6 Mbytes/s en TCP y 3.2 Mbytes/s en UDP, si bien en modo UDP se producen paradas aleatorias que van desde los 20 segundos hasta los dos o tres minutos, lo que la convierte en inútil para este protocolo. Todavía no he conseguido saber por qué falla esto. Si se baja la tasa de envío el problema parece que desaparece, pero entonces ya vale la pena usar TCP.

WiFi Enterprise no parece estar soportado de ninguna manera.

GPIO

Utilizando las funciones de Arduino, el pulso más corto que se podía producir era de 250 ns!! lo que resulta inútil para generar relojes a alta velocidad. Con PWM se pueden alcanzar pulsos de tan solo 16 ns, pero para mi caso son complicados de usar. Después de muchas pruebas, parece que mucho del retraso en poner los pines a cero o uno se debe al propio código. Escribiendo directamente sobre los registros de puesta a uno o cero se consigue un pulso mínimo de unos 40 ns:

GPIOC->regs->BSRRL=BIT(3); // esto lo hace a 40 ns, ya es algo, pero lo hace al reves (L pone a alto y H a bajo...)
GPIOC->regs->BSRRH=BIT(3);

También se puede escribir directamente sobre ODR el valor de lo que quiera, pero tarda un poco más (75 ns).

No son los 25 ns que se consigue con los ATSAM de Atmel, pero casi es suficiente.

ADC

El ADC de este micro es una maravilla. Puede alcanzar los 6 MSPS en modo encauzado, pero ya sólo con la llamada asíncrona de Arduino (analogRead) el retraso es de tan solo de 1.5 us (666 KSPS) que ya puede ser útil en muchas circunstancias. La señal parece estable y bastante lineal en todo el rango.









lunes, 17 de septiembre de 2018

Habilitar protocolo SMBv1 en Windows 10 ver 1803

ATENCIÓN: el arreglo que viene en este mensaje puede poner en peligro tu PC.

Windows desactivó el antiguo protocolo SMBv1.0 a partir de Windows 10. Hay algunas aplicaciones y dispositivos que todavía en 2018 siguen usando este nivel inseguro de compartición de ficheros, especialmente algunas versiones antiguas de samba Linux, o las implementaciones de samba en Android utilizadas en dispositivos tan populares como Fire TV stick, o el software de Kodi para Android.

Mientras estos dispositivos se ponen al día, es posible reactivar SMBv1 en Windows 10 y anteriores aunque Microsoft lo está poniendo cada día más difícil. Si tienes suerte, este protocolo se puede activar en "Activar y desactivar características de Windows" (Escribe "características" en el menú inicio).

En mi versión de Windows (a fecha septiembre 2018) esta opción ya no estaba. Otras opciones que vi en internet que modificaban el registro de Windows tampoco funcionaron, pero finalmente encontré un artículo del propio Microsoft donde pone cómo habilitarlo (aunque el artículo es para deshabilitarlo):

https://support.microsoft.com/es-es/help/2696547/how-to-detect-enable-and-disable-smbv1-smbv2-and-smbv3-in-windows-and

Básicamente hay que hacer lo siguiente en una powershell con privilegios de administrador:


> Get-WindowsFeature FS-SMB1
> Enable-WindowsOptionalFeature -Online -FeatureName smb1protocol

Una vez hecho esto, pedirá reiniciarse. Una vez arranque ya nos funcionarán los shares de Kodi en Android, entre otras cosas.

Es importante entender que activar este protocolo conlleva cierto riesgos de seguridad, por lo que, su no se va a utilizar conviene desactivarlo:

> Disable-WindowsOptionalFeature -Online -FeatureName smb1protocol


jueves, 6 de septiembre de 2018

ESP32

SparkFun ESP32 ThingESP32 es una mejora sustancial del espectacular ESP8266. Estos chips los fabrica Espressif Systems y en su página puedes encontrar numerosos recursos, SDK, etc., aunque lo más sencillo es utilizar los entornos de Arduino o PlatformIO para su programación. Estos microcontroladores incorporan un módulo WiFi y son fáciles de programar mediante el entorno de Arduino, aunque yo prefiero usar PlatformIO. El ESP32 presenta dos núcleos y Bluetooth como mejoras más importantes respecto del ESP8266.

Para las pruebas con el ESP32 estoy utilizando la plaquita Sparkfun ESP32 Thing. En el enlace del producto viene un tutorial para su programación con Arduino.

Lo más sencillo es utilizar Arduino o PlatformIO para programarlos, pero todavía hay algunas limitaciones y no toda la funcionalidad está implementada en estos "ports".

Para disponer de un API sin limitaciones y obtener el mayor control posible sobre el chip, es necesario utilizar el API propio del fabricante. En https://docs.espressif.com/projects/esp-idf/en/latest/ se encuentra el API del fabricante. Es un poco lío de preparar su entorno y demás, pero es más completo que la opción de Arduino o PlatformIO.
La buena noticia es que se pueden invocar las funciones de la API de Espressif directamente desde Arduino o PlatformIO añadiendo las cabeceras (include) correspondientes, aunque en ese caso perdemos la portabilidad del código.

El port de Arduino y PlatformIO se encuentra en https://github.com/espressif/arduino-esp32

En https://www.instructables.com/id/Develop-ESP32-With-PlatformIO-IDE/ se tiene un completo tutorial para usar ESP32 con PlatformIO. Además explica las diferencias y ventajas de utilizar PlatformIO frente a Arduino, aunque no debemos olvidar que en ambos casos el código va a ser exactamente el mismo, así como el resultado.

En https://www.losant.com/blog/getting-started-with-esp32-and-platformio viene también un tutorial similar, más simple, y orientado a la Sparkfun ESP32 Thing.

GPIO

El chip es muy versátil y tiene muchos periféricos que se pueden poner en cualquier pin del chip. Pero cuando quieres controlar cada pin de forma individual, aparece el problema de que el reloj de la periferia es mucho más lento que el de la CPU. El pulso más corto que se puede hacer escribiendo en los pines (sin usar PWM) es de 50 ns, que puede ser algo justo para algunas aplicaciones. Además, hay que insertar "nop()" entre escritura y escritura de pin para que no se solapen. Otros micros sincronizan estas escrituras y son más fáciles de programar, con el inconveniente de que se pierden ciclos de reloj que se podrían aprovechar para otras cosas.

WIFI

Funciona bien, pero tras hacer varias pruebas de velocidad, siemrpe transmitiendo desde el dispositivo y con la librería de arduino, la conclusión es que va francamente lento. En TCP se alcanzan velocidades de 110 Kbytes/s que es 10 veces más lento que su predecesor (el ESP8266) y que otras tarjetas que he probado como la Adafruit Feather WICED que alcanza 1.6 Mbytes/ en TCP y 3.2 Mbytes/s en UDP, aunque en este modo la WICED se queda colgada temporalmente. En modo UDP las velocidades son mayores, pero todavía muy por debajo del mega por segundo, y además dando errores de escritura. Si se baja la tasa de transmisión hasta los 110 Kbytes/s (mediante delays) se consigue que desaparezcan los errores de escritura, pero esa es la misma velocidad lenta de transmisión de TCP,así que no se gana nada por usar el protocolo menos seguro UDP.

Parece que utilizando directamente las funciones de la API de Espressif es posible obtener una mayor velocidad, pero su programación es algo más compleja y no lo he probado.

WiFi Enterprise

He intentado conectarme a "eduroam" de la Universidad de Valencia sin éxito (Es WPA2 Enterprise y por eso el problema). Parece que a algunos les va y a otros no. El código más fiable creo que se encuentra en https://github.com/martinius96/ESP32-Eduroam y a partir de ahí he hecho numerosas pruebas sin conseguir nada. Me parece que hay diferentes maneras de implementar la red eduroam, pues parece la explicación más probable a que a algunos les funcione (en su eduroam) y a otros no, con el mismo código.

ADC

El objetivo es poder leer valores analógicos en 1us. Tiene dos ADC, pero el ADC1 es el más general y único que he usado en las pruebas, así que todo lo que sigue es para el ADC1. El ADC tiene dos modos, uno normal o RTC y uno síncrono mucho más rápido a través del I2S. No está claro cómo hacer funcionar uno y otro. Parece que tanto Arduino como la API de Espressif utilizan el primer modo, pues sólo he conseguido bajar la espera en obtener el valor a 10 us (con las funciones de Arduino, los 10 us es lo que está por defecto, mientras que la API parte de 40 us y hay que configurar cosas para bajarlo). 
Los datos que se obtienen son bastante ruidosos, quizá por el montaje en el que no se han cuidado los apantallamientos. También parece que la respuesta no es muy lineal tal como se desprende de varios artículos por ahí, aunque en el API se han incluido rutinas para la calibración del ADC (https://github.com/espressif/esp-idf/issues/164).

En cuanto al uso del ADC con I2S, se supone que puede alcanzar los 2 Msps pues hace una conversión por escaneo sucesivo y de forma síncrona. Parece que va escaneando con un intervalo que se programe y cada vez que tiene un dato nuevo lo guarda en el registro de DMA del módulo I2S. La documentación sobre este modo es muy escasa, pero hay un ejemplo que parece hacer uso de este modo: https://github.com/espressif/esp-idf/tree/master/examples/peripherals/i2s_adc_dac

I2C

Fantástico. Todo funcionó a la primera con la estupenda librería Wire de Arduino. Compatibilidad total.





Presentación

Mi trabajo y mis hobbies están muy relacionados con el uso de dispositivos electrónicos de todo tipo, así que suelo apuntarme en ficheros Leeme.txt todo lo relacionado con un nuevo "gadget" o tecnología (enlaces importantes, pequeños tutoriales, problemas encontrados, atajos útiles...). Como casi me cuesta lo mismo escribir esos Leeme que escribir en un blog, voy a probar a hacer públicas esas chuletas pues lo mismo les pueden ser útiles a más gente.