Conversor de Nível Lógico TXS0108E: Manual Técnico Completo

Conversor de Nível Lógico TXS0108E — manual técnico completo

Introdução

Neste manual, será apresentado como instalar, configurar e utilizar o Conversor de Nível Lógico TXS0108E. Se desejar adquirir este produto, clique aqui.

O Conversor de Nível Lógico TXS0108E é um módulo de interface baseado no circuito integrado TXS0108E da Texas Instruments, um tradutor de nível de tensão de 8 canais bidirecionais que permite conectar dispositivos de lógica 3,3 V a dispositivos de lógica 5 V (ou 1,8 V, 2,5 V e 1,5 V) sem risco de danificar as entradas do microcontrolador. A placa utiliza o formato HW-221, com duas fileiras de 10 pinos em passo de 2,54 mm, identificadas na serigrafia como VA (lado de baixa tensão) e VB (lado de alta tensão).

O diferencial desse componente em relação a conversores passivos (divisores resistivos ou pares de MOSFET) é a tradução automática de direção: não existe pino de seleção de sentido, e o mesmo canal transporta sinais nos dois sentidos, com aceleradores de borda (one-shot) que mantêm a integridade de sinais digitais rápidos, como SPI, UART, I2C e PWM. Este manual apresenta as especificações extraídas do datasheet oficial, o pinout completo do módulo, os requisitos de alimentação, a tabela de conexões para os cenários mais comuns e três firmwares completos, testáveis na IDE do Arduino e no ecossistema ESP32.

Especificações técnicas

Principais especificações

ParâmetroEspecificação
Circuito integradoTXS0108E (Texas Instruments), encapsulamento TSSOP-20
Código SKU RoboBuildersRB0547
Número de canais8 canais bidirecionais, não inversores
Tensão de alimentação do lado A (VA / VCCA)1,4 V a 3,6 V DC
Tensão de alimentação do lado B (VB / VCCB)1,65 V a 5,5 V DC
Restrição de operaçãoVCCA deve ser menor ou igual a VCCB
Níveis traduzidos suportados1,5 V, 1,8 V, 2,5 V, 3,3 V e 5,0 V
ArquiteturaPass gate (porta de passagem) com aceleradores de borda one-shot
Sentido de transmissãoAutomático (bidirecional), sem pino de direção
Pull-ups internos4 kΩ (saída em nível alto) e 40 kΩ (saída em nível baixo)
Taxa de dados (push-pull)Até 110 Mbps com VCCA = 3,3 V e VCCB = 5 V
Taxa de dados (open-drain)Até 1,2 Mbps com VCCA = 3,3 V e VCCB = 5 V
Corrente quiescente combinada3 µA (típico em 1,4 V) a 8 µA (típico em 3,3 V), sem carga
Corrente em estado de alta impedância0,05 µA (lado A) e 4 µA (lado B) com OE em nível baixo
Atraso de propagação (tpd)Até 12 ns (máximo, com acionamento push-pull)
Tempo de habilitação / desabilitação200 ns (ten) e 400 ns (tdis)
Capacitância de entrada/saída6 pF (lado A) e 5,5 pF (lado B), por canal
Tensão de habilitação (OE)Ativo em nível alto, referenciado a VCCA (VIH ≥ 0,65 × VCCA)
Faixa de temperatura de operação−40 °C a +85 °C
Placa do móduloHW-221, PCB azul, ~25 mm × 16 mm, furos de fixação
Conector2 fileiras de 10 pinos macho, passo 2,54 mm

Características elétricas e operacionais

O TXS0108E não é um buffer convencional: cada canal é formado por um transistor de passagem de canal N (resistência de condução entre 300 Ω e 500 Ω) associado a dois circuitos de aceleração de borda. Quando o dispositivo externo puxa a linha, o one-shot detecta a transição e liga, por aproximadamente 30 ns, um transistor auxiliar que força rapidamente o novo nível no lado oposto. Esse mecanismo é o que permite ao componente operar tanto com saídas open-drain (I2C, 1-Wire, teclados matriciais) quanto com saídas push-pull (SPI, UART, PWM, GPIO).

Os pull-ups internos são dinâmicos e estão sempre referenciados à alimentação do respectivo lado. Quando a linha está em nível alto, o resistor efetivo é de 4 kΩ; quando a linha é levada a nível baixo, o valor sobe para 40 kΩ, reduzindo o consumo estático e a corrente que o dispositivo externo precisa drenar.

A corrente drenada pelo pull-up interno em nível baixo é dada por:

IOL=VCCBRPUB=5,0 V40 000 Ω=125 μAI_{OL} = \frac{V_{CCB}}{R_{PUB}} = \frac{5{,}0\ \text{V}}{40\,000\ \Omega} = 125\ \mu\text{A}

Já a potência dinâmica associada ao chaveamento de cada canal, com carga capacitiva CLC_L, é:

Pdyn=CL⋅VCCB2⋅fP_{dyn} = C_L \cdot V_{CCB}^{2} \cdot f

Para um barramento de CL=50 pFC_L = 50\ \text{pF}, VCCB=5 VV_{CCB} = 5\ \text{V} e f=1 MHzf = 1\ \text{MHz}, tem-se Pdyn=1,25 mWP_{dyn} = 1{,}25\ \text{mW} por canal; com os 8 canais simultâneos, cerca de 10 mW10\ \text{mW}, o que corresponde a apenas 2 mA2\ \text{mA} adicionais na fonte de 5 V.

Para dimensionar a proteção do circuito, os limites máximos absolutos do CI são:

ParâmetroMínimoMáximoUnidade
Tensão em VCCA−0,54,6V
Tensão em VCCB−0,56,5V
Tensão em qualquer entrada/saída (lado A)−0,5VCCA + 0,5V
Tensão em qualquer entrada/saída (lado B)−0,5VCCB + 0,5V
Corrente contínua por VCCA, VCCB ou GND−100+100mA
Temperatura de armazenamento−65+150°C
Descarga eletrostática (HBM / CDM)—±2 kV / ±1 kVV
Latch-up (JESD 78, Classe II)—> 100mA

⚠️ Atenção: os valores da tabela de limites absolutos indicam apenas a fronteira de dano permanente; eles não são condições de operação. O funcionamento normal exige VCCA entre 1,4 V e 3,6 V. Aplicar 5 V no pino VA ultrapassa o máximo absoluto de 4,6 V e destrói o circuito integrado de forma permanente.

Descrição do produto

O que é o Conversor de Nível Lógico TXS0108E?

O TXS0108E é um tradutor de nível de tensão direcional-automático (directionless), projetado para interligar dois domínios de alimentação distintos. O lado A acompanha a tensão aplicada em VCCA, e o lado B acompanha VCCB; os oito canais são independentes, mas todos compartilham o mesmo par de alimentações e a mesma referência de terra.

O módulo da RoboBuilders monta esse CI em uma pequena placa de circuito impresso com dois barramentos de pinos, dois capacitores cerâmicos de desacoplamento (C1 e C2) e dois furos de fixação. O pino OE (output enable) é exposto na extremidade da fileira A, o que permite desabilitar todos os canais quando o tradutor não está em uso.

Para que serve?

  • Interfacear módulos de 5 V em placas de 3,3 V (e o contrário): displays LCD 1602, módulos relé, sensores com saída TTL de 5 V, teclados matriciais e drivers de potência.
  • Traduzir barramentos completos com 4, 6 ou 8 linhas simultâneas: SPI (MOSI, MISO, SCK, CS), barramentos paralelos de displays e teclados, além de I2C e UART.
  • Adequar sinais de PWM e de temporização entre um microcontrolador de 3,3 V (ESP32, ESP8266, STM32) e periféricos que exigem níveis TTL de 5 V.

Por que devo usar?

  • Não exige pino de direção: o mesmo canal funciona como entrada ou saída, o que simplifica a fiação e permite linhas verdadeiramente bidirecionais, como SDA em I2C.
  • Suporta open-drain e push-pull: os pull-ups internos de 4 kΩ dispensam resistores externos em I2C, enquanto os aceleradores de borda preservam sinais de até 110 Mbps em SPI.
  • Proteção de domínio: o recurso de isolamento de alimentação coloca as duas portas em alta impedância quando uma das tensões cai a 0 V, evitando correntes de retorno e phantom power em placas desligadas.

Quando devo usar?

Use o TXS0108E quando:

  • For necessário traduzir sinais digitais entre 1,4–3,6 V (lado A) e 1,65–5,5 V (lado B), com até 8 linhas;
  • O barramento for bidirecional ou o sentido do sinal não puder ser definido em projeto (I2C, linhas de dados compartilhadas);
  • As taxas envolvidas forem de até 110 Mbps em push-pull ou 1,2 Mbps em open-drain, com fiação curta.

Não é a escolha adequada quando:

  • O sinal é analógico (sensores resistivos, áudio de linha, 4–20 mA): use amplificador operacional ou divisor calibrado;
  • A necessidade é elevar potência ou alimentar cargas: o módulo fornece apenas algumas centenas de microampères de corrente DC e não substitui fonte, driver ou regulador;
  • A tensão envolvida passa de 5,5 V (12 V, 24 V industriais): use optoacopladores ou transceptores isolados;
  • O barramento é diferencial (RS-485, CAN): use transceptores dedicados, como MAX485 ou MCP2551;
  • O cabo é longo (acima de ~30 cm) ou a carga capacitiva é alta: a atuação do one-shot pode gerar oscilação; prefira buffers de linha ou sinalização diferencial;
  • É necessário isolar galvanicamente os circuitos: nesse caso, a solução é um acoplador óptico ou um isolador digital.

Pinout e diagrama de entradas/saídas

O módulo possui 20 pinos distribuídos em duas fileiras. A fileira A concentra a alimentação de baixa tensão, os oito canais do lado A e o pino de habilitação; a fileira B concentra a alimentação de alta tensão, os oito canais do lado B e o terra comum.

Fileira A (lado de baixa tensão — VCCA)

PosiçãoSerigrafiaPino do CIFunção
1VA2 (VCCA)Alimentação do lado A: 1,4 V a 3,6 V DC
2A11Canal 1, referenciado a VA (par do B1)
3A23Canal 2, referenciado a VA (par do B2)
4A34Canal 3, referenciado a VA (par do B3)
5A45Canal 4, referenciado a VA (par do B4)
6A56Canal 5, referenciado a VA (par do B5)
7A67Canal 6, referenciado a VA (par do B6)
8A78Canal 7, referenciado a VA (par do B7)
9A89Canal 8, referenciado a VA (par do B8)
10OE10Habilitação ativa em nível alto (OE = 0 coloca todos os canais em alta impedância)

Fileira B (lado de alta tensão — VCCB)

PosiçãoSerigrafiaPino do CIFunção
1VB19 (VCCB)Alimentação do lado B: 1,65 V a 5,5 V DC
2B120Canal 1, referenciado a VB (par do A1)
3B218Canal 2, referenciado a VB (par do A2)
4B317Canal 3, referenciado a VB (par do A3)
5B416Canal 4, referenciado a VB (par do A4)
6B515Canal 5, referenciado a VB (par do A5)
7B614Canal 6, referenciado a VB (par do A6)
8B713Canal 7, referenciado a VB (par do A7)
9B812Canal 8, referenciado a VB (par do A8)
10GND11Referência de terra comum às duas alimentações

O pareamento é fixo e direto: A1 ↔ B1, A2 ↔ B2 e assim por diante. Não existe cruzamento entre canais, e o canal não utilizado pode permanecer desconectado, pois o pull-up interno mantém a linha em nível alto quando OE está habilitado.

💡 Dica: na serigrafia do módulo, VA e VB são os mesmos VCCA e VCCB do datasheet. Ao consultar tabelas de terceiros, lembre-se dessa equivalência para não inverter as alimentações.

⚠️ Atenção: o módulo HW-221 da RoboBuilders traz apenas os dois capacitores de desacoplamento (C1 e C2) na placa; o pino OE chega ao header sem resistor de pull-up ou pull-down dedicado. Com OE flutuante, o estado dos canais é indefinido. Ligue OE ao VA (por jumper ou fio curto) para habilitar o tradutor e, se precisar desabilitá-lo por software, comande esse pino com um GPIO de 3,3 V. Em caso de dúvida sobre o lote, meça a continuidade entre OE e VA/GND antes de energizar.

Como fazer a ligação

Requisitos de instalação e alimentação

O módulo não gera tensão: ele precisa das duas alimentações presentes ao mesmo tempo para traduzir os sinais. A fonte do lado A deve fornecer a tensão do dispositivo de baixa tensão (normalmente 3,3 V) e a do lado B, a tensão do dispositivo de alta (normalmente 5 V). O consumo do próprio CI é desprezível (poucos microampères em repouso), mas a fonte de 5 V precisa suportar a carga do periférico conectado — um LCD 1602, por exemplo, consome cerca de 25 mA com backlight.

