Archivo del Autor: ecarletti

Actuadores – Músculos neumáticos

Los músculos neumáticos son un tipo de dispositivo relativamente nuevo que produce un movimiento lineal utilizando aire a presión, pero no utiliza pistones como los actuadores neumáticos e hidráulicos habituales. Se contrae cuando se lo activa, como los músculos biológicos.

Estos músculos son fáciles de usar, no son muy costosos, y según quienes los fabrican, para ciertos usos (como por ejemplo en miembros manipuladores de robots) son más eficaces que los cilindros neumáticos estándar.


Demostración: al contraerse, un músculo neumático de 30 mm puede doblar un grueso clavo de hierro;

Haciendo algún tipo de comparación, en cierto modo los músculos neumáticos son similares a los alambres de nitinol, más que nada por su capacidad de contraerse cuando se los activa.

Una comparación rápida entre las dos opciones da estos resultados:

El alambre de nitinol sólo se contrae 5 a 7% de su longitud. El músculo neumático se contrae normalmente un 25% de su longitud, y puede llegar a un 40%. El alambre de nitinol consume mucha energía eléctrica y genera calor que se debe hacer disipar de algún modo.

Aunque el tiempo de reacción de un músculo de alambre puede ser rápido, su tiempo de ciclo (calefacción-enfriamiento-calefacción) suele ser muy largo. El músculo neumático funciona con aire comprimido. Aún cuando se consume energía eléctrica para comprimir el aire, este aire comprimido se puede almacenar. La respuesta de los músculos neumáticos es rápida y el ciclo es veloz.

Hacer una comparación de fuerza y del consumo total de energía es difícil. Un músculo neumático pequeño puede levantar 3 kg, mucho más que un alambre estándar de nitinol. El alambre de nitinol es más delicado, pero solamente cuando los diámetros de estos alambres son pequeños. Un alambre grueso de nitinol —no se fabrican muy gruesos porque serían muy costosos— tendría una fuerza de contracción de centenares de kilogramos (incluso millares), aunque consumiría una enormidad de corriente eléctrica.

El músculo neumático es un tubo alargado construido con una malla de plástico negro. Dentro de él hay un tubo de goma blanda. En los extremos posee unos clips de metal que lo cierran. La red plástica toma forma de lazos en cada extremo, que se sujetan con los clips del metal. Los lazos se utilizan para fijar el músculo neumático a un dispositivo. En los tamaños mayores, los fabricantes utilizan uniones sólidas en lugar de los lazos.

Cuando se presuriza un músculo neumático, la cámara de goma se infla. La cámara presiona contra la red de sujeción de plástico negro, que también se extiende. Al aumentar el grosor de la red plástica, su longitud se acorta. Esto causa que la longitud total del músculo neumático se reduzca, produciendo la contracción.

Figura

Diámetro de la cobertura trenzada

Longitud

Tamaño de la conexión de aire

Fuerza de tracción con 3,5 bar de presión

Fuerza máxima de tracción

6 mm

150 mm (estirado)

4 mm

3 kg

7 kg

20 mm

210 mm (estirado)

4 mm

12 kg

20 kg

30 mm

290 mm (estirado)

6 mm

35 kg

70 kg



Una aplicación bien sofisticada y exigente de estos músculos es una mano robótica que fabrican los mismos que producen estos actuadores (Shadow Robot Company), la mano Shadow Dextrous. Este miembro para robots es manejado por 36 músculos neumáticos.

Más datos:

      Air Muscles
      Cómo fabricar su propio músculo neumático (inglés)




Servos: características básicas

En primer lugar quiero aclarar que, si bien hoy se utiliza ampliamente la palabra abreviada «servo», la verdadera denominación de lo que voy a describir aquí es «servomotor». Existen otra clase de servos (o mejor expresado, servomecanismos) que no son precisamente motores. También hay servos no giratorios.

Diversas clases de servos, incluyendo lineales


Por ejemplo, los sistemas que poseen cilindros hidráulicos pueden ser servocontrolados. Estos cilindros hidráulicos o neumáticos, en su versión más simple, se mueven de extremo a extremo. Pero no siempre es así. En muchos casos es necesario que posean realimentación, lo que les permite ubicarse con precisión en cualquier lugar de su recorrido. Para esto se utilizan sensores de recorrido lineales, como potenciómetros lineales, sistemas ópticos o unos dispositivos llamados LVDT.

De modo que, aclaremos, un actuador mecánico controlado no siempre debe ser rotativo, aunque la mayoría de las veces así es.

Definamos, ahora:

Un servomotor es un motor eléctrico que consta con la capacidad de ser controlado, tanto en velocidad como en posición.

Un servomecanismo es un actuador mecánico —generalmente un motor, aunque no exclusivamente—, que posee los suficientes elementos de control como para que se puedan monitorizar los parámetros de su actuación mecánica, como su posición, velocidad, torque, etc.

