domingo, 27 de julio de 2014

Publicar en twitter desde Arduino.

Algo que no podemos negar es que cada vez más dispositivos llevan incorporado el Internet of things, es decir, en un futuro no muy lejano, muchos electrodomesticos, televisiones, herramientas... estarán conectadas a internet, bien para obtener información, o bien para transmitirla. La incorporación a nuestro diseño de un elemento capaz de comunicarse por la red es cada vez más sencilla, y si ese diseño incluye una tarjeta Arduino, el diseño se hace todavía más sencillo.
Un proyecto que llevaba tiempo queriendo hacer, pero que todavía no había tenido tiempo de sentarme a estudiarlo, es la publicación en twitter mediante una placa Arduino y una Ethernet Shield. Antes de empezar a informarme sobre el tema, pensaba que seria un proyecto lleno de librerías, referencias, y, en definitiva, problemas, pero si algo tiene la comunidad Arduino, es que si algo puede hacerse sencillo, lo es, y así pasa con esta aplicación.
Lo primero que debemos hacer si queremos hacer un proyecto de este tipo es autorizar a nuestra placa a publicar en twitter por nosotros, y esto es algo que twitter ya tiene pensado por lo que si accedemos a esta página, twitter nos preguntará si queremos permitir a la aplicación Arduino acceder a nuestra cuenta, en caso de que aceptemos, nos devolverá un código bastante largo de números, letras y símbolos. Este código tenemos que guardarlo bien, ya que es la autentificación.
Una vez tenemos nuestro token, lo siguiente que podemos hacer es empezar a teclear el código, pero antes tenemos que añadir una librería a nuestro entorno de Arduino, la libreria twitter.h, que podéis descargar aquí. Una vez descomprimido, lo copiamops en la carpeta libraries/ de nuestro directorio de Arduino, y con esto conseguimos dos cosas, la primera es tener incluida la libreria en todos nuestros proyectos, y la segunda es el acceso a dos nuevos ejemplos marcados como Twitter.
Si miráis esos ejemplos veréis que publicar en twitter es tan fácil como ejecutar la instrucción twitter.post(msg). Esa instrucción, además de publicar en twitter nos devuelve un valor de error si no ha sido posible realizar la comunicación.
Una vez conocido el funcionamiento básico de la librería, he desarrollado un programa que publica en twitter cada 2 horas la temperatura. El twit que publica queda así.
Y a continuación tenéis el código que hay que programar en el Arduino.
Como veis el código es muy sencillo y a partir de aquí podéis publicar en twitter lo que querais, por ejemplo, se me ocurre medir la potencia que está consumiendo tu vivienda y publicarla en twitter para que todos vean lo eficiente que eres.

domingo, 13 de julio de 2014

F28377D, Módulo IPC (II)

Como ya os dije en la entrada anterior, una vez os expliqué por encima como funciona el sistema de mensajería entre los dos núcleos del F28377D, toca ponerlo a prueba.
He diseñado dos programas, uno para cada CPU, sencillos en los que se puede ver de forma clara como utilizar este sistema de mensajería. El programa, como he dicho es muy sencillo, la CPU1 envia un mensaje compuesto por 3 bytes, uno de comando, otro de dirección y otro de dato, una vez enviados, hace saltar la interrupción del canal 1 del IPC en la CPU2. Esta, una vez ha almacenado los datos e las variables correspondientes, le devuelve un valor, y hace que en la CPU1 salte la interrupción del canal 0 del IPC, que lee el valor devuelto. Los códigos son los siguientes:

