Pular para o conteúdo

Hardware: a placa responde?

O que funciona com Arduino e ESP32, o que foi medido com a placa na mesa, e o que a linguagem não faz.

Responde — e esta página foi escrita com duas placas ligadas. A distinção que importa vem primeiro: *a linguagem fala com a placa, e não roda dentro dela.*

O modelo#

Você grava um firmware na placa uma vez. A partir daí ela deixa de ter um programa e passa a ter um protocolo: obedece. Quem decide é o computador, e o laço de trabalho passa a ser o dele — sem recompilar, sem regravar, sem esperar o upload.

bash
$ dataforge iot portas
$ dataforge iot sketch firmata --em=/tmp/fw
$ dataforge iot carregar /tmp/fw/firmata --fqbn=arduino:renesas_uno:unor4wifi
$ dataforge iot piscar --pino=13 --vezes=5

O que foi medido, com a placa na mesa#

PlacaPinosAnalógicosProvado
Arduino UNO R4 WiFi206LED no 13, PWM no 9, A0 lendo ruído
ESP32-D0WD-V34014LED no GPIO2, mapa de ADC completo
arduino:avr:uno206compilação
arduino:avr:mega7016compilação

Nada de tabela de pinos#

modo(13, "pwm") é recusado porque a placa disse que aquele pino não faz PWM — ela responde a pergunta de capacidade no handshake. Uma tabela escrita na linguagem envelheceria na primeira placa nova, e UNO, Mega e ESP32 têm mapas diferentes.

As duas armadilhas que mais custam tempo#

  • Sem `relatar_analogico(canal)` a leitura é zero, calada. A placa envia sozinha, ela não responde perguntas — sem ligar o relatório, analogico(0) devolve o valor inicial para sempre.
  • `escala` limita por padrão. O map() do C não limita, e um ADC que devolve 1024 por ruído vira 101% num painel.

Sem placa, com o simulador#

IoT.conectar_simulada("uno") devolve uma placa que fala os mesmos bytes. Ela não é um dublê da API: é um dispositivo do outro lado do cabo, e por isso exercita o parser, a partição em sete bits e o sysex — que é onde estão os erros.

dataforge
adopt Arcane.IoT as IoT

placa := IoT.conectar_simulada("uno")
placa.modo(13, "saida")
placa.escrever(13, 1)
assert placa.ler(13) is 1
assert placa.info()["firmware"]["nome"] is "DataForge"
out $"{placa.info()["pinos"]} pinos, sem placa nenhuma"