sexta-feira, novembro 03, 2023

Kit M8031TL da Bit9 - Parte 2 - Gravador via FTP

Na parte 1, eu descrevi este kit, baseado no AT89S52. Uma dificuldade para o seu uso é que a programação era feita originalmente ligando um cabo na interface paralela do PC.

Das várias opções que eu listei para resolver isso, optei por fazer um gravador que recebe o firmware a gravar via FTP. Primeiro, porque me pareceu divertido. Segundo, por possibilitar disparar a gravação por linha de comando. E, importante, as diversas partes do software já estão disponíveis.

O projeto andou rápido nos primeiros dias, mas depois a coisa complicou...


Hadware

O projeto se apoia na minha experiência em fazer um gravador para o ATS89S51. O hardware é praticamente o mesmo, com pequenas alterações:

  • Usa um display OLED gráfico ao invés de um display LCD alfanumérico.
  • Dispensa o conversor de nível, que no final do projeto anterior eu concluí ser desnecessário. Basta um divisor resistivo no sinal MISO (sim, porém... veja adiante).
  • Usa um XIAO ESP32-C3 ao invés de um ESP32, já que não precisa de muitos pinos para conexão.
Resolvi fazer uma montagem "definitiva" (enquanto a cola quente aguentar), usando uma caixinha padrão que eu tinha sobrando. Os furos foram feitos grosseiramente com uma Dremel e disfarçados com vinil adesivo. Fotos internas no próximo post.

O kit da Bit9 não recebe os 5V no conector de programação, mas achei melhor manter essa parte do programador original. Na caixa eu coloquei, inicialmente, um conector telefônico RJ12 (com seis contatos) para depois fazer um cabo para adaptar ao conector do kit.

Software

No lado do software, nesta primeira versão eu fiz uma colagem de vários projetos:
  • ESP-WiFiSettings, para a configuração do WiFi. Existem vários tipos destes "WiFi Managers" para os ESP8266 e ESP32, a escolha foi um pouco aleatória mas funcionou sem dificuldades. A configuração é salva na área SPIFFS. 
  • O controle do display é feito usando as rotinas que criei para o ATmegaDetonator.
  • Para o FTP eu usei o SimpleFTPServer e tive alguns problemas, descritos abaixo
  • A parte de gravação propriamente dita usa as rotinas do meu gravador anterior.
Nos meus testes estou usando o cliente FTP por linha de comando que vem no Windows.

O primeiro problema com o SimpleFTPServer foi que a conexão era derrubada pouco depois do cliente conectar. Não foi difícil descobrir que o client envia um comando "OPTS" logo no começo e o SimpleFTPServer rejeita este comando se vier antes da identificação do usuário. Dei uma passada de olhos na documentação e me parece que o comportamento do cliente é legal. Fiz uma pequena alteração no SimpleFTPServer e esta parte funcionou.

Mais complicado é que o arquivo recebido não era gravado. Após praticamente um dia na luta, foi hora de bater a mão na testa: o default do SimpleFTPServer para o ESP32 não é o SPIFFS! Acertando a configuração, funcionou. Em minha defesa, o exemplo do SimpleFTPServer usa o SPIFFS e não faz menção da necessidade de alterar a configuração padrão.

Nesta primeira versão, o FTP recebe o arquivo e grava no SPIFFS. Depois eu processo o arquivo, gerando a imagem do firmware em memória e faço a gravação. Futuramente vou gerar uma versão especializada do servidor FTP onde vou retirar um monte de comandos que não uso e alterar para fazer a análise à medida que recebe (o que fica mais parecido com o tratamento do gravador anterior), dispensando a gravação na Flash.

Problemas!

Tudo andou bem até a hora de testar a gravação. Não funcionou... E quando fui começar a depuração eu percebi que eu não estava bem... Covid! Felizmente foram sintomas leves, mas foi uma semana até ter animo para retomar o projeto (ainda me considero em recuperação).

Listando os problemas que fui encontrando:
  • Não consegui climpar satisfatoriamente um conector RJ12. Acabei trocando por um conector mini-DIN (daqueles que era usado para teclado e mouse).
  • A identificação dos pinos no Arduino com o ESP32-C3 não era bem como eu pensava. A figura do SeeedStudio mostra os pinos como GPIOxx e Dxx. Estupidamente, pensei as funções Arduino usassem a numeração do tipo Dxx (podendo omitir o D). Na verdade é usada a numeração do GPIO (ou colocar o D na frente). Para confundir, eu usei 4 pinos para conectar ao kit: D7 (enable), D8 (SCK), D9 (MISO) e D10 (MOSI). Os três últimos correspondem a GPIO8, GPIO9 e GPIO10, portando os números são os mesmos. Eu quebrei a cara com o D7, que é o GPIO20. Coisa boba, mas cheguei a pensar que tinha danificado o ESP32, já que o pino não me obedecia.
  • Os valores para os resistores do divisor resistivo precisam ser escolhidos com carinho. Inicialmente usei 22K/33K, e observei com o osciloscópio que o sinal estava ruim, indicando que os valores eram muito altos (o tempo de subida dos sinais varia com o produto RC, onde R é a resistência e C a capacitância). Eu baixei para 2,2K/3,3K e o ESP32 entrava no bootloader. No final coloquei 6,8K/10K e está ok. Detalhe: retirar e ressoldar estes resistores não foi fácil.
  • Mau contato no conector de alimentação do Kit. Cheguei a pensar que usava um jack diferente, mas parece que era só um conector vagabundo na minha fonte de alimentação. Troquei e o problema parou.
  • Mau contato em algum outro canto (possivelmente o conector de programação no kit). Ainda estou investigando.
Situação Atual

Após muita luta, consigo colocar o ATS89S52 no modo programação e ler a sua identificação. Daí para frente deve ser moleza... espero!

Tudo correndo bem, no próximo post espero apresentar uma documentação do projeto e o link para o software no github.


Nenhum comentário: