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...

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.