Mostrando las entradas con la etiqueta STM32F discovery. Mostrar todas las entradas
Mostrando las entradas con la etiqueta STM32F discovery. Mostrar todas las entradas

jueves, 2 de enero de 2020

XiuaElectronics: Inteligencia artificial aplicada a microcontroladores Parte #03


Buenos días estimados lectores, hoy vamos a ver la tercera y última parte de un tema sumamente interesante, que no había podido continuar por falta de tiempo. Hablamos sobre la inteligencia artificial aplicada a los microcontroladores. En una anterior entrada, parte #02 de este tema, pudimos observar una serie de impedimentos para poder crear un algoritmo con I.A en un microcontrolador. También vimos  algunas medidas para poder acercarnos a un algoritmo de inteligencia artificial en estos, pero con algunas desventajas. Hoy vamos a ver como al final de cuentas es posible o no utilizar esta en microcontroladores. Para los que no estén actualizados con las entradas anteriores a través de este link podrán ver la Parte #01. Comencemos.


DNN ( Deep Neural Network) y ANN (Artificial Neural Network ).


En la entrada pasada nombramos un termino que se ve mucho en inteligencia artificial y es el DNN, traducido del ingles (red neural profunda), donde explicábamos que esta sería una posible solución a implementar en la programación de la I.A en los microcontroladores. El DNN es mayormente utilizado por los científicos de datos. Este tiene como característica que posee varias capas entre las entradas y salidas de un sistema o diseño al cual se le esta implementando dicho algoritmo. El DNN hace parte de una categoría más amplia, el ANN o traducido del ingles (Redes neurales artificiales). En esta categoría entran los algoritmos de capas profundas o aquellos que solo tienen una sola capa.

Hago mención de estos dos términos ya que estos son los causantes de que haya un posible solución a la programación de inteligencia artificial en los microcontroladores. Para ser optimo este tipo de programación tenían que haber cambios en los compiladores y en los microcontroladores. 

Antes de utilizar un algoritmos de inteligencia artificial, lo programadores lo que hacen es entrenar sus programas con una serie de requisitos. Para entender mejor esto del entrenamiento, les sugiero que lean acerca del funcionamiento del machine learning o aprendizaje maquina. En general, la solución que se estableció para esto fue entrenar previamente diferentes tipos de algoritmos de DNN y optimizarlos en el microcontrolador. Haciendo alusión que los datos serían leídos a través de sus periféricos, utilizaron el POO para poder enlazar diferentes periféricos para dichos fines.

La capacitación de ANN (NN) implica pasar los conjuntos de datos a través de la red neuronal de manera iterativa para que las salidas de la red puedan minimizar los criterios de error deseables.
La definición, la capacitación y las pruebas de ANN generalmente se realizan utilizando marcos de aprendizaje profundo listos para usar.
Esto generalmente se realiza en una potente plataforma informática, con memoria y potencia computacional prácticamente ilimitadas, para permitir muchas iteraciones en un corto período de tiempo.

El resultado de este entrenamiento es la red neuronal artificial pre-entrenada.

Una vez que se pre-entrena la red neuronal artificial lo que sigue es optimizar este nuevo algoritmo en uno optimo para los microcontroladores. Aquí es donde entra la innovación, y la solución de nuestros problemas. La empresa STMicroelectronics, fabricante de semiconductores, fabrica los microcontroladores de 8 bits STM8 y los de 32 bits STM32, cada arquitectura con una amplia familia llena de variaciones. --Hago alusión a esta empresa por que es la única que ha innovado en el campo de la I.A y los microcontroladores, no me están patrocinando 😢 (lastimosamente)-- Ha diseñado en los últimos años software que nos hace eso, optimizar el código para poder grabarlo en un microcontrolador. Este software se llama STM32Cube.AI, y como su nombre lo indica solo es para microcontroladores de 32 bits. Vamos ver de que trata esto.

STM32Cube.AI

La herramienta STM32Cube.AI ofrece una interoperabilidad simple y eficiente con las populares herramientas de capacitación de Deep Learning ampliamente utilizadas por la comunidad de desarrolladores de Inteligencia Artificial. La salida de estas herramientas se puede importar directamente al STM32Cube.AI.

El siguiente paso es incrustar el ANN pre-entrenado en una MCU (código optimizado que minimiza la complejidad y los requisitos de memoria).
Esta parte es muy fácil e intuitiva gracias a la herramienta de software STM32Cube.AI. El STM32Cube.AI está completamente integrado en el ecosistema de desarrollo de software STM32 como una extensión de la herramienta STM32CubeMX ampliamente utilizada.
Permite la conversión rápida y automática de ANN pre-entrenadas en código optimizado que puede ejecutarse en una MCU. La herramienta guía a los usuarios a través de la selección de la MCU correcta y proporciona información rápida sobre el rendimiento de la red neuronal en la MCU elegida, y la validación se ejecuta tanto en su PC como en la MCU STM32 de destino.

