Arduino y ESP32

Hace unos años empecé a conocer el mundo arduino y a construir y programar mis primeros circuitos útiles (principalmente 2):

    • Un monitor de una instalación fotovoltaica aislada, que me enviaba por GPRS el estado de las baterías junto con información de temperatura, humedad, carga desde un pequeño molinillo,etc. Mediante SMSs podía también enviarle comandos (rearrancar el inversor, cortar el riego,…)
    • Un monitor doméstico para control de apertura de la puerta principal, de la puerta del garage,sensores de movimiento, temperatura,… enviando también mediante un ESP8266 información que recogía en una BD.

Las principales ventajas de arduino para mí han sido siempre su bajo coste, la disponibilidad de accesorios, sensores, actuadores,…, el gran número de pines de I/O (siempre he utilizado una placa Mega, generalmente con una pantalla), la facilidad de programación,etc

El principal problema que me he encontrado con arduino ha sido la iteración con las placas de comunicaciones. Tanto la comunicación con la placa GPRS como con el ESP8266 era a través de comandos AT, que no dejaban de dar problemas. En algún momento intenté también algo con una placa bluetooth, pero tras varios fracasos acabé desistiendo.

Al poco de enterarme de que el ESP8266 se podía programar y usar como microcontrolador (que ignorante antes, eh?) conocí la existencia del ESP32, y ahí acabó para mi la relación con las placas arduino.

El ESP32 es más potente que las placas arduino, tiene más velocidad, más memoria, 2 cores de procesamiento, incorpora wifi y bluetooth y tiene librerias que te evitan el angorroso mundo AT. Su único inconveniente (al menos hasta ahora), es que dispones de menos pines de I/O, y eso se nota en algunas aplicaciones (pero afortunadamente no es problema en muchas otras).

En mi caso lo estoy utilizando para todas mis nuevas ocurrencias, y aún mantengo mi monitor de baterías sobre arduino, pero quien envía la información ahora es un ESP32 via wifi, y me he quitado la placa GPRS.

Me mantengo en el entorno IDE de arduino por comodidad, y he probado varias placas:

    • Placa de Heltec con pequeña pantalla incorporada
    • Placa DevKit v1
    • Placa de TTGO con pequeña pantalla a color
    • Placa DevKitC, con antena incorporada o antena externa

Pero me he encontrado problemas. El principal ha sido en una aplicación relativamente compleja (unas 3000 líneas de código, varios sensores y actuadores, envío de información a BD, control via wifi de los dispositivos desde una aplicacion en el móvil, e incorporando ahora control via bluetooth).

Los problemas:

    • Tiene menos pines que el arduino MEGA, pero además algunos de ellos tienen limitaciones (principalmente de cara al arranque, el 0, el 12, el 15).
    • Hice uso de los contactos touch que tiene, pero el umbral de disparo es variable y tenía demasiados falsos positivos a pesar de filtrar las lecturas. Al final decidí cambiarlos por pulsadores.
    • Es un dispositivo que internamente y en los pines I/O funciona con 3,3v, lo que implica revisar los sensores y usar adaptadores de nivel (p.e. en mi caso para los relés y algún led -con 3,3v hay que ser más esquisito con el voltaje de caída del led y la resistencia-), 1€ el shifter de 8 circuitos.
    • De vez en cuando rearrancaba al encender cosas. Es más sensible a los picos en la alimentación que el arduino. El problema se ha resuelto añadiendo un condensador entre Vcc y GND, y en algunos casos separando algunas  cargas altas a una 2ª fuente de alimentación. De los 3 posibles modos de alimentarlo [por el USB,  por el pin de 3,3v o por el pin de 5v] yo lo alimento por los pines 5v-GND.
    • Al cabo de varias horas o varios días de repente se colgaba. Por supuesto el primer sospechoso es el código, pero no encontré nada raro. A pesar de eso hice algunas mejoras que no resolvieron el problema:
      • Eliminación de la mayoría de usos del tipo String, dado que fragmenta la memoria.
      • Control del espacio libre de heap, stack y máximo bloque asignable.
      • Añadir un watchdog para loop().
      • Añadir en el Core-0 un control sobre el funcionamiento de loop (que corre en el Core-1)

