Wiki segundo corte

Robot que atiende funciones de voz

Parte 2, Reconocimiento de colores, respuesta al detectar color, movimiento de motores Nema controlado con y sin joystick

- Materiales:

  • Tarjeta STM32F411
  • Plataforma virtual Mbed
  • Software CoolTerm
  • Jumpers
  • Sensor de color TCS3200
  • Buzzer
  • Motores Nema (x2)
  • Driver Nema (x2)
  • Joystick (x2)
  • Condensador 100u
  • Fuente de voltaje (12V)

-Modo de conexión:

/media/uploads/byonetsu/segcorte_bb.png

/media/uploads/byonetsu/t1.png

-Especificación de los componentes a utilizar.

Tarjeta STM32F411

Es un sistema embebido fabricado por la empresa ST microlelectronics ,esta basada en un micro controlador ARM cortex m4 de 32 bits el cual maneja una velocidad de procesamiento de 100MHz,512 Kbytes de memoria flash junto a 128-Kbytes de memoria RAM. Entre los componentes que conforman la STM32-NUCLEO F411RET6 se puede encontrar 64 puertos destinados a la vinculación de diferentes perifericos, tales como servomotores, motores paso a paso (steppers), lLEDs ,entre otros periféricos para poder desarrollar proyectos y soluciones enfocados a la robótica.

/media/uploads/byonetsu/nucleo64_perf_nologo_1024_zrv26gl.jpg.250x250_q85.jpg

Puertos de conexión:

/media/uploads/byonetsu/nucleo_f411re_morpho.png

USART (Transmisores receptores síncronos / asíncronos universales)

Los dispositivos incorporan tres transmisores receptores síncronos / asíncronos universales (USART1, USART2 y USART6). Estas tres interfaces proporcionan comunicación asíncrona, soporte IrDA SIR ENDEC, Modo de comunicación multiprocesador, modo de comunicación semidúplex de un solo cable y tienen capacidad LIN Master / Slave. Las interfaces USART1 y USART6 son capaces de comunicarse a velocidades de hasta 12.5 Mbit / s. La interfaz USART2 se comunica hasta 6,25 bit /s. USART1 y USART2 también proporcionan administración de hardware de las señales CTS y RTS, estas interfaces pueden ser servidas por el controlador DMA.

Periféricos incluidos en la tarjeta:

/media/uploads/byonetsu/2019-03-11_-4-.png

Sensor de color TCS3200

Es un sensor óptico fabricado por la empresa TAOS (Texas Advanced Optoelectronic Solutions) controlado mediante PWM (Pulse Width Modulation) ,el cual su principal funcionamiento es detectar diferentes tipos de color realizando conversiones de alta resolución de intensidad lumínica a frecuencia. este sensor ,completamente programable,maneja un margen de error de no linealidad de 0.2% a 50 kHz e internamente está conformado por una matriz de (4*6) foto-diodos los cuales están distribuidos en 4 colores base (6 diodos con filtros rojos,6 con filtros verdes ,6 con filtros azules y 6 sin filtro) ;los 4 tipos de colores son interdigitados para disminuir el efecto de no-uniformidad o irradiación incidente.

/media/uploads/byonetsu/sensor-de-color-tcs3200.jpg

Diagrama de funcionamiento.

/media/uploads/byonetsu/2019-03-11.png

/media/uploads/byonetsu/2019-03-11_-2-.png

/media/uploads/byonetsu/2019-03-11_-1-.png

Buzzer

Este actuador es controlado mediante PWM (Pulse Width Modulation),el cual ,por medio de implementación al sistema de detección de color, permite obtener un diferente sonido por cada frecuencia asignada al desarrollar el programa.

/media/uploads/byonetsu/buzz.jpg

Frecuencias sonoras incorporadas a vehículo:

Una de las características incorporadas al vehículo son los sonidos de 4 notas musicales que funcionan por tele comandos (ordenes codificadas en código hexadecimal que se pueden encontrar en la tabla de comandos anexada en este documento) configurados y digitados mediante el software coolterm; esta tele comandos se pueden denominar de la siguiente manera:

INIT Tele comando frecuencia tono (ingresar en coolterm)

• FF 00 100 Hz do • FF 01 150 Hz re • FF 02 200 Hz mi • FF 03 300 Hz fa

Cada tele comando, como se puede ver en la tabla se divide en 2 denominaciones INIT (FF o FE) que representa el inicio del comando a transferir y tele comando que representa la opción a ejecutar (en este caso el tono a reproducir).

Durante el desarrollo del vehículo , se incorporó 4 valores frecuenciales que representan el sonido de 4 notas musicales representados con los valores FF 00 (nota DO),FF01(nota RE),FF02(nota MI) y FF03(nota FA),las cuales son do (100Hz), re (150Hz),mi (200Hz) y fa (300Hz) ,los cuales son decodificados mediante el microprocesador ARM CORTEX M4 © ,incorporado en el sistema embebido STM32F4RET6 y transmitidos mediante la unidad de audio (Buzzer) incorporada en el vehículo.

Estos comandos como se indicó anteriormente, deben ser introducidos mediante el software de conexión serial coolterm, para ser ejecutados por el vehículo

Especificaciones:

/media/uploads/byonetsu/2019-03-11_-3-.png

Motor Nema

es un dispositivo electromecánico que convierte una serie de impulsos eléctricos en desplazamientos angulares discretos, lo que significa que es capaz de girar una cantidad de grados (paso o medio paso) dependiendo de sus entradas de control. El motor paso a paso se comporta de la misma manera que un conversor digital-analógico (D/A) y puede también leer impulsos procedentes de sistemas digitales. Este motor presenta las ventajas de tener precisión y repetitividad en cuanto al posicionamiento.

/media/uploads/byonetsu/motor-paso-a-paso-nema-17-32kg-cm.jpg

Joystick

Es un periférico de entrada que consiste en una palanca que gira sobre una base e informa su ángulo o dirección al dispositivo que está controlando.

/media/uploads/byonetsu/joy.jpg

Driver motor Nema

es circuito controlador bipolar de motores paso a paso le permite manejar un motor paso a paso bipolar de hasta 2A de corriente desde cualquier microcontrolador. Este driver para motores paso a paso cuenta con un limitador de corriente, y protección de sobre calentamiento y de exceso de consumo para garantizar un funcionamiento correcto cuando lo utilice en sus proyectos. El driver opera en un rango de 8 hasta 35V con una corriente de 1A por fase (sin un disipador de calor) y tiene capacidad para soportar hasta 2A por bobina si hubiera suficiente refrigeración adicional.

/media/uploads/byonetsu/driver.png

Conversor analogo digital (ADC)

/media/uploads/byonetsu/750px-conversor_ad.svg.png

include the mbed library with this snippet

#include "mbed.h"
Serial command(USBTX, USBRX);
AnalogIn analog_M1(A5);
AnalogIn analog_M2(A4);
AnalogIn analog_M3(A3);
AnalogIn analog_M4(A2);


int main()
{
    float meas_X;
    float meas_Y;
    float meas_X2;
    float meas_Y2;
    
    while(1) {
        
        meas_X=analog_M1.read();
        meas_Y=analog_M2.read();
        meas_X2=analog_M3.read();
        meas_Y2=analog_M4.read();
        printf(" X=%0.4f Y=%0.4f  X2=%0.4f Y2=%0.4f\n",meas_X, meas_Y, meas_X2, meas_Y2);
       
        
        
        wait(1); // 1 second
    }
}

En el que se hace la lectura de entrada analoga de cada eje según corresponda en cada uno de los joystick y en la que se imprime una salida digital que se puede medir en voltaje.

Conexión a CoolTerm Para salida de datos

1. Abrir el software CoolTerm.

/media/uploads/byonetsu/1.png

2. Una vez abierto el Software, debe asegurarse de que la tarjeta STM32F411 esté conectada; Se podrá verificar si ha sido correctamente conectada en la parte inferior.

/media/uploads/byonetsu/111.png

3. Además también será necesario revisar en options y asegurarse de que la velocidad de transmisión o baud rate sea la misma en la tarjeta y en el programa.

/media/uploads/byonetsu/2.png

Una vez elegida la opción 115200 es necesario guardar los cambios con el botón ok

4. Una vez ya configuradas las opciones es necesario para enviar datos desde :

Connection>Send String

/media/uploads/byonetsu/21.png

Y desplegará una nueva ventana desde la cual se podrán enviar datos en lenguaje hexa-decimal.

/media/uploads/byonetsu/211.png

Programación:

El software utilizado para desarrollar el programa de funcionamiento del sistema fuen el compilador Mbed, el cual permite programar microcontroladores y MPU'S fabricados por la empresa ST electronics tales como STM32-NUCLEO F411RET6 , entre otros diferentes tipos de MCU's O MPU'S.

Entendiendo el código:

1. Enviar dato 'FE' por medio del programa CoolTerm.

2. La placa STM empieza a hacer un barrido de las 5 opciones por las que tiene que responder.

2,1. Opciones.

/media/uploads/byonetsu/parametros.png

3. Cuando reconoce la opción devuelve el dato.

Nota: El dato tiene que ser en hexadecimal y no ‘imprimir’.

4. Cuando logra identificar el dato envía una señal que en este caso es el sonido de notas musicales y luego de reproducirse por un tiempo específico se reinicia posteriormente el programa.

Código de programación:

El siguiente código de programación, (realizado en el compilador on-line Mbed) tiene como objetivo hacer que el vehículo responda a las ordenes o tele comandos enviados vía coolterm tales como mover el vehículo, detectar 4 colores (rojo, verde, azul amarillo), reproducir 4diferentes tonos (DO, RE, MI, FA)) y controlar el vehículo mediante joystick como se indica anteriormente, el siguiente código, permite realizar dichas funciones:

include the mbed library with this snippet

  #include "mbed.h"
#include "scolor_TCS3200.h"

/***
Sensor TCS 3200

Programa que solicita telemetria al sistema embebido, por medio del comando  0xFe
para preguntar por el color  que detecta el sensor TCS3200
 
el sistema embebido recibe  el inicio de trama FE  y el número de comado: 01
   
|   INITELE  |  CMD       |   
|     0xfe   | 0x01       | 

para enviar los comandos usar el programa Coolterm http://freeware.the-meiers.org/
 

****************************
   datasheet https://www.mouser.com/catalog/specsheets/TCS3200-E11.pdf
 
 
    S0      Frequency scaling 
    S1      Frequency scaling 
    S2      Photo diode selection 
    S3      Photo diode selection 
    OutFreq Frequency
 
       -----------------------------------
      |   ____     ____   |
----> |  |            |   |            |  |                _     _ 
Light |  | Photodiode |   |   Current  |--|---OUTPUT_FREQ |   |_|   |_
----> |  |   Array    |---|     to     |  |
      |  |            |   |  Frequency |  |
      |  |____|   |____|  |
      |       ^  ^             ^  ^       |
       -------|--|-------------|--|-------
              |  |             |  |
             S2 S3            S0  S1
             
SO | S1 | OUTPUT FREQUENCY SCALING |        | S2 | S3 |   PHOTODIODE TYPE   |
 0 | 0  |        power down        |        |  0 | 0  |         Red         |
 0 | 1  |           2%             |        |  0 | 1  |         Blue        |
 1 | 0  |           20%            |        |  1 | 0  |  Clear (no filter)  |
 1 | 1  |           100%           |        |  1 | 1  |         Green       | 



Buzzer

Generar un programa que controle por el puerto serial los tonos  y el tiempo de buzzer .
por medio de la comunicacion serial el comando es 
 
|            |            |             |
|   INITCMD  |  tono      |   tiempo    |
|     0xff   | 0x01- 0x05 | 0x00 - 0xb4 |

Motor Nema 17

Generar un programa que controle por el puerto serial el sentido de giro del motor nema,
y el numero de pasos. en este caso dejar la velocidad cosntantes pero con un define .

por medio de la comunicacion serial el comando es 

|            |            |             |
|   INITCMD  |   sentido  |   N_pasos   |
|     0xff   | 0x00- 0x01 | 0x00 - 0xff |


# para el motor nena se configurar el driver  drv8825 - A4988:
#
#
#     <------period 4us min-------->
#     <-1.9us min -> <-1.9us min ->
#      _                _ 
# |             ||             |_  signal step
#   _                          _  
# |    |_|    |__  dir modex 1-cw 0ccw
#  <-> min 650ns                    <-> min 650ns  
#


***/