Por la explicación que he encontrado en otros sitios parecería que sólo se le llamaría «servo» a aquellos motores con reducción y control de posición que se utilizan extensivamente en modelismo, para efectivizar los movimientos controlados por radio (incluyendo en la entrada correspondiente de la Wikipedia, por lo menos por ahora). Por supuesto que no es así.

En realidad se utilizan muchos otros tipos de servos (o servomotores, mejor) en equipos industriales y comerciales, desde una diskettera en nuestra computadora —o en la videocassettera hogareña—, a las unidades de almacenaje y entrada y salida de datos de grandes sistemas de computación (hoy, más que nada, discos magnéticos), y hasta en los ascensores en edificios. El motor de un ascensor, junto con su equipo de control y detectores de posicionamiento, no es ni más ni menos que un servomotor. El mecanismo que saca para afuera el porta-CD de la lectora de CD de su computadora es un servomotor.

¿Qué convierte un motor en servomotor? O mejor dicho ¿por qué se considera que algunos motores son servomotores y otros no? La respuesta no es demasiado complicada: un servomotor tiene integrado o adosado al menos un detector que permita conocer su posicionamiento y/o velocidad. A los detectores de posición se les llama «encoders».

Aclarado esto, pasaré a esos servos a los que se refieren en los sitios que dije antes. Hablo de los servos para radiocontrol de modelos, como los de marca Futaba, Hitec, etc. Se trata de elementos para control de posición de alerones, timón, dirección (en autos), alimentación de combustible, etc, para modelos a escala, que se han vuelto populares en robótica porque entre los disponibles en el comercio hay algunos bastante económicos, lo que los hace de más fácil acceso cuando se trata de la construcción de proyectos personales de robótica y automatización casera.

De estos servos de modelismo, comencemos con los servos que se conocen como «analógicos».

Servo RC

Servo analógico para modelismo

Estos servomotores se componen, en esencia, de un motor de corriente continua, un juego de engranajes para la reducción de velocidad, un potenciómetro ubicado sobre el eje de salida (que se usa para conocer la posición) y una plaqueta de circuito para el control.

Como una imagen vale más que mil palabras, veamos un despiece.


Si lo que se desea controlar es la posición de un servomecanismo, como en este caso, en lugar de un tacómetro (que es para medir velocidad) necesitamos un encoder de posición.

Si hablamos de un servo cuyo movimiento es giratorio, será necesario un encoder (un detector que codifica la posición) que nos dé un valor diferente a su salida según cual sea su posición en grados.

Los servos que se usan en modelismo son de este tipo. Como dije antes, por lo general poseen un motor de CC, que gira a velocidad alta, una serie de engranajes para producir la reducción de velocidad de giro y acrecentar su capacidad de torque, un potenciómetro conectado al eje de salida (que es ni más ni menos que el encoder) y un circuito de control de la realimentación.

Estos servos reciben señal por tres cables: alimentación para el motor y la pequeña plaqueta de circuito del control (a través de dos cables, positivo y negativo/masa), y una señal controladora que determina la posición que se requiere. La alimentación de estos servos es, normalmente, de entre 4,8 y 6 voltios.




El estándar de esta señal controladora para todos los servos de este tipo, elegido para facilitar el uso en radiocontrol, es un pulso de onda cuadrada de 1,5 milisegudos que se repite a un ritmo de entre 10 a 22 ms. Mientras el pulso se mantenga en ese ancho, el servo se ubicará en la posición central de su recorrido. Si el ancho de pulso disminuye, el servo se mueve de manera proporcional hacia un lado. Si el ancho de pulso aumenta, el servo gira hacia el otro lado. Generalmente el rango de giro de un servo de éstos cubre entre 90° y 180° de la circunferencia total, o un poco más, según la marca y modelo.

Señal y posiciones del servo

Servo digital para modelismo

Los servos digitales tienen, al igual que los analógicos, un motor de corriente continua, un juego de engranajes reductores, un potenciómetro para la realimentación de posición y una electrónica de control embebida dentro del servo. La diferencia está en la placa de control, en la que han agregado un microprocesador que se hace cargo de analizar la señal, procesarla y controlar el motor.

La diferencia más grande de rendimiento está en la velocidad a la que reacciona el servo a un cambio en la señal. En un mismo lapso, el servo digital puede recibir cinco o seis veces más pulsos de control que un analógico. Como resultado la respuesta del servo a un cambio en la orden de posición es mucho más veloz. Este ritmo mayor de pulsos también produce mejoras en el rendimiento electromecánico del motor (mayor velocidad y más fuerza). Esto se debe a que en cualquier servo (de ambos tipos) el motor recibe, para su control, una alimentación conmutada. En los servos analógicos, la señal está conmutada a un ritmo de entre 10 y 22 ms. Si el ajuste que se requiere es muy pequeño (un ángulo pequeño de giro), los pulsos son muy delgados y están muy separados (10 a 22 ms). La integración de estos pulsos es la que da la alimentación de potencia al motor, y en consecuencia la que lo hace mover. Una integración de pulsos delgados y muy separados puede dar resultados erráticos. Suele ocurrir que cuando llega el otro pulso, el motor se ha pasado de la posición y deba reajustarse, algo que ocurre constantemente. En los servos digitales la señal llega mucho más seguido y por esto la integración es más estable y la variación de corriente de control es más firme.

