1 de dezembro de 2018

Gravar arquivo .hex no Arduino e ESP32 - Proteger Sketch

Uma forma de proteger seu código fonte é compartilhar o arquivo compilado.


Após desenvolver o programa, é possível compilar gerando um arquivo com a extensão .hex e gravá-lo no Arduino.
Para projetos profissionais é uma maneira de manter seu código fonte seguro, podendo enviar para gravação nas placas sem compartilhar o desenvolvimento da lógica de programação.

Gerar o arquivo compilado:
Na barra de menus da IDE Arduino, em Sketch \ Exportar Binário compilado, ou com as teclas de atalho Ctrl + Alt + S.


Serão gerados dois arquivos .hex no mesmo diretório do arquivo .ino.
Para o ESP32 o arquivo compilado possui a extensão .bin.


Um possui somente código fonte, o outro possui o bootloader compilado junto.

Quando o microcontrolador é energizado, o primeiro programa a ser executado é o bootloader, e após a sua finalização que é executado a função setup() e depois loop() e as demais.

A vantagem de gravar no microcontrolador o arquivo sem o bootloader é que o programa inicializará no ato que o circuito for energizado. A diferença é de um segundo mas, dependendo do projeto, isso pode ser um diferencial.

Gravar o arquivo compilado no Arduino / ESP32:
Para efetuar o upload do arquivo .hex no microcontrolador encontrei algumas - poucas - opções, baseadas em um front para simplificar a utilização do AVRDUDE e ESPTOOL.

Fiz minha própria versão e deixo aqui para compartilhar com vocês.

É possível efetuar o upload do arquivo compilado para as versões de Arduino Uno, Nano, Pro Mini, Mega e Gemma / Digispark (Attiny85). E também para ESP32 (Via Serial e OTA).
Ao selecionar o modelo da placa, os demais campos já serão preenchidos automaticamente.

O download do HexArduino pode ser feito através dos links:

Atualizado para versão 3.0 em 12/04/2023.

Para mim é útil e, espero, que possa ser útil para vocês também!
Abraços!

