sensor de color prueba 1

Dependencies:   mbed

Entrega Control Auto Con Josytik y Sonidos Musicales Por Sensor de luz

Integrantes Sneider Mocada, Daniel Pardo , Harrison Duran , Steven Castro Materia : Sistemas Embebidos

Profesor : Ferney Beltran

**

Ejecución

el ejercicio consiste en desarrollar un código de programa que mediante un sensor de color TCM302 permita leer una determinada serie de colores, adicional a eso también permitirá el movimiento de dos motores nema que seran movidos no solo por los diferentes telecomandos que se enviaran si no también mediante un joystik , el código hará que un buzzer emita diferentes sonidos dependiendo de su frecuencia ,todo esto se logra debido a una tarjeta embebida llamada STM32L476 Núcleo-64 y el compilador gratuito de la pagina de MBED,por medio de la aplicación COOLTERM se enviaran los diferentes telecomandos anteriormente mencionados y nombrados en dicho código, donde se logre habilitar y des habilitar cada uno de los componentes utilizados en nuestro carro robotico

/media/uploads/stevencastro/gmhg.png

Manual del usuario

/media/uploads/stevencastro/1.png /media/uploads/stevencastro/2.png /media/uploads/stevencastro/3.png /media/uploads/stevencastro/4.png /media/uploads/stevencastro/11.png /media/uploads/stevencastro/12.png

Manual Técnico

componentes del sistema

  • Tarjeta embebida a utilizar /media/uploads/stevencastro/stm.png
  • Características
  • La placa Núcleo STM32 ofrece las siguientes características:
  • • Microcontrolador STM32 en paquete LQFP64
  • • Tres LEDs:
  • Comunicación USB (LD1), LED de usuario (LD2), LED de alimentación (LD3)
  • • Dos pulsadores: USUARIO y RESET.
  • • Dos tipos de recursos de extensión.
  • - Conectividad Arduino ™ Uno V3
  • - Cabezales de pines de extensión ST morpho para acceso completo a todas las E / S STM32
  • • Alimentación de la placa flexible:
  • - USB VBUS o fuente externa (3.3 V, 5 V, 7 - 12 V)
  • - Punto de acceso de administración de energía.
  • • Depurador y programador ST-LINK / V2-1 integrados con conector SWD
  • - Selector de modo de selección para usar el kit como un ST-LINK / V2-1 independiente
  • • Capacidad de re-enumeración USB. Tres interfaces diferentes compatibles con USB:
  • - Puerto COM virtual
  • - Almacenamiento masivo
  • - Puerto de depuración
  • • Amplia biblioteca de software libre HAL que incluye una variedad de ejemplos de software
  • BUZZER
    • Funcionaiento un buzzer funciona como un emisor de sonido que se puede graduar mediante la frecuencia que queramos generar en la programacion, se puede conectar de 2 voltios hasta 5 voltios /media/uploads/stevencastro/buzzer_osa8ET1.png
  • Sensor de color características de funcionamiento
  • El sensor es un convertidor de luz a frecuencia que lee una matriz de 8×8 fotodiodos, de tal manera que 16 fotodiodos tienen filtro azul, 16 fotodiodos tienen filtro verde, 16 fotodiodos tienen filtro rojo y 16 fotodiodos son sin filtro.
  • Funciona de 2.7V a 5.5V
  • Alta Resolución de conversión de luz a frecuencia
  • Comunicación directa con el microcontrolador
  • Características en poder bajo (funciona estando apagado) ( Power Down Feature)
  • Error de No linealidad alrededor del 0.2% a 50 KHz
  • Coeficiente de temperatura estable de 200ppm/°C
    • /media/uploads/stevencastro/sensor.png

tablas de configuración de los fotodiodos /media/uploads/stevencastro/tablas.png

Diagrama de funcionamiento /media/uploads/stevencastro/diagrama_de_funcionamiento.png **

  • SO,S1 = Salida de frecuencia
  • S2,S3= Entradas de selección tipo fotodiodo.
  • OUT: Salida de frecuencia (f0)

MOTORES A PASOS