Serial command(USBTX, USBRX);
//           PIN + BUZZER
PwmOut mybuzzer(PB_8)            ;
//                     S0,   S1,   S2,   S3,   OUT
scolor_TCS3200 scolor(PA_9, PC_7, PB_6, PA_7, PA_6);

DigitalOut stepper_step(PB_4);
DigitalOut steppeer_dir(PB_5);
DigitalOut stepper_step_2(PB_10);
DigitalOut steppeer_dir_2(PA_8);
AnalogIn analog_M1(A3);
AnalogIn analog_M2(A2);
AnalogIn analog_M3(A1);
AnalogIn analog_M4(A0);


DigitalOut led(LED1);

//INGRESE LA CONFIGURACION DE LOS MOTORES/

#define INITCMD    0xFF
#define VELOCITY   2500
#define TS         0x00
#define SA         0x01
#define SB         0x02
#define SC         0x03
#define SD         0x04
#define DO         100
#define RE         150 
#define MI         200 
#define FA         250
#define SO         300 
#define UP         0x05
#define DOWN       0x06
#define LEFT       0x07
#define RIGTH      0x08
#define VEL        0x09
#define joystick   0x0a
#define vs         50
#define vm         100


// definición de las variables globales 

uint8_t mv         ;
uint8_t tip_mov    ;
uint8_t n_vueltas  ;
uint8_t STEEP      ;
uint8_t SN         ; 
uint8_t ER         ;
uint8_t xz         ;
uint8_t xy         ;
uint8_t tono       ;    // variable almacena la frecuencia del buzzer
uint8_t tiempo     ;    // varIable almacena los tiempos del buzzer leer_datos()
uint8_t velocidad=1   ;

float meas_X; //para joystick 1
float meas_Y;
float meas_X2; //para joystick 2 
float meas_Y2;
    
// definición de las funciones

void setup_uart()        ;
void mover_steper_nema() ;
void leer_datos()        ;
void funcion_pasos()     ;
void leer_color()        ;
void movimientos()       ;
//void control(uint8_t xz, uint8_t xy)        ;
void buzzer_on(uint8_t tono, uint8_t tiempo);
    
int main() {

    setup_uart();
    //servo.period(03..020);
    //command.printf("inicio de programa");
    while(1){    
        leer_datos()            ;
        mover_steper_nema()     ;
        leer_color()            ;
        buzzer_on(tono, tiempo) ;
       // control(xz, xy);
        /*movimientos()           ;
        meas_X=analog_M1.read();
        meas_Y=analog_M2.read();
        meas_X2=analog_M3.read();
        meas_Y2=analog_M4.read();*/
    }    
}


void setup_uart(){
    command.baud(115200);
}

void leer_datos(){
    
    while(command.getc()!=INITCMD);
         
         tip_mov=command.getc()          ;
         SN=command.getc()               ;
         ER=command.getc()               ;
         tono=command.getc()             ;
         tiempo=command.getc()           ;
     //    xz=command.getc()                ;
  //       mv=command.getc()               ;
         n_vueltas=command.getc()        ; 
}

