OPENDROP V2.0 FIRMWARE BACKUP & RESTORE COM O AVRDUDE

Breve visão geral

OpenDrop-v2.0-Firmware_avrdude_guide (este artigo em PDF, recomendado!)

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

Este documento & blog post é para pessoas que:

  • quer obter um entendimento básico para o uso do avrdude com uma placa Sparkfun Pro Micro (ou compatível)
  • (ATmega32U4 5V, 16 MHz)
  • Obtenha arquivos de firmware para o OpenDrop v2.0 (quatro botões de pressão) - o firmware NÃO é compatível com versões mais recentes do OpenDrop (v2.1 com joystick) - por favor use o download do GitHub para compilar e carregar o Firmware você mesmo.
  • não têm medo de sujar as mãos com coisas de linha de comando sob Linux (e suportarão as consequências - não somos responsáveis por você quebrar dispositivos seguindo este guia! Tenha cuidado e verifique os comandos - a diferença entre ler (r) e escrever (w) é literalmente apenas uma letra)

Tive de reparar um Arduino partido numa das nossas unidades OpenDrop V2.0 (com quatro botões de pressão). No repositório oficial do GitHub ( -> https://github.com/GaudiLabs/OpenDrop ), o download lhe dará o código para o OpenDrop v2.1 (com um joystick). Portanto, eu considerei que a solução mais fácil seria fazer backup do firmware de outro dispositivo OpenDrop v2.0, e copiá-lo para o novo Arduino.

Usei avrdude numa unidade Raspberry Pi para fazer o backup do firmware, e escrevi-o no novo Arduino. O backup requer vários passos, e colocar o Arduino no estado adequado (também necessário para a leitura!).

Armadilhas que eu encontrei

  • verifique se o seu cabo USB inclui cablagem para dados - o primeiro cabo que tentei só alimentará o Arduino, mas não aparecerá nos dispositivos USB.
  • Copiar & colar códigos de linha de comando da maioria dos blogs pode renderizar alguns caracteres de forma errada - considere o uso do documento PDF que eu forneço deste post, para garantir que o código seja inserido corretamente

Criação e compreensão básica

O OpenDrop v2.0 é accionado por um dispositivo Arduino, que é compatível com a placa Sparkfun Pro Micro. (Por exemplo, Deekrobot Pro Micro)

  • ATmega32U4 (5V, 16 MHz)
  • porta microUSB integrada para alimentação e programação

O avrdude é usado para ler e escrever ficheiros de firmware e definições de / para o Arduino.

Eu uso um Raspberry Pi, já que somos um revendedor aprovado pelo Raspberry Pi & eu me sinto confortável em usar a linha de comando Linux sobre Windows.

Instalação do avrdude:

sudo apt-get install avrdude

Localização do porto a utilizar com o avrdude

Desligue a fonte de alimentação da OpenDrop, se esta estivesse ligada à corrente.

Conecte o cabo microUSB do Arduino no Arduino, e no Raspberry Pi. O dispositivo irá apitar.

Certifique-se de que o Arduino aparece como um dispositivo USB:

/home/pi# lsusb

Autocarro 001 Dispositivo 005: ID 2341:8037 Arduino SA

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

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

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

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Se a entrada Arduino SA NÃO aparecer, verifique novamente o seu cabo USB: alguns cabos só transmitem energia, não dados. A propósito, este também foi o erro pelo qual eu não pude usar o Arduino IDE no Windows com este dispositivo - eu estava tentando um cabo USB errado primeiro!

Encontre a porta, que a Sparkfun Pro Micro utiliza:

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

Você está procurando por algo como /dev/ttyACM0, ou /dev/ttyUSB0

No meu caso foi /dev/ttyACM0

Esta porta só estará presente, quando o dispositivo estiver ligado à corrente. Para garantir que você tenha a porta correta, você pode tentar listar com o OpenDrop sendo conectado, e o OpenDrop sendo desconectado (microUSB -> USB no Pi). Compare as saídas. Assumo que será /dev/ttyACM0 também para você.

Criar diretório para backup

Nós nos tornaremos o super usuário, criaremos o diretório para os arquivos de backup, e mudaremos para ele:

sudo su

mkdir /home/pi/opendrop2.0_bak

cd /home/pi/opendrop2.0_bak

Usando o avrdude

O botão reset (Importante, não pule esta parte)

Para o avrdude funcionar, a SparkFun Pro Micro tem de estar no estado correcto do sistema. Para colocar o SparkFun Pro Micro no estado correto do sistema, você deve pressionar o botão reset (rotulado RST) rapidamente duas vezes um após o outro. O dispositivo emitirá um bip, e o LED começará a piscar.

Você deve executar o comando avrdude imediatamente após fazer isso, pois o dispositivo voltará ao estado normal após um curto intervalo de tempo.

Para cada comando que executei, pressionei o botão RST duas vezes depois um do outro. Provavelmente os comandos poderiam ser combinados em um script shell; como eu gosto de usar cautela para não tijolo os dispositivos usando a linha de comando errada, eu pulei através do processo manualmente.

Se você não usar o botão RST, como eu já disse, você receberá erros do avrdude como:

Conectando-se ao programador: .avrdude: butterfly_recv(): programador não está respondendo

Apoio Firmare: Leitura - visão geral

Vamos fazer marcha atrás.

  • flash
  • eeprom
  • hfuse
  • lfuse
  • efuse

Ref: https://www.hackster.io/rayburne/avr-firmware-duplicator (Cuidado, as configurações do avrdude aqui não estão corretas para o OpenDrop / Sparkfun Pro Micro).

Cópia de Segurança de Firmware: Os comandos

Se ainda não estiver pronto, mude para o diretório que você preparou para os arquivos de backup do Firmware, e torne-se o super usuário (root). Não tenho a certeza se o avrdude vai funcionar fora da caixa sem permissões de root - experimente se quiser.

Certifique-se de que utiliza a porta certa (muito provavelmente /dev/ttyACM0). Certifique-se de que você tem a letra "r" após o alvo de leitura. r como em leitura; uma letra w usaria seu arquivo de destino como fonte, para sobrescrever seu Arduino Flash - sem aviso de segurança!

A letra r após o nome do arquivo de backup especifica o tipo de saída, é importante acertar isso para a operação de restauração posterior. Se você estiver curioso, leia a página manpage aqui: https://www.nongnu.org/avrdude/user-manual/avrdude_4.html

-p especifica a plataforma

-c o programador

-P o porto

-U especifica a operação (fonte/target:mode:target/source:file_mode)

Aqui está, então, o primeiro comando a usar, e é a saída:

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

Conectando-se ao programador: .

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

    Versão de Software = 1.0; Não é fornecida Versão de Hardware.

O programador suporta o incremento de endereços automáticos.

O programador suporta acesso à memória buffer com buffersize=128 bytes.

 

O programador suporta os seguintes dispositivos:

    Código do dispositivo: 0x44

 

Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções

 

Leitura | ################################################## | 100% 0.00s

 

Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)