Lo primero que hacemos en los dos núcleos es inicializarlos mediante la función InitSysCtrl(), que se encuentra en el archivo F2837xD_SysCtrl.c. En esta función se inicializa el PLL y el oscilador para obtener una velocidad de 190MHz. Después, en la CPU1 se inicializan los GPIO. Aquí, en el caso que lo necesitaramos, seria donde la CPU1 cedería el control de los GPIO correspondientes a la CPU2. En este caso no se ha hecho. Una vez hecho esto, todo lo relacionado con la inicialización del PIE i las interrupciones se hace del mimo modo que en cualquier C28. Lo siguiente es en la CPU1 preparar el mensaje que queremos mandar, escribirlo en los registros correspondientes y activar la interrupción del IPC1 en la CPU2. Mientras en esta vamos a bucle principal a esperar a que salte la interrupción. Una vez han llegado los datos, los pasamos a la variables correspondientes, y devolvemos un valor de respuesta. Para avisar a la CPU1 que hemos recibido correctamente los datos, activamos la interrupción del IPC0 en la CPU1, y este lee la respuesta.
A partir de este programa se pueden hacer otros más complejos y utilizando mas periféricos. Espero que os resulte interesante y probéis estos potentes microcontroladores.

lunes, 7 de julio de 2014

F28377D, Módulo IPC (I)

Cuando tenemos un sistema multiprocesador, en el que los núcleos tienen que compartir información, esto puede ser una desventaja, ya que, por muy potentes y rápidos que sean los procesadores, la velocidad de la comunicación siempre suele ser menor, por lo que ahí se produce lo que se llama, un cuello de botella.
Lo ideal si queremos grandes velocidades de comunicación es utilizar interfaces en paralelo, de forma que si tenemos un reloj a 10MHz, sabemos que en cada pulso de reloj, tenemos un dato completo. La desventaja de este sistema es evidente, necesitamos un bus de datos, cuyo tamaño de palabra sea lo mas parecido al de los datos que queremos enviar, ya que si es menor, necesitaremos más de un ciclo de reloj para enviar un dato. Esta comunicación, si tenemos dos procesadores independientes, debemos ocupar un buen puñado de GPIO, por lo que puede ser una gran desventaja. Para los casos en los que no disponemos de GPIO de sobra, existen las comunicaciones serie, que aunque cada vez las velocidades a las que funcionan los periféricos, nunca llegarán a la velocidad de un puerto paralelo.
Todo esto cambia cuando los dos procesadores se encuentran dentro de la misma pastilla de silicio, como es el caso de el TMS320F28377D. En este caso, Texas Instruments podía haber optado sin ningún problema por una comunicación paralelo, y el sistema hubiera funcionado bien, pero no tan bien como funciona con lo que ellos han llamado Inter Processor Communication, o periférico IPC.
Este modulo incluye un conjunto de periféricos para comunicarnos de formas diferentes entre las dos CPU. Lo primero que vemos es una memoria RAM de doble puerto. Esta memoria, en principio está controlada por la CPU1, siendo esta la unica que puede leer en ella, escribir en ella, o incluso ejecutar código desde ella, mientras que la CPU2 tan solo puede leerla. Si queremos ceder el control a la CPU2 lo podemos hacer desde el código. Esta memoria compartida, si bien esta dentro del periferico IPC, yo no la consideraría un sistema de comunicación, ya que no está destinada a mandar mensajes, sino a compartir el valor de ciertas variables. Lo que si que es indudablemente un sistema de comunicación es la memoria RAM destinada al paso de mensajes, y es esta la que voy a explicaros un poco más en profundidad en esta entrada.


Este módulo dispone de 2 bloques reservados de memoria de 2kB, a través de los cuales, mediante una seria de registros podemos intercambiar mensajes directamente. Estos 2kB si que vienen asignados a cada una de las CPU, de hecho aparecen como tal en el mapa de memoria.


El nombre de cada uno de los bloques nos dice la dirección en la que fluye la comunicación. El acceso a estos bloques de memoria se hace a través de un conjunto de registros, 8 en totoal para cada procesador, 4 para enviar datos, y 4 para recibirlos.
Los 3 primeros registros los podemos utilizar como más nos convenga, lo ideal es que nos creemos un protocolo propio de comunicaciones en el que tengamos una serie de comandos, y una serie de daros que podemos utilizar como queramos.
Por ultimo decir que desde cada una de las CPU podemos activar hasta 32 flags en la CPU remota. La mayoría de estos hemos de revisarlos periódicamente mediante polling, y solamente 4 de estos generan interrupción en la CPU remota, suficientes para poder realizar una perfecta comunicación entre los dos núcleos.
En la siguiente entrada os pondré un ejemplo de la utilización de este módulo.

sábado, 28 de junio de 2014

F28377D, programando un doble núcleo.

Hola a todos!! Hace unos meses envié un correo electrónico a Texas Instruments preguntándoles si sería posible que me mandaran uno de sus nuevos microcontroladores de la familia C2000 de doble núcleo, de forma que los pudiera probar y escribir entradas sobre ellos, sin casi ninguna esperanza ni siquiera de recibir respuesta. Para mi sorpresa, después de un par de correos más contándoles mi experiencia con microcontroladores de la familia C2000 se pusieron en contacto conmigo para darme la genial noticia de que me iban a mandar uno de esos microcontroladores, y hace una semana lo recibí calentito desde Texas Instruments!.


Estos nuevos microcontroladores son, sin duda, lo más potente que hay ahora mismo en el mercado. Internamente cuenta con dos microcontroladores de la serie delfino, cada uno con su propia unidad en punto flotante, además de 2 coprocesadores matemáticos (Control Law Acelerators), funcionando en paralelo a los principales, con lo que en total, este integrado cuenta con 4 procesadores independientes. Los dos procesadores principales pueden funcionar hasta 200MHz, por lo que haciendo funcionar los dos en paralelo alcanzamos una velocidad de 400MHz, aunque desde Texas Instruments dicen que podemos llegar hasta 880MIPS equivalentes.
Toda esta velocidad que encontramos dentro del procesador, no valdría de mucho si no somos capaces de adquirir señales del exterior también a una ata velocidad, para eso, el F28377D cuenta con 4 conversores analógico - digital que tienen dos modos de funcionamiento. Podemos hacerlos funcionar con una resolución de 16 bits, y a una velocidad de 1MSPS, lo que se traduce en 4MSPS haciendo funcionar los 4 en paralelo, o bien si necesitamos mayor velocidad, podemos sacrificar un poco la resolución bajándola a 12 bits y tendremos 3.5MSPS en cada conversor, o 14MSPS en total.
A parte de estas características, cuenta con todas las de los microcontroladores de la serie Delfino, 24 canales PWM, conversor digital - analógico de 12 bits, 4 buses SCI, 2 buses I2C, PWM de alta resolución...


Para poder gestionar los dos núcleos internos, el f28377D tiene una configuración Maestro - Esclavo, de forma que tenemos la CPU1 que es la que tiene el control, y la CPU2 está a sus ordenes. Desde la CPU1 tenemos el control de todos sus periféricos propios, como son sus temporizadores, su FPU, además del control de todos los GPIO. La CPU2, también controla todos sus periféricos propios, pero no puede controlar ningún GPIO , ni ponerse en marcha por si misma. Lo que debemos hacer es desde la CPU1, arrancar la CPU2, y de esta forma ya tenemos los dos núcleos corriendo sus propios programas. Para poder controlar los GPIO desde la CPU2, es la CPU1 la que debe ceder el control de estos, una vez hecho esto, la CPU2 tiene acceso a los pines cedidos, como si de los suyos propios se tratara.
Para que los dos Delfino puedan comunicarse entre ellos, existen un módulo IPC de comunicación. El módulo IPC (Inter Processor Communication), consta de un sistema de mensajería entre los dos procesadores, y mediante interrupciones, y una memoria SARAM compartida, de forma que cuando queramos compartir algún dato entre las CPUs, guardamos el dato en la memoria SARAM compartida, y mediante el sistema de mensajería le decimos a la otra CPU que tiene el dato disponible. Además de estos mensajes, para evitar el acceso simultaneo a una misma dirección de memoria, el sistema cuenta con un sistema de semáforos.



En cuanto a la programación, cada proyecto para el F28377D cuenta con dos proyectos independientes, uno para cada CPU. Y a la hora de programarlo, debemos programar cada uno d elos núcleos por separado, y luego arrancarlos de forma separada, en primer lugar la CPU1, y luego la CPU2. Esta secuencia de arranque es lógica si tenemos en cuenta que hasta que la CPU1 no arranque la CPU2, esta no va a hacer nada, pero sin embargo si que podemos arrancar solo la CPU1 sin utilizar la segunda. Además de las dos CPUs, también tenemos las dos CLA, las cuales cuentan con sus propio código también, que arrancamos y ejecutamos desde su CPU correspondiente.
En resumen, existen muchísimas posibilidades con este microcontrolador. En las próximas entradas os iré explicando más sobre este microcontrolador, y me gustaría hacer un par de vídeos.

lunes, 16 de junio de 2014

Primer programa con la Connected Launchpad.

En la entrada anterior os presente la nueva placa de la serie Launchpad de Texas Instruments. Esta placa monta un microcontrolador Tiva TM4C129, lo que se traduce en un ARM Cortex M4 a 120Mhz. Como ya comenté, Texas Instruments, ha facilitado mucho la programación de estas placas, lo que en principio parece una ventaja, pero no lo es tanto, ya que utilizando ese método nos abstraemos mucho del hardware con el que trabajamos, pero sin duda, la utilización de APIs hace mucho más sencilla la programación, y como dije, estas APIs son muy eficientes en cuanto a código.
Lo primero que debemos hacer para aprender a programar estas placas y familiarizarnos con las APIs, lo mejor es empezar a ver algunos ejemplos que encontramos en la colección TivaWare que podéis descargar aquí. Una vez instalado, en la carpeta de instalación tenemos muchos ejemplos para los diferentes periféricos que dispone, pero los ejemplos no son infinitos.
Por algunas razones, uno de los ejemplos que he echado en falta es el de la lectura de varios canales analógicos a una frecuencia determinada. Esto que puede parecer trivial para algunos es muy útil cuando queremos, por ejemplo realizar un control, o cuando queremos hacer un procesado de la señal.
En este ejemplo, como en todos, lo primero que debemos hacer es habilitar los periféricos que vamos a utilizar, que en nuestro caso serán los puertos digitales N y E, el Timer0, y el propio conversor analógico - digital. Esto es lo primero que debíamos hacer también cuando programábamos los STM32 de ST, y es que recordad que internamente, muy internamente, son lo mismo. Lo siguiente es empezar a configurar los perifericos, empezando por los GPIO, configurándolos como salida los que vayamos a utilizar. En segundo lugar debemos configurar el Timer0. Texas Instruments, en la serie Tiva, divide los timers en 2, TIMER_A y TIMER_B, cada uno de ellos de 16 bits. En el ejemplo solo utilizo el TIMER_A. Por último configuramos el conversor AD. Añadimos los canales 0 y 1 al secuenciador, a la cola de conversión , y le decimos que al llegar al canal 1 ha acabado y genere una interrupción.
El conversor ADC de los microcontroladores Tiva permite bastantes opciones de disparo, incluso podemos decirle que una vez ha finalizado, el mismo se genere el disparo para que lea los canales continuamente.
El código del ejemplo que he desarrollado lo teneis a continuación.


He estado buscando ejemplos un poco menos genericos y no he encontrado muchos, solo en los propios foros de TI, así que espero que este ejemplo os ayude y anime a probar con estas placas low cost.

miércoles, 4 de junio de 2014

Connected Launchpad

Hola a todos, en esta entrada os voy a presentar la ultima de las herramientas de desarrollo que ha sacado Texas Instruments para su serie Launchpad, la Connected Launchpad.
A pesar de este nuevo nombre, que abarca 2 placas de desarrollo, una de estas no es mas que la Tiva Launchpad, antes Stellaris Launchpad, a la que ahora le ha salido una hermana mayor.


