Trilha de aprendizado · Nível 12 · Tutorial 8

Comutação segura com um driver de ponte H

Definir comandos seguros para uma ponte H integrada, usando as proteções do driver e uma sequência de operação que evite sobreposição de chaves e reversões abruptas.

  • Nível: Avançado
  • Duração: 24 min
  • 9 passos
Comutação segura com um driver de ponte H

O que você vai percorrer

  1. Onde surge a condução simultânea Localize o caminho de condução simultânea e separe comandos lógicos, condução efetiva e frenagem dinâmica. 2 min
  2. Tempo morto e intertravamento Diferencie tempo morto, intertravamento e a espera necessária antes de inverter um motor. 2 min
  3. Verificar o driver e os limites do módulo Avalie o módulo como um conjunto documentado: CI, placa, alimentação, motor e condições de operação. 3 min
  4. Traduzir a tabela em comandos seguros Mapeie as entradas reais do DRV8833 para acionamento, PWM, parada e desabilitação sem tratar nSLEEP como um controle de velocidade. 3 min
  5. Garantir um início sem movimento inesperado Organize hardware e firmware para manter o motor sem acionamento durante reset, inicialização e espera por autorização. 3 min
  6. Reverter somente após a parada Estruture uma reversão em estados, bloqueando comandos até a confirmação válida de parada e cancelando a pendência em desabilitação ou falha. 3 min
  7. Validar a sequência em baixa energia Aplique uma liberação progressiva da ponte H e compare comandos do firmware com evidências da prática de baixa energia, incluindo a condição documentada da alimentação diante de energia devolvida. 4 min
  8. Analisar falhas sem provocá-las Diferencie falhas de comutação, carga e alimentação por suas evidências e escolha uma resposta prudente, sem reproduzir condições destrutivas. 3 min
  9. Revisão final: autorizar ou bloquear o acionamento Revisão integrada dos critérios para liberar ou bloquear o acionamento de uma ponte H. 2 min

O que você vai aprender

  • Explicar como surge a condução simultânea e como tempo morto e intertravamento reduzem esse risco.
  • Verificar compatibilidade lógica, limites elétricos e proteções de um módulo de ponte H.
  • Organizar comandos de habilitação, sentido e PWM com estado seguro durante inicialização e parada.
  • Distinguir o tempo morto elétrico da espera necessária antes de inverter o movimento.
  • Analisar falhas potencialmente destrutivas sem reproduzi-las na montagem.

Antes de começar

  • Ponte H: sentido de rotação e recirculação
  • Perdas e margem térmica em transistores
  • Compatibilidade elétrica entre circuitos digitais
  • Máquinas de estados no firmware

Passo 1 de 9

Onde surge a condução simultânea

Localize o caminho de condução simultânea e separe comandos lógicos, condução efetiva e frenagem dinâmica.

Localizando o caminho perigoso

O curto dentro de um braço

Um caminho direto pela alimentação

Em uma ponte H, cada braço tem uma chave superior ligada a VM e uma chave inferior ligada ao GND. Se as duas chaves do mesmo braço conduzirem ao mesmo tempo, elas formam um caminho de baixa resistência entre os trilhos da fonte.

Esse evento é a condução simultânea, também chamada de shoot-through. A corrente resultante não é a corrente útil que atravessa o motor: ela contorna a carga e pode ser limitada principalmente pela resistência das chaves, das trilhas, da fonte e das conexões. Por isso, pode crescer rapidamente e causar aquecimento, queda de tensão, atuação de proteção ou dano.

O problema está em uma coluna da ponte, não na diagonal que normalmente conduz o motor.

Caminho do shoot-through

Diagrama de ponte H no qual as chaves superior e inferior do braço esquerdo estão fechadas, criando um caminho vermelho direto entre a alimentação e o terra, sem passar pelo motor.

As duas chaves do mesmo braço fechadas conectam VM ao GND diretamente.

Por que o diagrama lógico pode enganar

Comando e chave real

Complementar no comando não significa complementar na condução

Em uma situação ideal, um comando lógico desce exatamente quando o outro sobe. Porém, a chave real não muda de estado instantaneamente. Carga e descarga do gate, atrasos internos e o tempo necessário para uma chave deixar de conduzir podem deslocar a condução efetiva.

Assim, mesmo que dois comandos externos pareçam complementares, pode haver um pequeno intervalo em que a chave que deveria desligar ainda conduz e a outra já começou a conduzir. É essa região que importa para o shoot-through.

As formas de onda a seguir são didáticas: distinguem comando e condução. Elas não são uma medição direta dos gates ou transistores internos de um driver integrado.

Exemplo

Leitura de um diagrama temporal

Imagine a transição em um braço:

  • O comando da chave superior passa de alto para baixo.
  • O comando da chave inferior passa de baixo para alto.
  • A condução superior persiste por um curto tempo após seu comando cair.
  • A condução inferior começa antes de a superior cessar completamente.

Durante esse trecho, as duas conduções estão em nível ativo. O cruzamento dos comandos não basta para concluir que as chaves nunca ficaram simultaneamente ligadas.

Sobreposição didática

Quatro formas de onda: dois comandos lógicos azuis complementares e duas conduções efetivas laranjas que se sobrepõem brevemente em uma faixa vermelha.

Os comandos podem parecer perfeitos, enquanto a condução efetiva ainda apresenta sobreposição.

Verifique sua interpretação

Identifique a condição perigosa

Qual situação descreve shoot-through em uma ponte H?

Escreva pelo menos 60 caracteres (0/60).

Diferencie os dois casos

Uma frenagem dinâmica prevista na tabela funcional do driver é automaticamente igual a shoot-through.

Escreva pelo menos 90 caracteres (0/90).

Passo 2 de 9

Tempo morto e intertravamento

Diferencie tempo morto, intertravamento e a espera necessária antes de inverter um motor.

Tempo morto atua dentro do braço

Tempo morto: uma janela elétrica

Ao transferir um braço da ponte da chave superior para a inferior, o driver precisa garantir uma breve janela em que nenhuma das duas conduz. Essa janela é o tempo morto.

Ele existe porque desligar uma chave e remover sua condução efetiva leva tempo. Portanto, dois comandos externos que parecem perfeitamente complementares não são prova de que as chaves internas nunca se sobrepuseram.

Em uma ponte H integrada, o circuito interno comanda os transistores e aplica o tempo morto compatível com sua própria tecnologia, quando isso estiver documentado.

Transferência sem sobreposição

Diagrama de um braço de ponte H mostrando a chave superior desligar, um curto intervalo com ambas as chaves desligadas e, depois, a chave inferior conduzir.

O intervalo sem condução reduz o risco de as chaves de um mesmo braço criarem um caminho direto entre os trilhos da alimentação.

Não confunda bloqueio com temporização

Duas proteções, dois papéis

Intertravamento é outra proteção: ele bloqueia uma combinação de comandos incompatível antes que ela solicite uma condição perigosa.

Exemplo conceitual: se uma combinação de entradas pedir, direta ou indiretamente, as duas chaves de um mesmo braço, o driver documentado pode impedir esse pedido. Isso é diferente de tempo morto:

  • Intertravamento: decide que comandos incompatíveis não podem coexistir.
  • Tempo morto: controla a transição temporal entre uma chave que deixa de conduzir e a outra que passa a conduzir.

As duas funções podem coexistir no driver, mas não devem ser tratadas como sinônimos.

Comparação funcional

Compare os mecanismos que participam de uma comutação segura.

Cada mecanismo responde a uma pergunta diferente.
MecanismoO que fazO que não comprova
IntertravamentoBloqueia comandos incompatíveisQue a transição ocorreu sem atraso interno
Tempo mortoCria intervalo sem condução na troca de chaveQue o motor já parou de girar
Espera antes da reversãoDá tempo para confirmar a parada mecânicaQue as chaves internas têm proteção contra sobreposição

O driver faz a comutação das chaves

O que os GPIOs controlam — e o que não revelam

Para esta aplicação, prefira uma ponte H integrada cujo manual documente o comando interno das chaves e a prevenção de condução simultânea. O microcontrolador fornece entradas de controle; ele não deve tentar reproduzir, com quatro GPIOs, o acionamento direto de quatro MOSFETs.

O sinal observado nos pinos de entrada mostra apenas o que foi solicitado ao driver. Mesmo que os níveis externos estejam corretos, eles não medem o instante real em que os transistores internos deixam ou começam a conduzir. Esse comportamento depende do circuito interno, de seus atrasos e das condições especificadas pelo fabricante.

Dica

Leitura prudente da documentação

Ao avaliar uma ponte integrada, procure na documentação a tabela funcional, as condições de habilitação e as proteções de comutação. Não conclua essas características apenas pela aparência do módulo ou pela forma de onda dos GPIOs.

Aplicação dos mecanismos

Verifique sua distinção

Associe cada situação ao mecanismo mais adequado.

Faça as associações.

Use os termos tempo morto, intertravamento e espera para parada mecânica.
SituaçãoMecanismo adequado
Evitar que duas chaves de um braço conduzam durante a trocaTempo morto
Recusar um pedido de comando incompatívelIntertravamento
Só permitir sentido oposto após o rotor estar paradoEspera para parada mecânica

Prática: atribua a proteção correta

Checagem rápida

Qual afirmação está correta?

Qual afirmação está correta?

Passo 3 de 9

Verificar o driver e os limites do módulo

Avalie o módulo como um conjunto documentado: CI, placa, alimentação, motor e condições de operação.

Fixar a configuração de referência

Uma referência verificável

A referência deste tutorial é um módulo documentado com DRV8833, alimentado em VM por uma fonte regulada de 5,0 V. O Uno R3 tem alimentação própria; os GNDs se unem no ponto previsto. A ponte A usa sempre IN1 = 9, IN2 = 10 e NSLEEP = 7.

O motor é pequeno, fixado e sem mecanismo acoplado, com corrente de partida documentada de até 0,60 A. A autorização depende do conjunto completo: CI, placa, trilhas, conectores, capacitores, fonte e motor. Um anúncio de corrente, isoladamente, não substitui essa análise.

A referência também exige entradas definidas quando o Uno está em reset ou desligado: há pull-downs físicos de 10 kΩ para GND em IN1, IN2 e NSLEEP. A ponte B permanece definida por pull-downs de 10 kΩ em BIN1 e BIN2. Esses resistores só são aceitos após conferir no esquema do módulo que não há pull-ups incompatíveis.

Conjunto elétrico de referência

Diagrama do Uno ligado ao módulo DRV8833 por três sinais, com fonte de potência de 5 V separada, terra comum, motor no canal A, pull-downs nas entradas e capacitores junto à alimentação.

A referência combina alimentação, sinais definidos e desacoplamento. A aparência de outro módulo não comprova que ele tenha a mesma configuração.

Conferir CI, placa e carga

CI, placa e carga são limites diferentes

Separe sempre os limites do CI dos limites do módulo. A faixa de tensão e a corrente indicadas na folha de dados do DRV8833 não garantem, por si sós, que uma placa pequena suporte a mesma corrente contínua: encapsulamento, cobre, conectores, ventilação e montagem mudam a dissipação possível.

A corrente de partida é transitória. Ela não deve ser comparada diretamente apenas com uma corrente contínua. Para liberar um motor, compare sua partida com a condição de partida validada para o módulo e, quando houver dados, com os limites transitórios, a limitação de corrente e a margem térmica.

Nesta referência, os pinos 9 e 10 usam o PWM padrão do Uno, próximo de 490 Hz. Isso está abaixo do máximo de 20 kHz declarado para o módulo de referência; não reconfigure temporizadores.

Ficha resumida da referência

Valores exclusivos da aplicação de referência. Todas as verificações aplicáveis precisam ser atendidas.

O valor anunciado para o CI não transfere automaticamente capacidade térmica e elétrica para qualquer módulo.
VerificaçãoCI DRV8833Módulo de referência
VMFaixa de operação do CI5,0 V regulados
Entradas lógicasLOW até 0,8 V; HIGH a partir de 2,0 VCompatível com GPIO de 0 a 5 V do Uno
Corrente por ponteAté 1,5 A RMS sob condições do CI0,80 A contínuos a 25 °C, ventilação natural
Partida do motorDepende da aplicaçãoValidada somente até 0,60 A
PWMComutação interna do driverAté 20 kHz; uso em cerca de 490 Hz
VM–GNDDesacoplamento exigido100 nF cerâmico + 100 µF eletrolítico instalados