En los servos digitales, la señal está separada por unos 3,3 ms. La separación entre pulsos varía en cada marca de servo digital, pero el ritmo de llegada de los pulsos es de al menos 300 veces por segundo versus 50 a 100 en un analógico.

La ventaja de los digitales se reduce un poco cuando se habla de consumo (algo muy importante en, por ejemplo, un avión radiocontrolado, pero también en los robots), ya que el consumo del circuito y de los ajustes más continuados produce un gasto mayor de energía, y también un mayor desgaste del motor.

Los servos digitales son capaces de memorizar parámetros de programación, que varían de acuerdo a cada fabricante pero en general son:

  • 1 – Se puede programar el sentido de giro como «normal» o «inverso».
  • 2 – Se puede variar la velocidad de respuesta del servo.
  • 3 – Se puede programar una posición central (o posición neutra) diferente, sin afectar los radios de giro.
  • 4 – Se pueden determinar diferentes topes de recorrido para cada lado.
  • 5 – Es posible programar qué debe hacer el servo en caso de sufrir una pérdida de señal.
  • 6 – Es posible programar la resolución, es decir cuánto se mueve el control en el radio sin obtener un movimiento en el servo.

Estos valores pueden ser fijados en los servos utilizando aparatos destinados a la programación, que son específicos para cada marca.


Manejo de potencia para motores con el integrado L293D

El integrado L293D incluye cuatro circuitos para manejar cargas de potencia media, en especial pequeños motores y cargas inductivas, con la capacidad de controlar corriente hasta 600 mA en cada circuito y una tensión entre 4,5 V a 36 V.

L293D

Los circuitos individuales se pueden usar de manera independiente para controlar cargas de todo tipo y, en el caso de ser motores, manejar un único sentido de giro. Pero además, cualquiera de estos cuatro circuitos sirve para configurar la mitad de un puente H.

El integrado permite formar, entonces, dos puentes H completos, con los que se puede realizar el manejo de dos motores. En este caso el manejo será bidireccional, con frenado rápido y con posibilidad de implementar fácilmente el control de velocidad.

Diagrama detallado del circuito interno

Diagrama simplificado

Las salidas tienen un diseño que permite el manejo directo de cargas inductivas tales como relés, solenoides, motores de corriente continua y motores por pasos, ya que incorpora internamente los diodos de protección de contracorriente para cargas inductivas.

Las entradas son compatibles con niveles de lógica TTL. Para lograr esto, incluso cuando se manejen motores de voltajes no compatibles con los niveles TTL, el chip tiene patas de alimentación separadas para la lógica (VCC1, que debe ser de 5V), y para la alimentación de la carga (VCC2, que puede ser entre 4,5V y 36V).

Las salidas poseen un circuito de manejo en configuración «totem-pole» (término en inglés que se traduce como «poste de tótem», nombre que, gráficamente, nos remite a un «apilamiento» de transistores, como las figuras en los famosos totems indígenas).

En esta estructura, unos transistores en configuración Darlington conducen la pata de salida a tierra y otro par de transistores en conexión seudo Darlington aporta la corriente de alimentación desde VCC2. Las salidas tienen diodos incorporados en el interior del chip para proteger al circuito de manejo de potencia de las contracorrientes de una carga inductiva.

Estos circuitos de salida se pueden habilitar en pares por medio de una señal TTL. Los circuitos de manejo de potencia 1 y 2 se habilitan con la señal 1,2EN y los circuitos 3 y 4 con la señal 3,4EN.

Las entradas de habilitación permiten controlar con facilidad el circuito, lo que facilita la regulación de velocidad de los motores por medio de una modulación de ancho de pulso. En ese caso, las señales de habilitación en lugar de ser estáticas se controlarían por medio de pulsos de ancho variable.




Las salidas actúan cuando su correspondiente señal de habilitación está en alto. En estas condiciones, las salidas están activas y su nivel varía en relación con las entradas. Cuando la señal de habilitación del par de circuitos de manejo está en bajo, las salidas están desconectadas y en un estado de alta impedancia.

Conexionado para un motor con giro en ambos sentidos (lado izquierdo) y con motores con giro en sentido único en dos salidas (lado derecho)


Por medio de un control apropiado de las señales de entrada y conectando el motor a sendas salidas de potencia, cada par de circuito de manejo de potencia conforma un puente H completo, como se ve en el diagrama de arriba, lado izquierdo. En la tabla de funcionamiento que sigue se puede observar los niveles TTL que corresponden a cada situación de trabajo:

Ejemplo de circuito en forma de puente H (para control bidireccional del motor) y su tabla de manejo

Disipador

Las patas centrales de la cápsula del chip están pensadas para proveer el contacto térmico con un dispador que permitirá lograr la potencia máxima en el manejo del integrado. En la figuras que siguen se observa la distribución de pines afectados a esta disipación, el área de cobre que se deja en el circuito impreso por debajo y a los lados del chip, y el diseño del disipador que propone el fabricante. La hoja de datos aporta una curva que permite una variación de estos tamaños según la potencia a manejar.

Shield de Arduino

Esta plaqueta posee dos L293D, o sea que permite controlar 4 motores de CC o dos motores paso a paso. Tiene aparte otras salidas.

Diagrama de la placa

Utiliza estos pines en el Arduino UNO:

Digital 4 – DIR_CLK
Digital 7 – DIR_EN
Digital 8 – DIR_SER
Digital 12 – DIR_LATCH
Digital 11 – PWM_Motor1
Digital 3 – PWM_Motor2
Digital 6 – PWM_Motor3
Digital 5 – PWM_Motor4
Digital 9 – Servo_1
Digital 10 – Servo_2

Descargamos ahora una librería de Adafruit para manejar el Shield directamente, ya que si no el manejo podría resultar bastante complicado.

La librería que necesitamos es esta adafruit-Adafruit-Motor-Shield-library-8119eec, y para instalarla seguimos el procedimiento habitual.

Para iniciar la plaqueta, necesitamos incluir este par de instrucciones:

La primera línea incluye la librería de AdaFruit en el programa. La segunda crea una instancia de un motor conectado a la puerta M1. La inicialización se define con el parámetro que le pasamos, que puede ir del 1 = M1 al 4 = M4.

Para establecer la velocidad del motor:

La primera línea define la velocidad el motor a 200. El valor 255 sería el máximo de RPM. La segunda línea indica que deseaemos dejar el motor en punto muerto.

Para que el motor avance usamos:

Y para que retroceda:

Es todo lo necesario para controlar un motor.

Si queremos hacer un primer programa sencillo que haga avanzar el motor unos segundos y después retroceda, he aquí el programa:

En caso de querer controlar cuatro motores:

Enlaces: L293D, Hoja de datos – Quadruple Half-H Drivers

Artículos relacionados:
Uso de la placa L298N para motores de CC
Puente H: Placa controladora de motores L9110S
Guía rápida de placas de control de motores
Manejo de potencia para motores con el integrado L293D
Control de motores de CC por Ancho de Pulso (PWM)


¿Un FPGA en un Arduino?

Arduino anunció recientemente una nueva línea de productos, y uno de ellos, el MKR Vidor 4000, incluye un FPGA. ¿Qué harán los diseñadores con el poder de un FPGA en sus manos?

Un FPGA en un Arduino

Arduino es una popular herramienta de creación de prototipos por varias razones. En primer lugar, no requiere un programador voluminoso y caro (como los chips PIC) y se puede programar a través de USB. En segundo lugar, las placas Arduino son de código abierto y, debido a esto, hay muchos fabricantes de placas Arduino que ofrecen precios competitivos. En tercer lugar, los Arduinos son famosos por su robusto entorno de shields y soporte de bibliotecas, lo que hace que el uso de dispositivos complejos como los chips de Ethernet sea cosa fácil.

A medida que progresó la tecnología, también lo hizo el Arduino. En el lanzamiento de las nuevas placas Arduino se reflejan muchas tendencias de la industria. Por ejemplo, la introducción del Arduino Yun agregó capacidades de Wi-Fi, y el Arduino Duo marcó el comienzo con procesadores más potentes. La miniaturización se concretó con el Arduino Nano, y con el LilyPad se introdujo la electrónica portátil. Pero todas estas mejoras involucran hardware especializado que realiza tareas únicas, como comunicaciones por RF o bajo consumo de energía.

Ahora que los FPGA se están volviendo más baratos y más accesibles, Arduino está a punto de lanzar un Arduino con un FPGA incorporado, el MKR Vidor 4000. La parte «MKR» de su nombre se pronuncia como “Maker” («Creador»), y Massimo Banzi, cofundador de Arduino, se refiere a él como una placa de «factor de forma de creador». Esto no es sorprendente, ya que generalmente se acepta que Arduino está diseñado para creadores, y no es de especial interés para los profesionales de ingeniería electrónica.

El FPGA

El FPGA incluido es un Intel Cyclone 10CL016, y el sitio web de Arduino afirma que el FPGA contiene 16.000 elementos lógicos, 504 Kb de RAM, 56 multiplicadores 18×18 de hardware para aplicaciones DSP de alta velocidad, etc. El sitio web también establece que los pines FPGA pueden dar salidas de hasta 150MHz, y que también pueden configurarse como puertos de comunicaciones comunes como UART, I2C y SPI. Si es cierto, este complemento FPGA podría ser extremadamente útil para los diseñadores que desean crear sistemas digitales de alta velocidad que necesitan capturar datos y procesarlos rápidamente (como los procesadores de señales digitales).

Sin embargo, ¿cuántos aficionados realmente necesitan usar un FPGA?

¿Cómo ayudará esto a los diseñadores?