void buzzer_on(uint8_t tono, uint8_t tm){
        
     mybuzzer.write(0);
     switch(tono){
        case SA: mybuzzer.period_us(DO);break;
        case SB: mybuzzer.period_us(RE);break;
        case SC: mybuzzer.period_us(MI);break;
        case SD: mybuzzer.period_us(FA);break;
        //default:mybuzzer.period_us(SO); break;
        }
     mybuzzer.write(0.5);
     
     wait(tm);
     mybuzzer.write(0);
}
/*
void movimientos(){
    switch (mv){
        case joystick:
          
        printf(" X=%0.4f Y=%0.4f  X2=%0.4f Y2=%0.4f\n",meas_X, meas_Y, meas_X2, meas_Y2);
  //      servo.pulsewidth (0.001+meas_Y*0.001);
              
        wait(1); // 1 second
        
        if(meas_X <= 0.4){
             steppeer_dir=1;
             funcion_pasos();
             STEEP=200;
            }
        if(meas_X >= 0.6){
             steppeer_dir=0;
             funcion_pasos();
             STEEP=200;
            }
        if(meas_X2 <= 0.4){
             steppeer_dir_2=0;
             funcion_pasos();
             STEEP=200;
            }
        if(meas_X2 >= 0.6){
             steppeer_dir_2=1;
             funcion_pasos();
             STEEP=200;
            }
            
        break;
        }
    }
*/    
void leer_color(){
    switch (SN){
        case TS:
    
    long     red    ;
    long     green  ;
    long     blue   ;
    long     yellow ;
    long     clear  ;
 
 
       red    = scolor.ReadRed()    ;
       green  = scolor.ReadGreen()  ;
       blue   = scolor.ReadBlue()   ;
       yellow = scolor.ReadYellow() ;
       clear  = scolor.ReadClear()  ;
     
       printf("FE 01: %5d     FE 02: %5d     FE 03: %5d     FE 04: %5d     FE 00: %5d    \n ", red, green, blue, yellow, clear);  
         
    break;  
}   
}

void mover_steper_nema(){

        switch (tip_mov){
        case UP:  
        //for (int a=0; a<n_vueltas; a++){
                    steppeer_dir=0;
                    steppeer_dir_2=1;
                    STEEP=200;  
                    funcion_pasos();           
        printf("MOVER ADELANTE\n");
               break;   
               //}              
        case DOWN: 
       // for (int a=0; a<n_vueltas; a++){
                steppeer_dir=1;
                steppeer_dir_2=0;  
                funcion_pasos();
                STEEP=200;
                printf("MOVER ATRAS\n");
                   break;
              // }
        case LEFT: 
                steppeer_dir=1;
                steppeer_dir_2=1;  
                funcion_pasos();
                STEEP=50;
                printf("MOVER IZQUIERDA\n"); 
                   break;
        case RIGTH: 
                steppeer_dir=0;
                steppeer_dir_2=0;  
                funcion_pasos();
                STEEP=50;
                printf("MOVER DERECHA\n");
                    break;
             }
             
        
}
/*
void control(uint8_t xz, uint8_t xy)
{
    switch (xz)
      case VEL:
        if(xy == 01)
        {
            VELOCITY = vs;
            VELOCITY = velocidad;
            }
        if(xy == 02)
        {
            VELOCITY = vm;
            }
        if(xy == 03)
        {
            VELOCITY = vf;
            }
      break;
    }*/
void funcion_pasos()
{
    for(int i=0; i<STEEP; i++)
     {
        stepper_step=1;
        stepper_step_2=1;
        wait_us(VELOCITY*velocidad);
        stepper_step=0;
        stepper_step_2=0;
        wait_us(VELOCITY*velocidad);
}
}
            }


Please log in to post comments.