Esta nueva placa monta un microcontrolador de la serie Tiva, el TM4C1294, el cual lleva un núcleo ARM Cortex M4, con todo lo que eso conlleva, es decir, 120MHz, 1MB de memoria de programa, 256KB de SRAM, 6KB de memoria E2PROM, FPU.... Además de los periféricos propios del núcleo ARM, este microcontrolador cuenta también con 2 ADC independientes de 1MSPS cada uno, a los cuales podemos asignar cualquiera de los 20 canales analógicos de los que dispone, 3 comparadores analógicos, módulo EMAC con PHY incorporado, lo cual reduce el número de componentes externos para poder utilizar la comunicación Ethernet, y un sin fin de periféricos más que harán que podamos controlar casi cualquier cosa.
La placa de desarrollo tiene el mismo color rojo de toda la serie, y lleva incorporado el programador y el depurador. A diferencia de otros Launchpad, y gracias a su tamaño, en esta herramienta es posible "pinchar" hasta 2 BoosterPack, y por si con esos 80 pines no podemos acceder a todas las entradas y salidas del microcontrolador, además disponemos de un conector en el lateral en el cual si que encontramos todos los pines.
Una de las cosas que me ha hecho decantarme por empezar con esta herramienta, y no seguir con las placas discovery de ST es que lleva un puerto RJ45, con lo que sin añadir nada más podemos crear un servidor web o cualquier otro dispositivo que se conecte a la red. Aunque no todo van a ser ventajas...


Una de las cosas que mas me gustaba de la serie discovery, y de los microcontroladores STM32 en general, es que se pueden programar como si de un PIC se tratara, es decir, miro en el datasheet el registro que quiero modificar,  gracias a las librerías que proporciona ST, puedo asignar de una forma fácil un valor concreto a un registro, incluso el compilador, gracias a la declaración de estructuras dadas por el fabricante, me sugiere los registros disponibles para modificar. Esto parece que no es del agrado de texas instruments, ya que esas estructuras y esos registros no están declaradas en ninguna librería de las que he probado, con lo que tienes que "conformarte", con utilizar las funciones o APIs que ellos te dan. Si bien, la utilización de esas APIs te hace la vida más sencilla, pero te obliga a conocerlas, mientras que los registros se encuentran en el datasheet. Ojo! que nadie se piense que esas funciones son como las de Arduino, esas APIS pueden incluso ser más optimas que la configuración directa del registro, pero si tengo que sacar un defecto a esta placa, o a TI, es ese. Por lo demás es una placa de desarrollo muy buena, bonita y barata (14 euros), ¿que mas se puede pedir?

domingo, 25 de mayo de 2014

Puente en H. Control (III)

Una vez hemos visto y entendido el hardware que forma el puente en H o puente completo llega la hora de preparar un programa para poder controlar todo lo bien que podamos la respuesta del puente completo.
Lo primero es elegir el microcontrolador que vamos a utilizar, y en esta ocasion he elegido uno de Texas Instruments, el TMS320f28027. El uso de este microcontrolador va a tener muchas ventajas, la primera de ellas es su potencia, ya que funciona a 60MIPS. La segunda de las ventajas es que, utilizando el Launchpad  C2000 tenemos este microcontrolador integrado en una placa de desarrollo, junto con un depurador por un precio de 14 euros.

Otra de las opciones que tuve en mente es utilizar un PIC de 8 bits. En concreto podría haber utilizado alguno de los que tienen módulos ECCP como el 18f2550 o el 18f14k50. El problema de estos es que no hay posibilidad de realizar una modulación como necesito, ya que estos módulos conmutan solo uno de los transistores de la rama, mientras que lo ideal es conmutar los dos de forma inversa. Esta posibilidad si que la tienen los DSPIC o los PIC24, pero no tengo ninguna placa de desarrollo que me facilite su montaje.
El programa que he escrito es algo más complicado de lo que acostumbro a poner en el blog habitualmente, pero aún así no creo que tengáis problema en entenderlo. Una novedad importante que hay en el código es que he utilizado el formato numérico en coma fija que proporciona Texas Instruments a través de la librería IQmath. Utilizando este formato numérico es mucho más sencillo agregar filtros o reguladores, ya que estos funcionan todos con la librería IQmath, de forma que no habría que hacer cambios de formato numérico a la hora de agregar estos al proyecto, directamente la salida del regulador la podríamos llevar a la variable que ajusta el ciclo de trabajo del puente. La función que establece el ciclo de trabajo está preparada para aceptar ciclos de trabajo entre -1 y 1, con una resolución de 1/2^24.
A continuación tenéis los archivos modpwm.c y modpwm.h para utilizar con estos microcontroladores y para controlar cualquier puente completo.

Espero que os sirva aunque sea de referencia para poder exportarlo a cualquier otro microcontrolador.