sensor de color prueba 1
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
Manual del usuario
Manual Técnico
componentes del sistema
- Tarjeta embebida a utilizar
- 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
- 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
tablas de configuración de los fotodiodos
Diagrama de funcionamiento **
- SO,S1 = Salida de frecuencia
- S2,S3= Entradas de selección tipo fotodiodo.
- OUT: Salida de frecuencia (f0)
MOTORES A PASOS
- 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 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 ;