Control de un motor Dc con un sensor ultrasónico y un puente H ajustando el ciclo de trabajo del mismo

Dependencies:   mbed HCSR04

Proyecto final Sistemas Microprocesados Universidad Politécnica Salesiana

Control PWM con Sensor HCSR04

En la implementación de este proyecto se utilizan las herramientas que se aprendieron a lo largo del curso e implementarlas dentro de un microprocesador.

¿Que es un sensor de ultra sonidos?

Un sensor de ultra sonidos es un dispositivo para medir distancias. Su funcionamiento se base en el envío de un pulso de alta frecuencia, no audible por el ser humano. Este pulso rebota en los objetos cercanos y es reflejado hacia el sensor, que dispone de un micrófono adecuado para esa frecuencia.
arduino ultrasonido
Midiendo el tiempo entre pulsos, conociendo la velocidad del sonido, podemos estimar la distancia del objeto contra cuya superficie impacto el impulso de ultrasonidos.

¿CÓMO FUNCIONA UN SENSOR DE ULTRASONIDOS?

El sensor se basa simplemente en medir el tiempo entre el envío y la recepción de un pulso sonoro. Sabemos que la velocidad del sonido es 343 m/s en condiciones de temperatura 20 ºC, 50% de humedad, presión atmosférica a nivel del mar. Transformando unidades resulta

https://os.mbed.com/media/uploads/carlosm93/eq1.png

Diagrama de conexion en Arduino

Se adjunta la conexión con una placa arduino UNO, en nuestro caso lo realizaremos con nuestra placa de entrenamiento STM32F4 discovery.
https://os.mbed.com/media/uploads/carlosm93/arduino-ultrasonidos-esquema-electrico.png

Montaje en Arduino

https://os.mbed.com/media/uploads/carlosm93/arduino-ultrasonidos-montaje.png
Para activar el sensor necesitamos generar un pulso eléctrico en el pin Trigger (disparador) de al menos 10us. Previamente, utilizaremos la librería HCSR04.h proveniente de https://os.mbed.com/users/aralshukaili/code/HCSR04/

Recomendación!

Los pines a utilizar en la tarjeta STM32F4 son PB6 y PB7, se adjunta el Pinout de la placa con sus respectivas funcionalidades para cada pin, en este caso dichos pines son Rx y Tx, el primero para recepción y el segundo para transmisión, en la comunicación serial con Hercules se utilizan los pines PA2, PA3 ademas se utilizan leds indicadores para las distancias, estos son los pines PD13 y PD14 de la placa.


https://os.mbed.com/media/uploads/carlosm93/stm32f4-discovery-pinout.png

Codigo para programar sensor ultrasónico con librería


main.cpp

#include "mbed.h"
#include "HCSR04.h"
HCSR04 ultrasonico(PB_6,PB_7); //PB6 pin TX y pb7 pin RX estos pines se usan para transmision y recepcion de datos
DigitalOut VERDE(PD_13);// LED PARA INDICAR DISTANCIA MAYOR A 50 CM
DigitalOut NARANJA(PD_14); // LED PARA INDICAR DISTANCIA MENOR O IGUAL A 10CM
Serial comunicacion(PA_2,PA_3); // PINES DE COMUNICACION SERIAL
int main() {
    comunicacion.baud(115200); // VELOCIDAD DE COMUNICACION
    comunicacion.printf("comienzo"); //IMPRIMIR PALABRA COMIENZO
    while(1) {
        long d= ultrasonico.distance(1);
        comunicacion.printf("Distancia:%i\n\r",ultrasonico.distance(1));
        if(d<=10) { // DISTANCIA MENOR O IGUAL A 10CM
            VERDE=0;
            NARANJA=1;
        }
        if(d>=50) { //DISTANCIA MAYOR IGUAL A 50CM
            VERDE=1;
            NARANJA=0;
        }
        wait(0.1);

    }
}


Conexión con Puente H TB6612FNG


Primero deberemos estudiar el concepto de puente H y el driver con el que se trabaja para hacer la modulación de ancho de pulso para controlar a dos motores, entonces surge la siguiente pregunta:

¿Qué es un TB6612FNG ?

El TB6612FNG es un controlador (driver) de motores que nos permite manejar dos motores de corriente continua desde Arduino, variando tanto la velocidad como el sentido de giro.

https://os.mbed.com/media/uploads/carlosm93/tb6612fngcomparacion.jpg

El TB6612FNG puede ser considerado una versión mejorada del L298N. Al igual que esté, internamente está formado por dos puentes-H, junto con la electrónica necesaria para simplificar su uso, y eliminar posibles cortocircuito por errores de uso.

https://os.mbed.com/media/uploads/carlosm93/l298n_6_iso.jpg
Sin embargo, en el caso del TB6612FNG los puentes-H están formados por transistores MOSFET, en lugar de transistores BJT como en el L298N. Esto permite que el TB6612FNG tiene mejor eficiencia y menores dimensiones que el L298N.

