Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Segundo_corte
SISTEMA DE ALMACENAMIENTO¶
- Brian Alexis Cárdenas Castañeda 67574
- Valeria Alejandra Bravo Bonilla 67577
- Angela Manuela González Plazas 60534
El proyecto consiste en realizar un Sistema de Almacenamiento, con el que, se busca ensamblar un prototipo de (brazo robótico) robot clasificador; que cuente con la capacidad de identificar cierta gama de colores cuando el sensor correspondiente detecte un objeto y el brazo lo clasifique, Adicionalente se usarán dos Joystick para contar con un movimiento manual en donde el usuario podrá decidir en que dirección mover el brazo. También, contará con una programación que permitirá comandar el brazo por medio de comunicación serial para hacer el proceso automático ..
En el siguiente informe se presentará la compilación de dos manuales; uno técnico y uno del usuario respectivamente; En el manual técnico se incluirá todo lo relacionado con las especificaciones de la tarjeta de desarrollo STM Nucleo 32F446-RE con la cual estaremos desarrollando el proyecto, indicaciones de conexión, desglose de los componentes que utilizamos más una explicación sustancial del código con el que se ha trabajado; en el manual del Usuario se explicará cómo y cuales son los pasos para poner en funcionamiento el proyecto y cumplir adecuadamente el proceso.
1.Manual Técnico¶
- TARJETA DE DESARROLLO STM Nucleo-F446RE.

La tarjeta Nucleo-F446RE es una placa de desarrollo STM32, que cuenta con un microcontrolador ARM cortex M4; la cual trabaja a una velocidad de 180Mhz y un sistema SRAM de 128 KB. También se cuentan con estás demás especificaciones. USB VBUS or external source (3.3 V, 5 V, 7 - 12 V). Two push buttons: USER and RESET. 512 KB Flash.

- Diagrama de Conexiones.

- SERVOMOTOR:

El servomotor es un dispositivo que en su interior dispone de un pequeño motor con un reductor de velocidad y multiplicador de fuerza, también dispone de un circuito que controla el sistema. Para controlar un servomotor se debe aplicar un pulso de duración y frecuencia específicos. Todos los servomotores disponen de tres cables, dos para alimentación Vcc y Gnd y un tercero para aplicar el tren de pulsos de control, que hace que el circuito de control diferencial interno ponga el servo en la posición indicada, dependiendo del ancho del pulso. En el servomotor SG90 el ángulo de giro del eje es de 180º . un servo es muy importante por que es el encargado de dar movilidad al robot.
- Ángulos de giro de un servomotor:

- Modulación por Ancho de pulso (PWM).
Es una técnica utilizada para regular la velocidad de giro de los motores eléctricos de inducción o asíncronos.u Mantiene el par motor constante y no supone un desaprovechamiento de la energía eléctrica. Se utiliza tanto en corriente continua como en alterna, como su nombre lo indica, al controlar: un momento alto (encendido o alimentado) y un momento bajo (apagado o desconectado),

- COOLTERM:
Es una sencilla aplicación creada por Roger Meier que permite tener una terminal para nuestros puertos serie, su menú de configuración esta muy completo, permitiendo elegir desde una lista los puertos disponibles y seleccionar su velocidad y demás parámetros; despliega los datos recibidos tanto en Ascii como en Hexadecimal.
El sistema de almacenamiento es un prototipo de robot para almacenar en celtas piezas clasificándolas por color, adicionalmente cuenta con dos formas de use, uno manual en donde el usuario por medio de un joystick puede manejar el robot a su criterio llevándolo a las posiciones deseadas, el otro es en modo automático donde ya se tiene las posiciones especificadas, por medio de programación se cumplen rutinas del proceso.
- SENSOR ÓPTICO TCS 3200

El sensor de color programable, es un sensor óptico que convierte la frecuencia de los haces de luz en una frecuencia de corriente. y como resultado da una salida de onda cuadrada. A continuación, se pude ver el datasheet del sensor.

