Camilo Ramirez / Mbed 2 deprecated ENTREGA FINAL SISTEMAS EMBEBIDOS

Dependencies:   mbed

You are viewing an older revision! See the latest version

ENTREGA 2 PICOLO SISTEMAS EMBEBIDOS

INTRODUCCIÓN

EN EL SIGUIENTE PROGRAMA SE PRESENTA EL CÓDIGO A UTILIZAR PARA EL MOVIMIENTO DEL PICCOLO TENIENDO COMO BASE LA COMUNICACIÓN SERIAL ENTRE NUESTRO MODULO Y NUESTRO PC, PARA ESTO EMPLEAMOS UNA PROGRAMACIÓN SECCIONADA, EN DONDE MANEJAMOS DIFERENTES FUNCIONES Y VARIABLES TANTO PARA LA COMUNICACIÓN, GUARDADO, UBICACIÓN Y EFICIENCIA EN GENERAL DE NUESTRO ROBOT.

DESCRIPCIÓN DEL PROGRAMA:

EL PROGRAMA COMO TAL ESTA DIVIDIDO EN 4 SECCIONES;

DEF.H:

PRINCIPALMENTE DECIDIMOS DEJAR LAS VARIABLES A UTILIZAR EN UN ARCHIVO CABECERA LLAMADO def.h , COMO YA SE MENCIONO, AQUÍ ALOJAREMOS NUESTRAS VARIABLES CON VALORES PREVIAMENTE ASIGNADOS

/media/uploads/Camilokingxd/1.png

LAS VARIABLES UTILIZADAS SON DEFINIDAS DEPENDIENDO DE SU USO, PRIMERAMENTE ENCONTRAMOS LA DEFINICIÓN DE LA VARIABLE MEM_SIZE, EN DONDE DEFINIMOS EL TAMAÑO DE LA MEMORIA Y POR TAL MOTIVO LA CANTIDAD DE ESPACIOS QUE TENDRA NUESTRO ARREGLO, POSTERIORMENTE ENCONTRAREMOS LA VARIABLE MEM_TYPE, QUE DEFINIRÁ EL TAMAÑO DE CADA UNA DE NUESTRAS POSICIONES, EN ESTE CASO DE 32 BITS (4 BYTES), SE DEFINEN LOS PULSOS MAXIMOS Y MINIMOS PARA POSICIONAR NUESTROS SERVOMOTORES A 0° O A 180°, POSTERIORMENTE DEFINIMOS NUESTRA MAXIMA POSICION EN MILÍMETROS PARA TENER UNA VARIABLE QUE LIMITE EL MAXIMO DE RECORRIDO DE NUESTRO PICCOLO EN SUS EJES X Y Y, DE IGUAL MANERA SE HACE CON LAS VARIABLES DRAW Y NO DRAW, ASIGNÁNDOLES SUS VALORES EN MILÍMETROS PARA ESTAS POSICIONES, YA POR ULTIMO SE DEFINEN LOS COMANDOS QUE UTILIZAREMOS Y A QUE VALOR CORRESPONDE CADA UNO DE ESTOS, DE IGUAL MANERA DEFINIMOS UNA VARIABLE CON UN NUMERO CONCRETO DE PASOS NECESARIOS PARA QUE EL PICOLO AVANCE O RECORRA LOS 5 CENTÍMETROS CORRESPONDIENTES A CADA CUADRICULA. POR ULTIMO SE DEFINEN 4 VARIABLES CON EL FIN DE CARACTERIZAR LAS POSIBLES DIRECCIONES QUE TOME EL PICCOLO EN EL TABLERO DE JUEGO.

MAIN.CPP:

EN NUESTRO PROGRAMA PRINCIPAL DEFINIMOS LAS LIBRERIAS NECESARIAS PARA EL FUNCIONAMIENTO DEL ROBOT, EL PROGRAMA COMIENZA CON LA ASIGNACIÓN DE LA SEÑAL PWM A LOS PINES PB4,PB5 Y PB3 ENCARGADOS DE MOVER LOS SERVOMOTORES SEGUIDO DE ESTO INICIALIZAMOS LA COLA Y CABEZA DE LA MEMORIA EN UNA POSICION 0, SE DEFINEN EL TAMAÑO Y EL TIPO DE NUESTRA MEMORIA .

/media/uploads/Camilokingxd/2.png

