entramado.net

Posts tagged “Arduino

Comunicaciones en microcontroladores: Un ejemplo

Esto es un pequeño apunte mientras estudio un tema de comunicaciones en microcontroladores.

Pila del port Contiki OS a Arduino

Pila de Arduino IPv6

Las pilas de protocolos de comunicaciones en microcontroladores presentan algunos problemas en su implementación. Como sabéis la comunicación dentro de cualquier red se consigue utilizando una pila de protocolos que controlan diferentes ámbitos de la comunicación, en la parte de microcontroladores estas capas de la pila de protocolos se reducen a 3 o como mucho a 4, de abajo a arriba: nivel físico, de enlace, de red y de aplicación. Por encima del nivel de aplicación se encuentra el programa de usuario y por debajo del nivel físico el cable o el aire por donde se transmiten las ondas.

Lo problemática de programar este tipo de pilas viene cuando queremos comunicar información de una capa a otra. Si utilizamos C para programar (lo más común) tendremos que separar cada capa en un módulo y llamar de uno a otro mediante funciones declaradas en los archivos de cabecera. Pero cuando el tránsito de información se produce de abajo a arriba en la pila ocurre un problema, la recepción se produce de forma asíncrona mediante una interrupción, por eso la forma más eficiente de realizar esto es usando un flag que se active cuando se reciba un mensaje y una función callback, para realizar el procesamiento.

Una función callback es una función que se llama de arriba hacia abajo, pero en realidad está enviando información de abajo a arriba.

Para que me quede más claro el tema he buscado un ejemplo y he aprovechado que quería mirar el port de Contiki OS para Arduino. Este port utiliza como capa física los famosos chips XBee, baratos y fáciles de utilizar.

Contiki no sólo provee de una capa de red IPv6 si no que además proporciona la capa de aplicación CoAP. Me gustaría saber si se puede portar esto a Pinoccio, abaratando aún más la plataforma.

Así que me he puesto manos a la obra, me he bajado el código:
git clone https://github.com/telecombretagne/Arduino-IPv6Stack

Después de rebuscar un poco entre las librerías he encontrado lo que buscaba, en el fichero simple_udp.c:

if(c != NULL) {

        /* If we were called because of incoming data, we should call
           the reception callback. */
        if(uip_newdata()) {
          /* Copy the data from the uIP data buffer into our own
             buffer to avoid the uIP buffer being messed with by the
             callee. */
          memcpy(databuffer, uip_appdata, uip_datalen());

          /* Call the client process. We use the PROCESS_CONTEXT
             mechanism to temporarily switch process context to the
             client process. */
          if(c->receive_callback != NULL) {
            c->receive_callback(c,
                                &(UIP_IP_BUF->srcipaddr),
                                UIP_HTONS(UIP_IP_BUF->srcport),
                                &(UIP_IP_BUF->destipaddr),
                                UIP_HTONS(UIP_IP_BUF->destport),
                                databuffer, uip_datalen());
          }
        }
      }

 

Como podéis ver se utiliza la función uip_newdata() como el flag del que he hablado antes, además se puede observar cómo si existe una función callback en ‘c’ (la estructura que se utiliza para la comunicación) ésta se ejecuta pasándole los datos de la misma conexión y los que necesite para el nivel inferior, que es el nivel IP.

Como hemos podido ver, en las implementaciones de sistemas de comunicaciones complejos como este caso se utilizan estos métodos para solucionar los problemas de implementación que pueden surgir.


Enlaces Interesantes XI

En la última recopilación de enlaces se me olvidó comentar algunas cosas, ahí van, además de los nuevos enlaces:

Impresión 3D y energía solar: Me encanta poder participar en conversaciones tan interesantes como ésta.

PirateBox DIY – OpenWrt: Una forma barata de montarse una PirateBox, ¿que qué es una PirateBox? Una caja para compartir archivos y crear redes distribuidas.

Bitcoin: world’s fastest growing currency migrates off the internet – video: Aún que sí es cierto que el universalismo ha sido el gran error de diseño de Bitcoin, aún hay una esperanza para esta moneda a mi modo de ver, si distintas comunidades empiezan a utilizarla en su día a día poco a poco la moneda se estabilizará. El vídeo de Kreuzberg muestra como esto es posible, lo que me pregunto es como fijarán los precios. Lo que menos me gusta es que se utilicen para eso códigos QR, podría empezar a usarse NFC para esto que ya empieza a verse en los nuevos móviles.

Dos años después del 15-M: Hablando de universalismo, una buena explicación sobre éxito y caída del 15M, como su propio universalismo inmovilizó paradójicamente el “movimiento”.

El cacharro de la semana:
SODA: Simple, Open Data Acquisition: Un sencillo datalogger con Arduino.