Funcionamiento Sensor TCS - 3200:
El sensor es un convertidor de luz a frecuencia que combina fotodiodos de silicio y una corriente de frecuencia en un solo circuito integrado. La salida es una onda cuadrada con una frecuencia directamente proporcional a la intensidad de luz. Las entradas y salidas digitales permiten una interfaz directa con un microcontrolodor. 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.
ESPECIFICACIONES DEL SENSOR DE COLOR TCS3200:
- Alta resolución de conversión de luz a frecuencia.
- Frecuencia de salida Programable en color y escala completa.
- Se comunica directamente con un microcontrolador.
- Voltaje de funcionamiento: 2.7-5.5 V.
- Rango de error típicamente de 0,2% a 50 kHz.
- Coeficiente de temperatura 200 ppm/°C .

Frecuentemente el TCS3200 se distribuye en módulos que incorporan dos o cuatro LED de luz blanca y un protector de plástico. El objetivo de ambas medidas es minimizar los efectos de la iluminación ambiente en la medición. Pese a sus especificaciones y elementos para eliminar la luz ambiente, el TCS3200 no es capaz de medir de forma precisa el color RGB de un objeto, o la temperatura de color de una fuente luminosa. Sin embargo, podemos emplearlo para distinguir entre colores básicos. Por ejemplo, podemos emplearlo para reconocer el color de una tarjeta o un objeto, y guiar a un robot en un recorrido.
Conexión del sensor a la tarjeta:

El TCS3200 tiene cuatro entradas digitales S0, S1, S2, y S3, y una salida digital Out. Para conectarlo, necesitaremos emplear al menos 3 pines digitales. En primer lugar debemos alimentar el módulo conectando los pines Gnd y Vcc del TCS3200, respectivamente, a Gnd y Vcc respectivamente.
- Funciones de los Terminales*

- Opciones Seleccionables*
Los pines S0 y S1 controlan la frecuencia de la salida y la des activación del módulo. Los conectamos a dos salidas digitales, o podemos conectarlas a 5V si no queremos poder apagar el módulo.

Por otra parte, los pines S2 y S3 seleccionan el color a medir. Deberemos conectarlos a dos salidas digitales de nuestra tarjeta.

Espectro de luz visible:
Es el espectro de radiación electromagnética que es visible para el ojo humano. Va desde una longitud de onda de 400 nm hasta 700 nm. Estas son las ondas que componen lo que llamamos luz visible. Cuando estamos viendo un objeto, es porque ese objeto está siendo iluminado por la luz visible.

- 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, 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.
El Joystick consta básicamente de dos potenciometros que representan los dos ejes de libertad en las que las palancas se pueden mover; el eje 'x' y el eje 'y'. Y además cuenta con un pulsador. A continuación se puede observar el diagrama esquemático del Joystick.

Conexión del Joystick

El Joystick analógico es el más tradicional. En forma de manche, este dispositivo posee una palanca para posicionamiento continuo. Es movido libremente al lo largo de dos ejes, un vertical y un horizontal, y es apoyado sobre una mesa a través de ventosas, que ayudan en su fijación. Ya el Joystick digital, también conocido como joypad, no posee palanca, pero sí una pequeña cruz con la cual pueden ser definidas las posiciones direccionales (arriba, abajo, izquierda, derecha).
Funciones de los Terminales

