sábado, 21 de septiembre de 2013

Arduino + Shield Tarjeta SD

Volvemos con Arduino! y esta vez con un elemento que ofrece muchas posibilidades a nuestros proyectos! Un shield casero para lectura/escritura de tarjetas SD con arduino!
Primero, hablemos un poco sobre tarjetas SD: ¿Qué son? ¿Para qué sirven? y muy importante para trabajar con Arduino, ¿Cómo se comunican?
¿Qué son las tarjetas SD y para qué sirven? Me sirvo de Wikipedia para explicar un poco.

SD (Secure Digital) es un formato de tarjeta de memoria
no-volátil
 inventado por Panasonic allá por 1999.
Son tarjetas de pequeña dimensión, que permiten el almacenaje de datos en todo tipo de dispositivos de hoy en día, como cámaras fotográficas, teléfonos móviles, PDA’s, etc.
Su tamaño ha ido creciendo con los años, hasta hoy en día donde ya se comercializan tarjetas SD de hasta 128 Gigabytes.
Existen dos tipos de tarjeta dependiendo de la velocidad a la que trabajan, las SD y las SDHC que tienen tasas de transferencia de datos más altas.
Son muy utilizadas a día de hoy por la gran ventaja que nos suponen, pudiendo obtener una gran capacidad de almacenamiento de datos a un muy bajo precio.
Veamos cómo se comunican las tarjetas SD para poder interactuar con Arduino!
¿Cómo se comunican las tarjetas SD?  Sigue leyendo!Las tarjetas SD poseen dos protocolos de comunicación que son:
Bus SD: Utiliza transferencias paralelas de 4 bits.
SPI (Serial Peripheral Interface): Interfaz de Periféricos Serie.
Este último es el que nos interesa a nosotros ya que comunicaremos la tarjeta SD con Arduino utilizando el protocolo de comunicación SPI. En Wikipedia está bien explicado:
El Bus SPI es un estándar de comunicaciones usado principalmente para la transferencia de información entre circuitos integrados en equipos electrónicos. Sirve para controlar casi cualquier dispositivo electrónico digital que acepte un flujo de bits serie regulado por un reloj.
Este protocolo funciona con una configuración Master-Slave (maestro-esclavo), donde en nuestro caso el Arduino será el maestro, y la tarjeta SD será el esclavo. Veamos:
CLK (Línea de reloj): Es la señal de reloj.
- MOSI (MasterOut-SlaveIn): Línea por donde el maestro envía y el esclavo recibe.
- MISO (MasterIn-SlaveOut): 
Línea por donde el maestro recibe y el esclavo envía.
- CS (Chip Select)/ SS (Slave Selector): Conecta o desconecta la operación del dispositivo con el que comunicamos. Permite la comunicación de varios esclavos a un mismo maestro, multiplexando la señal de reloj.
El maestro configura la velocidad de transmisión a la máxima permitida por el esclavo, y seguidamente pone a nivel bajo la señal “Selector Slave” para indicarle que va a comunicar.
Durante cada ciclo de reloj se produce una comunicación bidireccional, ya que por una parte el maestro va a enviar bits en serie (MOSI) y el esclavo a recibir, mientras que a la vez el esclavo va a enviar bits en serie (MISO) para que el maestro lo reciba.
Al terminar la comunicación el maestro coloca a nivel alto la señal SS y para la señal de reloj.
Arduino Shield casero para tarjetas SD
Como vemos en la imagen de Maestro-Esclavo, necesitamos 4 líneas de conexión para establecer la comunicación SPI, así que vamos a identificar dichas conexiones tanto en el Arduino como en la tarjeta SD.  Veamos el pinout de una SD:
Identificados los pines de la tarjeta SD, tenemos que saber donde conectarlos en el Arduino UNO, los pines de conexión del bus SPI son los siguientes:
- Pin digital 4 – CS / SS (En librería Arduino SD / Este pin es configurable vía software)
- Pin digital 11 – MOSI
- Pin digital 12 – MISO
- Pin digital 13 – CLK  
Los pines 8 y 9 de la tarjeta SD, no se conectan ya que son necesarios solamente si utilizaramos el protocolo BUS SD, que utiliza 4 líneas de bits en paralelo para comunicar.
Ya sabemos como conectar, pero nos surje un pequeño problema, y muy importante!
Las tarjetas SD funcionan a un voltaje comprendido entre 2,7V y 3,3V máximo! 
Por lo que no podemos conectar la tarjeta directamente al Arduino, ya que los pines digitales funcionan a 5V y quemaríamos la SD.
A partir de aquí hay varias opciones, podemos utilizar un divisor de tensión con resistencias, utilizar circuitos integrados como el 74HC4050 que regula el voltaje a 3.3V, o bien, comprar un shield ya montado, en cuyo caso no sigas leyendo a partir de aquí. (xD)
El modo más barato, es utilizar un divisor de tensión con resistencias, que es el que he utilizado yo, por lo que hay que calcular el valor de las resistencias para obtener una salida de 3,3V a partir de una entrada de 5V, mediante la siguiente fórmula:
Vamos a suponer el valor de R2 y así simplemente tenemos que despejar R1. (R2 = 2k2)
Sabemos Vin = 5V (De los pines digitales del Arduino), R2 = 2k2 y Vout = 3,3V (La tensión de salida que queremos conseguir). Despejamos R1 y nos sale que R1 = 1133 Ω que como no es un valor normalizado, usamos 2 resistencias en serie de 1k + 100 Ω.
Si presuponemos otro valor de R2, al hacer los cálculos obtendremos otro valor de R1, podemos conseguir 3,3V con muchas combinaciones distintas de valores de resistencias.
Estos divisores no son de lo más estable y no siempre se consigue el voltaje de salida deseado debido a las tolerancias de las resistencias, pero suele ser muy cercano al que necesitemos. Hacemos la prueba, medimos y el valor es “perfecto”:
Midiendo el voltaje de salida del divisor de tensión
Así que conseguido el divisor de tensión necesario para conectar la tarjeta SD con Arduino, procedemos a crear el circuito. Los materiales necesarios son:
- Slot para tarjetas SD
- 3x Resistencias 2k2
- 3x Resistencias 1k
- 3x Resistencias 100 Ω
- Placa perforada o placa de cobre a elección de cada uno.
- Conector de tira de pines hembra.
- Cables.
Y el circuito en cuestión es…  (Descarga el esquemático en OrCAD: SD Shield)
Procedemos al montaje como cada uno desea, y fin!! Ya tenemos un SD Shield para poder dotar de almacenamiento a nuestros proyectos!
Es muy importante que las tarjetas SD estén formateadas en formato FAT16 para poder trabajar con Arduino!Normalmente es el tipo de formato que traen por defecto, pero en caso de no ser así, habría que formatearlas.  
Aquí unas fotos del resultado del mío, como estoy sin impresora, las placas perforadas apañan a uno muy bien:
SD Shield 1
SD Shield 2
SD Shield 3
SD Shield 4
Arduino trae por defecto una librería específica para trabajar con tarjetas SD, por lo que podemos utilizar los ejemplos que trae que son muy interesantes, como crear un archivo de texto en la SD, leer y escribir en archivos de texto, etc.
Y esta vez, no hay vídeo de funcionamiento, pero prometo ponerlo pronto! Eso si, hay foto!
Funcionando!
SD Shield Funcionando!

No hay comentarios:

Publicar un comentario