avrdude: memória flash de leitura:

 

Leitura | ################################################## | 100% 0.64s

 

avrdude: escrevendo o arquivo de saída "flash_backup_file_od2.0.hex".

 

avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)

 

Avrdude feito. Obrigado.

 

Aqui está o segundo comando. A propósito, você pode mudar os nomes dos arquivos (neste caso o bit eeprom_backup_file_od2.0.hex):

 

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

 

Conectando-se ao programador: .

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

    Versão de Software = 1.0; Não é fornecida Versão de Hardware.

O programador suporta o incremento de endereços automáticos.

O programador suporta acesso à memória buffer com buffersize=128 bytes.

 

O programador suporta os seguintes dispositivos:

    Código do dispositivo: 0x44

 

Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções

 

Leitura | ################################################## | 100% 0.00s

 

Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)

avrdude: leitura da memória eeprom:

 

Leitura | ################################################## | 100% 1.76s

 

avrdude: escrevendo o arquivo de saída "eeprom_backup_file_od2.0.hex".

 

avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)

 

Avrdude feito. Obrigado.

 

Depois vamos fazer backup de três tipos diferentes de fusíveis. Aqui está o primeiro:

 

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

 

Conectando-se ao programador: .

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

    Versão de Software = 1.0; Não é fornecida Versão de Hardware.