/media/uploads/stevencastro/motor_a_paso.jpg

  • Tamaño: 42 mm x 38 mm cuadrados, sin incluir el eje (NEMA 17)
  • Peso: 285g (10 onzas)
  • Diámetro: 5 mm.
  • Pasos por revolución: 200.
  • Corriente: 1.68A por bobina.
  • Voltaje: 2.7 V.
  • Resistencia: 1.65 Ohm por bobina.
  • Torque: 3.7Kg-cm (51 onzas-in)

MODULO JOYSTIK /media/uploads/stevencastro/josystik.jpg Un joystick suele estar formado por dos potenciómetros a 90º que transforman el movimiento en X e Y del mando en una señal eléctrica proporcional a su posición y que además suele incluir un botón. Así pues, suelen tener 5 pines: X, Y, botón y 3.3V y GND.

Control Auto Con Josytick y Sonidos Musicales Por Sensor de Color

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

Librería para la descarga de la target .h, Librería usada para llamar la configuración general del sensor de color

Control Auto Con Joystick y Sonidos Musicales Por Sensor de Color

#define INITCMD 0xFF
#define DO  3500
#define RE  2500
#define MI  2000
#define FA  3000

Define la inicialización del comando como FF, y definimos la frecuencia de los tonos

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

scolor_TCS3200  scolor(D8,D7,D6,D5,D4);

Configuración de pines digitales del sensor de color

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

DigitalOut stepper_step(D12);
DigitalOut steppeer_dir(D13);
DigitalOut stepper_step2(D11);
DigitalOut steppeer_dir2(D10);

Configuración de las salidas digitales que controlan al motor

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 PwmOut mybuzzer (D15);

Configuración pin PWM de salida para hacer los sonidos con el Buzzer

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 Serial command(USBTX, USBRX);

Configuración de los pines de comunicación TX Y RX con el pc en serial USB

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 AnalogIn value_analg0 ( A0 ) ;//x
   AnalogIn value_analg1 ( A1 ) ;//y

Configuración Pines análogos para la lectura del joystick

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 Ticker tk1;

Declaración de nuestro Primer Tiemer para que la lectura del sensor sea constante

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

InterruptIn button1(D2);
Timeout button1_timeout; 

Declaración de una interrupcion de entrada dada por el botón del joystick

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

volatile bool button1_pressed = false; // Used in the main loop
volatile bool button1_enabled = true; // Used for debouncing

void button1_enabled_cb(void)
{
    button1_enabled = true;
}

le damos valor a dos variables booleanas (false o true) las cuales se encargarán de leer el estado del boton joystick la funcion botto1_enabled-cb se encargara de poner la variable botton1_enabled en verdadero eso significa que el boton esta habilitado para oprimir

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

void button1_onpressed_cb(void)

{ 
    if (button1_enabled) { // Disabled while the button is bouncing
        button1_enabled = false;
        button1_pressed = true; // To be read by the main loop
        button1_timeout.attach(callback(button1_enabled_cb), 0.3); // Debounce time 300 ms
    }
    int idx = 0;
    if (button1_pressed) { // Etablece cuando se preciona el botn
            button1_pressed = false;
            //NVIC_SystemReset();
             printf("Button pressed %d\n", idx++);
            led1 = !led1;
        }
}

Funcion que controla el ruido al momento de usar el joystick nos dice si el boton esta siendo oprimido y en que momento se podrán volver a guardar los datos que envié en el momento de volverse a oprimir

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

  volatile int Exit = 0 ;           
           double In [ 1 ] = {} ; 
           int8_t salida = 0 ;
           uint32_t VELOCITY = 400 ;
           int16_t recepsion [ 2 ] = {} ; 

Declaracion variables

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 void setup_uart ();
    void Rx_interrupt();
    void leer_datos ();
    void sensor_color ();
    void comandosrobot ( uint8_t Parametro, uint8_t Comandos );

Declaración Funciones

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

