AVISO: Las imagenes ofrecidas de la app Blynk estan desactualizadas, la plataforma ha cambiado en la actualidad.
En este Sketch vamos a poner en practica el control entre 1 a 20 rpm de un motor paso a paso como el 17hd48002H-22b o equivalente con nuestro driver TMC2209 y la APP de Blynk. Si quieres entretenerte en comprobar los calculos hechos en el sketch y ponerlos en práctica, quizas pueda servirte para algun proyecto que tengas en la cabeza o te de la luz para otro.

En la APP utilizamos tres widgets: dos medidores configurados para leer dos decimales y un Joystick con solo uso del eje X con medición entre 0 y 1066
La eleccion de 1066 es debido a que en su punto medio la lectura sera de 533 y el medidor de rpm en sentido CCW utilizara de 533-0 y el medidor rpm CW de 533-1066

Componentes necesarios:
Al utilizar el motor 17hd48002H-22b , necesitaremos una regulación de tensión de 6.5V para una vez ajustado el driver TMC2209 obtengamos un consumo de entre 400-500 mA.
Al utilizar Blynk, solo necesitaremos la placa Esp32 y el montaje lo dejo a la elección de cada uno, con lo que presupongo que ya se tiene experiencia en el conexionado de estos motores y el driver especificado. Si no es asi ,se puede consultar estas claves
Las claves:
- Entender como funcionan las salidas PWM y las funciones LEDC
- Conocer la relación entre frecuencias y RPM
SKETCH COMPLETO:
const int pin_step1 = 0;
const int pin_ena1 = 4;
const int pin_dir1 = 15;
int dutyCycle = 127;
#define Vref 533
int vmotor1 = 533;
// setting PWM properties
const int step1Channel = 10;
const int resolution = 8;
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = "XXXXXXXXX";
char ssid[] = "---";
char pass[] = "---";
BLYNK_WRITE(V10) {
vmotor1 = param.asInt(); // assigning incoming value from pin V1 to a variable
}
void Rpm1R() {
float R = (vmotor1 - Vref) / 53.3;
Blynk.virtualWrite(V2, R);
}
void Rpm1L() {
float L = (Vref - vmotor1) / 53.3;
Blynk.virtualWrite(V3, L);
}
BlynkTimer timer1; // Announcing the timer1
BlynkTimer timer2; // Announcing the timer2
void Motor1(){
float freqr = (vmotor1-Vref);
float freql=(Vref-vmotor1);
if (freqr/53.33 >=1) {
digitalWrite(pin_ena1, LOW);
digitalWrite(pin_dir1,HIGH);
ledcSetup(step1Channel,freqr, resolution);
ledcWrite(step1Channel, dutyCycle);
delay(500);
}
else {
digitalWrite(pin_ena1, HIGH);
}
if (freql/53.33 >= 1) {
digitalWrite(pin_ena1, LOW);
digitalWrite(pin_dir1,LOW);
ledcSetup(step1Channel,freql, resolution);
ledcWrite(step1Channel, dutyCycle);
delay(500);
}
}
void setup()
{
//pinMode(pin_step1, OUTPUT);
pinMode(pin_ena1, OUTPUT);
pinMode(pin_dir1, OUTPUT);
digitalWrite(pin_ena1, HIGH);
digitalWrite(pin_dir1, HIGH);
ledcAttachPin(pin_step1, step1Channel);
Blynk.begin(auth, ssid, pass);
// You can also specify server:
Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
//Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);
// Setup a function to be called every second
timer1.setInterval(500L, Rpm1R); //timer will run every sec
timer2.setInterval(500L, Rpm1L); //timer will run every sec
}
void loop()
{
Blynk.run();
timer1.run();
timer2.run();
Motor1();
}