Vamos a ver el siguiente vídeo de la empresa donde podremos apreciar esto:


Y en general esta seria un enlace directo y sin muchas complicaciones al desarrollo de aplicaciones con inteligencia artificial y microcontroladores. Los dejo con un vídeo donde podrán apreciar una aplicación básica de la IA en el mundo exterior, donde se aplica IA con microcontroladores. No siendo más los dejo con el vídeo. No olvides seguirme y compartir mi contenido. 




Escrito por: Breismam Alfonso Rueda Díaz



Fuentes
:

  • http://www.konradlorenz.edu.co/images/stories/suma_digital_matematicas/Programacion%20Dinamica.PDF
  • https://www.st.com/content/st_com/en/about/innovation---technology/artificial-intelligence.html
  • Xumari, G.L. Introduction to dynamic programming. Wilwy & Sons Inc., New York. 1967.






Estén pendientes de mi canal, de mi blog y de mi pagina de Facebook para más contenido.



viernes, 25 de enero de 2019

XiuaElectronics: Inteligencia artificial aplicada a microcontroladores Parte #02

Inteligencia artificial aplicada a microcontroladores Parte #02


Buenos días estimados lectores. En el día de hoy continuaremos con la segunda parte se inteligencia artificial aplicada a microcontroladores. 

Para aquellos que aún no están en contexto, a través del siguiente link podrán ver la primera parte. Analizando la entrada anterior a este tema pudimos ver que de alguna forma un microcontrolador nos daba la posibilidad de poder integrar  una red neural artificial, o en general algún método de la inteligencia artificial para optimizar algún tipo de proceso. Quedamos a la espectativa de saber si es posible o no el implementar esto; para fortuna de todos si. Resulta que tras un tiempo de consultas y estudios, pude observar que hay algo llamado programación dinamica; y aquí se encuentra un aliciente pero no el unico de la solución de este contexto.


Mapa de problema sobre diligencias

¿Qué es la programación dinámica?



La programación dinámica es un método para reducir el tiempo de ejecución de un algoritmo mediante la utilización de subproblemas superpuestos y subestructuras óptimas. El matemático Richard Bellman inventó la programación dinámica en 1953 que se utiliza para optimizar problemas complejos que pueden ser discretizados y secuencializados.

Una subestructura óptima significa que se pueden usar soluciones óptimas de subproblemas para encontrar la solución óptima del problema en su conjunto. Por ejemplo, el camino más corto entre dos vértices de un grafo se puede encontrar calculando primero el camino más corto al objetivo desde todos los vértices adyacentes al de partida, y después usando estas soluciones para elegir el mejor camino de todos ellos. En general, se pueden resolver problemas con subestructuras óptimas siguiendo estos tres pasos:

  • Dividir el problema en subproblemas más pequeños.
  • Resolver estos problemas de manera óptima usando este proceso de tres pasos recursivamente.
  • Usar estas soluciones óptimas para construir una solución óptima al problema original.
  • Los subproblemas se resuelven a su vez dividiéndolos en subproblemas más pequeños hasta que se alcance el caso fácil, donde la solución al problema es trivial.


Decir que un problema tiene subproblemas superpuestos es decir que se usa un mismo subproblema para resolver diferentes problemas mayores. Por ejemplo, en la sucesión de Fibonacci (F3 = F1 + F2 y F4 = F2 + F3) calcular cada término supone calcular F2. Como para calcular F5 hacen falta tanto F3 como F4, una mala implementación para calcular F5 acabará calculando F2 dos o más veces. Esto sucede siempre que haya subproblemas superpuestos: una mala implementación puede acabar desperdiciando tiempo recalculando las soluciones óptimas a problemas que ya han sido resueltos anteriormente.

Esto se puede evitar guardando las soluciones que ya hemos calculado. Entonces, si necesitamos resolver el mismo problema más tarde, podemos obtener la solución de la lista de soluciones calculadas y reutilizarla. Este acercamiento al problema se llama memoización (no confundir con memorización; en inglés es llamado memoization). Si estamos seguros de que no volveremos a necesitar una solución en concreto, la podemos descartar para ahorrar espacio. En algunos casos, podemos calcular las soluciones a problemas que de antemano sabemos que vamos a necesitar.