int main() {
    setup_uart();
    button1.fall(callback(button1_onpressed_cb));
    tk1.attach (&sensor_color, 0.8 );

en nuestro cuerpo principal empezamos con la lectura de la velocidad de recepción de datos en baudios y se tendrá en cuenta el estado del boton del joystick para no interrumpir el código principal ademas de esto cada 0.38 micro segundo la función de sensar color sera llamada para que lea el color

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

     while(1){  
        leer_datos();
        comandosrobot ( recepsion [ 1 ], recepsion [ 0 ] );
}

nuestro primer while se basara en la lectura de los comandos que enviemos por el programa cool tearm desde la función leer datos que guardara los valores en un arreglo y se evaluaran en la función comandosrobot donde se guardan las acciones de los periféricos de nuestro robot

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

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

función que establece la velocidad de comunicación

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

    void leer_datos()    {
 
    while ( command.getc()!= INITCMD ) ;
    uint8_t i ;
    
    for ( i = 0 ; i < 2 ; i++){
        
        recepsion [ i ] = command.getc (); 
        
        }
}

función que lee los datos enviados por el pc mientras la inicializacion del comando se evalúa se guardan los datos en un arreglo de 3 datos los cuales se guardaran en una variable llamada recepción

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

        void Rx_interrupt() {
    Exit = 1;
    command.attach( NULL, Serial::RxIrq );
     printf("int ");        
    return ;
 
}

Funcion Interrupccion

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 void sensor_color(){
        
    long     red = scolor.ReadRed();
    long     green = scolor.ReadGreen();
    long     blue = scolor.ReadBlue();
    long     clear = scolor.ReadClear();
    long freqrojo;
    long freqverde;
    long freqazul;
     long freqclear;

Funcion Inicializacion del sensor de color

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

     freqrojo=((1.0/(2*red))*1000);
          freqverde=((1.0/(2*green))*1000);
            freqazul=((1.0/(2*blue))*1000);
             freqclear=((1.0/(2*clear))*1000);

Obtencion de Frecuencias de lectura del sensor

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 if ( freqrojo>=20 and  freqrojo <=31) // lee  rojo
        {
            if (freqverde >=7 and freqverde <=11 )
            {
                if ( freqazul>=10 and freqazul<=15)
                {
                    if (freqclear>=40 and freqclear <=55) 
                    {
                        
            printf("|FE 01|\n");
            mybuzzer.period_ms(200);
            mybuzzer.write(0.5);
            wait_ms(4000);
            mybuzzer.write(0);
}

Lectura Color Rojo

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

if ( freqrojo>=10 and  freqrojo <=15)  // leer azul 
        {
            if (freqverde>=11 and freqverde <=15)
            {
                if ( freqazul>=25 and  freqazul <=31)
                {   if (freqclear >=45 and freqclear <=62){
            
            printf("|FE 02|\n"); 
            mybuzzer.period_ms(300);
            mybuzzer.write(0.5);
            wait_ms(4000);
            mybuzzer.write(0); 
            }     
        

Lectura color Azul

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 if ( freqrojo>=10 and freqrojo<=21) // lee verde
        {
            if (freqverde>=12 and freqverde<=33)
            {
                if ( freqazul>=12 and  freqazul<=20)
                {
                    if (freqclear>=40 and freqclear<=55 ){
            printf("|FE 03|\n");
            mybuzzer.period_ms(500);
            mybuzzer.write(0.5);
            wait_ms(4000);
            mybuzzer.write(0);
                        }

Lectura color Verde

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 if ( freqrojo>=55 and freqrojo<=70) // lee  amarillo
        {
            if (freqverde>=41 and freqverde<=55)
            {
                if ( freqazul>=25 and  freqazul<=31)
                {
             if (freqclear>=71 and freqclear<=170 )
             {
                        
            printf("|FE 04|\n");
            mybuzzer.period_ms(600);
            mybuzzer.write(0.5);
            wait_ms(4000);
            mybuzzer.write(0);
                     
                }

Lectura Color Amarillo

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 if (red <=200) 
        {
            if (green <=300)
            {
                if (blue <=200)
                {
                        
            printf("|FE 00|\n");

Error en la lectura

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 void comandosrobot ( uint8_t Parametro, uint8_t Comandos ){
        uint8_t i ;
        uint8_t j ;
            switch (Comandos){
            case 0 : 
                printf ("Robot sensador de color Reproductor de sonidos");
            break;

Caso 0, Inicializacion Robot

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

case 1 :
                printf ( "sonido:1              Tiempo: %d s  \n" , Parametro ) ;
                mybuzzer.period_us ( RE ) ;
                mybuzzer.write ( 0.8 ) ;
                wait( Parametro ) ;
                mybuzzer.write ( 0 ) ;
            break; 

Caso1, Activacion sonido 1

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

case 2 :
                printf ( "sonido:2              Tiempo: %d s  \n" , Parametro ) ;
                mybuzzer.period_us ( MI ) ;
                mybuzzer.write ( 0.8 ) ;
                wait( Parametro ) ;
                mybuzzer.write ( 0 ) ;
            break;

Caso2: Activacion sonido 2

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

case 3 :
                printf ( "sonido:3              Tiempo: %d s  \n" , Parametro ) ;
                mybuzzer.period_us ( DO ) ;
                mybuzzer.write ( 0.8 ) ;
                wait( Parametro ) ;
                mybuzzer.write ( 0 ) ;
            break;

Caso 3,Activacion sonido 3

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 case 4 :
                printf ( "sonido:4              Tiempo: %d s  \n" , Parametro ) ;
                mybuzzer.period_us ( FA ) ;
                mybuzzer.write ( 0.8 ) ;
                wait( Parametro ) ;
                mybuzzer.write ( 0 ) ;
            break;

Caso 4, Activacion sonido 4

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

case 5 : 
                
                steppeer_dir = 0;
                steppeer_dir2 = 0 ;
                wait_us ( 1 );
                for ( j = 1 ; j <= Parametro ; j++){
            
                    for ( i= 0 ; i <=  250 ; i++ ){
                 
                        stepper_step = 1 ; 
                        stepper_step2 = 1;
                        wait_us(VELOCITY);
                        stepper_step = 0;
                        stepper_step2 = 0;
                        wait_us ( VELOCITY );
            
                    } 
                }
            break ; 

Caso 5, Activacion Motores hacia adelante

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

case 6 : 
            printf ("atras");
               steppeer_dir = 1;
                steppeer_dir2 = 1;
                wait_us ( 1 );
                for ( j = 1 ; j <= Parametro ; j++){
                    for ( i= 0 ; i <=  200; i++ ){
                 
                        stepper_step = 1  ; 
                        stepper_step2 = 1 ;
                        wait_us( VELOCITY ) ;
                        stepper_step = 0 ;
                        stepper_step2 = 0 ;
                        wait_us ( VELOCITY ) ;
            
                    } 
                
                }
                
            break ;

Caso 6, Activacion Motores hacia atras

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

case 7 : 
            printf ("derecha");
            //steppeer_dir = 0;
            steppeer_dir2 = 0 ;
                wait_us ( 1 );
                for ( j = 1 ; j <= Parametro ; j++){
            
                    for ( i= 0 ; i <=  200 ; i++ ){
                 
                       // stepper_step = 1 ; 
                       stepper_step2 = 1;
                        wait_us(VELOCITY);
                        //stepper_step = 0;
                        stepper_step2 = 0;
                        wait_us ( VELOCITY );
            
                    } 
                }
            break ; 

Caso 7, Activacion Motores hacia la derecha

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

case 8 : 
            printf ("izquierda");
            steppeer_dir = 0;
                //steppeer_dir2 = 0 ;
                wait_us ( 1 );
                for ( j = 1 ; j <= Parametro ; j++){
                  for ( i= 0 ; i <=  200 ; i++ ){     
                        stepper_step = 1 ; 
                  //      stepper_step2 = 1;
                        wait_us(VELOCITY);
                        stepper_step = 0;
                    //    stepper_step2 = 0;
                        wait_us ( VELOCITY );
            
                    } 
                }
                //command.attach( callback(Rx_interrupt), Serial::RxIrq );
            break ;

Caso 8, Activacion Motores hacia la izquierda

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

    case 9 :
            switch ( Parametro ){
                case 1:
                    VELOCITY = 400 ;
                break ;
                case 2:
                    VELOCITY = 2500 ;
                break ;
                case 3:
                    VELOCITY = 5000 ;
                break ; 
                }
                break;  

Caso 9, Cambio de velocidad de los motores

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

case 10:
            if ( Parametro == 1){ 
                Exit=0;            
                while ( !Exit ){ 
                    In [ 0 ] = value_analg0.read(); // Converts and read the analog input value (value from 0.0 to 1.0)    
                    printf(" X = %.04f \n", In[0]); 

Caso 10, Cambio de control al Joystick

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

if ( In [ 0 ] > 0.6 ){ 
 
                        steppeer_dir = 1;
                        wait_us( 1 );
                
                        for ( i= 0 ; i <=  50 ; i++ ){
                 
                            stepper_step = 1 ; 
                            //stepper_step2 = 1 ;
                            wait_us( VELOCITY ) ;
                            stepper_step = 0 ;
                            //stepper_step2 = 0 ;
                            wait_us( VELOCITY ) ;
                        }

Control direccion Joystick hacia adelante

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

  if ( In [ 0 ] < 0.3 ){ 
                
                        steppeer_dir2 = 1;
                        wait_us( 1 );
                        
                        for ( i= 0 ; i <=  50 ; i++ ){
                 
                            //stepper_step = 1 ; 
                            stepper_step2 = 1 ;
                            wait_us( VELOCITY ) ;
                            //stepper_step = 0 ;
                            stepper_step2 = 0 ;
                            wait_us( VELOCITY ) ;
                        

Control direccion Joystick hacia atras

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 In [ 1 ] = value_analg1.read(); // Converts and read the analog input value (value from 0.0 to 1.0)    
                    //printf(" Y = %.04f \n", In[0]); 
                                
                    if (In [ 1 ] > 0.6 ){
                     
                        steppeer_dir = 1 ;
                        steppeer_dir2 = 0 ;
                        wait_us( 1 );
                        
                        for ( i= 0 ; i <= 50 ; i++ ){
                 
                            stepper_step = 1 ; 
                            stepper_step2 = 1 ;
                            wait_us( VELOCITY ) ;
                            stepper_step = 0 ;
                            stepper_step2 = 0 ;
                            wait_us( VELOCITY ) ;

Control direccion Joystick hacia la derecha

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

                                        
                    if ( In [ 1 ] < 0.3 ){
                     
                        steppeer_dir = 0 ;
                        steppeer_dir2 = 1 ;
                        wait_us( 1 );
                        
                        for ( i= 0 ; i <= 50 ; i++ ){
                         
                            stepper_step = 1 ; 
                            stepper_step2 = 1 ;
                            wait_us( VELOCITY ) ;
                            stepper_step = 0 ;
                            stepper_step2 = 0 ;
                            wait_us ( VELOCITY ) ;

Control direccion Joystick hacia la izquierda

Control Auto Con Josytik y Sonidos Musicales Por Sensor de Color

 command.attach( callback(Rx_interrupt), Serial::RxIrq );
                    wait_us ( 1 );
                    
                }
            }              
            break ;
            

main.cpp

Committer:
fabeltranm
Date:
9 months ago
Revision:
1:334b40b47233
Parent:
0:fa6bdbdd4239
Child:
2:1c61db0b3207

File content as of revision 1:334b40b47233:

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

/* *****************************************************************************
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/


@fabeltranm 2019
fbeltranm@ecci.edu.co

********************************************************************************
   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       | 
             
******************************************************************************/

#define INITELE 0xFE
#define CMD  0x01



Serial command(USBTX, USBRX);
//                     S0,    S1,   S2,   S3,    OUT
scolor_TCS3200 scolor(PA_8, PB_10, PB_4, PB_5, PB_3);

// definición de las funciones
void setup_uart();
void leer_datos();
void leer_color();

uint8_t cmd;

int main() {

    setup_uart();
    while(1){    
        leer_datos();
        if (cmd==CMD){}
            leer_color();
    }    
}



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


void leer_datos(){
    while(command.getc()!= INITELE);
    cmd=command.getc();

    
}


void leer_color(){
    
 
    
    long     red = scolor.ReadRed();
    long     green = scolor.ReadGreen();
    long     blue = scolor.ReadBlue();
    long     clear = scolor.ReadClear();
 
    printf("RED: %5d     GREEN: %5d     BLUE: %5d     CLEAR: %5d    \n ", red, green, blue, clear);
    
    }