El acceso a un FPGA permite que los diseñadores creen circuitos personalizados para conectarse al Arduino, lo que puede eliminar la necesidad de circuitos externos. También permite cargarle las funciones de E/S del Arduino al FPGA, pero conlleva el costo de requerir una línea de comunicación entre el FPGA y el Arduino (a menos que el FPGA y la CPU estén integrados en el mismo paquete, en cuyo caso los dos pueden tener líneas de E/S especiales para su comunicación).

Los FPGA, sin embargo, son dispositivos complejos y, a menudo, se programan en lenguajes como HDL y Verilog, que no son aptos para personas no muy arriesgadas. Si bien Arduino anunció que están diseñando un sistema de compilación basado en la nube que facilitará el uso del FPGA, esto aún está por verse. La mayoría de las veces que un sistema se hace más fácil de usar, sacrifica su poder, capacidad y control. Dicho esto, el Vidor 4000 podría ser una herramienta educativa invaluable para aquellos que desean comenzar con FPGA.

¿Más al estilo pi?

El Vidor 4000 no solo cuenta con la inclusión de un FPGA; también tiene varios dispositivos de E/S que lo hacen parecer más a un Pi que a un Arduino.

El Vidor 4000 incluye también un módulo Wi-Fi Nina W102, un chip criptográfico ECC508, un conector micro HDMI, un conector MIPI para cámara y un conector rápido MiniPCI con hasta 25 pines programables por el usuario. Estas características, especialmente el Wi-Fi incorporado, crean una plataforma de IoT potencialmente popular que puede realizar tareas increíblemente complejas. Con el chip criptográfico incorporado, la verificación SSL y HTTPS se convertirán en una tarea trivial y ayudarán a descargar las tareas de seguridad del microcontrolador principal.

Si bien este dispositivo no será tan poderoso como un Raspberry Pi, definitivamente es más pequeño y está más enfocado en el hardware, algo en lo que la Pi se queda atrás.

Placas competidoras para creadores con FPGA

El Vidor 4000, obviamente, no es la primera placa en salir con capacidades FPGA, pero tampoco es la primera construida teniendo en cuenta la compatibilidad con Arduino. Otro producto ya en el mercado, XLR8, es una tarjeta de desarrollo compatible con Arduino que está basada en FPGA, incluye un microcontrolador integrado de instrucción AVR de 8 bits y es programable a través del IDE de Arduino.

El XLR8 está preconfigurado con «bloques xcelerator», que son bloques que están especialmente diseñados para manejar tareas específicas. Los bloques con los que viene preinstalada la unidad incluyen un bloque matemático de punto flotante, un servocontrol, un controlador NeoPixel y un ADC mejorado.

La integración de los FPGA en un proyecto Arduino sin duda creará una nueva ola de proyectos e ideas que podrán construir los aficionados, pero los FPGA son dispositivos complejos. Sin embargo, los usuarios de Arduino pueden comenzar a diseñar su propio hardware desde cero y los FPGA incluidos en los microcontroladores pueden cambiar la forma en que se construyen los circuitos.

La nueva placa MKR Vidor 4000 lleva la complejidad de los FPGA a los que no son ingenieros electrónicos.




Descripción y funcionamiento del Bus I2C

Introducción

DEFINICIÓN DE I2C (I2C): Abreviatura de Inter-IC (inter integrated circuits), un tipo de bus diseñado por Philips Semiconductors a principios de los 80s, que se utiliza para conectar circuitos integrados (ICs). El I2C es un bus con múltiples maestros, lo que significa que se pueden conectar varios chips al mismo bus y que todos ellos pueden actuar como maestro, sólo con iniciar la transferencia de datos. Este bus se utiliza dentro de una misma placa de un dispositivo.

El bus I2C, un estándar que facilita la comunicación entre microcontroladores, memorias y otros dispositivos con cierto nivel de «inteligencia», sólo requiere de dos líneas de señal y un común o masa. Fue diseñado a este efecto por Philips y permite el intercambio de información entre muchos dispositivos a una velocidad aceptable, de unos 100 Kbits por segundo, aunque hay casos especiales en los que el reloj llega hasta los 3,4 MHz.

La metodología de comunicación de datos del bus I2C es en serie y sincrónica. Una de las señales del bus marca el tiempo (pulsos de reloj) y la otra se utiliza para intercambiar datos.

Descripción de las señales

  • SCL (System Clock) es la línea de los pulsos de reloj que sincronizan el sistema.
  • SDA (System Data) es la línea por la que se mueven los datos entre los dispositivos.
  • GND (Masa) común de la interconexión entre todos los dispositivos «enganchados» al bus.

Las líneas SDA y SCL son del tipo drenaje abierto, es decir, un estado similar al de colector abierto, pero asociadas a un transistor de efecto de campo (o FET). Se deben polarizar en estado alto (conectando a la alimentación por medio de resistores «pull-up») lo que define una estructura de bus que permite conectar en paralelo múltiples entradas y salidas.

