domingo, 24 de maio de 2026

LSM110 MESHTASTIC

🚀 Meshtastic no LSM110A (STM32WL55JCIx) — Guia Completo de Port

📅 Data: Maio 2026
👤 Autor: Miguel Alexandre Wisintainer
🔧 Hardware: WISOL LSM110A (STM32WL55JCIx)
📦 Firmware base: Meshtastic 2.8.0 — variant wio-e5
📖 Blog: lom204-cli-wisol.blogspot.com

Este guia documenta como portar o firmware Meshtastic para o módulo LSM110A da WISOL, baseado no chip STM32WL55JCIx da STMicroelectronics. O LSM110A é um módulo LoRaWAN industrial de alta qualidade, com TCXO integrado e excelente estabilidade de frequência — características que o tornam ideal para nós Meshtastic de longa autonomia.

📋 Índice

  1. O módulo LSM110A
  2. Pré-requisitos
  3. Clonar o repositório Meshtastic
  4. Modificações necessárias no firmware
  5. Compilar o firmware
  6. Gravar o firmware no LSM110A
  7. Configurar o nó via CLI
  8. Testar a comunicação mesh
  9. Resumo das mudanças
  10. Conclusão

1. O módulo LSM110A

O LSM110A é um módulo LoRaWAN da WISOL baseado no STM32WL55JCIx da STMicroelectronics. As suas principais características são:

CaracterísticaValor
ChipSTM32WL55JCIx
NúcleosCortex-M4 (aplicação) + Cortex-M0+ (rádio)
Flash256 KB
RAM64 KB
RádioSub-GHz LoRa integrado (SX1262 interno)
TCXOSim — 1.7V
Frequência868 MHz / 915 MHz
Potência TXaté 22 dBm
RF Switch CTRL1PB12
RF Switch CTRL2PC13
Serial (UART)PA2 (TX), PA3 (RX)
ℹ️ Porquê o LSM110A para Meshtastic? O STM32WL55 tem consumo ultra-baixo em sleep e o TCXO garante estabilidade de frequência mesmo com variações de temperatura — ideal para nós relay alimentados por bateria + painel solar.

2. Pré-requisitos

  • VSCode com extensão PlatformIO IDE
  • Git instalado no sistema
  • Python 3.x instalado (com pip)
  • STM32CubeProgrammer — para gravar o firmware via UART ou ST-Link
  • Adaptador USB-UART (CP2102 ou CH340) — para comunicação serial com o LSM110A
  • Meshtastic CLI — instalar com: pip install meshtastic

Verifica a instalação do CLI:

python -m meshtastic --version

3. Clonar o repositório Meshtastic

git clone https://github.com/meshtastic/firmware.git
cd firmware
git submodule update --init

Abre a pasta firmware no VSCode. O PlatformIO irá instalar as dependências automaticamente na primeira compilação.

4. Modificações necessárias no firmware

São necessárias modificações em 3 ficheiros. Todas as alterações são cirúrgicas e bem documentadas.

4.1 — RF Switch: variants/stm32/wio-e5/rfswitch.h

Define os pinos do RF switch do LSM110A. O módulo usa apenas dois pinos de controlo:

// LSM110A (STM32WL55JCIx)
// RF Switch: PB12 = CTRL1, PC13 = CTRL2
// O LSM110A transmite APENAS via RFO_HP (High Power)
static const RADIOLIB_PIN_TYPE rfswitch_pins[5] = {
    PB12, PC13, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC
};
static const Module::RfSwitchMode_t rfswitch_table[4] = {
    {STM32WLx::MODE_IDLE,  {LOW,  LOW}},
    {STM32WLx::MODE_RX,    {HIGH, LOW}},
    {STM32WLx::MODE_TX_HP, {HIGH, HIGH}},
    END_OF_MODE_TABLE
};

4.2 — MAC address único: src/platform/stm32wl/main-stm32wl.cpp

O STM32WL55 gera o Node ID a partir do UID do chip. Em alguns lotes de produção, dois chips podem ter o mesmo UID. Para garantir IDs únicos em cada módulo, usa-se o BUILD_EPOCH (timestamp Unix da compilação) como factor adicional de aleatoriedade:

void getMacAddr(uint8_t *dmac)
{
    const uint32_t uid0 = HAL_GetUIDw0();
    const uint32_t uid1 = HAL_GetUIDw1();
    const uint32_t uid2 = HAL_GetUIDw2();

    // XOR com BUILD_EPOCH garante ID único por compilação
    // Cada compilação tem um timestamp diferente
    dmac[5] = (uint8_t)(uid0 ^ (BUILD_EPOCH & 0xFF));
    dmac[4] = (uint8_t)(uid0 >> 16) ^ ((BUILD_EPOCH >> 8) & 0xFF);
    dmac[3] = (uint8_t)uid1;
    dmac[2] = (uint8_t)(uid1 >> 8);
    dmac[1] = (uint8_t)uid2;
    dmac[0] = (uint8_t)(uid2 >> 8);
}
ℹ️ Como funciona o BUILD_EPOCH: O PlatformIO define automaticamente BUILD_EPOCH como o timestamp Unix do momento da compilação. Como cada compilação acontece em momentos diferentes, o MAC gerado será sempre único — sem necessidade de configuração manual.

5. Compilar o firmware

Usa o ambiente wio-e5 — é o variant mais compatível com o STM32WL55 do LSM110A:

pio run -e wio-e5

O binário gerado fica em:

.pio/build/wio-e5/firmware.bin
⚠️ Para cada módulo LSM110A: Compila o firmware separadamente para cada módulo (em momentos diferentes). O BUILD_EPOCH muda a cada compilação, garantindo Node IDs únicos.

6. Gravar o firmware no LSM110A

1 Entra em modo bootloader: Liga o pino BOOT0 a VCC e faz reset. O LSM110A entra em modo de programação UART.
2 Liga o CP2102/CH340: Conecta PA2 (TX) ao RX do adaptador e PA3 (RX) ao TX do adaptador.
3 Abre o STM32CubeProgrammer → selecciona UART → conecta à porta COM do adaptador.
4 Full Chip Erase — obrigatório! Limpa o Node ID anterior e força o Meshtastic a gerar um novo ID único.
5 Grava o firmware: Selecciona o ficheiro firmware.bin e grava no endereço 0x08000000.
6 Verifica: O STM32CubeProgrammer deve mostrar "Verify OK".
7 Sai do modo bootloader: Coloca BOOT0 em LOW e faz reset. O Meshtastic inicia automaticamente.

7. Configurar o nó via CLI

Liga o LSM110A ao PC via CP2102 e verifica se o Meshtastic está a responder:

python -m meshtastic --port COM6 --info

Resposta esperada:

Connected to radio
Owner: Meshtastic XXXX
firmwareVersion: "2.8.0.ef734b7"
hwModel: WIO_E5
pioEnv: "wio-e5"

Configura a região (Brasil usa ANZ — banda 915-928 MHz):

python -m meshtastic --port COM6 --set lora.region ANZ

Configura o nome do nó:

python -m meshtastic --port COM6 --set device.longName "LSM110 Node1"
python -m meshtastic --port COM6 --set device.shortName "LS-1"

Activa a telemetria:

python -m meshtastic --port COM6 --set telemetry.deviceTelemetryEnabled true

Reinicia o nó para aplicar as configurações:

python -m meshtastic --port COM6 --reboot

8. Testar a comunicação mesh

Com dois módulos LSM110A gravados e configurados com região ANZ, abre dois terminais:

Terminal 1 — Node1 a escutar:

python -m meshtastic --port COM6 --listen

Terminal 2 — Node2 a enviar:

python -m meshtastic --port COM3 --sendtext "Hello from Node2!"

Resultado esperado no Terminal 1:

decoded {
  portnum: TEXT_MESSAGE_APP
  payload: "Hello from Node2!"
}
rx_snr: 6.25
rx_rssi: -69
hop_limit: 3
fromId: '!5008332a'
transport_mechanism: TRANSPORT_LORA
✅ Mesh a funcionar! RSSI de -69 dBm e SNR de 6.25 indicam excelente qualidade de sinal. O campo TRANSPORT_LORA confirma que a mensagem viajou via rádio LoRa.

8.1 — Web Client (interface gráfica)