Cuando hablamos de optimizar nos referimos a buscar alguna de las mejores soluciones de entre muchas alternativas posibles. Dicho proceso de optimización puede ser visto como una secuencia de decisiones que nos proporcionan la solución correcta. Si, dada una subsecuencia de decisiones, siempre se conoce cuál es la decisión que debe tomarse a continuación para obtener la secuencia óptima, el problema es elemental y se resuelve trivialmente tomando una decisión detrás de otra, lo que se conoce como estrategia voraz. En otros casos, aunque no sea posible aplicar la estrategia voraz, se cumple el principio de optimalidad de Bellman que dicta que «dada una secuencia óptima de decisiones, toda subsecuencia de ella es, a su vez, óptima». En este caso sigue siendo posible el ir tomando decisiones elementales, en la confianza de que la combinación de ellas seguirá siendo óptima, pero será entonces necesario explorar muchas secuencias de decisiones para dar con la correcta, siendo aquí donde interviene la programación dinámica.

Contemplar un problema como una secuencia de decisiones equivale a dividirlo en problemas más pequeños y por lo tanto más fáciles de resolver como hacemos en Divide y Vencerás, técnica similar a la de programación dinámica. La programación dinámica se aplica cuando la subdivisión de un problema conduce a:

Ejemplo sobre problema de diligencia-programación dinámica
  • Una enorme cantidad de problemas.
  • Problemas cuyas soluciones parciales se solapan.
  • Grupos de problemas de muy distinta complejidad.

Pero como vimos anteriormente en la definición de programación dinámica, podemos deducir que unos de los problemas fundamentales al momento de intentar programar un algoritmo de forma dinámica es la cantidad de memoria que se necesitaría para poder programar los distintos subproblemas que conllevaría la implementación. Pero bueno, para esto hay una solución y es la implementación de una memoria flash externa controlada por algún periférico SPI que posea el microcontrolador. Entonces, en la actualidad. ¿porqué no se implementan este tipo de programación?, por una sencilla razón, y es que los compiladores no estan optimizados para este tipo de programación. Entonces, ¿si no están optimizados para este tipo de programación, porqué no los optimizan?. Resulta que este tipo de programación no es muy eficiente para distintas situaciones, por tal razón, no es viable optimizar los microcontroladores para estos tipos de algoritmos; pero bueno, no todo son malas noticias, hay situaciones que poco a poco se van presentando en la industria de una manera exponencial y que sugiere la nesecidad de implementar algún tipo de algoritmo autónomo que dependiendo de las variables, pueda decidir la mejor solución sin necesidad de intervención humana. Es en este punto donde entra a jugar las DNN (Deep Neural Networks), que son algoritmos entrenados para para realizar tareas específicas. Anteriormente mencioné que si se puede implementar inteligencia artificial en los microcontroladores; básicamente se puede hacer algunos arreglos, crear compiladores que se ajusten a la necesidad de un algoritmo tan especializado como lo son como los de programación dinámica, pero como dije anteriormente el tiempo es un recurso que no podemos olvidar, y si es para un proyecto de baja escala, posiblemente no valga la pena ponerse a realizar este trabajoso proceso.

Una solución actual y que es muy viable es implementar una DNN, que en cuestión ya es posible. Veremos este apartado de implementación de redes neurales en microcontroladores en una tercera parte para poder tratar mejor el tema.

Aquí podrás ver la Parte #03.


Escrito por: Breismam Alfonso Rueda Díaz


Fuentes:

  • http://www.konradlorenz.edu.co/images/stories/suma_digital_matematicas/Programacion%20Dinamica.PDF
  • https://www.st.com/content/st_com/en/about/innovation---technology/artificial-intelligence.html
  • Xumari, G.L. Introduction to dynamic programming. Wilwy & Sons Inc., New York. 1967.




Bien muchachos, esto es todo por hoy. Estén pendientes de mi canal, de mi blog y de mi pagina de Facebook para más contenido.




Cualquier duda, trabajo, tutoria personalizada por correo electrónico o pagina en facebook:




domingo, 21 de octubre de 2018

XiuaElectronics: ¿Cuál es la diferencia entre STM32FX Discovery y STM32FX Núcleo ?

¿Cuál es la diferencia entre STM32FX Discovery y STM32FX Núcleo?

Buenos días estimados lectores. 

