Archivo de la etiqueta: SD

Hardware Ethernet en Arduino

Para poder añadir conectividad de Ethernet a Arduino disponemos de varios tipos de Ethernet Shield y breakout boards, pero principalmente el chip que tiene el interfaz ethernet y la pila de protocolos TCP/IP es el chip Wiznet W5100 y más recientemente el W5500, pero podemos encontrarnos shields intermedios basados en el W5200. La librería a usar dependerá del chip ethernet usado al estilo de un driver en un ordenador.

Existen otras shields o breakout boards basadas en otros chips y con otras librerías como el ENC28J60:

Cómo elegir la correcta librería para añadir Ethernet cn enc28j60 a Arduino: http://www.homautomation.org/2014/10/27/how-to-choose-the-right-library-to-add-ethernet-enc28j60-to-your-arduino/

Ethernet Shield V1

El Arduino Ethernet Shield V1 nos da la capacidad de conectar un Arduino a una red ethernet. Es la parte física que implementa la pila de protocolos TCP/IP.

Ethernet Shield permite a una placa Arduino conectarse a internet. Está basada en el chip ethernet Wiznet W5100. El Wiznet W5100 provee de una pila de red IP capaz de soportar TCP y UDP. Soporta hasta cuatro conexiones de sockets simultáneas. Usa la librería Ethernet para escribir programas que se conecten a internet usando la shield.

Datasheet de W5100: https://www.sparkfun.com/datasheets/DevTools/Arduino/W5100_Datasheet_v1_1_6.pdf

Para manejar este shield disponemos de la librería Ethernet: http://arduino.cc/en/Reference/Ethernet

El shield provee un conector ethernet estándar RJ45. La ethernet shield dispone de unos conectores que permiten conectar a su vez otras placas encima y apilarlas sobre la placa Arduino.

Arduino usa los pines digitales 10, 11, 12, y 13 (SPI) para comunicarse con el W5100 en la ethernet shield. Estos pines no pueden ser usados para e/s genéricas. El botón de reset en la shield resetea ambos, el W5100 y la placa Arduino.

El jumper soldado marcado como “INT” puede ser conectado para permitir a la placa Arduino recibir notificaciones de eventos por interrupción desde el W5100, pero esto no está soportado por la librería Ethernet. El jumper conecta el pin INT del W5100 al pin digital 2 de Arduino.

La shield contiene varios LEDs para información:

  • ON: indica que la placa y la shield están alimentadas
  • LINK: indica la presencia de un enlace de red y parpadea cuando la shield envía o recibe datos
  • 100M: indica la presencia de una conexión de red de 100 Mb/s (de forma opuesta a una de 10Mb/s)
  • RX: parpadea cuando el shield recibe datos
  • TX: parpadea cuando el shield envía datos

Un tutorial sencillo para comenzar con el shield ethernet en: http://www.artinteractivo.com/arduino-ethernet

Para cualquier duda sobre el ethernet Shield consultar: http://arduino.cc/en/Main/ArduinoEthernetShield

Puntos a recordar del Ethernet Shield:

  • Opera a 5V suministrados desde la placa de Arduino
  • El controlador ethernet es el W5100 con 16K de buffer interno. No consume memoria.
  • El shield se comunica con el microcontrolador por el bus SPI, por lo tanto para usarlo siempre debemos incluir la libreria SPI.h: http://arduino.cc/en/Reference/SPI
  • Soporta hasta 4 conexiones simultáneas
  • Usar la librería Ethernet para manejar el shield: http://arduino.cc/en/Reference/Ethernet
  • El shield dispone de un lector de tarjetas micro-SD que puede ser usado para guardar ficheros y servirlos sobre la red. Para ello es necesaria la librería SD: http://arduino.cc/en/Reference/SD
  • Al trabajar con la SD, el pin 4 es usado como SS.

Nuestro Arduino UNO se comunica con W5100 y la tarjeta SD usando el bus SPI a través del conector ICSP. Por este motivo los pines 10, 11, 12 y 13 en el UNO y los 50, 51, 52 y 53 en el Mega no podrán usarse. En ambas placas los pines 10 y 4 se usan para seleccionar el W5100 y la tarjeta SD.

El W5100 y el SD no pueden trabajar simultáneamente y debemos tener cuidado al usar ambos de forma conjunta.

El esquemático lo podéis encontrar en: http://arduino.cc/en/uploads/Main/arduino-ethernet-shield-06-schematic.pdf

El Ethernet shield es compatible con PoE gracias a un módulo adicional que extrae la energía eléctrica del cable ethernet, anteriormente inyectada desde el switch.