Para uma interface mais amigável, usa o Web Client oficial:

  1. Abre o Chrome ou Edge em client.meshtastic.org
  2. Clica em Add Connection → Serial
  3. Selecciona a porta COM do LSM110A
  4. Vês os nós detectados, mensagens e configurações em tempo real
ℹ️ Dois nós em simultâneo: Usa o Chrome para um nó e o Edge para o outro — cada browser tem o seu contexto Serial independente.

9. Resumo das mudanças

FicheiroMudançaMotivo
variants/stm32/wio-e5/rfswitch.hPB12 e PC13 apenas; tabela com MODE_TX_HPPinos correctos do RF switch do LSM110A
src/mesh/STM32WLE5JCInterface.cppsetTCXO(1.7) antes do begin(); return trueTCXO obrigatório; begin() pode retornar erro mas rádio funciona
src/platform/stm32wl/main-stm32wl.cppgetMacAddr() com XOR do BUILD_EPOCHGarante Node IDs únicos por compilação
Ambiente PlatformIOUsar wio-e5Variant mais compatível com o STM32WL55

📡 Configurações LoRa em uso

ParâmetroValor
Região (Brasil)ANZ (915-928 MHz)
Modem PresetLONG_FAST
Spreading FactorSF11
Bandwidth250 kHz
Coding Rate4/5
Potência TX22 dBm
Hop Limit3 saltos
TCXO1.7V
Canal padrãoLongFast (compatível com toda a rede Meshtastic)

🔄 Procedimento para cada novo LSM110A

  1. Aplica as 3 modificações nos ficheiros acima
  2. Compila: pio run -e wio-e5
  3. Full Chip Erase no STM32CubeProgrammer
  4. Grava o firmware.bin em 0x08000000
  5. Configura via CLI: região ANZ + nome
  6. Repete o processo para cada módulo adicional (nova compilação = novo BUILD_EPOCH = novo ID)

10. Conclusão

O LSM110A (STM32WL55JCIx) é um excelente módulo para integrar na rede Meshtastic, especialmente como nó relay/repetidor de longa autonomia. Com as modificações documentadas neste guia, é possível ter o Meshtastic completamente funcional, incluindo:

  • ✅ Comunicação LoRa bidirecional (TX e RX)
  • ✅ Telemetria automática (bateria, uptime, utilização do canal)
  • ✅ Detecção automática de nós vizinhos
  • ✅ Envio e recepção de mensagens de texto
  • ✅ Compatibilidade total com qualquer nó Meshtastic na região ANZ
  • ✅ Interface Web Client via Serial
  • ✅ Node IDs únicos automáticos via BUILD_EPOCH

O LSM110A, sem GPS, ecrã ou Bluetooth, é ideal como nó repetidor autónomo — pode funcionar anos com bateria + painel solar, retransmitindo automaticamente as mensagens de toda a rede mesh, expandindo o alcance para dezenas de quilómetros em linha de vista.

📬 Comunidade Meshtastic Brasil: t.me/meshtastic_br
📖 Outros projectos com LSM110A: lom204-cli-wisol.blogspot.com
🔗 Firmware Meshtastic: github.com/meshtastic/firmware
Meshtastic no LSM110A (STM32WL55JCIx) — Guia Completo

🚀 Meshtastic no LSM110A (STM32WL55JCIx) — Guia Completo de Port

📅 Data: Maio 2026
👤 Autor: Miguel Alexandre Wisnieski
🔧 Hardware: WISOL LSM110A (STM32WL55JCIx)
📦 Firmware base: Meshtastic 2.8.0 — variant wio-e5
📖 Blog: lom204-cli-wisol.blogspot.com

Este guia documenta como portar o firmware Meshtastic para o módulo LSM110A da WISOL, baseado no chip STM32WL55JCIx da STMicroelectronics. O LSM110A é um módulo LoRaWAN industrial de alta qualidade, com TCXO integrado e excelente estabilidade de frequência — características que o tornam ideal para nós Meshtastic de longa autonomia.

📋 Índice

  1. O módulo LSM110A
  2. Pré-requisitos
  3. Clonar o repositório Meshtastic
  4. Modificações necessárias no firmware
  5. Compilar o firmware
  6. Gravar o firmware no LSM110A
  7. Configurar o nó via CLI
  8. Testar a comunicação mesh
  9. Resumo das mudanças
  10. Conclusão

