🚀 Meshtastic no LSM110A (STM32WL55JCIx) — Guia Completo de Port
👤 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
- O módulo LSM110A
- Pré-requisitos
- Clonar o repositório Meshtastic
- Modificações necessárias no firmware
- Compilar o firmware
- Gravar o firmware no LSM110A
- Configurar o nó via CLI
- Testar a comunicação mesh
- Resumo das mudanças
- 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ística | Valor |
|---|---|
| Chip | STM32WL55JCIx |
| Núcleos | Cortex-M4 (aplicação) + Cortex-M0+ (rádio) |
| Flash | 256 KB |
| RAM | 64 KB |
| Rádio | Sub-GHz LoRa integrado (SX1262 interno) |
| TCXO | Sim — 1.7V |
| Frequência | 868 MHz / 915 MHz |
| Potência TX | até 22 dBm |
| RF Switch CTRL1 | PB12 |
| RF Switch CTRL2 | PC13 |
| Serial (UART) | PA2 (TX), PA3 (RX) |
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 --version3. Clonar o repositório Meshtastic
git clone https://github.com/meshtastic/firmware.git
cd firmware
git submodule update --initAbre 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);
}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-e5O binário gerado fica em:
.pio/build/wio-e5/firmware.binBUILD_EPOCH muda a cada compilação, garantindo Node IDs únicos.6. Gravar o firmware no LSM110A
BOOT0 a VCC e faz reset. O LSM110A entra em modo de programação UART.PA2 (TX) ao RX do adaptador e PA3 (RX) ao TX do adaptador.firmware.bin e grava no endereço 0x08000000.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 --infoResposta 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 ANZConfigura 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 trueReinicia o nó para aplicar as configurações:
python -m meshtastic --port COM6 --reboot8. 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 --listenTerminal 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_LORATRANSPORT_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:
- Abre o Chrome ou Edge em client.meshtastic.org
- Clica em Add Connection → Serial
- Selecciona a porta COM do LSM110A
- Vês os nós detectados, mensagens e configurações em tempo real
9. Resumo das mudanças
| Ficheiro | Mudança | Motivo |
|---|---|---|
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âmetro | Valor |
|---|---|
| Região (Brasil) | ANZ (915-928 MHz) |
| Modem Preset | LONG_FAST |
| Spreading Factor | SF11 |
| Bandwidth | 250 kHz |
| Coding Rate | 4/5 |
| Potência TX | 22 dBm |
| Hop Limit | 3 saltos |
| TCXO | 1.7V |
| Canal padrão | LongFast (compatível com toda a rede Meshtastic) |
🔄 Procedimento para cada novo LSM110A
- Aplica as 3 modificações nos ficheiros acima
- Compila:
pio run -e wio-e5 - Full Chip Erase no STM32CubeProgrammer
- Grava o
firmware.binem0x08000000 - Configura via CLI: região ANZ + nome
- 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.
📖 Outros projectos com LSM110A: lom204-cli-wisol.blogspot.com
🔗 Firmware Meshtastic: github.com/meshtastic/firmware
🚀 Meshtastic no LSM110A (STM32WL55JCIx) — Guia Completo de Port
👤 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
- O módulo LSM110A
- Pré-requisitos
- Clonar o repositório Meshtastic
- Modificações necessárias no firmware
- Compilar o firmware
- Gravar o firmware no LSM110A
- Configurar o nó via CLI
- Testar a comunicação mesh
- Resumo das mudanças
- 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ística | Valor |
|---|---|
| Chip | STM32WL55JCIx |
| Núcleos | Cortex-M4 (aplicação) + Cortex-M0+ (rádio) |
| Flash | 256 KB |
| RAM | 64 KB |
| Rádio | Sub-GHz LoRa integrado (SX1262 interno) |
| TCXO | Sim — 1.7V |
| Frequência | 868 MHz / 915 MHz |
| Potência TX | até 22 dBm |
| RF Switch CTRL1 | PB12 |
| RF Switch CTRL2 | PC13 |
| Serial (UART) | PA2 (TX), PA3 (RX) |
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
};
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);
}
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
BUILD_EPOCH muda a cada compilação, garantindo Node IDs únicos.
6. Gravar o firmware no LSM110A
BOOT0 a VCC e faz reset. O LSM110A entra em modo de programação UART.
PA2 (TX) ao RX do adaptador e PA3 (RX) ao TX do adaptador.
firmware.bin e grava no endereço 0x08000000.
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
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:
- Abre o Chrome ou Edge em client.meshtastic.org
- Clica em Add Connection → Serial
- Selecciona a porta COM do LSM110A
- Vês os nós detectados, mensagens e configurações em tempo real
9. Resumo das mudanças
| Ficheiro | Mudança | Motivo |
|---|---|---|
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âmetro | Valor |
|---|---|
| Região (Brasil) | ANZ (915-928 MHz) |
| Modem Preset | LONG_FAST |
| Spreading Factor | SF11 |
| Bandwidth | 250 kHz |
| Coding Rate | 4/5 |
| Potência TX | 22 dBm |
| Hop Limit | 3 saltos |
| TCXO | 1.7V |
| Canal padrão | LongFast (compatível com toda a rede Meshtastic) |
🔄 Procedimento para cada novo LSM110A
- Aplica as 3 modificações nos ficheiros acima
- Compila:
pio run -e wio-e5 - Full Chip Erase no STM32CubeProgrammer
- Grava o
firmware.binem0x08000000 - Configura via CLI: região ANZ + nome
- 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.
📖 Outros projectos com LSM110A: lom204-cli-wisol.blogspot.com
🔗 Firmware Meshtastic: github.com/meshtastic/firmware
Documento gerado em Maio 2026 — Miguel Alexandre Wisnieski





