ItemRecomendação
Seção dos fios24 AWG a 26 AWG para sinais; 22 AWG para alimentação
Comprimento máximo dos sinais20 cm a 30 cm (acima disso, usar cabo com terra intercalado)
TerraUm único ponto de referência, com o GND do módulo ligado aos dois circuitos
Desacoplamento100 nF cerâmico em cada alimentação, o mais próximo possível do módulo
Alimentação do lado A3,3 V do ESP32 ou do Arduino (não exceder 3,6 V)
Alimentação do lado B5 V da fonte ou do barramento do sistema
Corrente máxima nos canaisCentenas de microampères em DC; jamais alimentar cargas

A regra de ouro é VCCA ≤ VCCB. Se as duas pontas operarem no mesmo nível (por exemplo, 3,3 V nos dois lados), o módulo também funciona, com VA = VB = 3,3 V, mas não há vantagem em utilizá-lo nesse caso.

Diagrama de ligação elétrica

Diagrama de ligação

O diagrama representa o cenário mais comum de bancada: um ESP32 DevKit (lógica de 3,3 V) no lado A e um módulo de 5 V no lado B. As alimentações VA e VB são derivadas das fontes correspondentes, o GND é comum aos três blocos e o pino OE aparece ligado a VA, condição necessária para habilitar os oito canais. As linhas de sinal são ortogonais e identificadas par a par (A1/B1, A2/B2), de modo que o mesmo número à esquerda e à direita corresponde ao mesmo canal interno.

⚠️ Atenção: o diagrama é esquemático. Antes de energizar, confirme com o multímetro que VA recebe no máximo 3,6 V e que VB recebe no máximo 5,5 V. Inverter as duas fileiras é o erro mais comum e o mais destrutivo.

Tabela de conexões dos terminais

Cenário 1 — Arduino Uno (5 V) com display OLED SSD1306 (3,3 V) em I2C

De (Arduino Uno)Para (módulo)Para (OLED)Observação
5VVB—Alimentação do lado B
3V3VAVCCAlimentação do lado A e do display
GNDGNDGNDTerra comum obrigatório
A4 (SDA)B1A1 → SDALinha de dados I2C
A5 (SCL)B2A2 → SCLLinha de clock I2C
—OEVAHabilita o tradutor

Cenário 2 — ESP32 (3,3 V) com display LCD 1602 (5 V) em modo 4 bits

De (ESP32)Para (módulo)Para (LCD 1602)Observação
3V3VA—Alimentação do lado A
VIN (5 V)VBVDDAlimentação do lado B e do display
GNDGNDVSS, RWRW aterrado (somente escrita)
GPIO 19A1 → B1RSSeleção registro/dado
GPIO 18A2 → B2EPulso de enable
GPIO 21A3 → B3D4Dado bit 0
GPIO 22A4 → B4D5Dado bit 1
GPIO 23A5 → B5D6Dado bit 2
GPIO 25A6 → B6D7Dado bit 3
—OEVAHabilita o tradutor

💡 Dica: no cenário 2, o potenciômetro de contraste do LCD (V0) e o resistor de backlight permanecem ligados ao lado de 5 V. O módulo só traduz os sinais lógicos; ele não interfere na alimentação do display.

Cuidados e observações de segurança

⛔ Perigo: nunca aplique 5 V em VA. O máximo absoluto do pino VCCA é 4,6 V, e a faixa recomendada termina em 3,6 V. A inversão entre as fileiras A e B produz dano permanente no CI e pode levar o microcontrolador junto.

⛔ Perigo: não use o módulo para comutar cargas, acionar relés, LEDs de potência ou motores. A corrente contínua especificada para os pinos de I/O é da ordem de microampères a poucos miliampères, e o limite absoluto de 100 mA vale para os pinos de alimentação, não para uso contínuo.

⚠️ Atenção: mantenha o terra comum entre as duas fontes. Sem referência compartilhada, os níveis traduzidos não têm significado elétrico e o CI pode conduzir correntes indesejadas pelas linhas de sinal.

⚠️ Atenção: em barramentos I2C, não instale pull-ups externos fortes (1 kΩ) no lado B. Os 4 kΩ internos já garantem a subida; associá-los a resistores de 1 kΩ aumenta a corrente de dreno sem necessidade e pode elevar o nível baixo (VOL) acima do limite aceito pelo dispositivo.

⚠️ Atenção: evite sinais com bordas muito lentas ou acionamento por resistor de valor alto (acima de 1 kΩ em série). O one-shot depende de transições nítidas para disparar; drivers fracos podem causar oscilação na saída. O datasheet especifica os tempos considerando impedância de saída inferior a 50 Ω.

Como usar