He comentado en:
La Conjetura Recuenco – Wilkins (En construcción).
Servidor web con arduino.
¿Aprende P2P? ¿Ap2prende? ¿Cursus Honorem? ¿La Web Armada Vs El Virus Zombi?


Enlaces Interesantes X

Con el traslado y todo esto no he tenido mucho tiempo de escribir, pero aún así he seguido leyendo y guardando enlaces en favoritos para luego compartirlos en el blog por lo que esta entrada puede ser más larga de lo habitual, tengo muchos temas de los que hablar, ahí va:

Diez proyectos que me gustaría hacer con la Raspberry Pi: De los cuales sobretodo me atraen el Ambilight y el despertador inteligente aún que le veo excesivo ponerle una RaspPi para eso, se pueden coger ideas.

Internet industrial: Artículo muy recomendable sobre lo que se le viene encima al mundo industrial.

#EUSKADI_P2P, el lugar más copiado del mundo: Continuando con lo industrial, una interesante reflexión sobre el modo de producción P2P.

La UE prohíbe la venta y reproducción de semillas autóctonas y tradicionales: Esta noticia es realmente alarmante, la UE ya estaba suficiente capturada por las grandes compañías alimentarias ahora además se quieren cepillar al pequeño agricultor que busca variedades locales. Yo ya me he puesto en pié de guerra, en un ejercicio de activismo de mercado pienso participar en poner en marcha una pequeña tienda de semillas, el permiso a empresas con menos de 10 empleados jugará a nuestro favor, ya conocemos los problemas de la economía de escala. De todas formas siempre nos quedará el bosque.

Pinoccio – A Complete Ecosystem for Building the Internet of Things: Cada poco tiempo salen nuevos cacharros que toman como referente a Arduino, como por ejemplo este Arduino con un ARM, pero este Pinoccio me parece muy interesante por que lleva una radio 2.4 GHz perfecta para el protocolo IEEE 802.15.4 y se programa igual que Arduino.

 Por qué los núcleos y su frecuencia no lo son todo para un procesador: Una explicación muy clara.

AMF: A Better File Format for 3D Printing?: Con la cantidad de opciones que proveen las nuevas impresoras 3D el formato STL empieza a quedarse corto, aquí va una alternativa.


Enlaces Interesantes IX

How to make a weather station with Arduino: Una shield hardware libre para Arduino que lo convierte en una estación meteorológica sencilla, incluye medidas de presión, temperatura y humedad y además un reloj en tiempo real para saber en que momento se toman las medidas. A partir de ahí ya se puede personalizar el diseño según nuestras preferencias.

La Semana Santa demuestra que al sistema eléctrico le sobra energía nuclear: La gestión de la energía en España es insostenible ¡hay que cambiar de modelo ya!

¿Lector de RSS para libro electrónico?: Como ya comenté, para mí la solución viene por sincronizar varios lectores RSS nativos, pudiendo utilizar uno para e-reader que muestre las noticias más tipo periódico. Mientras esto llega supongo que se puede hacer algo provisional con tt-rss, que nos permite obtener un feed RSS de cualquier lista y la funcionalidad de Calibre de leer de un RSS, aunque creo que ya ha comentado alguien esta posibilidad.

Graph.tk: Más sencillo imposible, metes la ecuación y se muestra a su representación gráfica, muy útil si estás estudiando matemáticas, aunque para un uso más profesional echo de menos que se pueda importar y exportar desde mathML o/y LaTeX. Pero lo mejor de todo es que: ¡Es Open Source!

Kitchen Garden Aid: Software Libre para planificar tu huerto.


Diseño modular en Arduino

Una buena plataforma para comenzar con diseño electrónico modular es Arduino, aunque su IDE sea mejorable en este sentido no es difícil empezar a trabajar con módulos y librerías en nuestros proyectos, vamos a empezar por usar librerías creadas por terceras personas, lo que se suele llamar Contribuido:

En primer lugar vamos a nuestro sketchbook de Arduino, una carpeta que en Ubuntu suele estar en tu home, si no está aún creada, hacemos una nueva carpeta que se llame libraries, en esta carpeta colocaremos los directorios de cada librería.

Una vez pongamos las librerías que queramos ahí ya podremos acceder a ellas desde el IDE de Arduino, en él veremos algo como esto:

Libreria Contribuido
Ya tenemos por donde empezar, es muy útil en diseño electrónico utilizar librerías de componentes electrónicos que se comunican con el procesador, estas librerías proveen de un acceso sencillo a los componentes, consiguiendo de esta forma una programación orientada a componentes.

Lo siguiente que vamos a hacer es dividir nuestro programa en módulos, aunque Arduino utiliza su propio lenguaje de programación podemos usarlo como si fuera C o C++, por esto podemos utilizar archivos “.cpp” para añadir código y archivos “.h” para enlazar este código con el archivo principal que será el “.ino”.