Nada de esto funcionó, el watchdog tampoco, ni el control desde el Core-0. Seguía el hanging total del dispositivo, a pesar de que el programa corría sin problemas en un TTGO que no tenía nada conectado.

Esto y el hecho de que se colgaba siempre al desactivar un relé, me ayudo a encontrar al culpable: el pico de tensión que causaba el relé al desconectar la carga inductiva que había detrás (un transformador). Las cargas inductivas intentan mantener la corriente en el momento de desactivar el relé. Esto suele provocar una chispa entre los contactos del relé, pero lo que yo notaba era ese cuelgue en una de cada n desactivaciones.

La solución: un circuito snubber colocado en paralelo a la carga en cada uno de los relés que actúan cargas inductivas (en mi caso un transformador y unas electroválvulas), por 0,50€.

Cambiar Disco Basico en Synology

Tengo un Synology 218 con 2 bahías, con 2 discos de 3TB en modo básico (sin redundancia) que se están llenando.

Después de buscar discos compatibles, que tuvieran capacidad, robustez y precio razonable, he comprado por amazon un disco WD-Gold de 12TB para sustituir el volume1 y no sabía cómo hacerlo (he encontrado instrucciones para cuando están en RAID, pero pocas cuando el tipo es básico).

El procedimiento sería hacer una copia de seguridad (dónde?), meter el nuevo disco sustituyendo al antiguo, configurarlo y restaurar la copia.

For Basic or RAID 0 volume on two and more bays models:

      1. Back up all data stored on the Synology Product.
      2. Turn off the Synology Product.
      3. Replace the internal hard drives with larger ones.
      4. Turn on the Synology Product.
      5. Reinstall the system.
      6. Copy the backed up data to the new volume.

Otros métodos tienen el problema de cambiar el orden de volume1 y volume2, lo que obliga a reconfiogurarlos o modificar las carpetas compartidas y las aplicaciones.

Buscando por internet he encontrado este método (gracias Mathieu), que tiene sentido y parece que funciona bien. Me he puesto con ello y os lo describo de manera más detallada (léelo completo antes de empezar a ejecutar pasos):

0- Siempre que vayas a tocar los discos, es conveniente hacer un backup de los datos importantes (deberías hacerlo con cierta frecuencia aunque no lo toques, un disco siempre se puede estropear cuando menos te lo esperas)

1- En DSM, desde el administrador de almacenamiento->HDD puedes dar a localizar unidad para confirmar en qué bandeja está un volumen determinado. Apagar el DS. Abrirlo y extraer de su bandeja/bahía el disco que vamos a querer dejar sin modificar (en mi caso el Volume2, en la bandeja2. El volume1 es el que quiero pasar al disco nuevo, lo dejo donde estaba). Puedes rearrancar para que reconozca la nueva situación, aunque no es necesario. Para no estar abriendo y cerrando la unidad a cada paso la he dejado abierta,tumbada sobre la cara que no se mueve. Al meter un disco estoy poniendo solo un par de tornillos en cada disco en lugar de todos, hasta que en el último paso llegue a la situación final,en que ya sí apretaré todos. Aprovecho esta operación para limpiar de polvo el interior (estaba lleno).

2- Insertar disco nuevo en la bandeja 2. Arrancar. En el gestor de almacenamiento vemos que ya no aparece el disco que hemos quitado, y en HDDs aparece el nuevo disco, sin inicializar (no le hacemos nada,lo hará el sistema en el próximo paso)