O programador suporta o incremento de endereços automáticos.

O programador suporta acesso à memória buffer com buffersize=128 bytes.

 

O programador suporta os seguintes dispositivos:

    Código do dispositivo: 0x44

 

Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções

 

Leitura | ################################################## | 100% 0.00s

 

Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)

avrdude: leitura da memória hfuse:

 

Leitura | ################################################## | 100% 0.00s

 

avrdude: escrevendo o arquivo de saída "hfuse_backup_file_od2.0.hex".

 

avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)

 

Avrdude feito. Obrigado.

 

agora o rastilho:

 

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

 

Conectando-se ao programador: .

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

    Versão de Software = 1.0; Não é fornecida Versão de Hardware.

O programador suporta o incremento de endereços automáticos.

O programador suporta acesso à memória buffer com buffersize=128 bytes.

 

O programador suporta os seguintes dispositivos:

    Código do dispositivo: 0x44

 

Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções

 

Leitura | ################################################## | 100% 0.00s

 

Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)

avrdude: leitura da memória do fusível:

 

Leitura | ################################################## | 100% 0.00s

 

avrdude: escrevendo o arquivo de saída "lfuse_backup_file_od2.0.hex".

 

avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)

 

Avrdude feito. Obrigado.

 

Agora o último comando, o efusível:

 

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

 

Conectando-se ao programador: .

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

    Versão de Software = 1.0; Não é fornecida Versão de Hardware.

O programador suporta o incremento de endereços automáticos.

O programador suporta acesso à memória buffer com buffersize=128 bytes.

 

O programador suporta os seguintes dispositivos:

    Código do dispositivo: 0x44

 

Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções

 

Leitura | ################################################## | 100% 0.00s

 

Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)

avrdude: leitura da memória efuse:

 

Leitura | ################################################## | 100% 0.00s

 

avrdude: escrevendo o arquivo de saída "efuse_backup_file_od2.0.hex".

 

avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)

 

Avrdude feito. Obrigado.

 

Lembre-se de que você precisa pressionar o botão RST duas vezes antes de cada operação! É não necessário para desconectar o Arduino do Raspberry Pi após a execução da operação RST.

 

Criação de um ficheiro ZIP

você pode criar um arquivo ZIP usando o seguinte comando (substitua os caminhos conforme apropriado):

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

Restaurando o firmware

Se você precisar restaurar o firmware, use os seguintes comandos. Mais uma vez, não se esqueça de carregar duas vezes no botão RST antes de cada comando!

Execute os comandos a partir do diretório correto como root. Certifique-se de que você tem a letra "w" para escrever no microcontrolador (Arduino, neste caso).

Escreva o arquivo flash:

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

Conectando-se ao programador: .

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

    Versão de Software = 1.0; Não é fornecida Versão de Hardware.

O programador suporta o incremento de endereços automáticos.

O programador suporta acesso à memória buffer com buffersize=128 bytes.

 

O programador suporta os seguintes dispositivos:

    Código do dispositivo: 0x44

 

Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções

 

Leitura | ################################################## | 100% 0.00s

 

Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)

Avrdude: NOTA: a memória "flash" foi especificada, será executado um ciclo de apagamento

         Para desactivar esta funcionalidade, especifique a opção -D.

avrdude: apagar o chip

avrdude: lendo arquivo de entrada "flash_backup_file_od2.0.hex".

avrdude: flash de escrita (32604 bytes):

 