Vamos a la carpeta de nuestro proyecto donde podremos ver nuestro archivo principal “.ino”, vamos a crear un nuevo módulo que vamos a llamar “datos”, por lo tanto creamos dos archivos, “datos.cpp” y “datos.h”, en el primero pondremos el código las funciones que vamos a crear y en el segundo las cabeceras de las funciones creadas anteriormente, sólo si vamos a hacer uso de ellas en el exterior del módulo.
Nos tenemos que asegurar que el archivo de cabeceras no se incluya en el proyecto más de una vez, para eso usamos:
#ifndef datos_h
#define datos_h
Al principio del archivo “.h” y:
#endif
Al final.

Por ultimo vamos a nuestro programa principal, si reiniciamos Arduino IDE ya nos abrirá los archivos que hemos creado en diferentes pestañas. Ahora los incluimos en nuestro programa principal usando:

#include "datos.h"
Y ya podremos acceder a los módulos que hemos creado.
Un consejo, si utilizáis librerías dentro de módulos y no están muy bien hechas os dará error, para solucionarlo lo que hago es incluirlas también en el programa principal, pero tenéis que aseguraros de que las librerías tienen un #ifndef como se ha explicado anteriormente.
Para más información sobre como hacer una librería para Arduino visitad el siguiente enlace:
Library Tutorial
Esto es todo por hoy, espero continuar con la serie sobre Arduino, tengo muchas cosas que publicar.


Raspberry Pi en Tiempo Real

Vía BricoGeek me llega este fantástica prueba de comparación de Raspberry Pi con Arduino y la combinación definitiva que puede resultar de su unión. Realmente la respuesta de los pines del RasPi es bastante mala por los problemas que comenta Radical Desig. ¿Entonces debemos resignarnos a no utilizar los pines GPIO más que para encender y apagar algún mísero LED?Arduino y Raspberri Pi

Pues no, si están ahí es para usarlos y podemos encontrar soluciones para los problemas que encontremos, que por otra parte no son problemas nuevos y se solucionaron hace tiempo, veamos como lo podemos solucionar:

  • Nunca utilizar lenguajes interpretados para realizar tareas de control: esto sirve para cualquier plataforma, los lenguajes interpretados no son nada fiables además de su lentitud natural.
  • Utilizar un kernel RT: El nucleo de Linux típico no está preparado para realizar este tipo de tareas, el cambio de una tarea a otra se hace en un tiempo muy grande para estos sistemas. Los kernels en tiempo real acortan este tiempo para que los hilos que lo necesiten puedan ejecutarse en el momento justo. Esta es una solución muy utilizada en producción musical para utilizar el puerto MIDI en un PC, reduciendo su latencia al máximo.
  • Utilizar un lenguaje con acceso a bajo nivel: Si utilizamos un lenguaje que nos permita acceder directamente al hardware y que se encargue el mismo de realizar la planificación de las tareas y la elección de prioridad, podremos conseguir resultados mucho mejores. Un ejemplo de estos lenguajes es Ada, diseñado expresamente para sistemas en tiempo real.

Si después de aplicar estas medidas nuestro problema aun no está resuelto podemos descartar el uso de los puertos GPIO e incorporarle a nuestro Raspberry Pi un Arduino o lo que queramos, pero conviene mirar antes estas soluciones para ahorrarnos unos cuantos euros.


Entrevista a Eben Upton sobre Raspberry Pi

Raspberry PiQue interesante la entrevista sobre éste pequeño ordenador que he encontrado en ieee spectrum, entrevistan en este caso al fundador de Raspberry Pi, Eben Upton, que además es diseñador de chips en Broadcom. Cosas que destacaría, la pregunta sobre como es de abierto Raspberry Pi, por ejemplo en comparación con Arduino, que se remarque el uso de estándares como el caso de la alimentación por microUSB y los nuevos usos que se le están buscando a la placa, ponen como ejemplo su uso en sistemas de control.

Personalmente Raspberry me gusta pero le hecho en falta un poco de esa libertad que si que demuestra Arduino, podrían empezar por compartir los esquemas de la placa, por otra parte y siguiendo con la comparación con Arduino, Raspberry demuestra una mayor utilización de estándares, en Arduino no son estándares ni siquiera los pines de entrada y salida.

Raspberry Pi aunque es una plataforma de desarrollo muy interesante por sus capacidades y su bajo coste, no se puede considerar una plataforma de hardware libre como Arduino, espero sinceramente que éste sea el primer paso para que aparezcan más plataformas hardware de este tipo que sí tengan una filosofía de libertad de base, este podría ser un gran salto para el hardware libre, que pasaría de dispositivos de hardware más o menos simples a algo tan complejo como un verdadero ordenador.


Todos usamos cookies, acéptalo ya. más información

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close