SE CREA UNA PEQUEÑA FUNCIÓN CON EL OBJETIVO DE LIBERAR LA MEMORIA EN CASO DE QUE SEA NECESARIO BORRAR LA INFORMACIÓN QUE SE ENCUENTRE GUARDADA. POSTERIORMENTE ENCONTRAMOS NUESTRA FUNCIÓN MEM_PUT, EN DONDE EMPEZAMOS VERIFICANDO QUE HAYA ESPACIO PARA ASIGNAR UN DATO A NUESTRA POSICIÓN EN LA QUE SE ENCUENTRE EL APUNTADOR CABEZERA, SI LA MEMORIA ESTA LLENA, EL PROGRAMA NOS RETORNA UN 1, DE LO CONTRARIO SE LE ASIGNARA EL DATO AL ARREGLO "BUFFER" EN LA POSICION "MEM_HEAD", CORREMOS 1 POSICION NUESTRO APUNTADOR Y VERIFICAMOS QUE AUN QUEDE ESPACIO EN NUESTRO ARREGLO, DE SER ASI, RETORNAREMOS UN 1 DANDO A ENTENDER QUE TODO ESTA EN ORDEN. PARA NUESTRA FUNCION MEM_GET, SE APLICA UN PRINCIPIO SIMILAR AL DE MEM_PUT, EMPEZAMOS VERIFICANDO SI TENEMOS DATOS QUE LEER, DE NO SER ASI, EL PROGRAMA RETORNARA UN 1 DANDO A SABER QUE NO TENEMOS NADA GUARDADO EN NUESTRA MEMORIA, POSTERIORMENTE SE REALIZA LA OBTENCION DE DATOS SUMANDO DE A UNA POSICION A LA COLA DEL ARREGLO, CUANDO LA COLA LLEGE HASTA LA CABEZA DEL ARREGLO SABREMOS QUE YA FUERON OBTENIDOS TODOS LOS DATOS QUE SE TENÍAN, SE RETORNA UN 0 INDICANDO QUE EL PROCESO FUE SATISFACTORIO.

/media/uploads/Camilokingxd/3.png

EMPEZAMOS NUESTRO CÓDIGO COMO TAL DEFINIENDO NUESTRO VOID VERTEX2D CON DOS COORDENADAS CON VALORES DE 8 BITS, LAS CUALES SERÁN CONVERTIDAS POSTERIORMENTE A PULSOS COMO TAL, SE REALIZA EL MISMO PROCESO CON LA FUNCIÓN PARA NUESTRO EJE Z. DEFINIMOS X, Y Y Z COMO ENTEROS POSITIVOS DE 8 BITS, SE AGREGAN LAS VARIABLES QUE ALMACENARAN LA POSICIÓN DEL PICOLO EN LA MATRIZ EN TRES DIFERENTES CASOS, LA POSICIÓN ANTERIOR, LA POSICIÓN ACTUAL Y EL NUMERO DE CASILLAS PARA LLEGAR A LA POSICIÓN DESEADA E INCLUIMOS LA FUNCIÓN QUE REALIZARA LA CONVERSIÓN DE MILÍMETROS A PULSOS. DECLARAMOS LAS FUNCIONES QUE UTILIZAREMOS POSTERIORMENTE E INICIAMOS NUESTRO MAIN OFICIAL.

/media/uploads/Camilokingxd/4.png

EMPEZAMOS DECLARANDO EL PERIODO PARA CADA UNO DE NUESTROS SERVOS, SE INICIA LA COMUNICACION SERIAL CON LA SUBRUTINA PROGRAMSERIAL Y DEFINIMOS LAS VARIABLES LETRA Y SUBLETRA, LAS CUALES SE UTILIZARAN POSTERIORMENTE PARA LA SEPARACION DE NUESTROS BYTES, SE INICIALIZA NUESTRO PICCOLO EN 0,0 EN EL EJE X Y Y, Y EL EJE Z EN NO DRAW, ENCENDEMOS EL LED PARA VERIFICAR QUE ESTE BIEN PROGRAMADA NUESTRA TARJETA E INICIALIZAMOS NUESTRO CICLO INFINITO.

/media/uploads/Camilokingxd/5.png

EMPEZAMOS ENVIANDO EL MENSAJE DE "INGRESE COMANDO", IMPORTANTE, EL PROGRAMA INICIALMENTE DEBE LEER SI SE QUIERE GUARDAR DATOS O EJECUTAR LOS DATOS QUE TENGA LA MEMORIA, ESTE COMANDO DEBE ESTAR SEGUIDO POR EL END (F0); ESTE VALOR DE 16 BITS SE CARGA SU PRIMER BYTE A LA VARIABLE "LETRA" Y SU SEGUNDO BYTE A LA VARIABLE "SUBLETRA", PRIMERO VERIFICAMOS QUE SE HALLA CERRADO CORRECTAMENTE EL COMANDO, ES DECIR QUE SE HALLA DIGITADO EL F0 COMO FINAL DE LINEA, SI FUE ASÍ, SE PROCEDE A ANALIZAR SI EL COMANDO INGRESADO FUE EL DE EJECUTAR O EL DE GUARDAR, PARA EL CASO 1 (EJECUTAR), SE VERIFICA QUE EFECTIVAMENTE EXISTAN DATOS EN NUESTRA MEMORIA, SI ES ASI SE REDIRIGE A LA FUNCION DE EJECUTAR, DEL CONTRARIO SE ENVIA UN MENSAJE ESPECIFICANDO QUE LA EMEMORIA SE ENCUENTRA VACIA, PARA NUESTRO SEGUNDO CASO (GUARDAR) SE DEBEN DE INGRESAR LOS DATOS, Y FINALIZAR ESTE GUARDADO, SI SE REALIZA BIEN ESTE PROCESO, EL PROGRAMA RETORNARA UN 0 INDICANDONOS QUE SE GUARDARON LOS DATOS CORRECTAMENTE. DE LO CONTRARIO SE ENVIA UN MENSAJE DE ERROR EN EL GUARDADO, DE NO SER ESPECIFICADO EL COMANDO INGRESADO COMO ALGUNA DE ESTAS DOS OPCIONES SE ENVIA UN MENSAJE DE COMANDO NO DEFINIDO.

/media/uploads/Camilokingxd/6.png

EN LA FUNCIÓN MM2PULSE SE REALIZA LA CONVERSION DEL NUMERO ENTRE 0 Y 50 AL PULSO RESPECTIVO PARA EL MOVIMIENTO DE LOS SERVOMOTORES, AQUI SE REALIZA INICIALMENTE UNA COMPARACIÓN PARA CONSTATAR QUE EL NUMERO INGRESADO POR EL OPERADOR NO HAYA SIDO MAYOR A 50, DE SER ASÍ SE REALIZA LA CONVERSIÓN Y ENVIA EL RESPECTIVO PULSO. PARA LA FUNCIÓN DE SETZ SE SIGUE EL MISMO PRINCIPIO DE FUNCIONAMIENTO, AUNQUE AL SABERSE QUE SOLO SE MOVERÁ EN SUS DOS POSICIONES LIMITES. LA FUNCIÓN DEL VERTEX2D SIMPLEMENTE REUNE ESTOS VALORES YA CONVERTIDOS EN TÉRMINOS DE PULSO Y LOS ENVÍA A LOS MOTORES DE LOS EJES "X" Y "Y". EN LA FUNCIÓN DEL PROGRAM_SERIAL SE PROGRAMA LA VELOCIDAD DE LA TRANSMISIÓN DE DATOS, LOS BITS DE PARADA Y OTROS PARÁMETROS DE LA COMUNICACIÓN SERIAL.

/media/uploads/Camilokingxd/7.png

EN LA FUNCION DE EJECUTAR SE EMPIEZA ENVIANDO EL MENSAJE DE QUE EL PROGRAMA SE ESTA EJECUTANDO, DE ENTRAR A ESTA FUNCIÓN SE SABE QUE EL PROGRAMA SE GUARDO CORRECTAMENTE, QUE HAY DATOS Y QUE SE VA A PROCEDER A LEERLO CONFORME SE INGRESARON, DECLARAMOS LAS VARIABLES A,B,C,D,L, L1. L2 Y L3 LAS CUALES EXPLICAREMOS MAS ADELANTE, LE ASIGNAMOS EL TAMAÑO A NUESTRA MEMORIA Y PROGRAMAMOS LOS PUERTOS POR LOS CUALES ENVIAREMOS LOS SELECTORES A NUESTROS MOTORES PASO A PASO, ACONTINUACION CARGAMOS A NUESTRA VARIABLE "VAL" LO QUE SE TENGA ALMACENADO EN LA MEMORIA, AHORA SE FRACIONARA NUESTRA PRIMERA LINEA DE MAMEROA, ESTA LA DIVIDIREMOS EN 4 SUB COMANDOS, DPEENDIENDO DE QUE VALORES TOMEN SUS PRIMEROS BYTES SABREMOS QUE FUNCION ES LA QUE EJECUTAREMOS.

/media/uploads/Camilokingxd/8.png

EMPEZAREMOS CON UN PARAMETRO QUE NOS ESTABLEZCA SI EL COMANDO SE TRATA DE UNA SERIE DE 4 SUBCOMANDOS O DE 3 SUBCOMANDOS, PARA ESTO SE COMPARA EL TERCER SUBCOMANDO DE LA LINEA DEL PROGRAMA, SABIENDO SI SE TRATA DE VERTEX O STEPMOTOR, O POR EL CONTRARIO DE ALGUN OTRO COMANDO. SI SE SABE QUE EL COMANDO PRINCIPAL POR OBLIGACIÓN TENDRÁ 2 DATOS MAS SE PROCEDE A HACER LA NUEVA SEPARACIÓN, EN DONDE EL PRIMER BYTE SE GUARDA EN LA VARIABLE "A", EL SEGUNDO EN LA "B", EL TERCERO EN LA "C" Y EL CUARTO EN LA "D". SELECCIONAMOS EL PRIMER COMANDO "A" Y VERIFICAMOS SI SE TRATA DE UN VERTEX2D O DE UN STEPMOTOR, DE TRATARSE DE EL VERTEX2D SE ENVÍAN LOS COMANDOS "B" Y "C" CORRESPONDIENTES A LAS COORDENADAS "X" Y "Y", DE NO SER ASÍ, SE SABE QUE EL COMANDO A MANEJAR ES EL STEPMOTOR, AQUÍ GUARDAMOS EN "XNEW" LA POSICIÓN EN X A LA QUE NOS DESEAMOS MOVER, Y EN "YNEW" LA POSICIÓN EN Y A LA QUE NOS DESEAMOS MOVER, SE CALCULA MEDIANTE RESTAS EL NUMERO DE CASILLAS QUE SE DEBE MOVER EN "X" Y "Y" PARA LLEGAR A LA NUEVA POSICIÓN, Y FINALMENTE SE LE ASIGNA A LA POSICIÓN ANTERIOR LA POSICIÓN NUEVA CON EL FIN DE VOLVER A REALIZAR ESTA FUNCIÓN EN UN PRÓXIMO MOVIMIENTO.

/media/uploads/Camilokingxd/9.png

LO QUE QUEDA AHORA ES ANALIZAR LOS POSIBLES MOVIMIENTOS QUE SE PUEDEN PRESENTAR Y ASIGNARLES LA MEJOR RUTA PARA LLEGAR A ESAS CASILLAS TENIENDO EN CUENTA QUE EN ALGUNAS OCASIONES EL MOVIMIENTO PUEDE SER NEGATIVO, PARA ESTO SE USA LA MULTIPLICACION POR SU VALOR ABSOLUTO, ESTO SE CARGA EN UNA VARIABLE LLAMADA "NOY" LA CUAL POSTERIORMENTE SE MULTIPLICA POR EL NUMERO DE PASOS NECESARIO PARA RECORRER EL CUADRANTE.

/media/uploads/Camilokingxd/10.png

DE NO SER NINGUNA DE ESTAS DOS ACCIONES SIMPLEMENTE SE SABE QUE LA FUNCIÓN ES DRAW O NODRAW Y SE REALIZA LA ACCIÓN CORRESPONDIENTE, AL TERMINARSE ESTO SE VUELVA A GUARDAR EN VAL LO QUE QUEDE EN LA MEMORIA, SE VUELVE A HACER LA SEPARACIÓN DE BYTES Y SE REPITE EL PROCESO HASTA QUE SE ENCUENTRE UN "FA". CUANDO SE TERMINEN DE EJECUTAR LO QUE SE ENCUENTRE EN LA MEMORIA, EL PROGRAMA ENVÍA UN MENSAJE DICIENDO QUE EL PROGRAMA YA SE HA TERMINADO DE EJECUTAR.

/media/uploads/Camilokingxd/11.png


All wikipages