En el día de hoy vamos a hablar acerca de dos placas de desarrollo muy interesantes del mundo de 32 bits, se trata de las STM32 Núcleo y Discovery, pertenecientes a la empresa Stmicroelectronics; empresa de semiconductores especializada en el desarrollo de componentes electrónicos desde diodos hasta microcontroladores. Esta empresa lleva mucho tiempo incursionando en el mundo de los microcontroladores, teniendo como fuerte los microcontroladores de 32 bits, los famosos STM32F.  En América latina no eran muy conocidos por el atraso tecnológico que se ve en esta región, afortunadamente hay personas que como yo y muchos más, tratan de buscar estas tecnologías y hacer masiva la difusión de estas para que los hablantes hispanos y en general todo latinoamerica pueda aprovechar el uso de estas herramientas.

Stmicroelectronics nos trae a disposición como mencione anteriormente, dos tarjetas de desarrollo, las STM32F Discovery y las STM32 Núcleo, esta última es de desarrollo más reciente. Pero bueno, si hay dos tarjetas de desarrollo de microcontroladores de 32 bits de la misma empresa, ¿cuál elegir?, ¿cuál es la diferencia entre ellas?. Resulta que las STM32 Discovery son tarjetas de desarrollo que salieron al mercado en el 2010, a comparación de las STM32 Núcleo que salieron 4 años más tarde.

STM32F3 Discovery

Tarjetas de desarrollo STM32 Discovery


Las Discovery son tarjetas las cuales van enfocadas para un ambiente más de laboratorio, es decir, el uso de estas tarjetas de desarrollo van enfocadas más a los profesionales que desean evaluar distintos desarrollos con base en los microcontroladores STM32Fxxx. Estas tarjetas de desarrollo en general están enfocadas a probar distintas tecnologías como lo son los acelerometros, giroscopios y sensores MEMS, etcétera, aprovechando que su hardware esta diseñado y pensado para dar soporte exclusivo a estas tecnologías.Los kits de desarrollo STM32 Discovery son una solución económica y completa para la evaluación de las capacidades sobresalientes de los MCU STM32. Llevan la infraestructura necesaria para la demostración de las características específicas del dispositivo, una biblioteca HAL y ejemplos completos de software que permiten aprovechar al máximo las características y los valores agregados del dispositivo, que funcionan a la perfección con una amplia gama de entornos de desarrollo que incluyen IAR EWARM, Keil MDK-ARM, mbed y IDE basados en GCC / LLVM.
Los conectores de extensión dan acceso a la mayoría de las Entradas/Salidas del dispositivo y hacen posible la conexión de hardware adicional.
Con el depurador / programador integrado, los kits Discovery STM32 son ideales para la creación de prototipos.





STM32F3 Núcleo

Tarjetas de desarrollo STM32 Núcleo

Las STM32 Núcleo son tarjetas de desarrollo las cuales fueron pensadas para rápidos desarrollos el cual no involucre tecnologías complejas, es decir, se puede hacer casi que lo mismo que con las Discovery, pero la diferencia es que las Núcleo no posee un hardware dedicado a distintas tecnologías, entonces como resultado nos da el tener que desarrollar todo el hardware por nosotros mismos en dado caso que se requiera.
Las Núcleo fueron pensadas más que todo para los estudiantes, makers y personas que no son allegadas a la electrónica y en general para los que no tienen un conocimiento básico de los microcontroladores que nos provee Stmicroelectronics.
Las placas STM32 Núcleo altamente asequibles permiten a cualquiera probar nuevas ideas y crear prototipos rápidamente con cualquier MCU STM32.
Al compartir los mismos conectores, las placas Núcleo STM32 se pueden ampliar fácilmente con una gran cantidad de complementos de hardware de aplicaciones especializadas (Núcleo-64 incluye conectores morfo de Arduino Uno rev3 y ST, Núcleo-32 incluye conectores Arduino Nano).
Las placas STM32 Núcleo integran un depurador / programador ST-Link, por lo que no hay necesidad de una sonda separada.
Con las placas STM32 Núcleo se proporciona una biblioteca HAL de software STM32 junto con varios ejemplos de software, que funcionan a la perfección con una amplia gama de entornos de desarrollo que incluyen IAR EWARM, Keil MDK-ARM, mbed y IDE basados en GCC / LLVM.


Bien, ya como vimos algunas de las características generales de estas dos placas  de desarrollo, vamos a utilizar la serie F303 de STM32 y buscar sus equivalentes en las Núcleo y en las Discovery para poder así hacer una comparación más profunda en cuando hardware.


