ESP32 LoRa Controlled Drone Engine

by Fernando Koyanagi in Circuits > Microcontrollers

14992 Views, 9 Favorites, 0 Comments

ESP32 LoRa Controlled Drone Engine

Motor de Drone controlado por ESP32 LoRa
1.png

Today we’re discussing drone engines, frequently called “brushless” motors. They’re widely used in aeromodelling, mainly in drones, due to their power and high rotation. We’ll learn about controlling a brushless motor using ESC and ESP32, performing an analogic actuation on the ESC using the internal LED_PWM controller, and using a potentiometer to change the motor speed.

Demonstration

demo.jpg

Resources Used

4.png

  • Jumpers for connection
  • Wifi LoRa 32
  • ESC-30A
  • Brushless A2212 / 13t Engine
  • USB cable
  • Potentiometer for control
  • Protoboard
  • Power supply

Wifi LoRa 32- Pinout

6.png

ESC (Electronic Speed Control)

7.png
8.png

  • Electronic Speed Controller
  • Electronic circuit to control the speed of an electric motor.
  • Controlled from a standard 50Hz PWM servo control.
  • It varies the switching rate of a network of field effect transistors (FETs). By adjusting the switching frequency of the transistors, the motor speed is changed. The motor speed is varied by adjusting the timing of the supplied current pulses to the various windings of the motor.
  • Specifications:

Output current: 30A continuous, 40A for 10 seconds

ESC Electronic Speed Control (ESC)

9.png

PWM Servo Motor Control

10.png

We will create a PWM servo to act on ESC data input by directing channel 0 of the LED_PWM for the GPIO13, and use a potentiometer to control the modulation.

For the capture, we will use a potentiometer of 10k as a voltage divider. The capture will be done on channel ADC2_5, accessible by GPIO12.

Analog Capture

11.1.png
11.2.png

Analog to digital conversion

We’ll convert the values of AD to the PWM.

The PWM of the servo is 50Hz, so the pulse period is 1/50 = 0.02 seconds or 20 milliseconds.

We need to act in at least 1 millisecond to 2 milliseconds.

When the PWM is at 4095, the pulse width is 20 milliseconds, meaning we should reach the maximum at 4095/10 to reach 2 milliseconds, so PWM should receive 410 *.

And after at least 1 millisecond, therefore 409/2 (or 4095/20), the PWM should receive 205 *.

* Values must be integers

Circuit - Connections

12.png

Source Code

Header

#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"

Variables

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 }

Files

Download the files

INO

PDF