COPIA DE SEGURIDAD Y RESTAURACIÓN DEL FIRMWARE DE OPENDROP V2.0 CON AVRDUDE

Breve resumen

OpenDrop-v2.0-Firmware_avrdude_guide (este artículo en PDF, recomendado)

opendrop2.0_firmware (para OpenDrop V2.0 como ZIP)

Este documento y entrada de blog es para las personas que:

  • quiero tener un conocimiento básico para el uso de avrdude con una placa Sparkfun Pro Micro (o compatible)
  • (ATmega32U4 5V, 16 MHz)
  • Obtenga los archivos de firmware para el OpenDrop v2.0 (cuatro botones) - el firmware NO es compatible con las versiones más recientes de OpenDrop (v2.1 con joystick) - por favor, utilice la descarga de GitHub para compilar y subir el Firmware usted mismo.
  • no tienen miedo de ensuciarse las manos con cosas de la línea de comandos en Linux (y asumirán las consecuencias - ¡no somos responsables de que rompas dispositivos por seguir esta guía! Tenga cuidado y compruebe los comandos - la diferencia entre leer (r) y escribir (w) es literalmente sólo una letra)

He tenido que reparar un Arduino roto en una de nuestras unidades OpenDrop V2.0 (con cuatro pulsadores). En el repositorio oficial de GitHub ( -> https://github.com/GaudiLabs/OpenDrop ), la descarga te da el código para el OpenDrop v2.1 (con un joystick). Por lo tanto, consideré que la solución más fácil sería hacer una copia de seguridad del firmware de otro dispositivo OpenDrop v2.0, y copiarlo en el nuevo Arduino.

Utilicé avrdude en una unidad Raspberry Pi para respaldar el firmware, y escribirlo en el nuevo Arduino. La copia de seguridad requiere varios pasos, y poner el Arduino en el estado adecuado (¡también es necesario para la lectura!).

Escollos que he encontrado

  • comprueba que tu cable USB incluye el cableado para los datos - el primer cable que he probado sólo alimentará el Arduino, pero no aparecerá en los dispositivos USB.
  • Copiar y pegar los códigos de la línea de comandos de la mayoría de los blogs puede hacer que algunos caracteres aparezcan de forma incorrecta - considere utilizar el documento PDF que proporciono de este post, para asegurarse de que el código se introduce correctamente

Configuración y conocimientos básicos

El OpenDrop v2.0 es manejado por un dispositivo Arduino, que es compatible con la placa Sparkfun Pro Micro. (Por ejemplo Deekrobot Pro Micro)

  • ATmega32U4 (5V, 16 MHz)
  • Puerto microUSB integrado para alimentación y programación

avrdude se utiliza para leer y escribir archivos de firmware y ajustes desde / hacia el Arduino.

Utilizo una Raspberry Pi, ya que somos un distribuidor autorizado de Raspberry Pi y me siento cómodo utilizando la línea de comandos de Linux en lugar de Windows.

Instalación de avrdude:

sudo apt-get install avrdude

Localización del puerto a utilizar con avrdude

Desenchufe el adaptador de corriente del OpenDrop, si estaba enchufado.

Conecta el cable microUSB de Arduino en el Arduino, y en la Raspberry Pi. El dispositivo emitirá un pitido.

Asegúrese de que el Arduino aparece como un dispositivo USB:

/home/pi# lsusb

Bus 001 Dispositivo 005: ID 2341:8037 Arduino SA

Bus 001 Dispositivo 004: ID 0424:7800 Standard Microsystems Corp.

Bus 001 Dispositivo 003: ID 0424:2514 Standard Microsystems Corp. Hub USB 2.0

Bus 001 Dispositivo 002: ID 0424:2514 Standard Microsystems Corp. Hub USB 2.0

Bus 001 Dispositivo 001: ID 1d6b:0002 Concentrador raíz de la Fundación Linux 2.0

Si la entrada Arduino SA NO aparece, compruebe de nuevo su cable USB: algunos cables sólo transmiten energía, no datos. Esto, por cierto, fue también el error por el que no pude utilizar el IDE de Arduino en Windows con este dispositivo - ¡estaba probando un cable USB equivocado primero!

Encuentra el puerto que utiliza la Sparkfun Pro Micro:

ls /dev/tty*

/dev/tty /dev/tty12 /dev/tty17 /dev/tty21 /dev/tty26 /dev/tty30 /dev/tty35 /dev/tty4 /dev/tty44 /dev/tty49 /dev/tty53 /dev/tty58 /dev/tty62  /dev/ttyACM0

/dev/tty0 /dev/tty13 /dev/tty18 /dev/tty22 /dev/tty27 /dev/tty31 /dev/tty36 /dev/tty40 /dev/tty45 /dev/tty5 /dev/tty54 /dev/tty59 /dev/tty63 /dev/ttyAMA0

/dev/tty1 /dev/tty14 /dev/tty19 /dev/tty23 /dev/tty28 /dev/tty32 /dev/tty37 /dev/tty41 /dev/tty46 /dev/tty50 /dev/tty55 /dev/tty6 /dev/tty7 /dev/ttyprintk

/dev/tty10 /dev/tty15 /dev/tty2 /dev/tty24 /dev/tty29 /dev/tty33 /dev/tty38 /dev/tty42 /dev/tty47 /dev/tty51 /dev/tty56 /dev/tty60 /dev/tty8

/dev/tty11 /dev/tty16 /dev/tty20 /dev/tty25 /dev/tty3 /dev/tty34 /dev/tty39 /dev/tty43 /dev/tty48 /dev/tty52 /dev/tty57 /dev/tty61 /dev/tty9

Está buscando algo como /dev/ttyACM0, o /dev/ttyUSB0

En mi caso era /dev/ttyACM0

Este puerto sólo estará presente, cuando el dispositivo esté conectado. Para asegurarte de que tienes el puerto correcto, puedes probar a hacer la lista con el OpenDrop conectado y el OpenDrop desconectado (microUSB -> USB en la Pi). Compara las salidas. Supongo que para ti también será /dev/ttyACM0.

Crear un directorio para las copias de seguridad

Nos convertiremos en el superusuario, crearemos el directorio para los archivos de la copia de seguridad y nos cambiaremos a él:

sudo su

mkdir /home/pi/opendrop2.0_bak

cd /home/pi/opendrop2.0_bak

Uso de avrdude

El botón de reinicio (Importante, no te saltes esta parte)

Para que el avrdude funcione, el SparkFun Pro Micro debe estar en el estado correcto del sistema. Para poner el SparkFun Pro Micro en el estado correcto del sistema, debe pulsar el botón de reinicio (etiquetado RST) rápidamente dos veces seguidas. El dispositivo emitirá un pitido y el LED comenzará a parpadear.

Debe ejecutar el comando avrdude inmediatamente después de hacer esto, ya que el dispositivo volverá al estado normal después de un breve tiempo de espera.

Para cada comando que he ejecutado, he pulsado el botón RST dos veces seguidas. Probablemente los comandos podrían combinarse en un script de shell; como me gusta tener precaución para no bloquear los dispositivos por usar la línea de comandos equivocada, hice el proceso manualmente.

Si no utilizas el botón RST como te he indicado, obtendrás errores de avrdude como:

Conectando con el programador: .avrdude: butterfly_recv(): el programador no responde

Respaldo de la firma: Lectura - visión general

Vamos a retroceder

  • flash
  • eeprom
  • hfuse
  • lfuse
  • efusor

Ref: https://www.hackster.io/rayburne/avr-firmware-duplicator (Cuidado, los ajustes de avrdude aquí no son correctos para el OpenDrop / Sparkfun Pro Micro).

Copia de seguridad del firmware: Los comandos

Si aún no lo has hecho, cambia al directorio que has preparado para los archivos de copia de seguridad del Firmware, y conviértete en el superusuario (root). No estoy seguro de que avrdude funcione sin permisos de root - pruébalo si quieres.

Asegúrese de utilizar el puerto correcto (probablemente /dev/ttyACM0). Asegúrese de que tiene la letra "r" después del objetivo de lectura. r como en lectura; una letra w usaría su archivo de destino como fuente, para sobrescribir su Arduino Flash - ¡sin aviso de seguridad!

La letra r después del nombre del archivo de copia de seguridad especifica el tipo de salida, es importante hacerlo bien para la posterior operación de restauración. Si tienes curiosidad, lee la página de manual aquí: https://www.nongnu.org/avrdude/user-manual/avrdude_4.html

-p especifica la plataforma

-c el programador

-P el puerto

-U especifica la operación (fuente/destino:modo:destino/fuente:modo_archivo)

Aquí, entonces, está el primer comando a utilizar, y su salida:

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U flash:r:flash_backup_file_od2.0.hex:r

Conexión al programador: .

Programador encontrado: Id = "CATERIN"; tipo = S

    Versión del software = 1.0; no se indica la versión del hardware.

El programador admite el incremento automático de la dirección.

El programador admite el acceso a la memoria en búfer con buffersize=128 bytes.

 

El programador es compatible con los siguientes dispositivos:

    Código del dispositivo: 0x44

 

avrdude: Dispositivo AVR inicializado y listo para aceptar instrucciones

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: Firma del dispositivo = 0x1e9587 (probablemente m32u4)

avrdude: leyendo la memoria flash:

 

Lectura | ################################################## | 100% 0.64s

 

avrdude: escribiendo el archivo de salida "flash_backup_file_od2.0.hex"

 

avrdude: safemode: Fusibles OK (E:CB, H:D8, L:FF)

 

avrdude hecho. Gracias.

 

Aquí está el segundo comando. Por cierto, puede cambiar los nombres de los archivos (en este caso el eeprom_backup_file_od2.0.hex):

 

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U eeprom:r:eeprom_backup_file_od2.0.hex:r

 

Conexión al programador: .

Programador encontrado: Id = "CATERIN"; tipo = S

    Versión del software = 1.0; no se indica la versión del hardware.

El programador admite el incremento automático de la dirección.

El programador admite el acceso a la memoria en búfer con buffersize=128 bytes.

 

El programador es compatible con los siguientes dispositivos:

    Código del dispositivo: 0x44

 

avrdude: Dispositivo AVR inicializado y listo para aceptar instrucciones

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: Firma del dispositivo = 0x1e9587 (probablemente m32u4)

avrdude: leyendo la memoria eeprom:

 

Lectura | ################################################## | 100% 1.76s

 

avrdude: escribiendo el archivo de salida "eeprom_backup_file_od2.0.hex"

 

avrdude: safemode: Fusibles OK (E:CB, H:D8, L:FF)

 

avrdude hecho. Gracias.

 

A continuación, vamos a respaldar tres tipos diferentes de fusibles. Aquí está el primero:

 

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U hfuse:r:hfuse_backup_file_od2.0.hex:r

 

Conexión al programador: .

Programador encontrado: Id = "CATERIN"; tipo = S

    Versión del software = 1.0; no se indica la versión del hardware.

El programador admite el incremento automático de la dirección.

El programador admite el acceso a la memoria en búfer con buffersize=128 bytes.

 

El programador es compatible con los siguientes dispositivos:

    Código del dispositivo: 0x44

 

avrdude: Dispositivo AVR inicializado y listo para aceptar instrucciones

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: Firma del dispositivo = 0x1e9587 (probablemente m32u4)

avrdude: leyendo la memoria de hfuse:

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: escribiendo el archivo de salida "hfuse_backup_file_od2.0.hex"

 

avrdude: safemode: Fusibles OK (E:CB, H:D8, L:FF)

 

avrdude hecho. Gracias.

 

ahora el fusible:

 

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U lfuse:r:lfuse_backup_file_od2.0.hex:r

 

Conexión al programador: .

Programador encontrado: Id = "CATERIN"; tipo = S

    Versión del software = 1.0; no se indica la versión del hardware.

El programador admite el incremento automático de la dirección.

El programador admite el acceso a la memoria en búfer con buffersize=128 bytes.

 

El programador es compatible con los siguientes dispositivos:

    Código del dispositivo: 0x44

 

avrdude: Dispositivo AVR inicializado y listo para aceptar instrucciones

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: Firma del dispositivo = 0x1e9587 (probablemente m32u4)

avrdude: leyendo la memoria de lfuse:

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: escribiendo el archivo de salida "lfuse_backup_file_od2.0.hex"

 

avrdude: safemode: Fusibles OK (E:CB, H:D8, L:FF)

 

avrdude hecho. Gracias.

 

Ahora el último comando, la mecha:

 

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U efuse:r:efuse_backup_file_od2.0.hex:r

 

Conexión al programador: .

Programador encontrado: Id = "CATERIN"; tipo = S

    Versión del software = 1.0; no se indica la versión del hardware.

El programador admite el incremento automático de la dirección.

El programador admite el acceso a la memoria en búfer con buffersize=128 bytes.

 

El programador es compatible con los siguientes dispositivos:

    Código del dispositivo: 0x44

 

avrdude: Dispositivo AVR inicializado y listo para aceptar instrucciones

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: Firma del dispositivo = 0x1e9587 (probablemente m32u4)

avrdude: leyendo la memoria de efuse:

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: escribiendo el archivo de salida "efuse_backup_file_od2.0.hex"

 

avrdude: safemode: Fusibles OK (E:CB, H:D8, L:FF)

 

avrdude hecho. Gracias.

 

Recuerde que debe pulsar el botón RST dos veces antes de cada operación. Es no necesario desconectar el Arduino de la Raspberry Pi después de ejecutar la operación RST.

 

Crear un archivo ZIP

puede crear un archivo ZIP utilizando el siguiente comando (sustituya las rutas según corresponda):

sudo zip -r /home/pi/opendrop2.0_bak.zip /home/pi/opendrop2.0_bak

Restaurar el firmware

Si necesitas restaurar el firmware, utiliza los siguientes comandos. De nuevo, ¡no olvides pulsar el botón RST dos veces antes de cada comando!

Ejecute los comandos desde el directorio correcto como root. Asegúrese de que tiene la letra "w" para escribir en el microcontrolador (Arduino en este caso).

Escribe el archivo flash:

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U flash:w:flash_backup_file_od2.0.hex

Conexión al programador: .

Programador encontrado: Id = "CATERIN"; tipo = S

    Versión del software = 1.0; no se indica la versión del hardware.

El programador admite el incremento automático de la dirección.

El programador admite el acceso a la memoria en búfer con buffersize=128 bytes.

 

El programador es compatible con los siguientes dispositivos:

    Código del dispositivo: 0x44

 

avrdude: Dispositivo AVR inicializado y listo para aceptar instrucciones

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: Firma del dispositivo = 0x1e9587 (probablemente m32u4)

avrdude: NOTA: se ha especificado memoria "flash", se realizará un ciclo de borrado

         Para desactivar esta función, especifique la opción -D.

avrdude: borrando el chip

avrdude: leyendo el archivo de entrada "flash_backup_file_od2.0.hex"

avrdude: escribiendo flash (32604 bytes):

 

Escritura | ################################################## | 100% 2.98s

 

avrdude: 32604 bytes de flash escritos

avrdude: verificando la memoria flash contra flash_backup_file_od2.0.hex:

avrdude: cargar datos de flash desde el archivo de entrada flash_backup_file_od2.0.hex:

avrdude: el archivo de entrada flash_backup_file_od2.0.hex contiene 32604 bytes

avrdude: lectura de datos de la flash en el chip:

 

Lectura | ################################################## | 100% 0.76s

 

avrdude: verificando ...

avrdude: error de verificación, primer desajuste en el byte 0x7000

         0x55 != 0x5f

avrdude: error de verificación; el contenido no coincide

 

avrdude: safemode: Fusibles OK (E:CB, H:D8, L:FF)

 

avrdude hecho. Gracias.

 

Nota: He intentado escribir varias veces, variando ligeramente el comando. En cada intento obtuve el error de verificación; sin embargo, el firmware funciona bien - mi investigación superficial mostró que está relacionado con algún cableado de la periferia del microcontrolador - fue insertado en el OpenDrop mientras hacía la copia de seguridad y la restauración. He decidido que los resultados hablan por sí mismos, y pasé a la restauración de las otras partes. Sus resultados pueden variar aquí. No se ofrecen garantías.

 

Restaurar la eeprom:

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U eeprom:w:eeprom_backup_file_od2.0.hex

 

Conexión al programador: .

Programador encontrado: Id = "CATERIN"; tipo = S

    Versión del software = 1.0; no se indica la versión del hardware.

El programador admite el incremento automático de la dirección.

El programador admite el acceso a la memoria en búfer con buffersize=128 bytes.

 

El programador es compatible con los siguientes dispositivos:

    Código del dispositivo: 0x44

 

avrdude: Dispositivo AVR inicializado y listo para aceptar instrucciones

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: Firma del dispositivo = 0x1e9587 (probablemente m32u4)

avrdude: leyendo el archivo de entrada "eeprom_backup_file_od2.0.hex"

avrdude: archivo de entrada eeprom_backup_file_od2.0.hex auto detectado como binario crudo

avrdude: escribiendo eeprom (1024 bytes):

 

Escritura | ################################################## | 100% 3.44s

 

avrdude: 1024 bytes de eeprom escritos

avrdude: verificando la memoria de la eeprom contra eeprom_backup_file_od2.0.hex:

avrdude: cargar datos de la eeprom desde el archivo de entrada eeprom_backup_file_od2.0.hex:

avrdude: archivo de entrada eeprom_backup_file_od2.0.hex auto detectado como binario crudo

avrdude: el archivo de entrada eeprom_backup_file_od2.0.hex contiene 1024 bytes

avrdude: lectura de los datos de la eeprom en el chip:

 

Lectura | ################################################## | 100% 1.76s

 

avrdude: verificando ...

avrdude: 1024 bytes de eeprom verificados

 

avrdude: safemode: Fusibles OK (E:CB, H:D8, L:FF)

 

avrdude hecho. Gracias.

 

Restablecer los fusibles (Nota: He leído algo acerca de algunos fusibles que sólo se puede restablecer por un programador de 12 V. YMMV).

 

Primera mecha:

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U hfuse:w:hfuse_backup_file_od2.0.hex

 

Conexión al programador: .

Programador encontrado: Id = "CATERIN"; tipo = S

    Versión del software = 1.0; no se indica la versión del hardware.

El programador admite el incremento automático de la dirección.

El programador admite el acceso a la memoria en búfer con buffersize=128 bytes.

 

El programador es compatible con los siguientes dispositivos:

    Código del dispositivo: 0x44

 

avrdude: Dispositivo AVR inicializado y listo para aceptar instrucciones

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: Firma del dispositivo = 0x1e9587 (probablemente m32u4)

avrdude: leyendo el archivo de entrada "hfuse_backup_file_od2.0.hex"

avrdude: archivo de entrada hfuse_backup_file_od2.0.hex auto detectado como binario crudo

avrdude: escribiendo hfuse (1 bytes):

 

Escritura | | 0% 0.00s ***failed;

Escritura | ################################################## | 100% 0.00s

 

avrdude: 1 bytes de hfuse escritos

avrdude: verificando la memoria de hfuse contra hfuse_backup_file_od2.0.hex:

avrdude: cargar datos hfuse desde el archivo de entrada hfuse_backup_file_od2.0.hex:

avrdude: archivo de entrada hfuse_backup_file_od2.0.hex auto detectado como binario crudo

avrdude: el archivo de entrada hfuse_backup_file_od2.0.hex contiene 1 bytes

avrdude: lectura de datos hfuse en el chip:

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: verificando ...

avrdude: 1 bytes de hfuse verificados

 

avrdude: safemode: Fusibles OK (E:CB, H:D8, L:FF)

 

avrdude hecho. Gracias.

 

ahora lfuse:

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U lfuse:w:lfuse_backup_file_od2.0.hex

 

Conexión al programador: .

Programador encontrado: Id = "CATERIN"; tipo = S

    Versión del software = 1.0; no se indica la versión del hardware.

El programador admite el incremento automático de la dirección.

El programador admite el acceso a la memoria en búfer con buffersize=128 bytes.

 

El programador es compatible con los siguientes dispositivos:

    Código del dispositivo: 0x44

 

avrdude: Dispositivo AVR inicializado y listo para aceptar instrucciones

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: Firma del dispositivo = 0x1e9587 (probablemente m32u4)

avrdude: leyendo el archivo de entrada "lfuse_backup_file_od2.0.hex"

avrdude: archivo de entrada lfuse_backup_file_od2.0.hex auto detectado como binario crudo

avrdude: escribiendo lfuse (1 bytes):

 

Escritura | | 0% 0.00s ***failed;

Escritura | ################################################## | 100% 0.00s

 

avrdude: 1 bytes de lfuse escritos

avrdude: verificando la memoria de lfuse contra lfuse_backup_file_od2.0.hex:

avrdude: cargar los datos de lfuse desde el archivo de entrada lfuse_backup_file_od2.0.hex:

avrdude: archivo de entrada lfuse_backup_file_od2.0.hex auto detectado como binario crudo

avrdude: el archivo de entrada lfuse_backup_file_od2.0.hex contiene 1 bytes

avrdude: lectura de datos de lfuse en el chip:

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: verificando ...

avrdude: 1 bytes de lfuse verificados

 

avrdude: safemode: Fusibles OK (E:CB, H:D8, L:FF)

 

avrdude hecho. Gracias.

 

ahora efusivo:

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U efuse:w:efuse_backup_file_od2.0.hex

 

Conexión al programador: .

Programador encontrado: Id = "CATERIN"; tipo = S

    Versión del software = 1.0; no se indica la versión del hardware.

El programador admite el incremento automático de la dirección.

El programador admite el acceso a la memoria en búfer con buffersize=128 bytes.

 

El programador es compatible con los siguientes dispositivos:

    Código del dispositivo: 0x44

 

avrdude: Dispositivo AVR inicializado y listo para aceptar instrucciones

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: Firma del dispositivo = 0x1e9587 (probablemente m32u4)

avrdude: leyendo el archivo de entrada "efuse_backup_file_od2.0.hex"

avrdude: archivo de entrada efuse_backup_file_od2.0.hex auto detectado como binario crudo

avrdude: escribiendo efuse (1 bytes):

 

Escritura | | 0% 0.00s ***failed;

Escritura | ################################################## | 100% 0.00s

 

avrdude: 1 bytes de efuse escritos

avrdude: verificando la memoria de efuse contra efuse_backup_file_od2.0.hex:

avrdude: cargar los datos de efuse del archivo de entrada efuse_backup_file_od2.0.hex:

avrdude: archivo de entrada efuse_backup_file_od2.0.hex auto detectado como binario crudo

avrdude: el archivo de entrada efuse_backup_file_od2.0.hex contiene 1 bytes

avrdude: lectura de datos efusivos en el chip:

 

Lectura | ################################################## | 100% 0.00s

 

avrdude: verificando ...

avrdude: 1 bytes de efuse verificados

 

avrdude: safemode: Fusibles OK (E:CB, H:D8, L:FF)

 

avrdude hecho. Gracias.

 

Eso es todo - el firmware se ha restaurado. Ya puedes desconectar el OpenDrop / SparkFun Pro Micro de tu Raspberry Pi.

 

Enlaces y referencias útiles

  • https://www.nongnu.org/avrdude/user-manual/avrdude_4.html
  • https://askubuntu.com/questions/254835/how-can-i-know-the-usb-port
  • https://forum.arduino.cc/index.php?topic=403201.0 (¡comando avrdude para otro objetivo!)
  • https://learn.sparkfun.com/tutorials/pro-micro–fio-v3-hookup-guide/introduction
  • https://www.hackster.io/rayburne/avr-firmware-duplicator (¡comando avrdude para otro objetivo!)
  • https://forum.arduino.cc/index.php?topic=453997.0 (en relación con el error con la verificación de flash)