1. O módulo LSM110A

O LSM110A é um módulo LoRaWAN da WISOL baseado no STM32WL55JCIx da STMicroelectronics. As suas principais características são:

CaracterísticaValor
ChipSTM32WL55JCIx
NúcleosCortex-M4 (aplicação) + Cortex-M0+ (rádio)
Flash256 KB
RAM64 KB
RádioSub-GHz LoRa integrado (SX1262 interno)
TCXOSim — 1.7V
Frequência868 MHz / 915 MHz
Potência TXaté 22 dBm
RF Switch CTRL1PB12
RF Switch CTRL2PC13
Serial (UART)PA2 (TX), PA3 (RX)
ℹ️ Porquê o LSM110A para Meshtastic? O STM32WL55 tem consumo ultra-baixo em sleep e o TCXO garante estabilidade de frequência mesmo com variações de temperatura — ideal para nós relay alimentados por bateria + painel solar.

2. Pré-requisitos

  • VSCode com extensão PlatformIO IDE
  • Git instalado no sistema
  • Python 3.x instalado (com pip)
  • STM32CubeProgrammer — para gravar o firmware via UART ou ST-Link
  • Adaptador USB-UART (CP2102 ou CH340) — para comunicação serial com o LSM110A
  • Meshtastic CLI — instalar com: pip install meshtastic

Verifica a instalação do CLI:

python -m meshtastic --version

3. Clonar o repositório Meshtastic

git clone https://github.com/meshtastic/firmware.git
cd firmware
git submodule update --init

Abre a pasta firmware no VSCode. O PlatformIO irá instalar as dependências automaticamente na primeira compilação.

4. Modificações necessárias no firmware

São necessárias modificações em 3 ficheiros. Todas as alterações são cirúrgicas e bem documentadas.

4.1 — RF Switch: variants/stm32/wio-e5/rfswitch.h

Define os pinos do RF switch do LSM110A. O módulo usa apenas dois pinos de controlo:

// LSM110A (STM32WL55JCIx)
// RF Switch: PB12 = CTRL1, PC13 = CTRL2
// O LSM110A transmite APENAS via RFO_HP (High Power)
static const RADIOLIB_PIN_TYPE rfswitch_pins[5] = {
    PB12, PC13, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC
};
static const Module::RfSwitchMode_t rfswitch_table[4] = {
    {STM32WLx::MODE_IDLE,  {LOW,  LOW}},
    {STM32WLx::MODE_RX,    {HIGH, LOW}},
    {STM32WLx::MODE_TX_HP, {HIGH, HIGH}},
    END_OF_MODE_TABLE
};
⚠️ Importante: Não usar PC5 como terceiro pino de controlo — este pino não é usado pelo RF switch do LSM110A e pode interferir com a transmissão RF.

4.2 — Interface do rádio: src/mesh/STM32WLE5JCInterface.cpp

Este é o ficheiro mais crítico. O lora.begin() pode retornar erro no STM32WL55 mesmo quando o rádio está operacional. A solução é forçar a inicialização completa independentemente do resultado:

#include "configuration.h"
#ifdef ARCH_STM32WL
#include "STM32WLE5JCInterface.h"
#include "error.h"

#ifndef STM32WLx_MAX_POWER
#define STM32WLx_MAX_POWER 22
#endif

STM32WLE5JCInterface::STM32WLE5JCInterface(LockingArduinoHal *hal,
    RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq,
    RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE busy)
    : SX126xInterface(hal, cs, irq, rst, busy)
{
}

bool STM32WLE5JCInterface::init()
{
    RadioLibInterface::init();

    // Configura o RF switch para o LSM110A
    lora.setRfSwitchTable(rfswitch_pins, rfswitch_table);

    limitPower(STM32WLx_MAX_POWER);

    // TCXO a 1.7V — obrigatório para o LSM110A
    // Deve ser chamado ANTES do lora.begin()
    lora.setTCXO(1.7);

    // Inicializa o rádio (tcxoVoltage=0 porque já foi configurado acima)
    int res = lora.begin(getFreq(), bw, sf, cr, syncWord, power, preambleLength, 0);
    LOG_INFO("STM32WLx init result %d", res);
    LOG_INFO("Frequency set to %f", getFreq());
    LOG_INFO("Bandwidth set to %f", bw);
    LOG_INFO("Power output set to %d", power);

    // Forçar startReceive() independentemente do resultado do begin()
    // O rádio funciona no LSM110A mesmo que begin() reporte erro
    startReceive();
    return true;
}

#endif // ARCH_STM32WL

4.3 — MAC address único: src/platform/stm32wl/main-stm32wl.cpp

O STM32WL55 gera o Node ID a partir do UID do chip. Em alguns lotes de produção, dois chips podem ter o mesmo UID. Para garantir IDs únicos em cada módulo, usa-se o BUILD_EPOCH (timestamp Unix da compilação) como factor adicional de aleatoriedade:

void getMacAddr(uint8_t *dmac)
{
    const uint32_t uid0 = HAL_GetUIDw0();
    const uint32_t uid1 = HAL_GetUIDw1();
    const uint32_t uid2 = HAL_GetUIDw2();

    // XOR com BUILD_EPOCH garante ID único por compilação
    // Cada compilação tem um timestamp diferente
    dmac[5] = (uint8_t)(uid0 ^ (BUILD_EPOCH & 0xFF));
    dmac[4] = (uint8_t)(uid0 >> 16) ^ ((BUILD_EPOCH >> 8) & 0xFF);
    dmac[3] = (uint8_t)uid1;
    dmac[2] = (uint8_t)(uid1 >> 8);
    dmac[1] = (uint8_t)uid2;
    dmac[0] = (uint8_t)(uid2 >> 8);
}
ℹ️ Como funciona o BUILD_EPOCH: O PlatformIO define automaticamente BUILD_EPOCH como o timestamp Unix do momento da compilação. Como cada compilação acontece em momentos diferentes, o MAC gerado será sempre único — sem necessidade de configuração manual.

5. Compilar o firmware

Usa o ambiente wio-e5 — é o variant mais compatível com o STM32WL55 do LSM110A:

pio run -e wio-e5

O binário gerado fica em:

.pio/build/wio-e5/firmware.bin
⚠️ Para cada módulo LSM110A: Compila o firmware separadamente para cada módulo (em momentos diferentes). O BUILD_EPOCH muda a cada compilação, garantindo Node IDs únicos.

6. Gravar o firmware no LSM110A

1 Entra em modo bootloader: Liga o pino BOOT0 a VCC e faz reset. O LSM110A entra em modo de programação UART.
2 Liga o CP2102/CH340: Conecta PA2 (TX) ao RX do adaptador e PA3 (RX) ao TX do adaptador.
3 Abre o STM32CubeProgrammer → selecciona UART → conecta à porta COM do adaptador.
4 Full Chip Erase — obrigatório! Limpa o Node ID anterior e força o Meshtastic a gerar um novo ID único.
5 Grava o firmware: Selecciona o ficheiro firmware.bin e grava no endereço 0x08000000.
6 Verifica: O STM32CubeProgrammer deve mostrar "Verify OK".
7 Sai do modo bootloader: Coloca BOOT0 em LOW e faz reset. O Meshtastic inicia automaticamente.

7. Configurar o nó via CLI

Liga o LSM110A ao PC via CP2102 e verifica se o Meshtastic está a responder:

python -m meshtastic --port COM6 --info

Resposta esperada:

Connected to radio
Owner: Meshtastic XXXX
firmwareVersion: "2.8.0.ef734b7"
hwModel: WIO_E5
pioEnv: "wio-e5"

Configura a região (Brasil usa ANZ — banda 915-928 MHz):

python -m meshtastic --port COM6 --set lora.region ANZ

Configura o nome do nó:

python -m meshtastic --port COM6 --set device.longName "LSM110 Node1"
python -m meshtastic --port COM6 --set device.shortName "LS-1"

Activa a telemetria:

python -m meshtastic --port COM6 --set telemetry.deviceTelemetryEnabled true

Reinicia o nó para aplicar as configurações:

python -m meshtastic --port COM6 --reboot