Las características del módulo PoE:

  • IEEE802.3af compliant
  • Low output ripple and noise (100mVpp)
  • Input voltage range 36V to 57V
  • Overload and short-circuit protection
  • 9V Output
  • High efficiency DC/DC converter: typ 75% @ 50% load
  • 1500V isolation (input to output)

Data sheet: http://arduino.cc/en/uploads/Main/PoE-datasheet.pdf

Ethernet Shield V2

Arduino Ethernet Shield V1 es una placa que aparece en la web de arduino.cc como retirado, pero sigue estando disponible como clones o versiones derivadas.

Existe una nueva versión del Ethernet Shield llamada Arduino Ethernet Shield 2 con el nuevo Wiznet 5500: https://www.arduino.cc/en/Main/ArduinoEthernetShield

Este Shield usa la librería Ethernet 2 cuya sintaxis es igual que la librería Ethernet: https://www.arduino.cc/en/Reference/Ethernet

Data sheet de W5500: https://www.sos.sk/productdata/15/26/12/152612/W5500_datasheet_v1.0.2_1.pdf

Mejoras de W5500: https://feilipu.me/2014/11/16/wiznet-w5500-ioshield-a

Arduino Ethernet Shield 2:

Otros Arduinos con Ethernet

Existe un Arduino Ethernet que es casi igual a un arduino UNO + Ethernet Shield: https://www.arduino.cc/en/Main/arduinoBoardEthernet

También existe el Arduino Leonardo ETH que es casi lo mismo que un Arduino Leonardo + un Ethernet Shield 2: https://www.arduino.cc/en/Main/ArduinoBoardLeonardoEth

Para las tarjetas basadas en el chip wiznet 5200:

Power over Ethernet

El Ethernet shield es compatible con PoE gracias a un módulo adicional que extrae la energía eléctrica del cable ethernet, anteriormente inyectada desde el switch.

Las características del módulo PoE:

  • IEEE802.3af compliant
  • Low output ripple and noise (100mVpp)
  • Input voltage range 36V to 57V
  • Overload and short-circuit protection
  • 9V Output
  • High efficiency DC/DC converter: typ 75% @ 50% load
  • 1500V isolation (input to output)

Data sheet: http://arduino.cc/en/uploads/Main/PoE-datasheet.pdf

Más información sobre el Power Over Ethernet:

Como funciona PoE: http://www.bb-elec.com/Learning-Center/All-White-Papers/Ethernet/Power-over-Ethernet-PoE.aspx

Phantom Feeding:

Alimentación sobre cables libres:

Práctica: Uso Ethernet Shield

IP Dinámica con Arduino. DHCP

Configurar Arduino con el ethernet shield de forma que coja la IP dinámicamente por DHCP y lo muestre por pantalla.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio32-DHCP

IP Fija con Arduino

Configurar Arduino con el ethernet shield de forma que le asignamos una IP fija con la siguiente configuración:

  • IP: 192.168.6.1YY. Siendo YY el número = 30 + número del kit. Por ejemplo para el kit 4 la IP es la 192.168.6.134 y para el kit 16 la IP es es 192.168.6.146.
  • Subnent: 255.255.255.0
  • Gateway: 192.168.6.1
  • DNS: 8.8.8.8

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio33-Configurar_IP

Grabar Datos en Tarjeta SD

El Ethernet shield tiene disponible una ranura para tarjetas microSD. Arduino es capaz de leer y escribir en la tarjeta microSD mediante la librería SD: https://www.arduino.cc/en/Reference/SD

Leer la documentación de la librería SD y entender qué hace cada una de las clases y sus métodos.

Insertar una tarjeta microSD y hacer un programa que grabe los datos de temperatura en un archivo llamado temp_log.csv cada 5 segundos. Los datos a guardar son: segundos desde inicio con la función millis() y la temperatura del sensor TMP36.

Opcionalmente crear un menú con 3 opciones:

  • 1 – Muestra el último dato guardado en la SD
  • 2 – Vuelca el contenido del fichero temp_log.csv por consola
  • 3 – Borra el contenido del fichero

Esquema de conexión:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio34-SD_Datalogger

Anuncios

Uso Ethernet Shield

IP Dinámica con Arduino. DHCP

Configurar Arduino con el ethernet shield de forma que coja la IP dinámicamente por DHCP y lo muestre por pantalla.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio32-DHCP

IP Fija con Arduino

Configurar Arduino con el ethernet shield de forma que le asignamos una IP fija con la siguiente configuración:

  • IP: 192.168.6.1YY. Siendo YY el número = 30 + número del kit. Por ejemplo para el kit 4 la IP es la 192.168.6.134 y para el kit 16 la IP es es 192.168.6.146.
  • Subnent: 255.255.255.0
  • Gateway: 192.168.6.1
  • DNS: 8.8.8.8

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio33-Configurar_IP

Grabar Datos en Tarjeta SD

El Ethernet shield tiene disponible una ranura para tarjetas microSD. Arduino es capaz de leer y escribir en la tarjeta microSD mediante la librería SD: https://www.arduino.cc/en/Reference/SD

Leer la documentación de la librería SD y entender qué hace cada una de las clases y sus métodos.

Insertar una tarjeta microSD y hacer un programa que grabe los datos de temperatura en un archivo llamado temp_log.csv cada 5 segundos. Los datos a guardar son: segundos desde inicio con la función millis() y la temperatura del sensor TMP36.

Opcionalmente crear un menú con 3 opciones:

  • 1 – Muestra el último dato guardado en la SD
  • 2 – Vuelca el contenido del fichero temp_log.csv por consola
  • 3 – Borra el contenido del fichero

Esquema de conexión:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio34-SD_Datalogger

Ampliación Memoria Arduino

Cuando se desarrolla un proyecto con Arduino, es posible que a medida que crezca en tamaño y complejidad nos quedemos sin memoria, ya sea sin SRAM que es lo más sencillo, al ser un recurso escaso, y también lo más fácil de solucionar o sin EEPROM o sin memoria flash.

Si al compilar un sketch ocupa mucho espacio y no cabe en la memoria flash, lo primero que se debe hacer es optimizar el código siguiendo estas recomendaciones. https://learn.adafruit.com/memories-of-an-arduino/optimizing-program-memory. Hay que tener en cuenta que no es posible ampliar la memoria flash de Arduino con memoria externa. Una alternativa es que si el sketch tiene muchos strings de solo lectura, imágenes, ficheros, arrays de gran tamaño, etc…, una solución es mover toda esa gran cantidad de datos a una tarjeta SD externa y leer los valores sólo cuando se necesitan.

En caso de necesitar más EEPROM  de la que dispone el microcontrolador, es sencillo usar EEPROM externas conectadas por I2C o SPI, aunque también es posible almacenar los datos no volátiles en una tarjeta SD externa en lugar de la EEPROM.

Un buen ejemplo de uso de una EEPROM externa I2C, puede ser la EEPROM de microchip 24LC256 con una capacidad de 32K x 8 (256 Kbit). Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/21203M.pdf. Tutoriales:

Otra alternativa para la expansión de memoria es dataflash https://en.wikipedia.org/wiki/DataFlash que es un protocolo serie desarrollado por Atmel para el acceso a memorias Flash http://www.mouser.es/Search/Refine.aspx?Keyword=dataflash.

Más información:

O también es posible usar SPI flash memory como 4MBIT W25X40CLSNIG que usa Moteino para almacenamiento de datos y la programación inalámbrica. La librería desarrollada es https://github.com/LowPowerLab/SPIFlash.

En caso de quedarnos sin memoria SRAM, lo primero es seguir estos consejos para optimizar su uso y mover a la memoria flash (si queda espacio) todas los strings y datos que no se modifican en tiempo de ejecución (read-only):  https://learn.adafruit.com/memories-of-an-arduino/optimizing-sram.

Si con esto no es suficiente, entonces podemos ampliar la memoria SRAM. Obtener más SRAM es en realidad bastante sencillo. Hay módulos de SPI RAM (memoria volatil) como el microchip 23K256, data sheet: http://ww1.microchip.com/downloads/en/DeviceDoc/22100D.pdf. Dispone de 32k de SRAM con un interfaz SPI. Se accede a ellos a través de SPI y hay la biblioteca SpiRAM para ayudar a su uso. Debe tenerse en cuenta que opera a 3,3V y no 5V y que no es posible usarla con Arduino Mega.

Dado que no es posible ampliar la memoria flash de Arduino, ampliando la memoria SRAM, podríamos reestructurar el sketch y reducir el tamaño del código a expensas de aumentar el tamaño de los datos, haciéndolo un poco más lento.

Más información:

Uso de tarjetas SD en Arduino

Una forma ampliar la capacidad de almacenamiento de un Arduino es añadir una memoria externa y la forma más sencilla y barata es mediante un lector de tarjetas SD. Esto nos permite añadir un almacenamiento local no volátil para por ejemplo guardar un log de temperaturas o los datos de configuración de nuestro programa.

Como hemos visto anteriormente, tanto si nos quedamos sin memoria SRAM, flash o EEPROM podríamos recurrir al uso de una tarjeta SD para tratar de solucionar el problema directa o indirectamente.

