banner

Ir para o Forum

Motor de Drone controlado por ESP32 LoRa



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

}




Faça o download dos arquivos

INO

PDF




5 comentários:

Tecnologia do Blogger.