Como podemos observar en el cuadro de características generales de cada tarjeta de desarrollo, las tarjetas tienen unas diferencias considerables. La primera es la memoria RAM; como les había comentado anteriormente las Núcleo son más recientes que las Discovery, por tal razón el microcontrolador de las Núcleo incluye nuevas características y en este caso una de esas es el aumento de memoria flash y RAM casi que al doble. También la Núcleo posee una nueva variante de la RAM entre otras características. Para el número de pines que incluye cada tarjeta en este caso por el diseño y el propósito la Discovery tiene mayor número de pines los cuales son configurables dependiendo del proyecto, aunque unos son dedicados exclusivamente a los sensores, pero estos se pueden manipular con un conocimiento ya intermedio con respecto al tema. Como son de la misma serie, ambas placas poseen las mismas características en cuanto a oscilador. Ambas poseen un programador ST-LINK V2 interno, pero varia en que algunas versiones de las placas son más recientes y por ende cambiará el tipo de conector en las Discovery. También  debemos tener en cuenta que como las núcleo son recientes por decirlo de alguna manera, el programado soportará la depuración, almacenamiento interno y puerto COM virtual en todas sus versiones. Para el caso de las Discovery solo para los modelos más recientes.
En la parte de sensores, vemos que las Núcleo no tienen ninguno, pero en cambio la Discovery STM32F303VC posee Giroscopio de 3 ejes de salida digital que se puede visualizar mediante los leds que posee esta; sensor de movimiento, sensor de aceleración lineal 3D y un sensor magnético digital 3D. Como les había comentado antes, esta es la gran diferencia de estas placas de desarrollo. La Discovery es simplemente un recurso especializado en ciertas tecnologías que solo es amigable para el que sabe, --Sorry arduineros, ja, ja, ja!-- . En cuanto a los leds, la Núcleo posee un solo led para aplicaciones con Shields de Arduino; en cambio la Discovery posee 10 leds. Un led de comunicación USB, uno para alimentación, y ocho leds los cuales podemos utilizar a nuestro antojo. Estos ocho leds vienen diseñados de tal forma que quedan ubicados en una circunferencia blanca, donde se nos indica el norte, sur, este y oeste. Lo anterior es con el fin de aprovecharlos y poder visualizar la salida del giroscopio, aunque también se pueden utilizar para lo que queramos. Las Núcleo y Discovery poseen 2 pulsadores, uno para resetear la placa y el otro para gusto del usuario. En cuanto a shields, la Núcleo se pensó para el publico en gneral, para el que quiera aprender y para el maker y demás, por tal razón es compatible con algunos escudos de Arduino y los propios del Stmicroelectronics. En la Discovery hay shields de empresas especializadas como MikroBus o de terceros que se ven prometedores, --aún no las e podido probar--. En cuanto a IDEs soportadas, casi que las mismas, con excepción de las Núcleo que soportan la plataforma en nube Mbed, diseñada especialmente para flexibilidad y facilidad a la hora de programar, --un lenguaje como el de Arduino pero más bonito y en la nube--. por último pero no menos importante, Las Discovery poseen un puerto USB dedicado para aplicaciones del usuario, en comparación con las Núcleo que no poseen.

En cuanto al precio, la Núcleo presentada en esta entrada esta según pagina oficial a $10.32 USD y la Discovery a $15.75 USD.

Conclusiones

Las Núcleos son tarjetas de desarrollo interesantes aunque con muy poco hardware dedicado, por tal razón se vuelven genéricas en un proyecto y más para uno de producción-venta. Lo anterior no es un impedimento para poder agregarle el hardware necesario para aplicaciones especificas, pero si se alarga el tiempo de desarrollo en estos escenarios, aunque las shields ayuden y amortigüen el golpe en cuestión.  Para el caso de las Discovery, simplemente son geniales, poseen todo lo necesario para embarcarse en infinidad de proyectos, pero el asunto acá es que son para personas con conocimientos intermedios y avanzados del tema. Las Discovery posee menos memoria en este caso, cosa que se puede suplir programandolas en bajo nivel, no tipo ASM sino más bien una variante de C ligera que trabaja con los registros, algo como las "low layer library- LL" que nos proporciona Stmicroelectronics. Mbed consume más memoria por tal razón las Núcleo poseen más.

Esta entrada no se trata de ver cual es mejor que cual, sino ver sus diferencias y cual es mejor opción para los distintos tipos de personas que las usarán. SI tiene cosas que agregar u opiniones y demás, en la parte de abajo puedes dejarlo en un comentario.


Escrito por: Breismam Alfonso Rueda Díaz





Bien muchachos, esto es todo por hoy. Estén pendientes de mi canal, de mi blog y de mi pagina de Facebook para más contenido.




Cualquier duda, trabajo, tutoria personalizada por correo electrónico o pagina en facebook: