O motor de drone, ou melhor, o
Brushless. É sobre esse “cara” que vamos falar hoje, que é aquele tipo de motor
que não tem “escova”. Ele é bastante utilizado no aeromodelismo, principalmente
nos drones, em função de sua potência e alta rotação. Vamos, então, controlar
um motor Brushless usando ESC e ESP32, realizar uma atuação analógica no ESC
usando o controlador interno LED_PWM e usar um potenciômetro para alterar a
velocidade do motor.
Demonstração
Recursos usados
- Jumpers para conexão
- Wifi LoRa 32
- ESC-30A
- Motor A2212/13t brushless
- Cabo USB
- Potenciômetro para controle
- Protoboard
- Fonte de alimentação
Wifi LoRa 32- Pinout
ESC (Eletronic Speed Control)
Controlador de velocidade eletrônico
- Circuito eletrônico para controlar a velocidade de um motor elétrico.
- Controlado a partir de um controle PWM de servo padrão de 50Hz.
- Varia a taxa de chaveamento de uma rede de transistores de efeito de campo (FETs). Ajustando a frequência de chaveamento dos transistores, a velocidade do motor é alterada. A velocidade do motor é variada ajustando a temporização dos pulsos de corrente fornecidos aos vários enrolamentos do motor.
- Especificações:
- Corrente de saída: 30A contínuos, 40A por 10 segundos
ESC Forma de Onda (Eletronic Speed Control)
PWM de controle do servo motor
Criaremos um PWM de servo para
atuar na entrada de dados do ESC direcionando
o canal 0 do LED_PWM para o
GPIO13, e usando um potenciômetro para controlar a modulação.
Para a captura usaremos um
potenciômetro de 10k como divisor de tensão.
A captura será feita no canal ADC2_5, acessíveis pelo GPIO12.
Captura analógica
Conversão analógica para
digital
Vamos converter os valores de
AD para o PWM.
O PWM do servo é de 50Hz,
então o período do pulso é de 1/50 = 0,02 segundos ou 20 milissegundos.
Precisamos atuar no mínimo 1
milissegundo até 2 milissegundos.
Quando o PWM estiver em 4095 a
largura do pulso é de 20 milissegundos, ou seja, devemos chegar no máximo em
4095/10 para atingir 2 milissegundos, portanto PWM deverá receber 410*.
E no mínimo 1 milissegundo,
portanto 409/2 (ou 4095/20), o PWM deverá receber 205*.
* Os valores devem ser
inteiros
Circuito – Ligações
Código Fonte
Cabeçalho
#include <Wire.h> // Necessário apenas para o Arduino 1.6.5 e posterior #include "SSD1306.h" // o mesmo que #include "SSD1306Wire.h" //OLED_SDA -- GPIO4 //OLED_SCL -- GPIO15 //OLED_RST -- GPIO16 #define SDA 4 #define SCL 15 #define RST 16 SSD1306 display(0x3c, SDA, SCL, RST); //Instanciando e ajustando os pinos do objeto "display"
Variáveis
const int freq = 50; const int canal_A = 0; const int resolucao = 12; const int pin_Atuacao_A = 13; const int Leitura_A = 12; int potencia = 0; int leitura = 0; int ciclo_A = 0;
Setup
void setup() { pinMode(pin_Atuacao_A, OUTPUT); ledcSetup(canal_A, freq, resolucao); ledcAttachPin(pin_Atuacao_A, canal_A); ledcWrite(canal_A, ciclo_A); display.init(); display.flipScreenVertically(); //Vira a tela verticalmente display.clear(); //ajusta o alinhamento para a esquerda display.setTextAlignment(TEXT_ALIGN_LEFT); //ajusta a fonte para Arial 16 display.setFont(ArialMT_Plain_16); }
Loop
void loop() { leitura = analogRead(Leitura_A); ciclo_A = map(leitura, 0, 4095, 205, 410); ledcWrite(canal_A, ciclo_A); potencia = map(leitura, 0, 4095, 0, 100); display.clear();//limpa o buffer do display display.drawString(0, 0, String("AD:")); display.drawString(32, 0, String(leitura)); display.drawString(0, 18, String("PWM:")); display.drawString(48, 18, String(ciclo_A)); display.drawString(0, 36, String("Potência:")); display.drawString(72, 36, String(potencia)); display.drawString(98, 36, String("%")); display.display(); //mostra no display }
6 Comentários
Os links não funcionam.
ResponderExcluirAtualizado amigo. Obrigado por avisar!
ExcluirO arquivo está danificado Fernando!!!
ResponderExcluirO arquivo .pdf estar danificado Fernando!!!
ResponderExcluirBoa noite Fernando. Gostaria de saber, se a ESP 32 consegue manter quatro motores brushless ligado ao mesmo tempo? Agradeço desde já
ResponderExcluirOla Fernando, copiei seu programa ControlePonteHVelocidade2
ResponderExcluire tenho um problema na linha:
SSD1306 display(0x3c, SDA, SCL, RST);
com a seguinte saída de erro do compilador:
invalid conversion from "int" to OLEDDISPLAY_GEOMETRY
Poderia me dizer o que é?
OBRIGADO