Dise帽ar coche teledirigido por bluetooth

El proyecto consiste en dise帽ar un coche teledirigido por bluetooth con detecci贸n de obst谩culos (ver en github). El coche ser谩 controlado con tel茅fono android, gracias a esta aplicaci贸n.

Se trata del proyecto final de la asignatura Dise帽o de Sistemas Basados en Microprocesador (18-19) del grado en Ingenier铆a Inform谩tica de la Escuela Superior de Inform谩tica de Ciudad Real (UCLM).

Funcionamiento

Cuando se pulse el bot贸n de alguna direcci贸n el coche comprobar谩 si no hay obst谩culos, y si es as铆, empezar谩 a moverse hacia esa direcci贸n. Si en alg煤n momento detecta un obst谩culo se parar谩 hasta que se reciba otra direcci贸n o el obst谩culo ya no est茅. Para parar el coche se ha implementado el bot贸n del c铆rculo.

Cabe destacar, que cuando le mandemos la orden de dirigirse hacia atr谩s no se comprobar谩 si hay obst谩culos, ya que, el sensor ultras贸nico esta situado en la parte delantera del coche y esa direcci贸n no se puede comprobar.

Dise帽o hardware

El dise帽o que pod茅is ver a continuaci贸n, se ha realizado con una herramienta gratuita llamada fritzing.

dise帽o hardware coche teledirigido por bluetooth

Componentes utilizados

Los componentes utilizados para dise帽ar el coche teledirigido por bluetooth son los siguientes:

  • Microcontrolador Nucleo F411RE
  • Arduino Shield Motor Ardumoto
  • Robot Car con 2 motores
  • Sensor ultras贸nico de 3 pines
  • Servomotor
  • Sensor Bluetooth
  • Bateria extraible
  • Cables

Configuraci贸n de los pines

Los pines elegidos para implementar el circuito se pueden apreciar en la siguiente tabla:

COMPONENTE

PIN

ArdumotoPB3 (Timer 2), PA7 (Timer 3)
UART BluetoothPA10 (Rx), PA9 (Tx)
Servomotor del sensor ultras贸nicoPA1 (Timer 5)
Sensor ultras贸nicoPB8

La configuraci贸n de los pines la hemos realizado con el programa STM32CubeMX. Este programa permite configurar los pines de tu placa y te genera el c贸digo con la configuraci贸n que hayas creado.

En este caso la configuraci贸n resultante fue la siguiente:

configuraci贸n de pines

Dise帽o software

Configuraci贸n de los timers

Hemos utilizado un total de 4 timers en el proyecto, cada uno con objetivo espec铆fico, y son los siguientes:

TIMER

USOPERIODO

PREESCALER

Tim2_CH2Ardumoto84991999
Tim3_CH2Ardumoto84991999
Tim5_CH2Servomotor sensor ultras贸nico1679999
Tim11Calcular ticks sensor ultras贸nico8391

M谩quina de estados finita

Hemos implementado 2 m谩quinas de estados en el proyecto (ver en github), la justificaci贸n de cada una de ellas se puede ver a continuaci贸n:

  • La FSM principal se encuentra en el bucle principal del main.c, la usamos para dependiendo la orden que se reciba el coche se mueva hacia una direcci贸n u otra, y poder as铆 pasar de un estado a otro dependiendo la elecci贸n. Cabe destacar, que solo se podr谩 acceder a esta m谩quina de estados si no se detecta un obst谩culo.
    while (1)
      {
        HAL_UART_Receive_IT(&huart1, buffer_read, 1);
        ultrasonic();
        if (buffer_read[0] != BACK && dis <= NEAR)
          stop();
        else
        {
          switch (buffer_read[0])
          {
          case FRONT:
            move_front();
            break;
          case BACK:
            move_back();
            break;
          case RIGHT:
            move_right();
            break;
          case LEFT:
            move_left();
            break;
          case STOP:
            stop();
          }
        }
      }
    
    
  • La segunda FSM puede parecer prescindible o se puede implementar en la principal, pero tiene un objetivo concreto. Esta situada en el callback Rx, para que cada vez que se reciba una interrupci贸n UART desde el sensor bluetooth el servomotor pueda moverse hacia la direcci贸n recibida y as铆 el sensor ultras贸nico pueda detectar obst谩culos.
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    
      if (huart->Instance == USART1)
      {
        switch (buffer_read[0])
        {
        case FRONT:
        case BACK:
          move_check(MID_CHECK);
          break;
        case RIGHT:
          move_check(RIGHT_CHECK);
          break;
        case LEFT:
          move_check(LEFT_CHECK);
          break;
        }
      }
    }
    

Implementando el movimiento

Para producir que el coche se mueva debemos generar un pulso hacia los motores, adem谩s de indicar la direcci贸n del giro.

Para ello se han implementado una serie de funciones, cada una para producir el movimiento en una direcci贸n espec铆fica.

Adem谩s de las funciones para moverse, tambi茅n se ha implementado otra funci贸n para parar el coche totalmente, que es trivial. (ver en github)

Detecci贸n de obst谩culos

La implementaci贸n que hemos realizado ha sido con un sensor ultras贸nico y un servomotor, que se mover谩 en la direcci贸n correspondiente. Como hemos dicho anteriormente el cambio direcci贸n del sensor para detectar alg煤n objeto se realiza en el callback uart.

La detecci贸n de obst谩culos se realiza calculando la distancia en cada iteraci贸n del bucle principal, dejando acceder a la m谩quina de estados principal cuando la distancia sea la adecuada. En el caso de que la orden recibida sea ir hacia atr谩s no se tendr谩 en cuenta la distancia calculada ya que el sensor no detecta obst谩culos en esta direcci贸n.

 

Deja un comentario