Conferir proteções e alimentação

Proteções não são permissão de sobrecarga

Antes de usar uma proteção como critério, identifique qual proteção existe no módulo e como ela opera.

Na referência, a limitação de corrente implementada com resistores de sensoriamento atua em torno de 1,5 A por ponte. Ela restringe a corrente durante a condução; não eleva a capacidade contínua de 0,80 A da placa nem torna aceitável manter uma carga em sobrecarga.

O desligamento por sobrecorrente é outra camada: ele desabilita a ponte ao detectar a condição. O DRV8833 pode tentar se reabilitar nos intervalos de repetição documentados mesmo se a causa persistir, alternando tentativas e novos desligamentos. Portanto, a aplicação deve retirar a solicitação de movimento e investigar; não deve contar com a repetição como controle normal de corrente.

A proteção térmica desliga e só permite retorno após resfriamento com a histerese interna. A subtensão bloqueia a operação enquanto VM está abaixo do limiar e libera quando a tensão volta à faixa válida. Em todos os casos, recuperação interna não é autorização para retomar movimento.

Partes do sistema em estados diferentes

Com VM desligada, não mantenha IN1, IN2 ou NSLEEP em nível alto pelo Uno. Isso pode alimentar parcialmente circuitos internos pelo caminho das entradas. Mantenha as linhas baixas — os pull-downs da referência ajudam nesse estado — até a alimentação de potência estar válida.

Após levar nSLEEP a HIGH, o DRV8833 requer o tempo de despertar tWAKE documentado, de até 1 ms na referência. Os steps seguintes usam 2 ms como margem antes de considerar o CI disponível. Essa espera não aplica PWM e não comprova que o motor esteja parado.

Atenção

Sem ensaio destrutivo

Não tente confirmar proteções bloqueando o rotor, criando curto, removendo VM durante o movimento ou elevando deliberadamente a temperatura. Uma proteção pode reduzir danos, mas eventos repetidos ainda aquecem o módulo, a carga e a alimentação.

Aplicar a ficha técnica

Decidir com evidências

Classifique cada cenário pela ficha de referência. “Informação insuficiente” significa que faltam dados para uma decisão técnica; não significa que o caso seja seguro.

Cenários documentais: não são instruções de teste.
CenárioDecisãoJustificativa
VM = 5,0 V; partida = 0,60 A; PWM = 490 Hz; capacitores presentesCompatível com a referênciaAtende aos dados declarados
Uno mantém IN1 alto com VM desligadaBloquearPode haver alimentação parcial pela entrada
Anúncio “2 A”, sem dados térmicos, PWM ou capacitoresInformação insuficienteO anúncio não comprova a capacidade do conjunto
Motor com partida de 1,20 A na mesma placaFora da referênciaExcede a partida validada de 0,60 A; faltam dados transitórios e térmicos para liberar

Checagem de decisão

Autorizar, bloquear ou pedir dados?

Uma placa anuncia “DRV8833, 2 A”. A documentação confirma VM de 5 V e entradas compatíveis com o Uno, mas não informa capacidade contínua da placa, PWM admissível, capacitores instalados, proteção implementada nem comportamento das entradas com VM desligada. O motor tem partida de 0,60 A. Qual decisão é correta?

Passo 4 de 9

Traduzir a tabela em comandos seguros

Mapeie as entradas reais do DRV8833 para acionamento, PWM, parada e desabilitação sem tratar nSLEEP como um controle de velocidade.

Ler a tabela, não adivinhar os papéis

Tabela funcional aplicada

Entradas da ponte A não são DIR + ENABLE

No DRV8833, o canal A recebe AIN1 e AIN2. Os dois pinos, em conjunto, definem o estado da ponte; não suponha que um deles seja apenas direção e o outro apenas habilitação.

Nesta referência, os pinos do Uno R3 são IN1 = 9, IN2 = 10 e NSLEEP = 7. Os nomes “frente” e “ré” dependem dos fios do motor. Aqui, chamaremos 1/0 de frente e 0/1 de ré apenas como convenção de firmware.

A tabela funcional determina também os estados de parada. Assim, é preciso escolher explicitamente entre alta impedância, frenagem e desabilitação global.

Comandos e efeito

Estados estáticos da ponte A do DRV8833 usados como referência.

AIN1 e AIN2 definem o estado da ponte A. O PWM será uma variação temporal intencional de uma dessas entradas.
AIN1AIN2Estado da ponteUso na referência
00Alta impedânciaParada livre / PWM retirado
10Motor em um sentidoFrente convencional
01Motor no sentido opostoRé convencional
11FrenagemFrenagem elétrica, se escolhida

Aplicar PWM sem inventar uma interface genérica

PWM com estado definido

A estratégia de referência aplica PWM em uma entrada por vez e mantém a outra em nível baixo:

  • Frente: PWM em IN1 e IN2 em LOW.
  • Ré: IN1 em LOW e PWM em IN2.
  • Retirada do acionamento: IN1 e IN2 em LOW.

Quando o PWM está alto, a ponte recebe 1/0 ou 0/1 e aciona o motor. Quando está baixo, ela recebe 0/0, que corresponde à alta impedância nesta tabela. Portanto, essa estratégia alterna entre acionamento e parada livre/recirculação correspondente; ela não alterna diretamente para o estado de frenagem 1/1.

O que o PWM alterna

Estados obtidos durante cada período do PWM na estratégia de referência.
Sentido solicitadoEntrada moduladaOutra entradaPWM altoPWM baixo
FrenteIN1IN2 = 01/0: acionamento0/0: alta impedância
RéIN2IN1 = 00/1: acionamento0/0: alta impedância

PWM em uma única entrada

Diagrama com PWM em IN1 e IN2 baixo, alternando entre acionamento e alta impedância; ao lado, a configuração espelhada com PWM em IN2.

Com a outra entrada baixa, os intervalos baixos do PWM levam a ponte para 0/0, e não para frenagem.

Separar retirada de comando, frenagem e repouso

Desabilitação global e ponte não usada

nSLEEP não é uma entrada de PWM. Em nível baixo, ele coloca o dispositivo inteiro em repouso e desabilita as duas pontes: canal A e canal B. Use-o para desabilitação global, não para controle de velocidade.

Ao levar nSLEEP a nível alto, espere o tempo de despertar documentado antes de solicitar movimento. No firmware de referência, será usada uma margem de 2 ms após habilitar o driver. Esse tempo torna o CI disponível; não prova que o motor parou nem autoriza uma partida automática.

Mesmo sem motor no canal B, suas entradas não devem ficar soltas. Mantenha BIN1 e BIN2 em níveis definidos conforme a documentação do módulo; nesta referência, ambos permanecem em LOW.

Atenção

Não confunda comando elétrico com rotor parado

Nenhum destes comandos, isoladamente, confirma que o rotor chegou a zero:

  • retirar o PWM e aplicar 0/0 remove o acionamento e seleciona alta impedância;
  • comandar 1/1 seleciona frenagem elétrica prevista na tabela;
  • levar nSLEEP a baixo desabilita globalmente o CI.

Eles definem estados elétricos da ponte, não uma medição de velocidade. A sequência que exige confirmação de parada antes da reversão será tratada no próximo step.

Verificar a tradução para código

Prática: comando coerente com a tabela

Complete o trecho que implementa a estratégia de referência no canal A. pwm representa um valor entre 0 e 255. A função pararLivre() deve retirar o PWM e selecionar 0/0.

Observe que nSLEEP não aparece nas funções de sentido: ele é reservado à habilitação e à desabilitação global do driver.

Completar os comandos

Preencha somente expressões que mantenham o código C/C++ válido após a substituição.

cpp
const byte IN1 = 9;
const byte IN2 = 10;

void girarFrente(byte pwm) {
  (IN1, pwm);
  digitalWrite(IN2, );
}

void girarRe(byte pwm) {
  digitalWrite(IN1, );
  analogWrite(IN2, pwm);
}

void pararLivre() {
  digitalWrite(IN1, );
  digitalWrite(IN2, LOW);
}

Passo 5 de 9

Garantir um início sem movimento inesperado

Organize hardware e firmware para manter o motor sem acionamento durante reset, inicialização e espera por autorização.

Estado seguro começa no hardware

O reset vem antes do código

Durante reset, energização ou quando o Uno ainda não configurou os GPIOs, o firmware não controla as linhas. O estado seguro precisa, portanto, existir no hardware: AIN1 = 0, AIN2 = 0 e nSLEEP = 0.

Na referência, isso mantém a ponte A em 0/0 e o DRV8833 inteiro em repouso. O motor não recebe acionamento antes de setup() nem após um reset. O código reforça esse estado assim que começa, mas não pode desfazer um pulso que tenha ocorrido antes.

Estado definido antes de setup()

Diagrama mostrando AIN1, AIN2 e nSLEEP mantidos em nível baixo por resistores de pull-down durante o reset do Uno, com o motor parado.

Os resistores definem as entradas enquanto os GPIOs ainda estão em alta impedância.

Configuração concreta da referência

A referência usa pull-downs de 10 kΩ para GND, instalados no conector do módulo: um em AIN1, um em AIN2 e um em nSLEEP. As duas entradas da ponte não usada também ficam em nível baixo por sua rede de 10 kΩ.

Essa configuração só é liberada se o esquema do módulo confirmar que esses pinos não têm pull-up para VCC nem outra fonte que os force em nível alto. Um módulo com pull-up em nSLEEP, ou com rede desconhecida, fica bloqueado para esta prática até que sua documentação prove o estado seguro durante reset. Não tente “vencer” um pull-up acrescentando outro resistor sem analisar a rede resultante.

Dica

Critério elétrico de liberação

Com o Uno desligado ou em reset, cada pull-down mantém sua linha próxima de 0 V. Quando o Uno estiver ativo e colocar nSLEEP em HIGH, o GPIO fornecerá cerca de 0,5 mA ao pull-down de 10 kΩ em 5 V, valor compatível com uma saída digital do Uno. Os mesmos resistores não impedem os níveis altos de PWM em AIN1 ou AIN2.

Antes de conectar, confira continuidade entre cada entrada e GND pelo resistor esperado, e ausência de ligação direta dessas entradas a VCC. Faça essa inspeção sempre desenergizado.

Firmware assume o controle

O firmware assume sem comando ativo

Nesta referência, mantenha uma única pinagem em todo o firmware: IN1 = 9, IN2 = 10 e NSLEEP = 7. Os pinos 9 e 10 usam o PWM padrão do Uno; não reconfigure temporizadores.

A sequência é: pré-carregar níveis baixos, configurar as saídas, retirar qualquer PWM e conservar nSLEEP baixo. Assim, a ponte continua desabilitada depois que o firmware assume os pinos.

Inicialização segura

Use este trecho como base para as funções de inicialização deste tutorial. Ele não autoriza movimento.

cpp
const byte IN1 = 9;
const byte IN2 = 10;
const byte NSLEEP = 7;

bool driverPronto = false;

void colocarSaidasInativas() {
  analogWrite(IN1, 0);
  analogWrite(IN2, 0);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
}

void setup() {
  digitalWrite(NSLEEP, LOW);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);

  pinMode(NSLEEP, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);

  colocarSaidasInativas();
  driverPronto = false;
}

void loop() {
  // Aguarda autorização explícita.
}

Atenção

Antes de alterar a montagem

Não considere a desabilitação funcional como isolamento elétrico. nSLEEP baixo desabilita o CI, mas VM, GND, capacitores e outros condutores podem continuar energizados. Desenergize a montagem antes de mudar fios, resistores ou conexões do motor.

Autorize o movimento separadamente

Habilitar não é partir

Inicializar não é autorizar movimento. Após qualquer reset, driverPronto permanece falso e nenhum PWM anterior é restaurado. Uma ação explícita da aplicação deve habilitar o driver; somente outra ação explícita poderá aplicar PWM.

A habilitação primeiro confirma as entradas inativas, depois leva nSLEEP a HIGH e aguarda a margem documentada de 2 ms. Essa espera torna o CI disponível; ela não manda o motor girar.

Funções com responsabilidades separadas

Estas funções separam habilitação, acionamento, parada e desabilitação. A convenção de sentido segue os steps anteriores: PWM em IN1 para frente e em IN2 para ré.