3- Convertir volume1 a RAID1. (Gestor de almacenamiento->grupo de almacenamiento->cambiar tipo RAID, no a SHR, sino RAID1). Dejarle que haga la copia al otro disco (podemos ir viendo el avance en Grupo de Almacenamiento. Tardará bastante -después de inicializar el disco nuevo, debe montar el RAID y copiar el S.O. y todos los datos. Para 2,5TB me ha tardado casi 8 horas con la mejora que indico abajo-).

Si desde un terminal ejecutamos cat /proc/mdstat podremos ver el avance, la velocidad de sincronización y el tiempo estimado para acabar (en mi caso inicialmente 100MB/sg y unas 8 horas).

$ cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md2 : active raid1 sdb3[1] sda3[0]
2925444544 blocks super 1.2 [2/1] [U_]
[===>.................] recovery = 19.1% (560982528/2925444544) finish=301.5min speed=130669K/sec

md1 : active raid1 sdb2[1] sda2[0]
2097088 blocks [2/2] [UU]

md0 : active raid1 sdb1[1] sda1[0]
2490176 blocks [2/2] [UU]

unused devices: <none>

En Gestor de almacenamiento->grupo de almacenamiento->configuración podemos decirle que priorice la sincronización sobre el uso normal para que la haga más rápido (en mi caso ha pasado a 130MB/sg, un 30% más rápido). Mientras copia el DS sigue activo, cuanto menos lo utilicemos para otras cosas mejor.

4- Apagar. Intercambiar de bandeja los discos 1 y 2 (para que el disco nuevo ocupe la posición en la que vamos a querer dejarlo definitivamente -podemos ponerle ya todos los tornillos-) y arrancar para que reconozca las nuevas posiciones.

5- Apagar y quitar el disco antiguo de la bandeja 2 y arrancar (arranca en modo degradado, y el nuevo disco ya está en el sistema y tiene toda la información). El sistema empezará a pitar para avisar de la falta de un disco del RAID (se puede apagar el pitido desde la consola o ejecutando el siguiente paso).

6- Desde el terminal ejecutar:

sudo mdadm  –grow  –raid-devices=1  –force  /dev/mdX

donde /dev/mdX es el device que corresponde al nuevos disco RAID (en mi caso /dev/md2).  Puedes usar  cat /proc/mdstat para listar todos los dispositivos RAID disponibles (los dispositivos RAID de 2 discos aparecerám como [UU] si están los 2 discos y [_U] o [U_] si sólo hay un disco de los 2 que lo forman).

Para entrar por terminal debes habilitarlo antes en el panel de control y usar una aplicación como p.e. putty para entrar por ssh (no olvides deshabilitarlo después para incrementar la seguridad de tu equipo evitando que te entren hackers -que lo intentan con frecuencia-)

Este comando le dice a  mdadm que ese dispositivo RAID usa sólo 1 disco en lugar de 2, y aparecerá como básico, como queríamos.

7- Se habrá apagado el pitido. En DSM, desde el administrador de almacenamiento->Grupo de Almacenamiento, veremos que el volumen ya es básico en lugar de RAID, pero su tamaño es el del antiguo disco. Hay una opción para expandir el volumen1 a ocupar todo el espacio disponible. Hacerlo y esperar a que acabe (serán unos pocos minutos). Deberá aparecer el volumen1 ocupando todo el espacio disponible, como RAID básico.

8- Apagar, insertar el disco2 (el que habíamos sacado para hacer hueco, pero que queremos conservar) en la bandeja2, como estaba  al inicio. Ya podemos poner todos los tornillos y cerrar la carcasa. Arrancar.

Deberíamos haber llegado a la situación que queríamos. Al arrancar me ha dado un aviso diciendo que había un fallo en la copia del sistema (cada disco contiene una copia del sistema DSM). En DSM->Gestor de almacenamiento->Visión General se puede ver el mensje y una opción Reparar que tarda unos segundos.

El disco que hemos sacado lo podemos meter en una carcasa de 3.5″ y conectarlo por USB al DS o usarlo como disco externo en otros equipos (PC, etc).