Guia de operação passo a passo

  1. Identifique as tensões dos dois lados. Anote a tensão de operação do microcontrolador e a do periférico. O lado de menor tensão vai para VA; o de maior, para VB.
  2. Ligue os terras primeiro. Una o GND do módulo ao terra das duas fontes antes de qualquer sinal.
  3. Alimente VA e VB. Confirme com o multímetro os valores em cada pino antes de conectar o restante do circuito.
  4. Habilite o OE. Ligue OE ao VA com um jumper. Sem essa ligação, todos os canais permanecem em alta impedância e nada é traduzido.
  5. Conecte os sinais par a par. A1 com B1, A2 com B2, sempre mantendo o mesmo canal dos dois lados.
  6. Faça o teste estático. Com o sistema desligado, meça continuidade entre A1 e o pino do periférico e entre B1 e o pino do microcontrolador. Confirme que não há curto entre canais vizinhos.
  7. Energize e valide com um sinal conhecido. Gere uma onda quadrada de 1 kHz em um GPIO e meça no outro lado com osciloscópio ou com o próprio microcontrolador (exemplo de auto-teste adiante).
  8. Ajuste a velocidade do barramento. Se houver erros intermitentes, reduza a frequência de I2C/SPI e encurte os fios antes de suspeitar do módulo.

Diagnóstico rápido de falhas

SintomaCausa provávelCorreção
Nenhum sinal passa, nos dois sentidosOE flutuanteLigar OE ao VA
Um lado funciona e o outro nãoAlimentação ausente em VA ou VBVerificar as duas tensões
Sinal invertido ou atenuadoCanais trocados ou VA maior que VBRevisar o pareamento e a ordem das tensões
Funciona em 100 kHz e falha em 400 kHz (I2C)Carga capacitiva alta ou fios longosEncurtar a fiação e reduzir a frequência
Aquecimento do CI5 V aplicado em VASubstituir o módulo e corrigir a ligação
Leitura instável em SPIFios longos ou sem terra de retornoUsar cabo com terra intercalado e reduzir o clock

Modos de operação e ajustes

O TXS0108E possui apenas dois modos funcionais, definidos pelo pino OE:

  • Habilitado (OE em nível alto): os oito canais traduzem nos dois sentidos. É o modo de operação normal. O tempo de habilitação é de cerca de 200 ns, prazo necessário para que os circuitos one-shot entrem em regime.
  • Desabilitado (OE em nível baixo): todos os I/Os ficam em alta impedância, com consumo reduzido a 0,05 µA no lado A e 4 µA no lado B. Útil para isolar um periférico durante a inicialização ou para economizar energia em sistemas com deep sleep.

Não há jumpers, trimpots ou seletores no módulo: a configuração é inteiramente elétrica. A tensão de cada lado define os níveis traduzidos, e a única escolha de projeto é qual domínio ocupa a fileira A. Mantenha VCCA ≤ VCCB em qualquer combinação.

💡 Dica: para desabilitar o tradutor por software, ligue OE a um GPIO de 3,3 V e mantenha um resistor de 10 kΩ de pull-down para o terra. Assim, durante o boot do microcontrolador (quando os pinos ficam flutuantes), o módulo permanece desabilitado e não injeta níveis indefinidos no periférico.

Exemplos práticos de uso

Os três exemplos a seguir cobrem as aplicações mais frequentes: I2C com open-drain, barramento paralelo push-pull e um auto-teste que valida os dois sentidos de tradução com um único jumper.

Exemplo 1 — Arduino Uno (5 V) lendo um OLED SSD1306 (3,3 V) por I2C

Este é o caso clássico de uso do TXS0108E: o Arduino Uno opera em 5 V, o display em 3,3 V e o barramento I2C é bidirecional (a linha SDA é compartilhada entre mestre e escravo). As bibliotecas utilizadas são as oficiais da Adafruit, disponíveis no Gerenciador de Bibliotecas da IDE do Arduino.

/*
 * ============================================================
 *  I2C 5 V (Arduino Uno) <-> 3,3 V (OLED SSD1306)
 *  Módulo: Conversor de Nível Lógico TXS0108E
 *
 *  Lado A (VA = 3,3 V) -> OLED
 *  Lado B (VB = 5,0 V) -> Arduino Uno
 *
 *  Ligação:
 *    Arduino 5V   -> VB
 *    Arduino 3V3  -> VA e VCC do OLED
 *    Arduino GND  -> GND do módulo e do OLED
 *    Arduino A4   -> B1  |  A1 -> SDA do OLED
 *    Arduino A5   -> B2  |  A2 -> SCL do OLED
 *    OE           -> VA  (habilita o tradutor)
 *
 *  Bibliotecas:
 *    - Adafruit SSD1306
 *    - Adafruit GFX Library
 * ============================================================
 */

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

constexpr uint8_t  OLED_ADDR   = 0x3C;   // endereço I2C típico do SSD1306
constexpr uint16_t TELA_LARG   = 128;    // largura em pixels
constexpr uint16_t TELA_ALT    = 64;     // altura em pixels
constexpr int8_t   OLED_RESET  = -1;     // sem pino de reset dedicado

Adafruit_SSD1306 oled(TELA_LARG, TELA_ALT, &Wire, OLED_RESET);

uint16_t ciclos = 0;                     // contador de atualizações da tela

void setup() {
  Serial.begin(9600);                    // monitor serial para diagnóstico

  Wire.begin();                          // SDA = A4 e SCL = A5 no Uno
  Wire.setClock(100000L);                // 100 kHz: margem segura com o tradutor

  // Inicializa o controlador do display; retorna false se não houver resposta
  if (!oled.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
    Serial.println(F("OLED nao respondeu. Verifique OE, VA/VB e SDA/SCL."));
    while (true) {                       // trava aqui para facilitar o diagnóstico
      delay(1000);
    }
  }

  oled.clearDisplay();
  oled.setTextColor(SSD1306_WHITE);
  oled.setTextSize(1);
  oled.setCursor(0, 0);
  oled.println(F("TXS0108E OK"));
  oled.println(F("I2C 100 kHz"));
  oled.display();
  delay(1500);                           // tempo para leitura da mensagem
}

void loop() {
  ciclos++;                              // incrementa o contador de ciclos

  oled.clearDisplay();
  oled.setCursor(0, 0);
  oled.setTextSize(1);
  oled.println(F("TXS0108E - I2C"));
  oled.println(F("Arduino 5V <> 3V3"));
  oled.println();
  oled.setTextSize(2);
  oled.print(F("N "));
  oled.println(ciclos);                  // imprime o número do ciclo atual
  oled.display();                        // envia o buffer para o display

  Serial.print(F("Ciclo I2C: "));
  Serial.println(ciclos);                // espelha a informação no monitor serial

  delay(1000);                           // atualiza uma vez por segundo
}

Exemplo 2 — ESP32 (3,3 V) acionando um LCD 1602 (5 V) em modo 4 bits

Aqui o sentido predominante é 3,3 V → 5 V, com sinais push-pull de baixa frequência. O LCD opera em modo de escrita apenas (RW aterrado), o que evita qualquer conflito de direção no barramento. A biblioteca LiquidCrystal acompanha a IDE do Arduino.

/*
 * ============================================================
 *  ESP32 (3,3 V) -> LCD 1602 (5 V) em modo 4 bits
 *  Módulo: Conversor de Nível Lógico TXS0108E
 *
 *  Lado A (VA = 3,3 V) -> ESP32
 *  Lado B (VB = 5,0 V) -> LCD
 *
 *  Ligação:
 *    3V3         -> VA
 *    VIN (5 V)   -> VB e VDD do LCD
 *    GND         -> GND, VSS e RW do LCD
 *    GPIO 19     -> A1 | B1 -> RS
 *    GPIO 18     -> A2 | B2 -> E
 *    GPIO 21     -> A3 | B3 -> D4
 *    GPIO 22     -> A4 | B4 -> D5
 *    GPIO 23     -> A5 | B5 -> D6
 *    GPIO 25     -> A6 | B6 -> D7
 *    OE          -> VA
 *
 *  O pino V0 do LCD vai ao potenciômetro de contraste (5 V/GND);
 *  o backlight (A/K) usa resistor de 220 ohms para 5 V.
 * ============================================================
 */

#include <LiquidCrystal.h>

// Ordem dos pinos: RS, E, D4, D5, D6, D7 (todos no lado A, 3,3 V)
constexpr uint8_t PIN_RS = 19;
constexpr uint8_t PIN_EN = 18;
constexpr uint8_t PIN_D4 = 21;
constexpr uint8_t PIN_D5 = 22;
constexpr uint8_t PIN_D6 = 23;
constexpr uint8_t PIN_D7 = 25;

LiquidCrystal lcd(PIN_RS, PIN_EN, PIN_D4, PIN_D5, PIN_D6, PIN_D7);