cpp
void habilitarDriver() {
  colocarSaidasInativas();
  digitalWrite(NSLEEP, HIGH);
  delay(2); // margem de despertar da referência
  driverPronto = true;
}

void acionarFrente(byte pwm) {
  if (!driverPronto || pwm == 0) return;
  analogWrite(IN2, 0);
  digitalWrite(IN2, LOW);
  analogWrite(IN1, pwm);
}

void pararMotor() {
  colocarSaidasInativas();
}

void desabilitarDriver() {
  colocarSaidasInativas();
  digitalWrite(NSLEEP, LOW);
  driverPronto = false;
}

Dica

Sem retomada automática

A função pararMotor() seleciona 0/0 e retira o PWM; desabilitarDriver() acrescenta a desabilitação global por nSLEEP. Nenhuma delas deve restaurar automaticamente um comando guardado antes do reset. A autorização de movimento continua separada da inicialização.

Verifique a proteção contra partida inesperada

Complete a inicialização segura

Complete a inicialização. A última lacuna deve ser uma chamada de função C/C++ válida, incluindo os parênteses.

cpp
void setup() {
  digitalWrite(NSLEEP, );
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);

  pinMode(NSLEEP, );
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);

  ;
  driverPronto = false;
}

Decisão durante reset

Qual decisão permite liberar a referência para a prática futura?

Passo 6 de 9

Reverter somente após a parada

Estruture uma reversão em estados, bloqueando comandos até a confirmação válida de parada e cancelando a pendência em desabilitação ou falha.

Sequência que bloqueia a reversão abrupta

Reversão é uma transição, não uma troca imediata

Para inverter com segurança, não basta trocar os comandos de sentido. Ao receber um pedido oposto durante o movimento, a aplicação deve:

  1. retirar o PWM e selecionar 0/0, o estado de parada livre/recirculação previsto;
  2. registrar o sentido oposto como pendente e entrar em AGUARDANDO_PARADA;
  3. bloquear novos pedidos de movimento;
  4. receber uma confirmação válida de que o rotor parou;
  5. somente então aplicar PWM no sentido pendente.

O tempo morto interno do DRV8833 protege a transferência elétrica entre chaves. Ele não informa se o rotor ainda tem energia mecânica. Por isso, uma espera fixa no firmware não comprova parada.

Fluxo seguro de reversão

Diagrama de estados mostrando avanço, retirada do PWM, espera por confirmação de parada e ré; uma passagem direta entre os sentidos está bloqueada.

A passagem entre sentidos precisa atravessar o estado de parada pendente.

Atenção

Limite da confirmação manual

A confirmação manual é aceita aqui somente na prática didática: motor pequeno, fixado, visível e sem hélice, roda ou mecanismo acoplado. Observe sem tocar no eixo. Se houver dúvida sobre a parada, mantenha o acionamento bloqueado.

Este firmware de referência não mede velocidade. Ele não converte um atraso em confirmação automática de parada.

Estados definidos também na ponte não usada

Conexões canônicas da referência

A referência mantém a pinagem já adotada: IN1 = 9, IN2 = 10 e NSLEEP = 7. Os pinos 9 e 10 usam o PWM padrão do Uno R3.

Todos os sinais de entrada do módulo permanecem definidos por pull-downs físicos de 10 kΩ para GND. Em particular, AIN1 e AIN2 são ligados simultaneamente aos pinos D9 e D10 do Uno e, cada um, ao seu próprio pull-down. Assim, durante reset ou antes da configuração dos GPIOs, a ponte A tende a 0/0.

A ponte B não é controlada nesta prática: BIN1 e BIN2 também permanecem em nível baixo por pull-downs físicos. Essa rede só é válida após conferir no esquema que o módulo não contém pull-ups ou outra ligação incompatível que force esses pinos para nível alto.

Tabela de conexões

A configuração abaixo é exclusiva do módulo de referência documentado e da prática de baixa energia.

Sinais de controle e estados definidos da referência.
Ponto do móduloConexão ou estadoFunção
AIN1Uno D9 + pull-down de 10 kΩ para GNDPWM para frente; nível baixo no reset
AIN2Uno D10 + pull-down de 10 kΩ para GNDPWM para ré; nível baixo no reset
nSLEEPUno D7 + pull-down de 10 kΩ para GNDHabilitação global segura
BIN1Pull-down físico de 10 kΩ para GNDPonte B inativa
BIN2Pull-down físico de 10 kΩ para GNDPonte B inativa

Firmware de referência — estados e funções

Crie um único sketch e copie os três blocos deste step na ordem apresentada. Este primeiro bloco declara os estados e as funções que retiram o acionamento, habilitam e desabilitam o driver.

cpp
const byte IN1 = 9;
const byte IN2 = 10;
const byte NSLEEP = 7;
const byte PWM_RUN = 160;

enum Direcao { NENHUMA, FRENTE, RE };
enum Estado { DESABILITADO, PARADO, EM_MOVIMENTO, AGUARDANDO_PARADA };

Estado estado = DESABILITADO;
Direcao ativa = NENHUMA;
Direcao pendente = NENHUMA;

void colocarSaidasInativas() {
  analogWrite(IN1, 0);
  analogWrite(IN2, 0);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
}

void pararMotor() {
  colocarSaidasInativas(); // AIN1/AIN2 = 0/0
  ativa = NENHUMA;
}

void desabilitarDriver() {
  pararMotor();
  digitalWrite(NSLEEP, LOW);
  pendente = NENHUMA;
  estado = DESABILITADO;
  Serial.println("DRIVER DESABILITADO; NOVA AUTORIZACAO NECESSARIA");
}

void habilitarDriver() {
  colocarSaidasInativas();
  digitalWrite(NSLEEP, HIGH);
  delay(2);
  pendente = NENHUMA;
  estado = PARADO;
  Serial.println("DRIVER HABILITADO; MOTOR PARADO");
}

Confirmação explícita, sem retomada automática

Firmware de referência — movimento e bloqueio

Acrescente este bloco após o anterior. Enquanto estado for AGUARDANDO_PARADA, pedidos de frente ou ré não acionam o motor. Parada e desabilitação cancelam a pendência.