El TB6612FNG también permite controlar intensidades de corriente superiores, siendo capaz de suministrar 1.2A por canal de forma continua, y 3.2A de pico. Recordar que el L298N tiene una intensidad máxima teórica de 2A, pero las pérdidas hace que en la práctica sólo pueda suministrar 0.8-1A.
https://os.mbed.com/media/uploads/carlosm93/tb6612fng_2_verde.jpg

Diagrama de Conexiones en Arduino

El esquema de montaje no es demasiado complicado. Por un lado, suministramos la tensión que alimentará el motor desde una fuente de alimentación externa, mediante el pin VM. La tensión máxima es de 15V.
Además, tenemos que alimentar la electrónica del módulo mediante el pin VCC. El rango de tensión para VCC es 2.7 a 5.5V, para el control del módulo los pines AIN1, AIN2 Y PWMA controlan el canal A, mientras que los pines BIN1, BIN2, y PWMB controlan el canal B.

Information

Finalmente, el pin STBY controla el modo Standby. Debemos ponerlo en HIGH para activar el motor. Podemos conectarlo a un pin digital de Arduino, si queremos poder activar el modo Standby, o conectarlo a VCC si queremos dejarlo permanentemente desconectado


https://os.mbed.com/media/uploads/carlosm93/tb6612fng_arduino_hookup_rojo.png

Programación en Mbed

En la programación en C++ de la plataforma Mbed Declaramos dos PwmOut, para utilizar el control por ancho de pulso en el puente H, ademas declaramos 4 salidas digitales para controlar la dirección de los motores y proponer la rutina controlada por el sensor ultrasónico, se utiliza la interface ticker para realizar el PWM por medio de interrupciones para llamar a una función en un momento especifico de tiempo, por eso se utiliza void flip_n para establecer el estado de los pines que controlan la dirección de los motores, se declara una frecuencia de 100Hz y un ciclo de trabajo al 100%.

main.cpp

#include "mbed.h"
#include "HCSR04.h" //https://os.mbed.com/users/aralshukaili/code/HCSR04/
HCSR04 ultrasonico(PB_6,PB_7); //PB6 pin TX y pb7 pin RX estos pines se usan para transmision y recepcion de datos
Ticker flipper1; // INTERRUPCION 1
Ticker flipper2; // INTERRUPCION 2
PwmOut en(PB_1); // SALIDA PWM CONTROL MOTOR 1
PwmOut en2(PB_0); // SALIDA PWM CONTROL MOTOR 2
DigitalOut in1(PD_12);// SENTIDO DE GIRO 1 MOTOR 1
DigitalOut in2(PA_1); // SENTIDO DE GIRO 2 MOTOR 1
DigitalOut in3(PA_7); // SENTIDO DE GIRO 1 MOTOR 2
DigitalOut in4(PA_6); // SENTIDO DE GIRO 2 MOTOR 2
DigitalOut VERDE(PD_13);// LED PARA INDICAR DISTANCIA MAYOR A 50 CM
DigitalOut NARANJA(PD_14); // LED PARA INDICAR DISTANCIA MENOR O IGUAL A 10CM
Serial comunicacion(PA_2,PA_3); // PINES DE COMUNICACION SERIAL

void flip1()   // flip 1 function
{
    in1 = 0;
    in2 = 1;
    in3 = 0;
    in4 = 1;
}
void flip2()   // flip 2 function
{
    in1=1;
    in2=0;
    in3=1;
    in4=0;
}
int main()
{
    en.period(0.01); //PERIODO A UNA FRECUENCIA DE 100 HZ
    en=1; //CICLO DE TRABAJO AL 100%
    en2.period(0.01); //PERIODO A UNA FRECUENCIA DE 100 HZ
    en2=1; //CICLO DE TRABAJO AL 100%
    in1=0;
    in2=0;
    in3=0;
    in4=0;
    comunicacion.baud(115200); // VELOCIDAD DE COMUNICACION
    comunicacion.printf("comienzo"); //IMPRIMIR PALABRA COMIENZO
    while(1) {
        long d= ultrasonico.distance(1);
        comunicacion.printf("Distancia:%i\n\r",ultrasonico.distance(1));
        if(d<=10) { // DISTANCIA MENOR O IGUAL A 10CM
            VERDE=0;
            NARANJA=1;
            flipper1.attach(&flip1, 0.5); //INTERRUPCION PARA CICLO DE TRABAJO AL 100%
            
        }
        if(d>=50) { //Detener Motores
            VERDE=1;
            NARANJA=0;
            in1=0;
            in2=0;
            in3=0;
            in4=0;
        }
        wait(0.1);
    }
}

Video en youtube



Imagenes del proyecto

https://os.mbed.com/media/uploads/carlosm93/whatsapp_image_2020-02-14_at_17.03.04_-2-.jpeg

https://os.mbed.com/media/uploads/carlosm93/whatsapp_image_2020-02-14_at_17.03.05_-1-.jpeg

Referencias

Conclusiones

A diferencia de arduino, con el microcontrolador STM32 se tiene una respuesta mas rápida y eficaz al momento de usar interrupciones, en arduino tenemos el problema que el microntrolador se queda inhibido por la ejecución de las interrupciones.

Committer:
carlosm93
Date:
Thu Feb 13 23:43:23 2020 +0000
Revision:
1:7aa614992c78
Parent:
0:f3a013103ee4
HCSR04

Who changed what in which revision?

UserRevisionLine numberNew contents of line
carlosm93 0:f3a013103ee4 1 #include "mbed.h"
carlosm93 0:f3a013103ee4 2 #include "HCSR04.h" //https://os.mbed.com/users/aralshukaili/code/HCSR04/
carlosm93 0:f3a013103ee4 3
carlosm93 0:f3a013103ee4 4 HCSR04 ultrasonico(PB_6,PB_7); //PB6 pin TX y pb7 pin RX estos pines se usan para transmision y recepcion de datos
carlosm93 0:f3a013103ee4 5 Ticker flipper1;
carlosm93 0:f3a013103ee4 6 Ticker flipper2;
carlosm93 0:f3a013103ee4 7 PwmOut en(PB_1);
carlosm93 0:f3a013103ee4 8 DigitalOut in1(PD_12);
carlosm93 0:f3a013103ee4 9 DigitalOut in2(PA_1);
carlosm93 0:f3a013103ee4 10 DigitalOut in3(PA_7);
carlosm93 0:f3a013103ee4 11 DigitalOut in4(PA_6);
carlosm93 0:f3a013103ee4 12 DigitalOut VERDE(PD_13);
carlosm93 0:f3a013103ee4 13 DigitalOut NARANJA(PD_14);
carlosm93 0:f3a013103ee4 14 Serial comunicacion(PA_2,PA_3);
carlosm93 0:f3a013103ee4 15 void flip1() // flip 1 function
carlosm93 0:f3a013103ee4 16 {
carlosm93 0:f3a013103ee4 17 in1 = 0;
carlosm93 0:f3a013103ee4 18 in2 = 1;
carlosm93 0:f3a013103ee4 19 }
carlosm93 0:f3a013103ee4 20 void flip2() // flip 2 function
carlosm93 0:f3a013103ee4 21 {
carlosm93 0:f3a013103ee4 22 in1=1;
carlosm93 0:f3a013103ee4 23 in2=0;
carlosm93 0:f3a013103ee4 24 }
carlosm93 0:f3a013103ee4 25
carlosm93 0:f3a013103ee4 26 int main()
carlosm93 0:f3a013103ee4 27 {
carlosm93 0:f3a013103ee4 28 en.period(0.01);
carlosm93 0:f3a013103ee4 29 en=0.5;
carlosm93 0:f3a013103ee4 30 in1 = 0;
carlosm93 0:f3a013103ee4 31 in2 = 0;
carlosm93 0:f3a013103ee4 32 comunicacion.baud(115200);
carlosm93 0:f3a013103ee4 33 comunicacion.printf("comienzo");
carlosm93 0:f3a013103ee4 34 while(1) {
carlosm93 0:f3a013103ee4 35 long d= ultrasonico.distance(1);
carlosm93 0:f3a013103ee4 36 comunicacion.printf("Distancia:%i\n\r",ultrasonico.distance(1));
carlosm93 0:f3a013103ee4 37 if(d<=10) {
carlosm93 0:f3a013103ee4 38 VERDE=0;
carlosm93 0:f3a013103ee4 39 NARANJA=1;
carlosm93 0:f3a013103ee4 40 flipper1.attach(&flip1, 1.0); // the address of the
carlosm93 0:f3a013103ee4 41 // function to be attached
carlosm93 0:f3a013103ee4 42 // and the interval (sec)
carlosm93 0:f3a013103ee4 43 }
carlosm93 0:f3a013103ee4 44 if(d>=200) {
carlosm93 0:f3a013103ee4 45 VERDE=1;
carlosm93 0:f3a013103ee4 46 NARANJA=0;
carlosm93 0:f3a013103ee4 47 in1=0;
carlosm93 0:f3a013103ee4 48 in2=0;
carlosm93 0:f3a013103ee4 49 // spin in a main loop
carlosm93 0:f3a013103ee4 50 // flipper will interrupt it to call flip
carlosm93 0:f3a013103ee4 51 }
carlosm93 0:f3a013103ee4 52
carlosm93 0:f3a013103ee4 53 if(d>=11 && d<=39) {
carlosm93 0:f3a013103ee4 54 VERDE=0;
carlosm93 0:f3a013103ee4 55 NARANJA=0;
carlosm93 0:f3a013103ee4 56
carlosm93 0:f3a013103ee4 57
carlosm93 0:f3a013103ee4 58 }
carlosm93 0:f3a013103ee4 59 wait(0.1);
carlosm93 0:f3a013103ee4 60
carlosm93 0:f3a013103ee4 61 }
carlosm93 0:f3a013103ee4 62 }