- * CÓDIGO:
En esta sección detallamos y explicamos partes del código para garantizar la comprensión del lector:
Se crean las clases para los objetos, que en este caso son los cuatro Servo-motores definiendo de una ves los pines de conexión.
PwmOut myservo1(PB_10); PwmOut myservo2(PB_4); PwmOut myservo3(PB_5); PwmOut myservo4(PB_3);
Se habilita la comunicación serial y poder enviar datos y se mencionan las variables globales.
Serial pc(USBTX, USBRX); uint8_t telecomando; uint8_t parametro; uint8_t nm;//variable de motores uint8_t ng;
Se crea una función que permite controlar el ancho del pulso para el Servo-motor. Está función convierte el valor del ciclo útil dado en us dentro del periodo en una posición en grados para el servomotor.
uint32_t degrees2usec(uint8_t grados){
// Retorno el valor en usegundos, donde
// y − y1 = m(x − x1 )
if(grados <= 180)
return int(750+grados*1900/180);// u6
return 750;
Tasa de baudios para la comunicación serial.
pc.baud(9600);
Comando de apertura para el envió de la trama desde Coolterm, expresado en Hexadecimal.
while (pc.getc()!=0XFF); //sincronizacion
Configuración inicial de la velocidad de los servo-motores
myservo1.pulsewidth_us(2000);
myservo1.period_ms(20)
Funciones para las rutinas del robot.
void home() void material() void celda1() void celda2() void celda3() void celda4()
Se crea una función para abrir y cerrar la pinza.
if (parametro==01)
{
myservo4.pulsewidth_us(degrees2usec(0));
}
else if(parametro==02)
{
myservo4.pulsewidth_us(degrees2usec(180));
Se crea otra función para indicar el caso para cada una de las rutinas, previamente definidas en las funciones anteriores. Este Switch interpreta la variable parámetro
void mover_pos()
Se crea una función que indica sí lo que se quiere controlar es una de las funciones del brazo, la pinza o cada motor por individual.
void mover_servo(uint8_t nm, uint8_t ng)
Luego se inicia el programa principal.
int main()
{
config_uart();
config_servo();
while(1)
{
Leer_Datos();
mover_servo(telecomando, parametro);
}
}
CÓDIGO PARA EL FUNCIONAMIENTO DEL SENSOR ÓPTICO:
Se declarán los pines correspondientes al sensor
// S0, S1, S2, S3, OUT scolor_TCS3200 scolor(PA_8, PB_10, PB_9, PB_5, PB_8);
Se definen las variables para almacenar las lecturas del sensor.
float red_sr = scolor.ReadRed();
float green_sr = scolor.ReadGreen();
float blue_sr = scolor.ReadBlue();
float clear_sr = scolor.ReadClear();
Se desarrolló una función en donde por medio de una regla de tres se compararon todos los colores con respecto a CLEAR y sacarlos en porcentajes.
float porcentajeR=(clear_sr/red_sr*100);
float porcentajeG=(clear_sr/green_sr*100);
float porcentajeB=(clear_sr/blue_sr*100);
Se realizó la calibración del sensor para que detecte los colores que se necesitaba.
if (porcentajeR > porcentajeB && porcentajeB > porcentajeG)
{
printf("Rojo \n");
}
else if (porcentajeB > porcentajeG && porcentajeG > porcentajeR)
{
printf("Azul \n");
}
else if (porcentajeG == porcentajeB && porcentajeG > porcentajeR)
{
printf("Verde \n");
}
else if (porcentajeR == porcentajeG && porcentajeB > porcentajeR)
{
printf("Blanco \n");
}
else
{
printf("No se detecta ningún color \n");
}
}
Con la intención de que la visualización no sea la de los colores, sino la de las temerarias que lo definen, se realizó lo siguiente
0XFE 0X01-> ROJO
0XFE 0X02-> AZUL
0XFE 0X03-> VERDE
0XFE 0X04-> AMARILLO
0XFE 0X05-> NINGUN COLOR
CÓDIGO PARA EL FUNCIONAMIENTO DEL JOYSTICK:
Declaramos los pines de la tarjeta de desarrollo con los pines del Joystick en las debidas conexiones.
AnalogIn joy(A0); AnalogIn joy1(A1); AnalogIn joy2(A2); DigitalIn bot1(PA_9); DigitalIn bot2(PC_7);
creamos variables para los valores del voltaje del Joystick y los respectivos grados que toma cada uno al no ser pulsados.
float vx=0; float vy=0; float vz=0; float grados3 = 90; float grados1 = 90; float grados2 =90; bool pulsador=0; bool pulsador2=0;
Se crea una función en la que según los valores que tomen los potenciometros de de cada uno de los Joystick's valla variando el grado de los servo-motores, esto con las entradas analógicas de la tarjeta.
vx=joy1.read();
if (vx<0.2)
{
grados=grados-10;
myservo1.pulsewidth_us(degrees2usec(grados));
wait(0.1);
if (grados <0)
{
grados=0;
}
}
if (vx>0.8)
{
grados= grados+10;
myservo1.pulsewidth_us(degrees2usec(grados));
wait(0.1);
if (grados>180)
{
grados=180;
}
}
command.printf("%f \n ",grados);
bot1.read();
if(bot1.read()==0)
{
myservo1.pulsewidth_us(degrees2usec(150));
command.printf("0");
wait(0.1);
}
if (bot1.read()==1)
{
myservo1.pulsewidth_us(degrees2usec(80));
command.printf("1");
wait(0.1);
}
command.printf("%d \n ",bot1.read());
}
2. MANUAL DE USUARIO¶
A continuación se describirán los pasos que el usuario debe seguir para hacer funcionar de manera correcta el proyecto del brazo de almacenamiento, todo ello ira con su respectiva imagen, para una mejor guia.
- Se debe tener conectada la tarjeta de desarrollo Núcleo STM F446RE.
- Descargar el código del software al Hardware. Luego de conectarla tarjeta , esta aparecerá en los equipos o dispositivos conectados al PC, se debe guardar el código y compilarlo correctamente en el software para luego copiar este mismo código a la carpeta de la tarjeta que aparece en los dispositivos.
- Iniciar desde el PC el programa Coolterm. Para ver el funcionamiento de la lectura del sensor TCS3200, se conectara el coolterm y luego en la pestaña