Escrever | ################################################## | 100% 2.98s

 

avrdude: 32604 bytes de flash escrito

avrdude: verificando a memória flash contra flash_backup_file_od2.0.hex:

avrdude: carregar dados flash a partir do arquivo de entrada flash_backup_file_od2.0.hex:

avrdude: ficheiro de entrada flash_backup_file_od2.0.hex contém 32604 bytes

avrdude: leitura de dados on-chip flash:

 

Leitura | ################################################## | 100% 0.76s

 

avrdude: verificando ...

avrdude: erro de verificação, primeiro descasamento em byte 0x7000

         0x55 != 0x5f

avrdude: erro de verificação; desajuste de conteúdo

 

avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)

 

Avrdude feito. Obrigado.

 

Nota: Eu tentei escrever várias vezes, variando ligeiramente o comando. Em cada tentativa eu recebi o erro de verificação; o firmware funciona bem, no entanto - minha pesquisa superficial mostrou que está relacionado a alguma fiação da periferia do microcontrolador - ele foi inserido no OpenDrop enquanto eu estava fazendo o backup e a restauração. Eu decidi que os resultados falam por si mesmos, e passei para a restauração das outras partes. Seus resultados podem variar aqui. Sem garantias dadas!

 

Restaurem o eeprom:

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

 

Conectando-se ao programador: .

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

    Versão de Software = 1.0; Não é fornecida Versão de Hardware.

O programador suporta o incremento de endereços automáticos.

O programador suporta acesso à memória buffer com buffersize=128 bytes.

 

O programador suporta os seguintes dispositivos:

    Código do dispositivo: 0x44

 

Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções

 

Leitura | ################################################## | 100% 0.00s

 

Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)

avrdude: lendo arquivo de entrada "eeprom_backup_file_od2.0.hex"

avrdude: arquivo de entrada eeprom_backup_file_od2.0.hex auto detectado como binário bruto

avrdude: escrevendo eeprom (1024 bytes):

 

Escrever | ################################################## | 100% 3.44s

 

avrdude: 1024 bytes de eeprom escrito

avrdude: verificando a memória eeprom contra eeprom_backup_file_od2.0.hex:

avrdude: carregar dados eeprom dados do arquivo de entrada eeprom_backup_file_od2.0.hex:

avrdude: arquivo de entrada eeprom_backup_file_od2.0.hex auto detectado como binário bruto

avrdude: ficheiro de entrada eeprom_backup_file_od2.0.hex contém 1024 bytes

avrdude: leitura de dados on-chip eeprom:

 

Leitura | ################################################## | 100% 1.76s

 

avrdude: verificando ...

avrdude: 1024 bytes de eeprom verificados

 

avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)

 

Avrdude feito. Obrigado.

 

Restaurar os fusíveis (Nota: Eu li algo sobre alguns fusíveis serem apenas reinicializáveis por um programador de 12 V. YMMV).

 

Primeiro rastilho:

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

 

Conectando-se ao programador: .

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

    Versão de Software = 1.0; Não é fornecida Versão de Hardware.

O programador suporta o incremento de endereços automáticos.

O programador suporta acesso à memória buffer com buffersize=128 bytes.

 

O programador suporta os seguintes dispositivos:

    Código do dispositivo: 0x44

 

Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções

 

Leitura | ################################################## | 100% 0.00s

 

Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)

avrdude: lendo arquivo de entrada "hfuse_backup_file_od2.0.hex"

avrdude: arquivo de entrada hfuse_backup_file_od2.0.hex auto detectado como binário bruto

avrdude: escrevendo hfuse (1 bytes):

 

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

Escrever | ################################################## | 100% 0.00s

 

avrdude: 1 bytes de hfuse escrito

avrdude: verificando a memória hfuse contra hfuse_backup_file_od2.0.hex:

avrdude: carregar dados hfuse dados do arquivo de entrada hfuse_backup_file_od2.0.hex:

avrdude: arquivo de entrada hfuse_backup_file_od2.0.hex auto detectado como binário bruto

avrdude: ficheiro de entrada hfuse_backup_file_od2.0.hex contém 1 bytes

avrdude: leitura de dados hfusíveis no chip:

 

Leitura | ################################################## | 100% 0.00s

 

avrdude: verificando ...

avrdude: 1 bytes de hfuse verificado

 

avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)

 

Avrdude feito. Obrigado.

 

agora rastilho:

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

 

Conectando-se ao programador: .

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

    Versão de Software = 1.0; Não é fornecida Versão de Hardware.

O programador suporta o incremento de endereços automáticos.

O programador suporta acesso à memória buffer com buffersize=128 bytes.

 

O programador suporta os seguintes dispositivos:

    Código do dispositivo: 0x44

 

Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções

 

Leitura | ################################################## | 100% 0.00s

 

Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)

avrdude: leitura do ficheiro de entrada "lfuse_backup_file_od2.0.hex".

avrdude: ficheiro de entrada lfuse_backup_file_od2.0.hex auto detectado como binário bruto

avrdude: escrever lfuse (1 bytes):

 

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

Escrever | ################################################## | 100% 0.00s

 

avrdude: 1 bytes de lfuse escrito

avrdude: verificando a memória lfuse contra lfuse_backup_file_od2.0.hex:

avrdude: carregar dados lfuse dados do arquivo de entrada lfuse_backup_file_od2.0.hex:

avrdude: ficheiro de entrada lfuse_backup_file_od2.0.hex auto detectado como binário bruto

avrdude: ficheiro de entrada lfuse_backup_file_od2.0.hex contém 1 bytes

avrdude: leitura de dados no chip lfuse:

 

Leitura | ################################################## | 100% 0.00s

 

avrdude: verificando ...

avrdude: 1 bytes de lfuse verificado

 

avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)

 

Avrdude feito. Obrigado.

 

agora efuse:

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

 

Conectando-se ao programador: .

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

    Versão de Software = 1.0; Não é fornecida Versão de Hardware.

O programador suporta o incremento de endereços automáticos.

O programador suporta acesso à memória buffer com buffersize=128 bytes.

 

O programador suporta os seguintes dispositivos:

    Código do dispositivo: 0x44

 

Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções

 

Leitura | ################################################## | 100% 0.00s

 

Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)

avrdude: leitura do ficheiro de entrada "efuse_backup_file_od2.0.hex"

avrdude: arquivo de entrada efuse_backup_file_od2.0.hex auto detectado como binário bruto

avrdude: efuse de escrita (1 bytes):

 

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

Escrever | ################################################## | 100% 0.00s

 

avrdude: 1 bytes de efuse escrito

avrdude: verificando a memória efuse contra efuse_backup_file_od2.0.hex:

avrdude: carregar dados efuse dados do arquivo de entrada efuse_backup_file_od2.0.hex:

avrdude: arquivo de entrada efuse_backup_file_od2.0.hex auto detectado como binário bruto

avrdude: ficheiro de entrada efuse_backup_file_od2.0.hex contém 1 bytes

avrdude: leitura de dados do efusível no chip:

 

Leitura | ################################################## | 100% 0.00s

 

avrdude: verificando ...

avrdude: 1 bytes de efuse verificado

 

avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)

 

Avrdude feito. Obrigado.

 

É isso mesmo - o firmware foi restaurado. Você pode desconectar o OpenDrop / SparkFun Pro Micro do seu Raspberry Pi agora.

 

Links e referências úteis

  • 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 outros alvos!)
  • https://learn.sparkfun.com/tutorials/pro-micro–fio-v3-hookup-guide/introduction
  • https://www.hackster.io/rayburne/avr-firmware-duplicator (comando avrdude para outros alvos!)
  • https://forum.arduino.cc/index.php?topic=453997.0 (relativo ao erro com verificação do flash)