cpp
void iniciarMovimento(Direcao d) {
  colocarSaidasInativas();
  if (d == FRENTE) analogWrite(IN1, PWM_RUN);
  else analogWrite(IN2, PWM_RUN);
  ativa = d;
  pendente = NENHUMA;
  estado = EM_MOVIMENTO;
  Serial.println(d == FRENTE ? "FRENTE AUTORIZADA" : "RE AUTORIZADA");
}

void pedirMovimento(Direcao desejada) {
  if (estado == DESABILITADO) {
    Serial.println("BLOQUEADO: HABILITE PRIMEIRO");
  } else if (estado == PARADO) {
    iniciarMovimento(desejada);
  } else if (estado == EM_MOVIMENTO && desejada == ativa) {
    Serial.println("SENTIDO JA ESTA ATIVO");
  } else if (estado == EM_MOVIMENTO) {
    pararMotor();
    pendente = desejada;
    estado = AGUARDANDO_PARADA;
    Serial.println("ACIONAMENTO RETIRADO; REVERSAO PENDENTE");
  } else {
    Serial.println("BLOQUEADO: AGUARDANDO PARADA CONFIRMADA");
  }
}

void cancelarParadaPendente() {
  pararMotor();
  pendente = NENHUMA;
  if (estado != DESABILITADO) estado = PARADO;
  Serial.println("PARADA SOLICITADA; PENDENCIA CANCELADA");
}

Firmware de referência — inicialização e comandos

Acrescente o último bloco. C não é uma medição nem um temporizador: é a confirmação do operador, permitida apenas após a observação válida descrita neste step. X representa uma condição anormal já identificada pela aplicação e exige nova habilitação e nova autorização.