En teoría, se podría ir tan lejos como traducir todo el sketch en algún lenguaje interpretado, almacenar esa versión del sketch en una tarjeta SD, y luego escribir un intérprete para que el lenguaje que se ejecute en Arduino y recoja, interprete y ejecute esas instrucciones de la tarjeta SD. Por ejemplo http://playground.arduino.cc//CommonTopics/ForthOnArduino que puede ser usado como una shell para ejecutar comando interactivos.

Veamos el uso de tarjetas SD con Arduino. Para ello lo primero que necesitamos es un HW externo que nos proporcione un lector de tarjetas y luego una librería adecuada para usar ese HW adicional.

Con la Ethernet shield disponemos de un lector de tarjetas micro SD y es accesible gracias a la librería SD: https://www.arduino.cc/en/Reference/SD

Otros shield interesante es el Adafruit datalogger shield que dispone de un lector de tarjetas SD, un RTC (Real Time Clock), una zona de prototipado para soldar componentes adicionales y dos LEDs indicadores configurables.

Más información: https://learn.adafruit.com/adafruit-data-logger-shield/overview

Otro HW para tarjetas SD:

La librería para manejar los lectores de tarjetas SD es la librería SD, el reference está disponible en http://arduino.cc/en/Reference/SD.Casi todos los módulos usan esta librería porque el acceso a la tarjeta SD es mediante el bus SPI directamente a la tarjeta o mediante un voltage level shifter.

La librería SD está basada en la librería SDfat: https://github.com/greiman/SdFat. Es compatible con sistemas de archivos FAT16 y FAT32 entarjetas SD estándar y tarjetas SDHC. Utiliza cortos 8.3 nombres de los ficheros. Los nombres de los archivos pasados a las funciones de la librería SD pueden incluir la ruta usando el caracter “/”, por ejemplo “directory/filename.txt”. El directorio de trabajo siempre es el root de la tarjeta SD.

Cuestiones a tener en cuenta cuando se usa la librería SD: https://www.arduino.cc/en/Reference/SDCardNotes

Tutoriales disponibles

  • Card Info: Obtiene información de la tarjeta SD.
  • Datalogger: Log data de tres entradas analógicas a la tarjeta SD.
  • Dump File: Lee un fichero de la SD card.
  • Files: Crea y borra un fichero de la SD card.
  • List Files: Imprime el listado de fichero en un directorio de la SD card.
  • Read Write: Lee y escribe datos de una SD card.

La librería SD tiene dos clases: SD que ofrece funciones para acceder a la tarjeta SD y manipular sus directorios y ficheros y la clase File que tiene los métodos para leer y escribir de ficheros individuales de la tarjeta SD.

Ver todos los métodos en https://www.arduino.cc/en/Reference/SD

Pineado de tarjetas SD:

Pin – Name – Description
1 – NC – not connected
2 – CS – Chip Select/Slave Select (SS)
3 – DI – Master Out/Slave In (MOSI)
4 – VDD – Supply voltage
5 – CLK – Clock (SCK)
6 – VSS – Supply voltage ground
7 – DO – Master In/Slave Out (MISO)
8 – RSV – Reserved

A la hora de conectar con Arduino, solo debemos definir en Arduino el pin CS (Chip Select). Antes de empezar a leer y escribir datos en la tarjeta SD de Arduino hay que utilizar la instrucción SD.begin(), determinando en el paréntesis el pin CS de tu shield de SD o del pin de la tarjeta SD. Esto quiere decir que si se utiliza una placa de Arduino UNO (o similar) se utiliza la instrucción SD.begin(10) pero si (por ejemplo) se utiliza el shield de Ethernet debe ponerse SD.begin(4).

Antes de utilizar la tarjeta SD de Arduino debes abrir el archivo sobre el que vayas a trabajar (verás cómo más adelante). Si por cualquier motivo pierdes la comunicación con dicho archivo antes de cerrarlo, podrías perder tus datos. Los datos solo se guardan cuando cierras el archivo o usas la función flush().

Más información:

Ejercicios con SD

Ejercicio30-SD: Grabar y leer en una tarjeta SD

Basarse en los tutoriales.

Solución:  https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio30-SD

Ejercicio50-DAQ_SD:  Leer y guardar en una tarjeta SD cada 30 segundos la temperatura y humedad de una sonda DHT22. Los datos son guardados en un fichero llamado datalog.csv. Los datos también son mostrados por en una pantalla LCD modelo https://www.sparkfun.com/products/9395

Para leer los datos de la SD y sacarlos por el puerto serie, usar el sketck: https://www.arduino.cc/en/Tutorial/DumpFile

Modificar el sketch para que funcione con la sonda y el display LCD del curso:

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio50-DAQ_SD