8. Testar a comunicação mesh

Com dois módulos LSM110A gravados e configurados com região ANZ, abre dois terminais:

Terminal 1 — Node1 a escutar:

python -m meshtastic --port COM6 --listen

Terminal 2 — Node2 a enviar:

python -m meshtastic --port COM3 --sendtext "Hello from Node2!"

Resultado esperado no Terminal 1:

decoded {
  portnum: TEXT_MESSAGE_APP
  payload: "Hello from Node2!"
}
rx_snr: 6.25
rx_rssi: -69
hop_limit: 3
fromId: '!5008332a'
transport_mechanism: TRANSPORT_LORA
✅ Mesh a funcionar! RSSI de -69 dBm e SNR de 6.25 indicam excelente qualidade de sinal. O campo TRANSPORT_LORA confirma que a mensagem viajou via rádio LoRa.

8.1 — Web Client (interface gráfica)

Para uma interface mais amigável, usa o Web Client oficial:

  1. Abre o Chrome ou Edge em client.meshtastic.org
  2. Clica em Add Connection → Serial
  3. Selecciona a porta COM do LSM110A
  4. Vês os nós detectados, mensagens e configurações em tempo real
ℹ️ Dois nós em simultâneo: Usa o Chrome para um nó e o Edge para o outro — cada browser tem o seu contexto Serial independente.

9. Resumo das mudanças

FicheiroMudançaMotivo
variants/stm32/wio-e5/rfswitch.h PB12 e PC13 apenas; tabela com MODE_TX_HP Pinos correctos do RF switch do LSM110A
src/mesh/STM32WLE5JCInterface.cpp setTCXO(1.7) antes do begin(); return true TCXO obrigatório; begin() pode retornar erro mas rádio funciona
src/platform/stm32wl/main-stm32wl.cpp getMacAddr() com XOR do BUILD_EPOCH Garante Node IDs únicos por compilação
Ambiente PlatformIO Usar wio-e5 Variant mais compatível com o STM32WL55

📡 Configurações LoRa em uso

ParâmetroValor
Região (Brasil)ANZ (915-928 MHz)
Modem PresetLONG_FAST
Spreading FactorSF11
Bandwidth250 kHz
Coding Rate4/5
Potência TX22 dBm
Hop Limit3 saltos
TCXO1.7V
Canal padrãoLongFast (compatível com toda a rede Meshtastic)

🔄 Procedimento para cada novo LSM110A

  1. Aplica as 3 modificações nos ficheiros acima
  2. Compila: pio run -e wio-e5
  3. Full Chip Erase no STM32CubeProgrammer
  4. Grava o firmware.bin em 0x08000000
  5. Configura via CLI: região ANZ + nome
  6. Repete o processo para cada módulo adicional (nova compilação = novo BUILD_EPOCH = novo ID)

10. Conclusão

O LSM110A (STM32WL55JCIx) é um excelente módulo para integrar na rede Meshtastic, especialmente como nó relay/repetidor de longa autonomia. Com as modificações documentadas neste guia, é possível ter o Meshtastic completamente funcional, incluindo:

  • ✅ Comunicação LoRa bidirecional (TX e RX)
  • ✅ Telemetria automática (bateria, uptime, utilização do canal)
  • ✅ Detecção automática de nós vizinhos
  • ✅ Envio e recepção de mensagens de texto
  • ✅ Compatibilidade total com qualquer nó Meshtastic na região ANZ
  • ✅ Interface Web Client via Serial
  • ✅ Node IDs únicos automáticos via BUILD_EPOCH

O LSM110A, sem GPS, ecrã ou Bluetooth, é ideal como nó repetidor autónomo — pode funcionar anos com bateria + painel solar, retransmitindo automaticamente as mensagens de toda a rede mesh, expandindo o alcance para dezenas de quilómetros em linha de vista.

📬 Comunidade Meshtastic Brasil: t.me/meshtastic_br
📖 Outros projectos com LSM110A: lom204-cli-wisol.blogspot.com
🔗 Firmware Meshtastic: github.com/meshtastic/firmware

Documento gerado em Maio 2026 — Miguel Alexandre Wisnieski

Nenhum comentário:

Postar um comentário