void setup() {
  Serial.begin(115200);                  // diagnóstico pelo monitor serial

  lcd.begin(16, 2);                      // display de 16 colunas por 2 linhas
  lcd.setCursor(0, 0);
  lcd.print(F("TXS0108E"));
  lcd.setCursor(0, 1);
  lcd.print(F("ESP32 -> 5 V"));

  Serial.println(F("LCD inicializado pelo tradutor TXS0108E."));
}

void loop() {
  static uint32_t ultimo = 0;            // instante da última atualização
  static uint8_t  segundos = 0;          // contador de segundos

  // Atualiza a segunda linha a cada 1 s sem bloquear o restante do programa
  if (millis() - ultimo >= 1000UL) {
    ultimo = millis();
    segundos++;

    lcd.setCursor(0, 1);
    lcd.print(F("t = "));
    lcd.print(segundos);
    lcd.print(F(" s    "));              // espaços apagam dígitos antigos

    Serial.print(F("Segundos: "));
    Serial.println(segundos);
  }
}

💡 Dica: se o LCD exibir apenas blocos escuros, o problema é quase sempre o contraste (V0), não o tradutor. Ajuste o potenciômetro até o texto aparecer antes de revisar a fiação dos canais.

Exemplo 3 — Auto-teste de ida e volta com o ESP32 (A→B e B→A)

Este firmware gera uma onda quadrada de 1 kHz no GPIO 25, injeta no canal 1 (A1), retorna pelo canal 2 (B2) por um jumper externo e mede o sinal no GPIO 26. Ele valida simultaneamente os dois sentidos de tradução e a integridade do one-shot em baixa frequência.

/*
 * ============================================================
 *  Auto-teste do TXS0108E (ida e volta)
 *
 *  Ligação:
 *    ESP32 GPIO 25 -> A1
 *    B1 ----------- jumper ----------- B2
 *    A2 -> ESP32 GPIO 26
 *    VA = 3V3, VB = 5V, GND comum, OE -> VA
 *
 *  Resultado esperado: 1000 Hz com duty cycle de 50% (+/- 2%)
 * ============================================================
 */

#include <esp_arduino_version.h>         // macros de versão do core ESP32
#include <math.h>                        // fabs() para as tolerâncias

constexpr uint8_t  PIN_GERADOR = 25;     // saída que gera a onda quadrada
constexpr uint8_t  PIN_LEITOR  = 26;     // entrada que mede o sinal traduzido
constexpr uint32_t FREQ_HZ     = 1000;   // frequência de teste, em hertz

void setup() {
  Serial.begin(115200);
  delay(300);                            // aguarda a porta serial estabilizar

  // Configura o PWM de 10 bits a 1 kHz no gerador, conforme a versão do core
#if ESP_ARDUINO_VERSION_MAJOR >= 3
  ledcAttach(PIN_GERADOR, FREQ_HZ, 10);  // API do core 3.x
  ledcWrite(PIN_GERADOR, 512);           // 512 de 1023 = 50% de ciclo ativo
#else
  ledcSetup(0, FREQ_HZ, 10);             // canal 0, 1 kHz, 10 bits (core 2.x)
  ledcAttachPin(PIN_GERADOR, 0);
  ledcWrite(0, 512);                     // mesmo duty cycle de 50%
#endif

  pinMode(PIN_LEITOR, INPUT);            // GPIO 26 como entrada digital
  Serial.println(F("Auto-teste TXS0108E: 1 kHz, 50%"));
}

void loop() {
  // Mede a duração do nível alto e do nível baixo (timeout de 50 ms)
  unsigned long tAlto  = pulseIn(PIN_LEITOR, HIGH, 50000);
  unsigned long tBaixo = pulseIn(PIN_LEITOR, LOW,  50000);

  // Sem pulso: jumper ausente, OE desabilitado ou canal com defeito
  if (tAlto == 0 || tBaixo == 0) {
    Serial.println(F("FALHA: sem sinal em A2. Verifique OE, jumper B1-B2 e GND."));
    delay(1000);
    return;
  }

  float periodo = (tAlto + tBaixo) * 1e-6f;      // período em segundos
  float freq    = 1.0f / periodo;                // frequência em hertz
  float duty    = 100.0f * tAlto / (tAlto + tBaixo); // ciclo ativo em %

  // Tolerâncias: 2% na frequência e 2 pontos percentuais no duty cycle
  bool aprovado = (fabs(freq - FREQ_HZ) < 0.02f * FREQ_HZ) &&
                  (fabs(duty - 50.0f) < 2.0f);

  Serial.print(F("f = "));
  Serial.print(freq, 1);
  Serial.print(F(" Hz | duty = "));
  Serial.print(duty, 1);
  Serial.print(F(" % | "));
  Serial.println(aprovado ? F("APROVADO") : F("REPROVADO"));

  delay(1000);                                   // uma medição por segundo
}