El diagrama es suficientemente autoexplicativo. Las dos líneas del bus están en un nivel lógico alto cuando están inactivas. En principio, el número de dispositivos que se puede conectar al bus no tiene límites, aunque hay que observar que la capacidad máxima sumada de todos los dispositivos no supere los 400 pF. El valor de los resistores de polarización no es muy crítico, y puede ir desde 1K8 (1.800 ohms) a 47K (47.000 ohms). Un valor menor de resistencia incrementa el consumo de los integrados pero disminuye la sensibilidad al ruido y mejora el tiempo de los flancos de subida y bajada de las señales. Los valores más comunes en uso son entre 1K8 y 10K.

Protocolo de comunicación del bus I2C

Habiendo varios dispositivos conectados sobre el bus, es lógico que para establecer una comunicación a través de él se deba respetar un protocolo. Digamos, en primer lugar, lo más importante: existen dispositivos maestros y dispositivos esclavos. Sólo los dispositivos maestros pueden iniciar una comunicación.

La condición inicial, de bus libre, es cuando ambas señales están en estado lógico alto. En este estado cualquier dispositivo maestro puede ocuparlo, estableciendo la condición de inicio (start). Esta condición se presenta cuando un dispositivo maestro pone en estado bajo la línea de datos (SDA), pero dejando en alto la línea de reloj (SCL).

El primer byte que se transmite luego de la condición de inicio contiene siete bits que componen la dirección del dispositivo que se desea seleccionar, y un octavo bit que corresponde a la operación que se quiere realizar con él (lectura o escritura).

Si el dispositivo cuya dirección corresponde a la que se indica en los siete bits (A0-A6) está presente en el bus, éste contesta con un bit en bajo, ubicado inmediatamente luego del octavo bit que ha enviado el dispositivo maestro. Este bit de reconocimiento (ACK) en bajo le indica al dispositivo maestro que el esclavo reconoce la solicitud y está en condiciones de comunicarse. Aquí la comunicación se establece en firme y comienza el intercambio de información entre los dispositivos.

Si el bit de lectura/escritura (R/W) fue puesto en esta comunicación a nivel lógico bajo (escritura), el dispositivo maestro envía datos al dispositivo esclavo. Esto se mantiene mientras continúe recibiendo señales de reconocimiento, y el contacto concluye cuando se hayan transmitido todos los datos.

En el caso contrario, cuando el bit de lectura/escritura estaba a nivel lógico alto (lectura), el dispositivo maestro genera pulsos de reloj para que el dispositivo esclavo pueda enviar los datos. Luego de cada byte recibido el dispositivo maestro (quien está recibiendo los datos) genera un pulso de reconocimiento.

El dispositivo maestro puede dejar libre el bus generando una condición de parada (o detención; stop en inglés).

Si se desea seguir transmitiendo, el dispositivo maestro puede generar otra condición de inicio en lugar de una condición de parada. Esta nueva condición de inicio se denomina «inicio reiterado» y se puede emplear para direccionar un dispositivo esclavo diferente o para alterar el estado del bit de lectura/escritura.

Definición de términos:

  • Maestro (Master): Dispositivo que determina los tiempos y la dirección del tráfico en el bus. Es el único que aplica los pulsos de reloj en la línea SCL. Cuando se conectan varios dispositivos maestros a un mismo bus la configuración obtenida se denomina «multi-maestro».
  • Esclavo (Slave): Todo dispositivo conectado al bus que no tiene la capacidad de generar pulsos de reloj. Los dispositivos esclavos reciben señales de comando y de reloj generados desde el maestro.
  • Bus libre (Bus Free): Estado en el que ambas líneas (SDA y SCL) están inactivas, presentando un estado lógico alto. Es el único momento en que un dispositivo maestro puede comenzar a hacer uso del bus.
  • Comienzo (Start): Se produce cuando un dispositivo maestro ocupa el bus, generando la condición. La línea de datos (SDA) toma un estado bajo mientras que la línea de reloj (SCL) permanece alta.
  • Parada (Stop): Un dispositivo maestro puede generar esta condición, dejando libre el bus. La línea de datos y la de reloj toman un estado lógico alto.
  • Dato válido (Valid Data): Situación presente cuando un dato presente en la línea SDA es estable al tiempo que la línea SCL está a nivel lógico alto.
  • Formato de Datos (Data Format): La transmisión de un dato a través de este bus consiste de 8 bits de dato (1 byte). A cada byte transmitido al bus le sigue un noveno pulso de reloj durante el cual el dispositivo receptor del byte debe generar un pulso de reconocimiento.
  • Reconocimiento (Acknowledge): El pulso de reconocimiento, conocido como ACK (del inglés Acknowledge), se logra colocando la línea de datos a un nivel lógico bajo durante el transcurso del noveno pulso de reloj.
  • Dirección (Address): Todo dispositivo diseñado para funcionar en este bus posee su propia y única dirección de acceso, preestablecida por el fabricante. Hay dispositivos que permiten definir externamente parte de la dirección de acceso, lo que habilita que se pueda conectar en un mismo bus un conjunto de dispositivos del mismo tipo, sin problemas de identificación. La dirección 00 es la denominada «de acceso general»; a ésta responden todos los dispositivos conectados al bus.
  • Lectura/Escritura (Bit R/W): Cada dispositivo tiene una dirección de 7 bits. El octavo bit (el menos significativo) que se envía durante la operación de direccionamiento, completando el byte, indica el tipo de operación a realizar. Si este bit es alto el dispositivo maestro lee información proveniente de un dispositivo esclavo. Si este bit es bajo, el dispositivo maestro escribe información en un dispositivo esclavo.

