Estancia de doctorado en el CONNECT – Centre for Future Networks and Communications

Como parte de su doctorado, nuestro compañero Ramiro Utrilla acaba de comenzar una estancia de investigación en el CONNECT – Centre for Future Networks and Communications. Este centro de investigación, financiado por la Science Foundation Ireland y el Fondo Europeo de Desarrollo Regional (FEDER), está constituido por miembros de las principales universidades de Irlanda y centra su actividad en el desarrollo, innovación e investigación de las telecomunicaciones.

Durante los 3-4 meses que dure la estancia, Ramiro estará trabajando en el grupo del Prof. Luiz Da Silva. Una de las líneas principales de investigación de este grupo es la aplicación de Inteligencia Artificial y Machine Learning al ámbito de las comunicaciones.

El objetivo de esta colaboración consiste en abordar el problema de la saturación del espectro, y la coexistencia de los dispositivos que operan en él, desde el punto de vista de los nodos finales, aquellos con más bajos recursos computacionales y energéticos. Para ello, es necesario trasladar el paradigma de la Radio Cognitiva a las características específicas de este tipo de sistemas.

En concreto, la primera aproximación consistirá en adaptar y evaluar técnicas de sensado espectral basadas redes neuronales a MIGOU, la plataforma de Radio Definida por Software de bajo consumo desarrollada por Ramiro durante la primera etapa de su tesis.

Estamos muy ilusionados con esta colaboración entre el CONNECT y el B105 ya que consideramos que su conocimiento en Inteligencia Artificial junto con nuestras capacidades técnicas de implementación pueden dar resultados muy interesantes y novedosos.

¡Os seguiremos informando!

B105 wins the Defense and Security Innovation Brokerage

On May 30, 2019, the DSiB (Defense and Security Innovation Brokerage) was held within the FEINDEF (International Defense and Security Exhibition).

The B105 attended the brokerage with 3 presentations:

  • Remotely Deployable Cognitive WSN for RMBQ
  • Safety and secure communications on the body
  • C4W – Command, control, communications and computer for Wireless

At the end of the sessions, prizes were awarded to those that the organization considered to be the best projects, granting the B105 Electronic Systems Lab the first award for the project: “C4W – Command, Control, Communications and Computer for Wireless

Taller con Empresas “4”. Fuerza 2035 – Mando

El pasado martes 21 tuvo lugar el Taller con Empresas “4”. FUERZA 2035 – MANDO organizado por la Dirección de Adquisiciones (DIAD) del Mando de Apoyo Logístico del Ejército (MALE), junto a la Subdirección General de Planificación, Tecnología e Innovación (SDG PLATIN) de la Dirección General de Armamento y Material (DGAM) en la Base “El Goloso”.

Los objetivos de este Taller “4” centrado en los sistemas de mando y control eran:

  • Acercar las posibilidades del mercado a las necesidades de las unidades del ET identificadas en el S/GTFUERZA 2035 y en PLEX BRIEX, así como realizar prospectiva de necesidades futuras, en lo que respecta a medios, tecnologías y procedimientos relacionados con la función de combate “Mando”: sistemas de información para C2, sistemas de telecomunicaciones, soluciones de interoperabilidad y herramientas de ciberdefensa aplicables a C2.
  • Identificar actividades futuras (principalmente demostraciones prácticas y experimentaciones) a realizar por empresas en el marco del desarrollo del concepto Fuerza 35.
  • Fomentar la interacción e intercambio de información entre empresas, universidades y centros y asociaciones tecnológicas. 

El B105 participó en la jornada a través de la ponencia “Puesto de Mando Inalámbrico en el nivel Brigada diseñado utilizando metodologías “Human Centered Design”” impartida por Octavio Nieto-Taladriz. En esta ponencia presentamos un ejemplo de diseño de un puesto de mando de despliegue rápido utilizando tecnologías ágiles de diseño, en concreto SCUM, y basado en el “triángulo de oro” formado por Universidad, Ejército e Industria.

