Bienvenidos a este tutorial, en el que mostraremos cómo configurar nuestra tarjeta de desarrollo Ophyra para poder realizar comunicación RS232.
Proyecto a realizar: Al establecer la comunicación RS232, estaremos mandándole datos a la Ophyra. Si la Ophyra recibe el carácter ‘E’, encenderá un LED; y al recibir el carácter ‘A’, apagará ese mismo LED.
Configurando el hardware.
Una vez ya creado nuestro proyecto (véase el tutorial preliminar de Crear un Proyecto para Ophyra), el siguiente paso es activar los recursos a utilizar. Como en esta proyecto se utilizará la comunicación RS232, requerimos activar el recurso USART (Transmisor-Receptor Síncrono/Asíncrono Universal por sus siglas en inglés), que es la herramienta general para utilizar varios protocolos de comunicación.
Paso 1. En las categorías de la izquierda, entraremos a Connectivity y podremos observar la lista de recursos que tiene el microcontrolador para todos los protocolos de comunicación que soporta. En nuestro caso, seleccionaremos el USART3, pues al revisar el Manual de Ophyra en la sección “12. Bus de datos del puerto COM”, ahí se indica que el puerto disponible para conectar nuestro cable USB es el USART3 y utiliza los pines PB10 y PB11 para la comunicación.
Regresando a las opciones de activación, en la opción de Mode (Modo) seleccionaremos Asynchronous (Asíncrono), y en el apartado de Hardware Flow Control (RS232) lo dejaremos con la opción Disable (Deshabilitado).
Al haberlo activado, podremos observar que ya se han activado también los pines correspondientes para transmitir (TX) y recibir (RX) los datos.
Paso 2. Ahora bien, pasamos a configurar nuestro recurso activado. Veremos varias opciones de configuración, tales como:
- Baud Rate: Indica la velocidad de transmisión (Bits por segundo)
- World Length: Establece el tamaño de la palabra en un número de bits (8 ó 9 bits)
- Parity: Este bit es utilizado como un método simple de detección de errores. Se puedes establecer como Even, Odd o puede estar desactivado.
- Stop Bits: Establece el largo que durará la señal de final de palabra. Puede ser 1 bit o 2 bits de largo.
- Data Direction: Se establece si la comunicación va a ser bidireccional o unidireccional.
- Over Sampling: Se indica la frecuencia de muestro para el procesamiento de señales.
Para nuestra configuración, estableceremos los valores como se muestran en la siguiente imagen.
Paso 3. Ahora procedemos a regresar a la seleccion de pines del microcontrolador. Activaremos el pin del LED correspondiente que se encenderá o apagará de acuerdo a nuestra condición. En nuestro caso, elegimos el pin PE2, el cual según las especificaciones en el Manual de Ophyra corresponde al LED Azul del LED RGB. También hacemos su configuración correspondiente en la sección System Core → GPIO.
Paso 5. Ahora es momento de generar nuestro código.
ADVERTENCIA
Si durante la creación de tu proyecto no llegaste a configurar el reloj de la tarjeta o a configurar los detalles del proyecto respecto a la generación del código, aún estás a tiempo.
Para sabér cómo hacer esas configuraciones, dirígase al tutorial preliminar de Crear un Proyecto para Ophyra y siga los pasos en Anexo 1: Configurar el reloj de la Ophyra y Anexo 2: Configurar los detalles el proyecto.
Para generar el código, basta con hacer clic en el botón de Guardar que se encuentra en la barra de herramientas en la parte superior. La interfaz cambiará y comenzará a cargar el código, así como se muestra en la siguiente imagen.
Realiznado el programa
Paso 6. Así como en esta práctica utilizaremos tipos de variables que van más allá de puros enteros (una cadena de caracteres, en nuestro caso) es necesario activar librerías de las que se cuentan disponibles.
En la parte inicial del código, encontraremos la sección de “Includes”. Ahí es donde colocaremos nuestras librerías. Nuestras librerías a incluir son stdio.h
y string.h
. Para poderlos incluir, se escribe como se muestra a continuación:
/* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include <stdio.h> #include <string.h> /* USER CODE END Includes */
Paso 7. Declararemos nuestras variables a utilizar. Para ello necesitamos dos:
- Una variable que se encarge de almacenar la palabra de 8 bits que va recibiendo a través de la comunicación RS232.
- Unn arreglo que almacene toda la cadena de caractere que enviemos. Debe ser lo suficientemente grande para almacenar al menos la frase de “Hola Mundo” que enviaremos.
int main(void) { /* USER CODE BEGIN 1 */ uint8_t Dato_Recibido[1]; char bufer[30]; /* USER CODE END 1 */
Paso 8. Procederemos a desarrollar nuestro código dentro del ciclo infinito del while. Nuestro código es el siguiente:
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_UART_Receive(&huart3, Dato_Recibido, (uint16_t)1, (uint32_t)100); if (Dato_Recibido[0] == 'E') { HAL_GPIO_WritePin(Led_Azul_GPIO_Port, Led_Azul_Pin, GPIO_PIN_RESET); } else if (Dato_Recibido[0] == 'A') { HAL_GPIO_WritePin(Led_Azul_GPIO_Port, Led_Azul_Pin, GPIO_PIN_SET); } sprintf(bufer, "Hola Mundo \n\r"); HAL_UART_Transmit(&huart3, (uint8_t*)bufer, (uint16_t)strlen(bufer), (uint32_t)100); } /* USER CODE END 3 */
La primera parte del código (antes del renglón en blanco resaltado) se encarga de recibir un dato por el puerto serial y compara si es un carácter válido. Al recibir una letra “E” se encenderá el LED Azul, mientras que al recibir la letra “A”, se apagará.
La segunda sección del código se encarga de enviar una cadena de caracteres por el puerto. En nuestro caso, se envía la leyenda “Hola Mundo” seguido del carácter especial correspondiente al Enter (salto de línea).
En este tutorial hemos implementado nuevas funciones. La primera de ellas es:
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Esta función se encarga de recuperar los datos provenientes del puerto serial y los guarda en una variable o arreglo, en este caso el dato recibido lo guarda en nuestra variable Dato_Recibido
. Podemos observar que requiere de cuatro parámetros, los cuales se explican a continuación.
- El puntero a la estructura del tipo
UART_HandleTypeDef
que contiene la información de configuración para el módulo UART que se utilizará. - Variable o apuntador que contendrá los datos provenientes del puerto, estos tienen que ser de 8 bits (del tipo
uint8_t
). - Cantidad de datos a recibir.
- Tiempo de espera en milisegundos (ms) de la transmisión.
También tenemos una segunda función, la cual es:
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Esta función se encarga de enviar los datos provenientes de una variable o arreglo, hacia el puerto serial. En este caso los datos enviados están en un arreglo llamado buffer
. Esta función tiene también cuatro parámetros que en nombre son idénticos al de la función anterior. En nuestro caso, dentro del tercer parámetro utilizamos la función strlen (const char *)
que se encarga de calcular la cantidad de caracteres contenios en nuestro arreglo y devuelve dicho valor, ahorrándonos así la molestia de tener que contar la longitud de nuestra frase de "Hola Mundo \n"
.
Paso final – Cargar el programa a la Ophyra
Ahora, falta programar nuestro código a la tarjeta Ophyra. Las instrucciones se encuentran en el tutorial del Paso final – Cargar el programa a la Ophyra.
Abriendo la terminal del puerto serial
IMPORTANTE
Para poder tener la comunicación RS232 al puerto COM de la Tarjeta Ophyra, es importante tener conectada la tarjeta por el puerto lateral.
Después de cargar el programa a la tarjeta Ophyra, necesitamos abrir la terminal del puerto serial que viene integrada en el STM32Cube IDE. Para poder empezar, necesitamos que la ventana Console se encuentre abierta. Por defecto, suele estar en la parte inferior de la interfaz. En el caso de que no se encuentre la ventana, se puede abrir entrando al menú Window → Show View y seleccionando Console.
La ventana de consola cuenta con su propia barra de herramientas, localizada en la parte superior derecha de la ventana. Presionaremos en Open Console, y de las opciones que despliega, elegiremos 3 Command Shell Console.
Se abrirá una pequeña ventana que contiene tres parámetros a configurar. En Connection Type elegiremos Serial Port, luego elegimos el Encoding tipo UTF-8. En Connection name, no encontraremos ninguna opción disponible por ser la primera vez. Entonces, le presionamos en New… para crear nuestra conección de Ophyra.
Se abrirá una nueva ventana en la que se configurarán los parámetros de comunicación serial. De los parámetros que aparecen, sólo configuraremos el nombre y el puerto serial. Los demás se dejarán así pues esos son los mismos valores que pusimos en la configuraación del microcontrolador de Ophyra (deben de coincidir para que la comunicación sea eficaz).
En el nombre podremos llamarle “Ophyra” para así identificarlo posteriormente, y en el puerto serial (Serial Port) buscamos el puerto COM que corresponde a nuestra tarjeta. Para que el puerto COM de la tarjeta aparezca en la lista de opciones, deberá estar corriendo el programa de la tarjeta, es decir, no deberá estar en modo Bootloader.
Nota
Si a pesar de que la tarjeta esté conectada y fuera del modo Bootloader aún sigue sin aparecer en la lista de puertos serial COM, entonces hace falta descargarle los drivers. Haga click aquí para entrar a la página donde puede descargar los drivers.
Dentro de la página, encontrará una tabla con varios links de descarga según el sistema operativo de su computadora.
Una vez descargado e instalado, el software ya deberá de reconocer el puerto COM de la Ophyra para poderlo seleccionar.
Una vez creada esa configuración, presiona el botón Finish para que se guarde y cierre la ventana. Regresará a la ventana anterior y ahora en la lista de opciones de Connection name ya podrá encontrar la de nombre “Ophyra”. La selecciona y presionamos en OK.
Resultados
Ya con la terminal del puerto serial abierta en nuestro STM32Cube IDE, podremos observar que se está escribiendo constantemente la frase “Hola Mundo”.
Con la terminal abierta, cada tecla de caracteres que presionemos, será enviado hacia la Ophyra. Si llegamos a mandar la letra E (debe ser en mayúscula, pues así lo programamos), entonces observaremos que el LED Azul enciende. Al mandar la letra A, el botón se apagará.
Conclusiones
Hemos logrado configurar y programar en Ophyra el puerto serial disponible, enviando y recibiendo datos por el mismo. Te sugerimos continuar haciendo más ejercicios, como la recepción de datos más largos y el despliegue de datos numéricos por la terminal.
Para seguir aprendiendo más sobre los recursos básicos de la Ophyra, te recomendamos seguir con el siguiente tutorial: 8. Lectura del sensor MPU6050 (Acelerómetro y Giroscopio).