La comunicación en más detalle

Cuando el dispositivo maestro quiere comunicarse con un esclavo, produce una secuencia de inicio en el bus. La secuencia de inicio es una de las dos secuencias especiales que se han definido en el bus I2C; la otra es la secuencia de parada. Las secuencias de inicio y la de parada son especiales porque son los dos únicos casos en que se permite que la línea de datos (SDA) cambie cuando la línea de reloj (SCL) está alta. Cuando se están transmitiendo datos, la línea SDA debe permanecer estable, y jamás cambiar, mientras la línea SCL está alta. Las secuencias de inicio y de parada señalan el comienzo y el final de una transacción con los dispositivos esclavos.

Los datos se transfieren en secuencias de 8 bits. Estos bits se colocan en la línea SDA comenzando por el bit de más peso (o más significativo). Una vez puesto un bit en SDA, se lleva la línea SCL a alto. Debemos recordar que el chip no puede llevar la línea a un estado alto, en realidad, lo que hace es «soltarla», y el que la pone en nivel lógico alto es el resistor de polarización. Por cada 8 bits que se transfieren, el dispositivo que recibe el dato envía de regreso un bit de reconocimiento, de modo que en realidad por cada byte de dato se producen 9 pulsos sobre la línea SCL (es decir, 9 pulsos de reloj por cada 8 bits de dato). Si el dispositivo que recibe envía un bit de reconocimiento bajo, indica que ha recibido el dato y que está listo para aceptar otro byte. Si retorna un alto, lo que indica es que no puede recibir más datos y el dispositivo maestro debería terminar la transferencia enviando una secuencia de parada.

Direccionamiento de dispositivos en el bus I2C

Lo más común en los dispositivos para el bus I2C es que utilicen direcciones de 7 bits, aunque existen dispositivos de 10 bits. Este último caso es raro.

Una dirección de 7 bits implica que se pueden poner hasta 128 dispositivos sobre un bus I2C, ya que un número de 7 bits puede ir desde 0 a 127. Cuando se envían las direcciones de 7 bit, de cualquier modo la transmisión es de 8 bits. El bit extra se utiliza para informarle al dispositivo esclavo si el dispositivo maestro va a escribir o va a leer datos desde él. Si el bit de lectura/escritura (R/W) es cero, el dispositivo maestro está escribiendo en el esclavo. Si el bit es 1 el maestro está leyendo desde el esclavo. La dirección de 7 bit se coloca en los 7 bist más significativos del byte y el bit de lectura/escritura es el bit menos significativo.

El hecho de colocar la dirección de 7 bits en los 7 bits más significativos del byte produce confusiones entre quienes comienzan a trabajar con este bus. Si, por ejemplo, se desea escribir en la dirección 21 (hexadecimal), en realidad se debe enviar un 42, que es un 21 desplazado un bit hacia arriba. También se pueden tomar las direcciones del bus I2C como direcciones de 8 bit, en las que las pares son de sólo escritura y las impares son de sólo lectura. Para dar un ejemplo, el integrado de brújula magnética CMPS03 es fijado en fábrica en la dirección 0xC0 ($C0). La dirección 0xC0 se utiliza para escribir en él y la dirección 0xC1 es para leer de él.

Protocolo de programación para el bus I2C

Lo primero que ocurre en un bus I2C es que el dispositivo maestro envía una secuencia de inicio. Esto alerta a los dispositivos esclavos, poniéndolos a la espera de una transacción. Éstos quedan atentos para ver si se trata de una solicitud para ellos. A continuación el dispositivo maestro envía la dirección de dispositivo. El dispositivo esclavo que posee esa dirección continuará con la transacción, y los otros ignorarán el resto de los intercambios, esperando la próxima secuencia de inicio.

Habiendo direccionado ya el dispositivo esclavo, lo que debe hacer ahora el maestro es enviar la ubicación interna o número de registro desde el que desea leer o al que va a escribir. La cantidad depende, obviamente, de qué dispositivo es y de cuántos registros internos posee. Algunos dispositivos muy simples no tienen ninguno, pero la mayoría sí los poseen.

Siguiendo con el ejemplo del CMPS03, éste posee 16 ubicaciones internas, numeradas desde el 0 al 15. Otro dispositivo, el medidor ultrasónico de distancia SRF08, tiene 36 registros.

Una vez que el maestro ha enviado la dirección del dispositivo en el bus I2C y la dirección del registro interno del dispositivo, puede enviar ahora el byte o bytes de datos. El dispositivo maestro puede seguir enviando bytes al esclavo, que normalmente serán puestos en registros con direcciones sucesivas, ya que el esclavo incrementa automáticamente la dirección del registro interno después de recibir cada byte. Cuando el maestro ha terminado de escribir datos en el esclavo, envía una secuencia de parada que concluye la transacción.