Outras aplicações diretas

  • UART entre ESP32 e módulo GSM/GPS de 5 V: usar dois canais (TX e RX) e manter o GND comum; taxas de 9600 bps a 115200 bps não representam desafio para o tradutor.
  • SPI com display ou cartão SD de 5 V: quatro canais (SCK, MOSI, MISO e CS), com clock de até 25 MHz em fiação curta; acima disso, avalie um buffer dedicado.
  • PWM para drivers de LED ou servo: o módulo reproduz o ciclo de trabalho com atraso de poucos nanossegundos, sem distorção perceptível em frequências de até 100 kHz.
  • Teclado matricial 4×4 de 5 V em placa de 3,3 V: oito canais, um para cada linha e coluna, aproveitando a bidirecionalidade nativa do componente.

Projetos

O conversor de nível é um acessório de bancada: ele aparece como etapa de interface em praticamente qualquer montagem que misture módulos de 5 V com placas de 3,3 V. No blog da RoboBuilders, o projeto de diagnóstico abaixo é o ponto de partida natural para validar a montagem, pois expõe cada GPIO do ESP32 em uma interface web e permite conferir, sem instrumentos, se o sinal chegou ao destino depois de atravessar o tradutor.

  • Painel Web de Teste e Diagnóstico de GPIOs com ESP32: firmware de código aberto (RB0718) que sobe um portal cativo e uma API REST no próprio ESP32, permitindo acionar saídas, ler entradas e verificar o estado de cada pino em tempo real pelo navegador. Combinado com o TXS0108E, o painel também serve para testar periféricos de 5 V — relés, LCDs, teclados e sensores TTL — conectados ao lado B do módulo.

O projeto entrega o firmware completo, a documentação da API REST, o mapeamento de pinos da placa e o passo a passo de compilação pela PlatformIO e pela IDE do Arduino, servindo como gabarito para homologar a interface de nível antes de integrá-la a uma montagem definitiva.

Conclusão

O Conversor de Nível Lógico TXS0108E resolve, em uma única placa de 20 pinos, o problema de compatibilidade entre dispositivos de 3,3 V e 5 V que aparece na maioria dos projetos de robótica e automação. O resumo do que foi apresentado neste manual:

  • Especificações: oito canais bidirecionais, VCCA de 1,4 V a 3,6 V, VCCB de 1,65 V a 5,5 V, com a obrigação de manter VCCA ≤ VCCB e taxas de até 110 Mbps em push-pull ou 1,2 Mbps em open-drain.
  • Descrição: tradutor sem pino de direção, baseado em porta de passagem com aceleradores de borda e pull-ups internos dinâmicos de 4 kΩ e 40 kΩ, adequado tanto a I2C quanto a SPI, UART e PWM.
  • Pinout: fileira A com VA, A1 a A8 e OE; fileira B com VB, B1 a B8 e GND, com pareamento direto entre canais de mesmo número.
  • Ligação: duas alimentações simultâneas, terra comum obrigatório, OE ligado ao VA para habilitar e fiação curta para preservar a integridade das bordas.
  • Operação: dois modos (habilitado e alta impedância), sem ajustes mecânicos, com três firmwares completos — I2C em Arduino, LCD paralelo em ESP32 e auto-teste de ida e volta.

Com o módulo corretamente alimentado e o OE habilitado, o TXS0108E torna-se uma etapa transparente no circuito: os sinais chegam ao outro lado com os níveis corretos, a mesma lógica e atraso desprezível para as aplicações usuais de bancada. É a peça que faltava para integrar, com segurança, o ecossistema de 3,3 V ao vasto conjunto de periféricos de 5 V ainda amplamente utilizados.

Solução de problemas

Olá! Sou o assistente técnico da RoboBuilders. Descreva seu problema com o Conversor de Nível Lógico TXS0108E: Manual Técnico Completo e eu ajudarei a encontrar a solução.

O assistente usa IA e pode errar. Confirme informações críticas no datasheet oficial do fabricante.