cpp
void setup() {
  digitalWrite(NSLEEP, LOW);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  pinMode(NSLEEP, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  colocarSaidasInativas();
  Serial.begin(115200);
  Serial.println("PRONTO: E F R S C X");
}

void loop() {
  if (!Serial.available()) return;
  char c = Serial.read();
  if (c == '\n' || c == '\r') return;
  if (c == 'X') { desabilitarDriver(); return; }
  if (c == 'S') { cancelarParadaPendente(); return; }
  if (c == 'E') {
    if (estado == DESABILITADO) habilitarDriver();
    return;
  }
  if (c == 'C') {
    if (estado == AGUARDANDO_PARADA && pendente != NENHUMA) {
      iniciarMovimento(pendente);
    } else Serial.println("SEM PARADA PENDENTE CONFIRMAVEL");
    return;
  }
  if (c == 'F') pedirMovimento(FRENTE);
  else if (c == 'R') pedirMovimento(RE);
  else Serial.println("COMANDO INVALIDO");
}
Saída esperada
PRONTO: E F R S C X
DRIVER HABILITADO; MOTOR PARADO
FRENTE AUTORIZADA
ACIONAMENTO RETIRADO; REVERSAO PENDENTE
RE AUTORIZADA

As linhas após a inicialização dependem dos caracteres enviados ao Monitor Serial. Antes de enviar C, confirme visualmente a parada somente nas condições didáticas estabelecidas.

Verifique a lógica de liberação

Ordene a reversão

Organize a sequência correta quando chega um pedido de sentido oposto enquanto o motor está em movimento.

Sequência de reversão segura

Coloque as etapas na ordem usada pela máquina de estados.

  1. Registrar o sentido oposto como pendente e bloquear pedidos de movimento
  2. Aplicar PWM no sentido pendente
  3. Retirar o PWM e selecionar o estado de parada previsto
  4. Confirmar a parada nas condições didáticas permitidas

Liberação condicionada

Complete as condições que tornam a confirmação C válida. Não use um atraso como substituto dessa condição.

cpp
if ( &&
     &&
    c == 'C') {
  iniciarMovimento(pendente);
}

Passo 7 de 9

Validar a sequência em baixa energia

Aplique uma liberação progressiva da ponte H e compare comandos do firmware com evidências da prática de baixa energia, incluindo a condição documentada da alimentação diante de energia devolvida.

Montar e liberar por etapas

Validação em três etapas

A validação avança somente quando cada etapa anterior produziu a evidência esperada:

  1. Inspeção desenergizada: confira documentação, polaridade, conexões, pull-downs e ausência de fios soltos.
  2. Sem motor: energize Uno e driver, abra o Monitor Serial em 115200 baud e confira os estados do firmware.
  3. Com motor: conecte um motor CC pequeno somente após desenergizar novamente e liberar todos os critérios elétricos.

A etapa com motor requer: alimentação de potência em 5,0 V, corrente de partida documentada de até 0,60 A, limites de dissipação e recirculação conferidos e fonte com limite de corrente ajustado em 0,70 A.

Mas atenção: limitar a corrente fornecida pela fonte não prova que ela absorve a corrente devolvida pelo motor. Libere o motor somente se a documentação da fonte ou do caminho de alimentação comprovar que VM permanece dentro dos limites diante de corrente reversa, ou se o conjunto já tiver uma solução documentada de absorção ou limitação dessa energia. Sem essa evidência, faça apenas a análise por diagramas e transcrição, sem conectar o motor.

Alimentações separadas, referência comum

Conexões exclusivas da referência com módulo documentado baseado no DRV8833. Faça ou altere qualquer conexão somente com as duas alimentações desligadas.

Cada entrada do canal A recebe simultaneamente o GPIO correspondente e seu pull-down físico de 10 kΩ. O GND é comum; os positivos das fontes não são unidos.
OrigemDestinoCondição
Uno R3 D9AIN1 do móduloPWM para frente
Resistor de 10 kΩAIN1 e GNDPull-down físico
Uno R3 D10AIN2 do móduloPWM para ré
Resistor de 10 kΩAIN2 e GNDPull-down físico
Uno R3 D7nSLEEP do móduloHabilitação global
Resistor de 10 kΩnSLEEP e GNDPull-down físico
Resistor de 10 kΩBIN1 e GNDPonte B em nível baixo
Resistor de 10 kΩBIN2 e GNDPonte B em nível baixo
Fonte isolada de 5,0 VVM e GND do móduloPositivo em VM; negativo no comum
Uno por USB ou fonte própriaUno e GND do móduloAlimentação separada; GND comum
Motor pequenoAOUT1 e AOUT2Somente na etapa final

Conferir a alimentação antes da carga

Referência elétrica da prática

Diagrama da referência com Uno alimentado separadamente, fonte isolada de 5 V no driver, terra comum, motor na saída A, pull-downs e um caminho de alimentação apto a lidar com energia devolvida.

Além do limite de corrente fornecida, a alimentação precisa ter comportamento documentado para corrente reversa ou uma solução documentada que limite ou absorva a energia devolvida.

Atenção

Condição obrigatória da alimentação

Use uma fonte de potência com saída isolada, regulada em 5,0 V e limite ajustado para 0,70 A. O GND da fonte de potência deve ser comum ao GND do Uno; os positivos permanecem separados. Nunca alimente VM pelo pino de 5 V do Uno.

O limite de 0,70 A restringe a corrente que a fonte entrega; ele não garante absorção de corrente reversa nem impede elevação de VM por energia devolvida. Antes de conectar o motor, verifique na documentação que a fonte aceita corrente reversa mantendo VM na faixa permitida, ou que existe no conjunto um circuito documentado para absorver ou limitar essa energia. Se não puder comprovar isso, não conecte o motor.

Energização sem motor: ajuste a fonte, ligue o Uno, confirme o estado inicial inativo e então ligue VM.

Para alterar fios: envie S e X, desligue VM, desligue o Uno e só então mude conexões.

Conferir o firmware sem carga

Primeira evidência: estado lógico

Com o motor ainda desconectado, carregue o firmware de referência completo do step anterior e abra o Monitor Serial em 115200 baud. Após reset, a mensagem automática é:

PRONTO: E F R S C X

Ela informa que o firmware aceita comandos; não afirma que o driver está habilitado. O estado inicial é DESABILITADO, com nSLEEP baixo e saídas inativas.

Envie E para habilitar o driver. Sem motor, esta etapa confirma a lógica de habilitação, pedidos de sentido, bloqueio de reversão e desabilitação, mas não confirma a parada de um rotor. O caractere C não é uma medição: ele representa a confirmação explícita do operador, permitida somente quando houver motor e observação válida de parada.

Exemplo

Sequência serial esperada

Esta transcrição usa exatamente o firmware do step anterior e também permite analisar integralmente a sequência sem montar o circuito:

  • Após reset: PRONTO: E F R S C X
  • E: DRIVER HABILITADO; MOTOR PARADO
  • F: FRENTE AUTORIZADA
  • R: ACIONAMENTO RETIRADO; REVERSAO PENDENTE
  • Após observar a parada válida e enviar C: RE AUTORIZADA

Depois de R, o firmware retirou o PWM e bloqueou a reversão. A mensagem RE AUTORIZADA comprova apenas que o firmware recebeu C; ela não mede velocidade nem demonstra que a parada foi observada corretamente. Sem uma fonte documentada para a energia devolvida, use esta transcrição e os diagramas como alternativa à etapa com motor.

Dica

Transição para a etapa com motor

Se o teste sem motor produzir mensagem inesperada, não conecte a carga. Envie S e X, desligue VM, mantenha as entradas baixas e investigue pinagem, taxa serial, pull-downs e alimentação com tudo desenergizado.

Mesmo que o teste lógico esteja correto, a conexão do motor continua bloqueada se não houver evidência documental sobre o comportamento de VM diante de corrente reversa.

Registrar e interromper com prudência

Atenção

Sequência de validação segura

Organize o roteiro. A última etapa só é permitida se a alimentação tiver comportamento documentado diante de energia devolvida pelo motor; caso contrário, a sequência termina na análise sem carga.

Ordem de liberação

Organize o roteiro de validação quando todos os critérios de alimentação foram documentados.

  1. Energizar novamente, acionar frente, pedir reversão, observar a parada completa e só então enviar C
  2. Com o motor desconectado, ajustar a fonte para 5,0 V e limite de 0,70 A; ligar Uno e VM e conferir os comandos no Monitor Serial
  3. Inspecionar documentação, polaridade, pull-downs e conexões com tudo desenergizado
  4. Enviar S e X, desligar VM e o Uno; comprovar na documentação a resposta da alimentação à corrente reversa ou a solução de absorção do conjunto
  5. Com as alimentações desligadas, conectar o motor pequeno, fixado e sem mecanismo acoplado

Atenção

Critérios de interrupção

Interrompa diante de ausência de partida, reset inesperado do Uno, aquecimento anormal, comportamento não previsto ou indicação documentada de proteção. Não insista no acionamento nem tente provocar curto, rotor bloqueado ou elevação de alimentação.

Envie S e X, desligue VM e investigue com as duas alimentações desenergizadas. Qualquer retomada exige nova liberação. A recuperação interna do driver não autoriza reiniciar o movimento.

Também interrompa a etapa com motor se não houver comprovação de que a alimentação suporta ou limita adequadamente a energia devolvida. Nesse caso, retorne à análise por transcrição e diagramas.

Registrar comando, evidência e decisão

Use a sequência serial fornecida como alternativa completa caso você não tenha equipamento adequado ou não consiga comprovar a condição da alimentação. Em 3 a 6 frases, diferencie:

  • a evidência de que o firmware iniciou sem autorização de movimento;
  • o comando que retira o acionamento durante a reversão;
  • a evidência física necessária antes de enviar C;
  • a condição adicional que precisa estar documentada para conectar o motor;
  • a ação correta diante de reset, aquecimento anormal ou outra anomalia.

Escreva pelo menos 140 caracteres (0/140).

Passo 8 de 9

Analisar falhas sem provocá-las

Diferencie falhas de comutação, carga e alimentação por suas evidências e escolha uma resposta prudente, sem reproduzir condições destrutivas.

Classifique pelo mecanismo físico

Três mecanismos, três caminhos

Nem toda anomalia em uma ponte H tem a mesma origem. Nesta análise documental, compare três mecanismos sem tentar reproduzi-los: condução simultânea, corrente excessiva com rotor bloqueado e elevação da alimentação por energia regenerada.

A regra é interromper a operação diante de um comportamento anormal. As proteções internas podem reduzir danos, mas não tornam seguro testar limites na montagem.

Diagrama comparando shoot-through, corrente elevada por rotor bloqueado e elevação do barramento por energia regenerada.

Os três casos podem interromper o acionamento, mas o percurso físico e a resposta necessária são diferentes.

Proteção não elimina a causa

Evidência não é diagnóstico único

Use evidências como hipóteses, não como diagnóstico definitivo. A tabela resume o que cada mecanismo sugere e o que ainda precisa ser conferido na documentação e na montagem desenergizada.

Falha, proteção e limite da aplicação

Comparação documental de falhas em uma aplicação com ponte H integrada.

Proteções e sinais variam conforme o CI e o módulo usado.
MecanismoEvidência compatívelProteção que pode atuarResponsabilidade da aplicação
Condução simultâneaCorrente abrupta na alimentação durante troca de chaveSobrecorrente, se documentadaUsar driver com intertravamento; não comandar chaves discretas diretamente
Rotor bloqueadoCorrente elevada persistente; motor não aceleraLimite de corrente ou desligamento térmico, se existentesNão manter comando; respeitar corrente de partida e limites térmicos
Energia regeneradaTensão do barramento sobe ao retirar comando ou frearSobretensão, se o dispositivo a oferecerGarantir condições de alimentação permitidas; não presumir absorção pela fonte

Ação prudente após uma anomalia

Leia sinais de falha com cautela

Se o módulo expõe um pino de falha, ele só pode ser interpretado pelo significado e pelas condições definidos na documentação daquele módulo. Um mesmo sinal pode indicar mais de uma proteção, ou nenhuma informação sobre a elevação do barramento.

Portanto, “falha ativa” não prova shoot-through, rotor bloqueado ou regeneração isoladamente. Registre o estado, interrompa o acionamento e investigue sem energizar novamente até haver uma hipótese verificável.

Atenção

Recuperação não é liberação

Não reinicie automaticamente após uma proteção. Mesmo que o driver se recupere sozinho, mantenha o movimento bloqueado. Verifique alimentação, carga, temperatura e comandos; depois exija uma nova autorização explícita para operar.

Pratique a classificação segura

Decida sem testar o limite

Associe cada evidência à hipótese mais compatível e à primeira ação segura. Considere que as evidências são didáticas: na prática, confirme-as pela documentação e pelas condições observadas, sem provocar a falha.

Atenção

Relacione a evidência ao mecanismo predominante.

Associar evidências e hipóteses

Faça as associações mais compatíveis.

Toque em um item e depois no par correspondente.

Passo 9 de 9

Revisão final: autorizar ou bloquear o acionamento

Revisão integrada dos critérios para liberar ou bloquear o acionamento de uma ponte H.

Critérios de decisão

A decisão tem três camadas

Uma decisão segura de acionamento depende de três camadas ao mesmo tempo:

  1. Capacidade elétrica: alimentação, corrente de partida, dissipação, PWM e módulo dentro dos limites documentados.
  2. Driver: proteções e prevenção de condução simultânea conforme a documentação; elas reduzem riscos internos, mas não substituem a aplicação.
  3. Sequência externa: entradas definidas no reset, PWM coerente com a recirculação prevista, parada confirmada antes de reverter e nova autorização após uma anormalidade.

Se qualquer camada falhar, o comando de movimento deve permanecer bloqueado.

Camadas de proteção complementares

Diagrama de uma ponte H conectada a motor, fonte e microcontrolador, cercada por indicadores de limites elétricos, proteção interna e sequência de firmware.

A proteção contra sobreposição é apenas uma camada: a aplicação ainda precisa respeitar limites e impedir reversões inadequadas.

Liberar ou bloquear?

Use esta tabela como critério final de liberação.

Cada condição precisa ser atendida; uma proteção interna não compensa as demais.
Condição observadaDecisãoMotivo
Reset ou inicializaçãoBloquearEntradas e PWM devem ficar inativos antes da habilitação.
Limites elétricos conferidosPode avançarMódulo, fonte e motor precisam atender às condições documentadas.
Pedido de reversão com motor ainda em movimentoBloquearRetirar acionamento não comprova que o rotor parou.
Parada confirmada, sem falhaPode liberar sentido opostoA transição externa respeita a sequência segura.
Proteção ou comportamento anormalBloquearInvestigar a causa e exigir nova autorização.

Corrija a transição bloqueada

Caso final: pedido de reversão

Considere este caso integrado: após o reset, o firmware mantém o driver sem acionamento. Uma autorização explícita libera o motor no sentido direto com PWM. Mais tarde, chega um pedido de reversão: o PWM é retirado e o firmware entra em espera de parada. Nesse intervalo, uma condição anormal é identificada.

A regra correta é: não aplicar o sentido oposto enquanto houver falha, enquanto os limites não estiverem liberados ou enquanto a parada não estiver confirmada. Não há reinício automático após a ocorrência.

Complete a condição de reversão

Complete as condições que autorizam a aplicação do sentido oposto.

cpp
if (estado == AGUARDANDO_PARADA &&
     &&
     &&
    ) {
  aplicarSentidoOposto();
  aplicarPWM(comandoPWM);
  estado = EM_MOVIMENTO;
}

Decida e justifique

Justifique a decisão final

Você está revisando o caso anterior. O motor estava em movimento direto, recebeu pedido de reversão e o PWM foi retirado. Antes da confirmação de parada, o módulo sinaliza uma condição anormal documentada.

Escreva a decisão do firmware e justifique-a usando: estado do movimento, condição do driver e necessidade de nova autorização.

Escreva pelo menos 120 caracteres (0/120).

Fechamento

Resumo

Síntese da comutação segura

  • A capacidade elétrica, as proteções documentadas e a sequência de firmware são camadas complementares.
  • Entradas definidas no reset e PWM inativo evitam movimento inesperado durante a inicialização.
  • Tempo morto e intertravamento protegem a comutação; não confirmam a parada do motor.
  • Uma reversão exige retirar o acionamento, confirmar a parada e só então autorizar o sentido oposto.
  • Após uma falha ou condição anormal, o movimento permanece bloqueado até investigação e nova autorização explícita.
  • Evitar shoot-through não protege, por si só, o motor e a alimentação contra uma reversão inadequada.

Tutorial concluído

Parabéns! Você concluiu: Comutação segura com um driver de ponte H

Agora você consegue justificar quando autorizar, bloquear ou interromper o acionamento de um motor com ponte H.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso