Archivo por años: 2015

Entradas y salidas Digitales

Una señal digital es un tipo de señal generada por algún tipo de fenómeno electromagnético en que cada signo que codifica el contenido de la misma puede ser analizado en término de algunas magnitudes que representan valores discretos, en lugar de valores dentro de un cierto rango. Por ejemplo, el interruptor de la luz sólo puede tomar dos valores o estados: abierto o cerrado, o la misma lámpara: encendida o apagada (véase circuito de conmutación).

http://es.wikipedia.org/wiki/Se%C3%B1al_digital

 Los sistemas digitales, como por ejemplo un microcontrolador, usan la lógica de dos estados representados por dos niveles de tensión eléctrica, uno alto, H y otro bajo, L (de High y Low, respectivamente, en inglés). Por abstracción, dichos estados se sustituyen por ceros y unos, lo que facilita la aplicación de la lógica y la aritmética binaria. Si el nivel alto se representa por 1 y el bajo por 0, se habla de lógica positiva y en caso contrario de lógica negativa.

 Cabe mencionar que, además de los niveles, en una señal digital están las transiciones de alto a bajo y de bajo a alto, denominadas flanco de bajada y de subida, respectivamente.

En una señal digital, se denomina flanco a la transición del nivel bajo al alto (flanco de subida) o del nivel alto al bajo (flanco de bajada).

 En la siguiente imagen el flanco de bajada es detectado por el retardo que realiza la compuerta not así cuando a la entrada haya uno las dos entradas de la or negada serán uno y cero, por tanto la salida será de cero, pero en el momento en que la entrada sea de cero la conexión directa que hay a la or negada nos dará un cero inmediato en una de sus entradas, mientras que por el retardo que presenta la not también tendremos un cero y esto nos generará un uno a la salida por unos momentos, o sea la detección del flanco de bajada.

 Las señales digitales:

  • Discreta: puede tomar un conjunto de valores
  • Binaria: Encendido (1) – Apagado (0)

 Arduino trabaja con tecnología TTL (transistor-transistor logic):

http://es.wikipedia.org/wiki/Tecnolog%C3%ADa_TTL

 Características

  • Su tensión de alimentación característica se halla comprendida entre los 4,75V y los 5,25V. Normalmente TTL trabaja con 5V.
  • Los niveles lógicos vienen definidos por el rango de tensión comprendida entre 0,0V y 0,8V para el estado L (bajo) y los 2,4V y Vcc para el estado H (alto).
  • La velocidad de transmisión entre los estados lógicos es su mejor base, si bien esta característica le hace aumentar su consumo siendo su mayor enemigo. Motivo por el cual han aparecido diferentes versiones de TTL como FAST, LS, S, etc y últimamente los CMOS: HC, HCT y HCTLS. En algunos casos puede alcanzar poco más de los 250 MHz.
  • Las señales de salida TTL se degradan rápidamente si no se transmiten a través de circuitos adicionales de transmisión (no pueden viajar más de 2 m por cable sin graves pérdidas).

 En arduino los pines digitales se describen y tienen la propiedades siguientes:  http://arduino.cc/en/Tutorial/DigitalPins

 En arduino para tratar las entradas y salidas digitales usamos las siguientes funciones:

 En la imagen siguiente se muestra el estado por defecto de una I/O digital en un microcontrolador de Arduino. Se ha simplificado con interruptores la compleja electrónica que hay dentro.

Por defecto los digital I/O pins están configurados como inputs en un estado de alta impedancia (equivalente a una resistencia de 100 Mohms en frente del pin), es decir, SW3 a ON y no hace falta llamar a la función pinMode() aunque es recomendable para aclarar el código.

  • PinMode(x, INPUT) –> SW3 = ON (resto a OFF). Los valores leidos serán aleatorios si el pin de Arduino está al aire.
  • PinMode(x,INPUT_PULLUP) –> SW3 = ON & SW4 = ON (resto a OFF). Los valores leidos sin nada conectado al pin es HIGH. La Resistencia R1 tiene un valor dependiendo del microcontrolador, pero tiene un valor entre 20kOhm y 150kOhm.
  • PinMode(x, OUTPUT) & digitalWrite(x,HIGH) –> SW2 = ON & SW1 = +5V (resto a OFF). Estado de baja impedancia, no hay resistencia interna y es necesario poner una adecuada para no superar los 40mA máximos admitidos
  • PinMode(x, OUTPUT) & digitalWrite(x,LOW) –> SW2 = ON & SW1 = GND (resto a OFF). Estado de baja impedancia, no hay resistencia interna y es necesario poner una adecuada para no superar los 40mA máximos admitidos

 En el caso que el pin esté configurado como OUTPUT, hay diferencia entre sink (recogida de corriente) y source (fuente de corriente) de un pin digital configurado como salida.

En el primer caso para encender el LED debo poner digitalWrite() a HIGH y en el segundo a LOW

 

 En el caso que el pin de entrada configurado como INPUT. Cuando el botón no está pulsado, en el primer caso leo digitalRead() un valor HIGH y en el segundo LOW y cuando pulso el botón, en el primer caso leo digitalRead() un valor LOW y en el segundo HIGH. Como véis, dependiendo de la configuración de lo conectado cambia lo leido.

 

 En el caso que el pin de entrada configurado como INPUT_PULLUP. Si el botón no está pulsado leo HIGH (no se producen lecturas aleatorias con el pin al aire) y cuando pulso el botón leo LOW.