Escritura en un dispositivo esclavo:

  • 1. Enviar una secuencia de inicio
  • 2. Enviar la dirección de dispositivo con el bit de lectura/escritura en bajo
  • 3. Enviar el número de registro interno en el que se desea escribir
  • 4. Enviar el byte de dato
  • 5. [Opcionalmente, enviar más bytes de dato]
  • 6. Enviar la secuencia de parada

Como ejemplo, veamos un SRF08, que tiene una dirección de bus fijada en fábrica de 0xE0. Para comenzar una medición de distancia con el SRF08 se debe escribir 0x51 en el registro de comando, ubicado en la dirección interna 0x00. La secuencia es la que sigue:

  • 1. Enviar una secuencia de inicio
  • 2. Enviar 0xE0 (La dirección de dispositivo del SRF08 con el bit de lectura/escritura en bajo)
  • 3. Enviar 0x00 (dirección interna del registro de comando)
  • 4. Enviar 0x51 (el comando para comenzar la medición del SRF08)
  • 5. Enviar la secuencia de parada

Lectura desde un dispositivo esclavo:

Esta operación es algo más complicada, pero no demasiado. Antes de leer datos desde el dispositivo esclavo, primero se le debe informar desde cuál de sus direcciones internas se va a leer. De manera que una lectura desde un dispositivo esclavo en realidad comienza con una operación de escritura en él. Es igual a cuando se desea escribir en él: Se envía la secuencia de inicio, la dirección de dispositivo con el bit de lectura/escritura en bajo y el registro interno desde el que se desea leer. Ahora se envía otra secuencia de inicio nuevamente con la dirección de dispositivo, pero esta vez con el bit de lectura/escritura en alto. Luego se leen todos los bytes necesarios y se termina la transacción con una secuencia de parada.

Volviendo al ejemplo del módulo de brújula CMPS03, veamos cómo se lee el registro de ángulo:

  • 1. Enviar una secuencia de inicio
  • 2. Enviar 0xC0 (La dirección de dispositivo del CMPS03 con el bit de lectura/escritura en bajo)
  • 3. Enviar 0x01 (dirección interna del registro de ángulo en valor 0-255)
  • 4. Enviar una secuencia de inicio (inicio reiterado)
  • 5. Enviar 0xC1 (La dirección de dispositivo del CMPS03 con el bit de lectura/escritura en alto)
  • 6. Leer un byte de dato desde el CMPS03
  • 7. Enviar la secuencia de parada

La secuencia se verá así:


Un caso un poco más complicado

Esto es todo cuando se trata de comunicaciones simples, pero debemos considerar una posible complicación: Cuando el dispositivo maestro está leyendo desde el esclavo, quien pone los datos en la línea SDA del bus es el dispositivo esclavo, y el maestro es el que controla el pulso de reloj. ¿Qué pasa si el esclavo no está listo para enviar un dato? Con dispositivos como una EEPROMs esto no sería problema, pero si el dispositivo esclavo es un microprocesador, que tiene otras tareas que realizar, pueden surgir inconvenientes.

Para atender la transacción, el microprocesador debe pasar a una rutina de interrupción, guardar sus registros de trabajo, determinar qué dirección desea leer el dispositivo maestro, obtener el dato y ponerlo en su registro de transmisión. Esto puede llevar varios microsegundos, lo que implica que el dispositivo maestro podría estar enviando pulsos de reloj ciegamente por la línea SCL sin que el dispositivo esclavo pueda responderle. El protocolo I2C ofrece una solución para esto: el esclavo puede mantener la línea SCL en bajo. A esto se le llama estiramiento del reloj. Cuando el esclavo recibe el comando de lectura lo primero que hace es poner la línea de reloj en bajo. Entonces sí, obtiene el dato solicitado, lo pone en el registro de transmisión, y recién entonces libera la línea de reloj, que pasará de inmediato a alto debido al nivel que aporta el resistor de polarización.

Desde el punto de vista del dispositivo maestro, éste tratará de enviar el primer pulso de reloj para la lectura de datos liberando la línea SCL para que pase a alto, pero antes de continuar comprobará que ésta realmente haya ido al nivel lógico 1. Si la línea SCL permanece en bajo, el dispositivo maestro interpreta que el esclavo la mantiene así y espera a que SCL vaya a alto antes de continuar. Por suerte, la mayoría de los puertos I2C de los microprocesadores manejan esto de manera automática.

Sin embargo, a veces el manejo de I2C en el dispositivo maestro no está implementado por circuito, sino que es un juego de subrutinas que maneja dos líneas de un puerto. Algunas implementaciones ignoran este estiramiento del reloj. Estas soluciones trabajarán bien con dispositivos tales como las EEPROM, pero no podrán intercambiar datos correctamente con microprocesadores esclavos que utilizan el estiramiento del pulso de reloj. Como resultado, se obtendrán datos erróneos.

Especificaciones de Philips sobre el bus I2C (PDF)