43 comentários:

  1. Respostas
    1. Bom dia!
      Por segurança o anti-vírus costuma bloquear qualquer arquivo executável. Basta selecionar a opção para liberar a execução.
      Abraços!

      Excluir
  2. Olá. Qual o software que vc usou para fazer o frontend? Aqui ele funcionou belezinha.

    ResponderExcluir
  3. obrigado pelo front , se funcionar com o mega vai ser uma mão na roda pra atualizar o arduino de impressora 3D com o notebook fraquinho ... só levar o hex compilado e mandar flashear sem ter que ficar recompilando , show !

    ResponderExcluir
  4. Olá, sabe me dizer se funciona para o arduíno Pro Micro?

    ResponderExcluir
    Respostas
    1. Boa tarde! Nessa versão, somente para Arduino Uno, Nano, Pro Mini, Mega e Gemma (Attiny85).
      Abraços!

      Excluir
    2. Tem algum que funcione com o arduino pro micro para me indicar? Ou teria a possibilidade de andicionar essa opção ao seu front end?

      Excluir
  5. LUCIANO FERNANDES DO NASCIMENTO21 de junho de 2021 às 23:03

    Valeu mesmo cara, estava procurando um proraminha desses e vc salvou bacana... Obrigado mesmo

    ResponderExcluir
  6. Tentei usar o frontend para gravar o .hex num arduino nano (old bootloader), não deu certo e agora quando tento gravar pelo modo tradicional (ide do arduino) retorna os seguintes erros:

    Ocorreu um erro enquanto o sketch era carregado
    avrdude: verification error, first mismatch at byte 0x00c4
    0x7d != 0x09
    avrdude: verification error; content mismatch

    O que será que aconteceu? Tem como reverter? O duro é que é um dispositivo que está lá no cliente e ele não pode me esperar que eu faça outro pra ele.

    ResponderExcluir
    Respostas
    1. Bom dia, Ismael!
      A IDE Arduino utiliza o programa AVRDUDE para enviar o arquivo compilado para o microcontrolador. O front que deixei disponível, utiliza o mesmo programa que a IDE Arduino, apenas com uma tela amigável que executa o AVRDUDE com as linhas de comando para envio ao microcontrolador.

      Alguns problemas que podem estar ocorrendo:
      - Dispositivo USB no Windows não foi reconhecido corretamente. Tente utilizando outra porta USB, ou remova o dispositivo através do 'gerenciador de dispositivos do Windows' e adicione novamente.
      - Cabo USB com algum mal contato. Durante a transmissão ocorre falha acarretando no erro. Verificar com outro cabo.
      - O conversor USB/TTL da placa Nano pode estar queimado. O fonte no microcontrolador segue rodando normalmente (Arduino funciona), mas o circuito da comunicação serial queimou. Nesse caso, é possível utilizar os pinos ICSP para novo upload e seguir utilizando o mesmo arduino no projeto.
      - Verificar se realmente é Old Bootloader que está gravado ou se é o Bootloader mais novo. Tentar realizar o upload tanto com novo quanto com antigo.

      São algumas das possibilidades que podem estar ocorrendo.
      Lembro que o front disponibilizado apenas faz a chamada de execução do AVRDUDE, assim como a IDE Arduino.
      Abraços!

      Excluir
  7. Olá, bom dia! Possuo uma dúvida... Há possibilidade de modificar os fuses através do seu software? Pois você informou que "o outro possui o bootloader compilado junto.", selecionei esse arquivo, porém não foi com as configurações que deixei no bootloader...

    ResponderExcluir
    Respostas
    1. Bom dia!
      No software não há a possibilidade de alterações nos fuses.
      Me recordo que ao exportar o arquivo hex, o software Arduino utiliza o bootloader padrão que possui salvo em seu diretório.

      Excluir
  8. Ah entendi! Alterei no arquivo "Boards" os fuses... No caso o caminho seria: Hardware - Arduíno - avr - boards. Seria esse o padrão de bootloader? Ou teria outro meio de alterar os fuses no diretório do arduíno e depois exportar e utilizar seu software?

    ResponderExcluir
    Respostas
    1. O caminho acho que seria dessa forma mesmo. Ir no diretório que citou e alterar por lá.
      Abraços!

      Excluir
  9. ola amigo muito show seu programa parabens deixa te perguntar teria como adicionar tbem para ele gravar junto o arquivo epron obrigado abraços.

    ResponderExcluir
    Respostas
    1. Bom dia, Marconato!
      Que bom que gostou e que o programa foi útil! Abraços!!

      Excluir
  10. seu programa consigo enviar usando o modulo cp2102 porem so envia o hex precisaria que enciasse os dois arquivos no USBasp usaria esse comando.. veja se pode me ajudar obrigado..

    REM Writing Flash + EEPROM + Fuses (L=F7, H=D9, E=FC)
    avrdude -c USBasp -P usb -p m328p -e -U flash:w:"master.hex":a -U eeprom:w:"master.eep":a -U lfuse:w:0xF7:m -U hfuse:w:0xD9:m -U efuse:w:0xFC:m

    ResponderExcluir
    Respostas
    1. Marconato, vou verificar a possível alteração para adicionar o arquivo junto. Abraços!

      Excluir
  11. Bom dia, Fellipe. Tudo bem? Tenho interesse comercial no desenvolvimento de uma solução semelhante, mas exclusiva para ESP32 e que carregue o firmware e o filesystem. O que me diz?

    ResponderExcluir
    Respostas
    1. Boa tarde! Quer me passar por e-mail mais detalhes do que precisa? Abraços! fellipe.couto@yahoo.com.br

      Excluir
  12. Olá, você poderia me fornecer o fonte? Aqui não funcionou.

    ResponderExcluir
    Respostas
    1. Olá! Qual erro é exibido pra você? É necessário ter o pacote Microsoft .Net Framework instalado no computador. Vários utilizam e não possuem problemas. Me passa o erro que tento dar uma investigada no problema. Abraços!

      Excluir
  13. funciona com nodeMCU ESP8266 ?
    na verdade tentei, mas da erro

    ResponderExcluir
    Respostas
    1. Boa tarde! ESP8266 não. Habilitado para ESP32.

      Excluir
    2. Olá Fellipe, existe a possibilidade de implementar para o ESP8266 ? acredito que por ser também muito utilizado poderia ser uma boa o desenvolvimento para ele. Eu infelizmente não possuo o conhecimento para tal :'(

      Excluir
    3. Olá! Bom dia! Obrigado pelo comentário e sugestão! Concordo e anotado! Vou verificar essa possibilidade para o ESP8266. Abraços!

      Excluir
  14. A atualização para OTA ajudou demais. Tu mandou muito bem! Abraços

    ResponderExcluir
  15. Ola amigo, funciona para Leonardo ou Pro Micro?

    ResponderExcluir
    Respostas
    1. Oi Geraldo! Pro Micro ou Leonardo são com Atmega32U4. Não está incluído no programa o upload para esse microcontrolador.

      Excluir
  16. Bom dia . agradeço a pessoas como vc que ajudam a outros profissionais!! Tenho um projeto com um comportamento estranho:
    1 - Carrego o cod bin pelo HexArduino - não funciona
    2 - vou ao Arduino, carrego a sketch, funciona.
    3 - Carrego arquivo vazio no ESP pelo Arduino( ou seja limpo o ESP32) - passa a não funcionar
    4 - Carrego o arquivo bin pelo HexArduino e funciona.
    como fazer para que o carregamento do BIN pelo HexArduino funcione sem que tenha que carregar pela sketch antes?
    E vc tem um preço bom para comprar de vcs o ESP32 numas 100 pçs?
    Desde já agradeço.

    ResponderExcluir
    Respostas
    1. Boa tarde! Estranho esse comportamento e por essas informações não estou conseguindo identificar. Por eliminação, efetuou os mesmos testes com outro ESP32? Para testarmos a possibilidade de alguma falha física no hardware. Nunca tive problemas com o HexArduino e não tenho informações de outra pessoa que tenha tido problemas.
      Com relação a venda, não possuo essa quantidade de estoque. Disponibilizo a venda dos que eventualmente sobra de outros projetos, que acabam não sendo usados.
      Abraços!

      Excluir
  17. Olá. Muito obrigado pelo retorno.
    Quase não faço perguntas em fóruns porque nenhum gestor responde. Por isso muito obrigado. Sim , testei em vários ESP. E é estrando, o HEX dá como finalizado, mas não roda. Carrego no Ard ele funciona. Carrego outra coisa pra "limpar" o ESP e carrego o prog anterior com o HEX e funciona. Lendo um tutorial do flash_download_tool_3.9.5 , descobri que existem 3 arquivos que o Ard não salva na pasta do programa , mas sim em um arquivo TEMP, e que são necessários no momento da gravação. Com esse programa e e localizando os outros 3 arquivos, consegui gravar e bem mais rápido que no Ard. Ard=2 a 4 min , Flash = 10s. https://elcereza.com/flash-download-tool-como-gravar-binarios-no-esp32/ .
    Precisava gravar 100 ESP. Gravei 1 e testei funcionou, procedi as gravações e mandei para a montagem das placas. Quando voltaram nada funcionava, estou tendo que gravar agora nas placas via adaptador e fios. Acho que justamente os ESP que peguei para fazer as primeiras gravações testes, eu já os havia gravado uma vez no Ard e por isso funcionaram e me induziram a proceder as gravações. A única explicação que tenho é que o Ard quando grava , deixa alguma biblioteca lá dentro e que daí o HEX consegue gravar. Devido a característica do Arc, ou do meu programa, que daí o HEX consegue gravar com eficiência. Novamente obrigado pela conversa.

    ResponderExcluir
    Respostas
    1. Agradeço vc tbm pelo retorno sobre o ocorrido! Vou precisar realizar alguns testes. Até o momento, já fiz muitas - muitas mesmo - gravações em ESP32 utilizando o HexArduino e nunca tive problemas. E tbm já tive conhecimentos de muitas outras pessoas que utilizam e nunca tiveram esse problema. Vou dar uma pensada e tentar realizar testes. Valeu!!

      Excluir
  18. Só pra complementar. Não estou criticando, só quero cooperar. Agradeço muito sua disponibilidade em ajudar. Para talvez detectar algum erro meu: Estou usando um adaptador PL2303, não estou usando um ESP32 implantado na placa e sim apenas o módulo, pode ser que haja alguma icompatibilidade com o driver do PL2303...

    ResponderExcluir
    Respostas
    1. Beleza! tranquilo! Todo conteúdo é bom e ajuda sempre! :) Vou tentar efetuar testes por aqui tbm. Abraços!

      Excluir