Práctica: Dimmer puerto serie

Práctica: Hacer un dimmer con un led, regulando la intensidad de brillo de un LED mediante el envío de una cadena entre 0 y 100, de forma que 0 es apagado y 100 es el 100% encendido. Debe usarse un pin digital que tenga salida PWM para poder tener una salida analógica.

Funciones a utilizar:

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio07-dimmer

Solución mejorada: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio07b-dimmer_mejorado

Práctica: Uso de puerto serie en Arduino

Práctica: Generar una tabla de caracteres y sus valores ASCII en decimal, hexadecimal, octal y binario

 Caracteres ASCII: http://es.wikipedia.org/wiki/ASCII y http://www.asciitable.com/

 Ejercicio: http://arduino.cc/en/Tutorial/ASCIITable

 Fijaros en el carácter ÿ y recordad cual es su valor en binario.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio06-ASCII

Comunicación Serie

Para manejar el puerto serie, debemos leer a fondo la referencia de Arduino:  http://arduino.cc/en/Reference/Serial

Funciones importantes que debemos conocer: begin(), read(), write(), print(), available() y flush()

 En el playground de Arduino tenemos más explicaciones y ejemplos de como funcional el puerto serie en Arduino: http://playground.arduino.cc/ArduinoNotebookTraduccion/Serial

Buffer Serial: los puertos serie de los microcontroladores tienen un buffer que se va llenando hasta que nosotros lo vamos leyendo con la función read() que lo vamos vaciando, es una pila LIFO. El tamaño del buffer serie en el Arduino Uno es de 64 bytes, cuando se llena ese buffer el resto de elementos recibidos se pierden.

 El microcontrolador de Arduino no tiene buffer de salida del puerto serie, solo de entrada.

 Toda la información del puerto seríe del microcontrolador del arduino UNO la tenemos en la página 176 de http://www.atmel.com/Images/doc8161.pdf

 Por ejemplo la función available() de Serial, podemos ver  como se hace en C o en ensamblador en la página 183.

 La función write() podemos verla en la página 184 y la función read() en la página 186.

 Una descripción de los registros usados por el microcontrolador en la comunicación serie se pueden ver en la página 195.

 OJO – las funciones de serial que usamos valen para cualquier arduino soportado por el IDE que estamos usando, pero luego cada microcontrolador internamente usa unos registros y operaciones diferentes, por lo que si usamos las funciones a bajo nivel vistas, sólo funcionarán con Arduino UNO.

 Entrar en temas más complejos como los vistos tiene dos objetivos, saber que tenemos toda la documentación disponible para entrar a fondo en el conocimiento del microcontrolador y sobre todo que todas esas funciones que usamos de una forma sencilla, saber que detrás de ellas hay mucha más complejidad de la que pueda parecer.

 Arduino nos facilita un lenguaje de programación y unas funciones sencillas para manejar unas serie de microcontroladores diferentes.

¿Y si necesitas más puertos serie? http://arduino.cc/en/Reference/SoftwareSerial

USB to Serial

Arduino se conecta a nuestro ordenador a través del puerto USB, pero el puerto USB se debe conectar al microcontrolador a través del puerto serie, por ello debemos entender como están relacionados el puerto USB y el puerto serie.

En un Arduino usamos el puerto USB para dos funciones: cargar nuestro programa ya compilado en la memoria flash y conectarnos al puerto Serie (UART) predefinido en cada Arduino para comunicarnos durante la ejecución del programa. Ambas cosas se puede hacer sin la necesidad del puerto USB, pero dada la facilidad de uso y que todos los ordenadores disponen de un puerto USB, nos facilita mucho hacer estas dos operaciones.

El puerto serie conectado al USB lo usamos como puerto de consola o puerto de debug.

UART: http://es.wikipedia.org/wiki/Universal_Asynchronous_Receiver-Transmitter

Las funciones principales de chip UART son de manejar las interrupciones de los dispositivos conectados al puerto serie y de convertir los datos en formato paralelo, transmitidos al bus de sistema, a datos en formato serie, para que puedan ser transmitidos a través de los puertos y viceversa.

El UART normalmente no genera directamente o recibe las señales externas entre los diferentes módulos del equipo. Usualmente se usan dispositivos de interfaz separados para convertir las señales de nivel lógico del UART hacia y desde los niveles de señalización externos.

RS232 – http://en.wikipedia.org/wiki/RS-232

Tecnología TTL: http://es.wikipedia.org/wiki/Tecnolog%C3%ADa_TTL

Cable FTDI: es la forma más fácil de conectar el microcontrolador a un ordenador por USB. Consiste en un chip de conversión USB a Serie. Como ocurre con Arduino cuando lo conectamos, necesitamos los drivers de windows, cuando conectamos un cable FTDI también necesita sus drivers. Los driver FTDI vienen integrados en el IDE de Arduino.

Drivers:https://web.archive.org/web/20141005060035/http://www.ftdichip.com/Drivers/VCP.htm

Productos de FTDI:

Explicación de la diferencia entre comunicación RS232 y TTL: RS-232 vs. TTL Serial Communication y http://www.atmel.com/Images/doc4322.pdf

Como usar RS232 con Arduino: necesito un driver receptor para poder usarlo: http://arduino.cc/en/pmwiki.php?n=Tutorial/ArduinoSoftwareRS232

Y si vamos a lo fácil: https://www.sparkfun.com/products/13029