Los participantes en este proyecto, además del B105 fueron la Brigada Guadarrama XII como usuarios finales, la empresa Teldat como socio industrial y el Colegio Universitario de la Defensa de Zaragoza y la Escuela Politécnica Superior del Ejército de Tierra como observadores.

Tras la exposición y en los tiempos dedicados a “networking” pudimos comprobar el gran impacto que había tenido esta presentación.

III Jornada sobre Daño Cerebral Adquirido

El pasado sábado tuvo lugar una jornada sobre Daño Cerebral Adquirido (DCA) en A Coruña, organizada por ADACECO y la Fundación Maria José Jove.  En esta jornada se profundizó en el conocimiento del DCA y su aspecto multidisciplinar. Se trataron las últimás novedades médico-sanitarias, tecnológicas, implicaciones legales, así como el aspecto emocional y social de los afectados.

Responsables de ADACECO, Fundación María José Jove, FEDACE y Conselleira de Política Social.

El B105 participó en la jornada a través de la ponencia “Robótica y Daño Cerebral Adquirido” impartida por Alvaro Araujo. En esta ponencia presentamos la línea de investigación que estamos desarrollando para la implementación de una red neuronal inalámbrica que permita ayudar a usuarios con problemas neurológicos. Pudimos comprobar el interés de los asistentes en la investigación y el apoyo para seguir desarrollando la misma.

Pudimos comprender mejor a los afectados por DCA y sus familiares, así como compartir diferentes experiencias con todos los profesionales involucrados que nos ayudarán a mejorar en nuestra labor.

Alvaro Araujo presentando la ponencia “Robótica y Daño Cerebral Adquirido”

Becas Cátedra BQ 2018/2019 2o Cuatrimestre

Fruto de la colaboración del B105 con BQ se lanza esta nueva convocatoria de becas para el segundo semestre del curso académico 2018/2019 (ver documento adjunto).

Los interesados en alguna de las becas deberán enviar un correo electrónico a la dirección  catedra.bq.upm@bq.com con la siguiente información:

  • Asunto: [Becas Cátedra  BQ].
  • Curriculum Vitae.
  • Beca/s en las que estás interesado y la motivación.
  • Situación actual del candidato: curso, asignaturas pendientes, limitaciones de horarios, interés en realizar PFC, TFG, TFM, Prácticas en Empresa, etc.

Información de interés:

  • Fecha límite de recepción de CV: 24 de Febrero de 2019
  • Fecha de inicio de las becas: Preferiblemente 1 de Marzo de 2019.

Os esperamos!

STM32F4: Cómo utilizar el ADC con DMA

Para este post, continuando con los post de esta placa, veremos los primeros pasos a dar para comenzar a obtener datos del ADC utilizando el DMA.

Pero la primera pregunta que debemos contestar es ¿qué es el DMA? El DMA (Direct Memory Access) es una forma de leer o escribir en memoria sin utilizar la CPU de la que disponen ciertos elementos como el ADC. Esto significa que no estamos perdiendo tiempo de CPU en procesar las muestras, por lo que éstas se procesan en background y mientras podemos estar haciendo otra cosa. Además, esto permite que las muestras de una señal no se pierdan por tiempo de procesado de la CPU.

CONFIGURACIÓN INICIAL

Abrimos CubeMX y habilitamos el ADC como en pasados tutoriales, pero esta vez habilitamos la opción de DMA Continuous Requests.

Configuración ADC

En ese momento, en la pestaña de DMA Settings tenemos que añadir un stream que tenga las características que se muestran en la imagen y después comprobar que en NVIC Settings de éste está habilitado. Es importante prestar atención al tipo de buffer a utilizar. Para esta primera prueba utilizaremos el normal, y después pasaremos al circular, puesto que es el que nos permite tener una captación de datos continua y renovada.

Ajustes para usar el DMA con el ADC

Tenemos que mantener el timer interno funcionando como en el tutorial anterior, ya que así garantizamos que estamos tomando las muestras correctamente, pero también se puede utilizar el ADC con DMA sin timer.

LECTURA Y REPRESENTACIÓN DE LA SEÑAL

Empezamos arrancando el timer y el ADC, pero para este último, utilizando las funciones que están relacionadas también con el DMA (como HAL_ADC_Start_DMA). Esta última función tiene como uno de sus argumentos el tamaño de los datos que vamos a leer.

Tras esto, haciendo uso de las funciones relacionadas con el DMA y el ADC, podemos controlar cuando ha terminado la lectura para, en ese momento, guardar los datos. De hecho, podemos controlar tanto la transacción completa como la mitad de la misma. Se deja la implementación al lector.

Finalmente, representamos estos datos para saber si lo estamos haciendo bien, (considerando que la configuración del timer es la misma que en el ejemplo anterior y la señal de entrada también). Manteniendo esta configuración y cambiando el buffer del DMA a circular en adc.c (hdma_adc1.Init.Mode = DMA_CIRCULAR;), lo que conseguimos es que el array donde se actualizan los datos esté en continuo cambio, pero hasta que no se detecta el fin de la transacción, no se guarda. La representación sería la misma en los dos casos (normal y circular).

Representación de los datos procesados por el DMA del ADC

 

Nota: la imagen de la portada se ha obtenido de CocoaStream Technologies.

STM32F4: Configuración del ADC con un timer

Este tutorial debe seguirse después de haber realizado el tutorial sobre la configuración y el uso básico del ADC, el cual se encuentra en la lista de tutoriales de la placa de desarrollo STM32F4.

 

CONFIGURACIÓN INICIAL

Timer externo:

En este caso, en CubeMX, también seleccionamos el pin PA1 como pin de entrada al ADC, pero además, en las opciones de la izquierda que se muestran al desplegar el ADC1, debemos seleccionar External-Trigger-for-Regular-Conversion. Esto se debe a que vamos a utilizar un timer para controlar cuando realizamos las lecturas del ADC. Por lo tanto, tenemos que habilitar este timer también. Podría ser cualquiera de los que muestra cubeMX, nosotros hemos elegido el timer 1, canal 1. Entre las opciones posibles para su configuración, hemos elegido PWM generation CH1, para así utilizar la información de uno de los anteriores tutoriales, aunque ésta no sería la única opción.

Todo esto puede verse reflejado en la imagen siguiente, donde encontramos los pines ADC1_TIM1, TIM1_CH1 y ADC1_EXTI11, la casilla de External-Trigger-for-Regular-Conversion marcada y el timer configurado como PWM.

Pinout ADC – PWM Timer

Al activar estas opciones, la configuración del ADC y del timer es la que encontramos en las imágenes siguientes. En cuanto al timer, hemos impuesto una frecuencia de 1 KHz y un ciclo del 50%. Sabiendo que la frecuencia del sistema es de 96 MHz, nos queda la siguiente igualdad:

(Preescaler + 1)x(Periodo + 1) = fclk/fPWM

Donde suponemos el preescalado y el periodo y obtenemos el pulso.

Configuración del ADC y del PWM Timer

Se deja al lector la implementación del timer externo sin configuración PWM.

Timer interno:

Para este otro caso, seleccionamos un timer que no tenga muchas funcionalidades, como el timer 2 (TIM2). En la opción clock source, seleccionamos Internal Clock, y después en la pestaña de configuración, ponemos la misma configuración que teníamos con el PWM en los campos que sean iguales.
Es importante seleccionar en “Trigger Event Selection TRGO” la opción de Update Event.

 

LECTURA Y REPRESENTACIÓN DE LA SEÑAL

Timer externo:

Ahora conectaremos el pin asociado al TIM1_CH1 con el pin asociado al ADC1_EXTI11 con un cable externo, y el generador de funciones en la entrada del ADC (PA1). Estas señales se pueden visualizar en el osciloscopio para comprobar que efectivamente es como esperamos.
Pasamos la configuración de CubeMX a Eclipse. Ahora no solo tenemos que iniciar el ADC sino también el timer. Después, la toma de datos sería de la misma forma que en el anterior tutorial. Se deja al lector la tarea de implementar el código, sería necesario el código del tutorial anterior del ADC y del tutorial relacionado con el timer.

Sin embargo, aquí tenemos que tener en cuenta el teorema de Nyquist, puesto que ahora tenemos una frecuencia de muestreo conocida. La señal de entrada será de 50 Hz, ya que así dispondremos de 20 muestras por período. El array en el que se guardan será de 100 muestras, por lo que tendremos 5 períodos de una representación muy aproximada de la señal, como bien puede observarse en la imagen.

Señal de 1 KHz procesada por el ADC

Timer interno:

En este caso no sería necesario conectar ningún cable adicional.
Tras pasar la configuración a Eclipse, iniciamos el timer de una forma diferente a la anterior, utilizando la función HAL_TIM_Base_Start(&htim2). Y ya podríamos correr nuestro código.

 

Nota: la imagen de la portada se ha obtenido de Jóvenes Científicos

STM32F4: Configuración y uso básico del ADC

Como continuación de los tutoriales relacionados con la placa de desarrollo STM32F411E-Discovery, en este post vamos a explicar las nociones básicas para el uso del ADC.
El ADC (Analog to Digital Converter) es un elemento que se utiliza en electrónica para convertir una señal analógica en una señal digital, es decir, es la comunicación entre Hardware y Software. Al permitir esta comunicación, el ADC se convierte en un elemento fundamental a la hora de poder utilizar las señales digitalmente.

En este tutorial aprenderemos el funcionamiento básico para realizar la lectura de un dato y de una señal, sin utilizar el DMA.

 

CONFIGURACIÓN INICIAL

El primer paso es utilizar CubeMX, al igual que en el resto de tutoriales. Para entender la configuración básica nos basamos primero en lo que nos cuentan los documentos relacionados con nuestra discovery (manual de usuario y manual de referencia) y con el ADC, y segundo en lo que nosotros buscamos obtener. Esto implica conocer los siguientes conceptos sobre la configuración:

  • Clock Prescaler: la frecuencia a la que se capturarán datos del ADC.
  • Scan Conversion Mode: este modo se activa cuando queremos usar varios canales del ADC.
  • Continuous Conversion Mode: al activarlo el ADC se pone a leer muestras de forma continua.
  • Discontinuous Conversion Mode: se utiliza para convertir un grupo cerrado de conversiones.
  • DMA Continuous Requests: se habilita cuando queremos utilizar el DMA.
  • End Of Conversion Selection: este flag se utiliza para determinar cuando se ha realizado una conversión.
  • Number of Conversion: determina el número de canales que van a realizar conversiones.

En este caso, el trigger externo no es necesario, por lo que se deja la opción de configuración mediante el software. Las opciones de Rank se dejan por defecto salvo que en los documentos anteriores nos indique lo contrario.

Por tanto, escogemos el pin PA1 como ADC1_IN1 y seguimos la configuración que puede verse en las imágenes. Tras lo cual, podemos pasar el código a Eclipse (el resto de pines que se ven marcados son los que se marcan al aceptar la configuración por defecto).

Configuración del ADC

Pin del ADC

Es importante tener en cuenta que aunque el modo continuo esté habilitado, si el modo End Of Conversion Selection está habilitado sólo se realizará una lectura.

 

LECTURA DE UN POTENCIÓMETRO

Conectamos un potenciómetro a la discovery, siendo la salida la conexión con el pin PA1 y los otros dos pines se conectan a VDD (alimentación) y GND (masa).

Entonces, dentro del main.c, tenemos que utilizar una función que permita empezar la conversión, otra que compruebe que el ADC está funcionando de forma correcta (utilizando la opción de polling) y otra que permita leer el valor del ADC. Se deja al lector la implementación de estas 3 funciones, las cuales pertenecen a la HAL – Hardware Abstraction Layer (es decir, aquellas funciones que permiten la interación entre Hardware y Software). Por ello, es conveniente revisar estas funciones, explicadas en este link. El valor deberá ser guardado en una variable.

Finalmente, compilamos y lanzamos el debugger. Al darle a empezar lo que tendremos será el valor que el ADC ha leído del potenciómetro una vez, el cual se encuentra entre 0 y 4096 (debido a los 2^12 bits que tiene el ADC). Para tener claro si el valor es leído correctamente, lo mejor es hacer 3 medidas: una con el potencióemtro en el mínimo (la variable tendría un valor cercano a 0), otra con el potenciómetro en el máximo (la variable tendría un valor cercano a 4096) y otra con el potenciómetro en el valor intermedio (la variable tendría un valor cercano a 2048).

Para leer la variable es necesario pausar la reproducción y poner el cursor encima de la variable en cuestión.

 

LECTURA DE UNA SINUSOIDE

El siguiente paso a dar es conseguir leer una sinusoide correctamente, es decir, teniendo en cuenta que la frecuencia de la señal obtenida es la misma que la de la sinusoide de entrada.

Conectamos el generador de funciones al pin PA1 y generamos una sinusoide de 1 KHz. El uso del osciloscopio para comprobaciones de entrada o salida es opcional y su uso se deja a elección del lector.

Las propiedades del ADC que tenemos que cambiar son las siguientes:

  • hadc1.Init.ContinuousConvMode = ENABLE; — Si lo teníamos DISABLE.
  • hadc1.Init.EOCSelection = DISABLE;

Esto se puede hacer directamente en el archivo adc.c, no es necesario ir a cubeMX a cambiar la configuración.

Sería necesario un array en el que guardar las muestras necesarias para la lectura de la sinusoide. Tras recoger las muestras, es necesario comprobar la señal que se está guardando a partir de estas muestras, lo cual se puede hacer utilizando cualquier herramienta que permita la representación de datos. En este caso, hemos utilizado MatLab, y lo que hemos obtenido es lo que se muestra en la imagen siguiente.

Sinusoide obtenida con los datos leídos del ADC

Podríamos pensar que ha funcionado correctamente al ver la imagen, pero si tenemos en cuenta que tenemos un array de 1000 elementos y una señal de entrada de 1 KHz, deberíamos estar haciendo 1 lectura cada milisegundo como máximo, y entonces podríamos ver un período de la señal. Si realizáramos lecturas más rápidas, veríamos menos de un período; y si son más lentas estaríamos perdiendo muestras y la señal no sería la misma. El problema es que no sabemos a qué velocidad se está realizando la captura y lectura de datos del ADC, pero por la imagen podemos deducir que lo que ocurre es el último caso. Las lecturas son más lentas, lo que provoca que estemos perdiendo muestras, y al perder muestras, para rellenar el array, necesitamos muestras de períodos siguientes, lo que hace que en su representación se observen varios períodos.

Una forma de intentar corregir este aspecto es aumentar la frecuencia de muestreo. Si no conseguimos una buena representación ni cuando la aumentamos, esto quiere decir que la limitación se encuentra en el tiempo que tarda el microcontrolador en procesar las instrucciones, y ahí poco podemos mejorar.

 

CONCLUSION

En este tutorial hemos aprendido a configurar un ADC y a realizar lecturas del mismo, tanto individuales como continuas. Pero los resultados muestran que esta forma de obtener datos solo es útil si buscamos obtener datos independientes o de forma continuada pero lenta.

Para mejorar este comportamiento tenemos dos opciones: utilizar interrupciones o utilizar el DMA. Ambas formas son explicadas en los siguientes tutoriales.

 

Nota: La imagen de la portada ha sido obtenida de THine Electronics