Tema 3 – Conceptos básicos de microcontroladores y electrónica (2)

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 que necesitamos los drivers de windows, cuando conectamos un cable FTDI también necesita sus drivers.

There are four wires: red power, black ground, white RX into USB port, and green TX out of the USB port. The power pin provides the 5V @ 500mA direct from the USB port and the RX/TX pins are 3.3V level for interfacing with the most common 3.3V logic level chipsets.

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

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

Veamos como aplicar esta teoría en nuestro Arduino…

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(), 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 inforamció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 el 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, 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

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: Ejercicio06-ASCII

Práctica: Hacer un dimmer con un led, regulando la intensidad de brillo de un LED mediante el envío de un byte entre 0 y 255.

analogwrite() – http://arduino.cc/en/Reference/AnalogWrite

Serial.read() – http://arduino.cc/en/Serial/Read

Serial.available() – http://arduino.cc/en/Serial/Available

Solución: Ejercicio07-dimmer

Entradas y salidas Digitales

La 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:

Ejercicio: Usar la resistencia de pullup para detectar flancos de subida y de bajada.

Solución: Ejercicio08-pullup

Ejercicio: Contar el número de veces que se pulsa un botón.

Solución: Ejercicio09-cuentapulsos

Ejercicio Avanzado: Ejercicio2 del libro.

Ejercicios para los más avanzados:

Leer la función tone()

Solución: Ejercicio10-tone

Proyecto: Hacer un juego con 5 leds y dos botones, de forma que al iniciar el programa se enciende el led del medio y se desplaza el led iluminado en función del jugador que pulsa más veces el botón, cuando hay un ganador, el LED más cercano al botón ganador parpadea. Para volver a empezar a jugar resetear.

Podéis usar el simulador: http://www.123dapp.com/circuits

Entender como funcionan las E/S en Arduino

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.