- Ingresar los comandos funcionales para que el robot inicie ha realizar las rutinas. Para saber cuales son los comando interpretables por el software se presentara a siguiente tabla.

En la tabla se definió los comandos para dar inicio a el funcionamiento del robot. la primera columna inicializa la trama de datos en valores hexadecimales condicionando a que sea únicamente "0XFF" de lo contrario no se desarrollará el programa.
En la segunda columna se especifica el tipo de Telecomando siendo "0X01" funciones que determinan únicamente el movimiento del brazo y siendo "0X02" función para abrir y cerrar la pinza. Para la columna tercera y cuarta se especifican las posiciones de cada uno de los eslabones. Adicionalmente en la columna de telecomandos está configurada para que cada motor se mueva individualmente, esto se logra dándole valores en hexadecimal correspondientes a cada grado en la columna de parámetros, como por ejemplo si se desea 180° se debe ingresar B4 ó 0 grados se ingresa 01 para mejor explicación se adjunta la siguiente tabla donde se explican cada 10°.

Luego siguen el telecomando de velocidad el cual se representa por "0X07" y se divide en tres parámetros brindando tres velocidades distintas en las cuales los servomotores deben funcionar, yendo de la velocidad mas lenta con el parámetros de 0X01 , velocidad media con el parámetro 0X02 y velocidad máxima con 0X03 hacia la posicion deseada.
- Demostración del Funcionamiento.
A continuación se mostrarán las correspondientes imágenes al funcionamiento de cada función.
Home.
Material.
Celda 1.
Celda 2.
Celda 3.
Celda 4.

Ahora se agregaron dos telecomandos mas 0X08 y 0X09, el primer telecomando se utiliza para el manejo de la pinza con el Joystick, el cual realizara el movimiento del motor desde 0° a 180°, el cual se compone de dos parámetros 0X01 con el cual se inicia el movimiento del brazo por medio del Joystick y el 0X02 el cual detiene el movimiento del brazo por medio del Joystick el cual funciona con el principio de un pulsador.
El ultimo telecomando añadido fue el 0X09, el cual se utiliza para activar la lectura del sensor TCS3200 , cuando ya no se este utilizando mas el control manual por medio del Joystick, el cual se utiliza un WIT diferente "0XFE" para su implementacion tanto en el código como en el programa Coolterm, según la tabla mostrada a continuación se puede diferenciar entre los colores según los parámetros dados como resultados de las lecturas del sensor en el Coolterm, dando como resultado el color según la lectura del sensor.
La lectura del sensor se realiza en distintos colores, como se muestra a continuación:
Color Rojo

Color Azul

Color Amarillo

Sin Color

Ahora se realizará la presentación de la lectura del Joystick

Ya por ultimo se mostrará la presentación final del prototipo.

Se requería de un plus para la presentación final, el cual se decidió se realizaría utilizando el teclado matricial, el cual controlara el acceso a la planta del sistema , por medio de una contraseña la cual sino se ingresa correctamente no permitira la activacion del proceso.