Tutorial ESP32 49/55 - Controle de Motor DC pela Internet usando Adafruit IoT | Kit ESP32 da SunFounder
Neste tutorial, iremos explorar como controlar um motor DC pela internet usando o ESP32 e o serviço Adafruit IO MQTT. A velocidade e a direção do motor DC podem ser manipuladas remotamente, permitindo um controle eficiente de qualquer lugar com conexão à internet. Este projeto demonstra as capacidades do microcontrolador ESP32, que possui Wi-Fi integrado, tornando-o ideal para aplicações de Internet das Coisas (IoT).
Estaremos implementando um sistema onde o motor pode ser ligado, desligado e sua velocidade ajustada através de uma interface web conectada ao Adafruit IO. Os usuários podem se inscrever em tópicos específicos para controle do motor e ajustar parâmetros de acordo. Para entender melhor o processo, não deixe de conferir o vídeo que acompanha este tutorial (no vídeo em 00:00).
Hardware Explicado
Para este projeto, utilizaremos o microcontrolador ESP32, que é o coração do nosso sistema. O ESP32 é capaz de lidar com comunicações Wi-Fi, tornando-o perfeito para nossa aplicação IoT. Ele se conecta à plataforma Adafruit IO, permitindo-nos enviar e receber mensagens via protocolo MQTT.
Além disso, estaremos utilizando o driver de motor L293D, que é essencial para controlar o motor DC. O L293D pode acionar dois motores DC e permite o controle de ambas as direções e velocidade através da Modulação por Largura de Pulso (PWM). Ele atua essencialmente como uma interface entre o ESP32 e o motor, gerenciando a corrente mais alta exigida pelo motor enquanto isola o ESP32 de quaisquer sinais de contra-eletr EMF potencialmente prejudiciais.
Detalhes da Ficha Técnica
| Fabricante | Texas Instruments |
|---|---|
| Número da peça | L293D |
| Tensão de lógica/IO | 4,5 - 36 V |
| Tensão de alimentação | 4,5 - 36 V |
| Corrente de saída (por canal) | 600 mA |
| Corrente de pico (por canal) | 1.2 A |
| Orientação sobre a frequência PWM | 10 kHz (típ.) |
| Limiares de lógica de entrada | 0,8 V (alto), 2,0 V (baixo) |
| Queda de tensão / RDS(on)saturação | 1,5 V máx |
| Limites térmicos | 150 °C |
| Pacote | DIP-16 |
| Notas / variantes | Driver half-H de alta corrente quádruplo |
- Assegure um adequado dissipador de calor para operação contínua.
- Use PWM para controlar efetivamente a velocidade do motor.
- Observe os limites de tensão de entrada para evitar danos.
- Verifique as conexões de aterramento adequadas entre todos os componentes.
- Tenha cuidado com a força contra-eletromotriz; use diodos se necessário.
- Verifique a fiação novamente, pois a polaridade pode afetar a direção do motor.
- Teste com uma voltagem mais baixa antes da operação completa.
- Fique atento ao superaquecimento durante o uso prolongado.
- Certifique-se de debounçar os interruptores mecânicos se forem utilizados.
- Certifique-se de que o ESP32 não esteja sobrecarregado pela corrente do motor.
Instruções de Fiação
Comece conectando a fonte de alimentação. Conecte o terminal positivo da sua fonte de alimentação externa ao pino VCC do L293D (pino 8) e o terra ao pino GND (pino 4). Certifique-se de que o ESP32 esteja alimentado separadamente, se necessário, normalmente através de uma conexão micro USB.
Em seguida, conecte o motor ao L293D. Um terminal do motor deve ser conectado ao pino de saída 3 (pino 2 do L293D) e o outro terminal ao pino de saída 6 (pino 7 do L293D). Para os sinais de controle, conecte o pino 13 do ESP32 ao pino de entrada 2 (pino 1 do L293D) e o pino 14 ao pino de entrada 7 (pino 2 do L293D). O pino de habilitação (pino 1) também deve ser conectado à alimentação de 5V para ativar o driver. Por último, certifique-se de que o terra do ESP32 esteja conectado ao terra do L293D para uma referência comum.
Exemplos de Código e Passo a Passo
O código fornecido inicializa as bibliotecas necessárias e configura o cliente Wi-Fi e MQTT. Os identificadores-chave incluemmotorSpeed,motorDirection, emotorStart, que gerenciam a operação do motor com base nos comandos recebidos do Adafruit IO.
bool debug = false;
#define motor1A 13
#define motor2A 14
int motorSpeed = 0;
int motorDirection = 1;
int motorStart = 1;
Neste trecho, os pinos do motor são definidos junto com variáveis iniciais para controlar a velocidade, a direção e o estado de início/parada do motor. A variávelmotorSpeedserá ajustado com base nas entradas do Adafruit IO.
void setup() {
Serial.begin(115200);
WiFi.begin(WLAN_SSID, WLAN_PASS);
delay(2000);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
Na função de configuração, a comunicação serial é iniciada e o ESP32 se conecta à rede Wi-Fi especificada. Essa conexão é crucial para habilitar a comunicação MQTT.
void loop() {
MQTT_connect();
mqtt.processPackets(500);
runMotor();
}
Esta função de loop estabelece a conexão MQTT e processa os pacotes recebidos para controlar o motor com base nos últimos comandos recebidos. A funçãorunMotor()é chamada para aplicar as configurações atuais ao motor.
Demonstração / O que Esperar
Quando a configuração estiver completa e o código for carregado, você deverá ser capaz de controlar o motor através do painel do Adafruit IO. Você pode ajustar a velocidade do motor usando um controle deslizante e mudar sua direção com um interruptor. Se tudo estiver conectado corretamente, o motor responderá a esses comandos em tempo real, destacando a baixa latência do sistema (no vídeo em :00).
Problemas comuns incluem a direção do motor invertida devido a fiação incorreta, então verifique novamente as conexões se o motor não se comportar como esperado. Além disso, certifique-se de que seus tópicos MQTT estão configurados corretamente no Adafruit IO para corresponder ao código.
Marcação de Vídeo
- 00:00 Início
- 2:21 Introdução ao projeto
- 4:20 Como o Motor DC é controlado
- 6:39 Driver de Motor L293D
- 11:42 O que é MQTT?
- 15:03 Configuração do Adafruit IO
- 19:17 Explicação da Fiação
- 22:42 Código explicado
- 35:28 Demonstração do Projeto
/*
* Este é um esboço Arduino para ESP32 para motor DC usando o serviço MQTT da Adafruit
* Assista ao vídeo de instruções https://youtu.be/OUgyPXNYg3g
* 📚⬇️ Página de download e recursos https://robojax.com/RJT673
* Escrito por Ahamd Shamshiri
* em 18 de fevereiro de 2024
*
* Biblioteca Adafruit MQTT exemplo ESP32 Adafruit IO SSL/TLS
*
* /// ref: https://www.electronicwings.com/esp32/esp32-mqtt-client
*/
bool debug = false;
#define motor1A 13
#define motor2A 14
// Configurações PWM
const int freq = 500; // Frequência PWM: 500 Hz
const int resolution = 8; // Resolução PWM: 8 bits
const int channelA = 0; // Canal PWM para motor1A: 0
const int channelB = 1; // Canal PWM para motor2A: 1
char* dir[]={"CCW", "CW"};
int motorSpeed =0;
int motorDirection =1;
int motorStart = 1;
int dutyCycle =0;
#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
/*
* Ponto de Acesso WiFi *********************************/
*
* #define WLAN_SSID "Book"
* #define WLAN_PASS "88888888"
*
* ************************* Configuração Adafruit.io
*/
#define AIO_SERVER "io.adafruit.com"
// Usando a porta 8883 para MQTTS
#define AIO_SERVERPORT 8883
// Configuração da Conta Adafruit IO
// (para obter esses valores, visite https://io.adafruit.com e clique em Chave Ativa)
// #define AIO_USERNAME "SEU_NOME_DE_USUÁRIO_ADAFRUIT_IO"
// #define AIO_KEY "SUA_CHAVE_ADAFRUIT_IO"
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_jHpm60SEsWUdU5x472FViZjWzsY9"
/*
* Estado Global (você não precisa mudar isso!) ******************/
*
* // WiFiFlientSecure para suporte SSL/TLS
* WiFiClientSecure client;
*
* // Configurar a classe do cliente MQTT passando o cliente WiFi e os detalhes do servidor e login MQTT.
* Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
*
* // CA root do io.adafruit.com
* const char* adafruitio_root_ca = \
* "-----BEGIN CERTIFICATE-----\n"
* "MIIEjTCCA3WgAwIBAgIQDQd4KhM/xvmlcpbhMf/ReTANBgkqhkiG9w0BAQsFADBh\n"
* "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
* "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
* "MjAeFw0xNzExMDIxMjIzMzdaFw0yNzExMDIxMjIzMzdaMGAxCzAJBgNVBAYTAlVT\n"
* "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
* "b20xHzAdBgNVBAMTFkdlb1RydXN0IFRMUyBSU0EgQ0EgRzEwggEiMA0GCSqGSIb3\n"
* "DQEBAQUAA4IBDwAwggEKAoIBAQC+F+jsvikKy/65LWEx/TMkCDIuWegh1Ngwvm4Q\n"
* "yISgP7oU5d79eoySG3vOhC3w/3jEMuipoH1fBtp7m0tTpsYbAhch4XA7rfuD6whU\n"
* "gajeErLVxoiWMPkC/DnUvbgi74BJmdBiuGHQSd7LwsuXpTEGG9fYXcbTVN5SATYq\n"
* "DfbexbYxTMwVJWoVb6lrBEgM3gBBqiiAiy800xu1Nq07JdCIQkBsNpFtZbIZhsDS\n"
* "fzlGWP4wEmBQ3O67c+ZXkFr2DcrXBEtHam80Gp2SNhou2U5U7UesDL/xgLK6/0d7\n"
* "6TnEVMSUVJkZ8VeZr+IUIlvoLrtjLbqugb0T3OYXW+CQU0kBAgMBAAGjggFAMIIB\n"
* "PDAdBgNVHQ4EFgQUlE/UXYvkpOKmgP792PkA76O+AlcwHwYDVR0jBBgwFoAUTiJU\n"
* "IBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsG\n"
* "AQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMDQGCCsGAQUFBwEB\n"
* "BCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEIGA1Ud\n"
* "HwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEds\n"
* "b2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEW\n"
* "HGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDQYJKoZIhvcNAQELBQADggEB\n"
* "AIIcBDqC6cWpyGUSXAjjAcYwsK4iiGF7KweG97i1RJz1kwZhRoo6orU1JtBYnjzB\n"
* "c4+/sXmnHJk3mlPyL1xuIAt9sMeC7+vreRIF5wFBC0MCN5sbHwhNN1JzKbifNeP5\n"
* "ozpZdQFmkCo+neBiKR6HqIA+LMTMCMMuv2khGGuPHmtDze4GmEGZtYLyF8EQpa5Y\n"
* "jPuV6k2Cr/N3XxFpT3hRpt/3usU/Zb9wfKPtWpoznZ4/44c1p9rzFcZYrWkj3A+7\n"
* "TNBJE0GmP2fhXhP1D/XVfIW/h0yCJGEiV9Glm/uGOa3DXHlmbAcxSyCRraG+ZBkA\n"
* "7h4SeM6Y8l/7MBRpPCz6l8Y=\n"
* "-----END CERTIFICATE-----\n";
*
* /****************************** Feeds
*/
// Configurar um feed chamado 'test' para publicação e 'test2' para assinatura.
// Observe que os caminhos MQTT para AIO seguem a forma: <username>/feeds/<feedname>
Adafruit_MQTT_Subscribe MOTOR_SPEED = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/motor.speed");
Adafruit_MQTT_Subscribe MOTOR_DIRECTION = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/motor.direction");
Adafruit_MQTT_Subscribe MOTOR_START = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/motor.start");
Common Course Links
Common Course Files
Recursos e referências
Ainda não há recursos.
Arquivos📁
Nenhum arquivo disponível.