Un vistazo al código QR

Ivrolan
Blog Robotech
Published in
7 min readSep 24, 2020
Photo by Markus Winkler on Unsplash

Un código QR (Quick Response) puede parecer un poco extraño a primera vista, como si se estuviera rompiendo nuestra pantalla porque un grupo de píxeles hubiera dejado de funcionar; simplemente parecen manchurrones negros que forman caos. Pero en ese aparente caos hay orden y significado, que puede ser decodificado por las cámaras de nuestros móviles, por ejemplo, para devolvernos la página web del restaurante asiático en el que vamos a comer.

¿Qué es? ¿Para qué sirve?

Podemos definir “código” como:

Sistema de símbolos y reglas que permite componer y descifrar un mensaje.

De esta manera, el código QR utiliza cuadrados blancos y negros (que son leídos luego por un ordenador como 0s y 1s) para representar información mediante unas reglas dadas. Con esto se pueden identificar productos al comprarlo, promocionar nuestra marca, dar nuestros datos de contacto en una tarjeta de visita…

Realmente, la información que podemos representar en un QR la podríamos escribir directamente con letras en un papel en vez de utilizar esos patrones tan raros. Siguen siendo representaciones de la misma información. Sin embargo, los lectores QR, como un smartphone, permiten recoger esta información mucho más rápido. Siguiendo con el ejemplo inicial de la web del restaurante asiático, tendrías que teclear letra por letra su URL (que no suelen ser cortas), mientras que leyendo el QR solo necesitas enfocar la cámara y confirmar que quieres acceder a la web. ¡Listo! Acabas de ganar un precioso tiempo que podrás invertir en otras cosas, como preguntarte si vas a atreverte a utilizar palillos o pedir un tenedor para no hacer el ridículo como la última vez.

Origen

Fue creado en 1994 por Masahiro Hara, trabajador para la empresa DENSO WAVE, en Japón, como una evolución del código de barras. DENSO WAVE manufacturaba vehículos y sus piezas, por lo que necesitaba una mejora en la identificación de cada producto para agilizar procesos.

El código diseñado por Masahiro se podía leer desde cualquier ángulo, gracias a 3 localizadores cuadrados en 3 esquinas con una proporción 1:1:3:1:1 (1 cuadradito negro:1 blanco:3 negros: 1 blanco:1 negro).

Con el paso del tiempo se ha ido perfeccionando y mejorando, en parte también porque no se patentó la idea desde el inicio y porque a la empresa le favorecía que la gente utilizara su nuevo código siempreque sigueran con los estándares. Se han creado nuevas versiones que pueden representar aún más información o que son más compactas y pequeñas (microQR). La versión 1 es de 21x21 cuadrados y puede representar 152 bits como mucho, mientras que la versión 40 es de 127x127 y puede llegar a los 23,648.

21x21, 25x25, 127x127 respectivamente, de Autopilot y Bobmath at Wikipedia

Estructura

Bobmath at Wikipedia

En verde está marcado una zona que tiene que estar en blanco para evitar que el entorno del código pueda afectar a su lectura.

En 3 esquinas se colocan los localizadores de posición y orientación. Uniendo estos localizadores están unas líneas de puntos (las líneas que no están en gris) y que sirven de guía al lector QR para saber si la columna o fila que está leyendo es par o impar. Además, si es una versión grande se añaden pequeños cuadrados entre la información del QR para ayudar al alineamiento y evitar distorsiones.

En azul, al lado de los localizadores de las esquinas superior-derecha e inferior-izquierda, información sobre la versión del QR (si la versión es igual o mayor a 7).

En rojo, en los lados restantes, información sobre el formato, la máscara que se ha utilizado y el nivel de corrección de errores.

Finalmente, en gris los bloques de datos y de corrección de errores después de aplicarse la máscara.

Creando un código QR

1 - Codificar los datos:

Para incluir los datos tienen que estar codificados como 0s y 1s para poder incluirlos como cuadrados blancos o negros en el QR. Dependiendo de los datos se usará una codificación u otra:

  • Codificación numérica: si los datos que queremos representar son sólo números. Por ejemplo: 8675, para la versión 1 (puede variar dependiendo de la versión) dividimos el número en grupos de 3 empezando por la izquierda. Convertimos los grupos de 3 en 10 bits, los de 2 en 7 bits y los de 1 en 4 bits.

867 = 512 +256 +64 +32 +2 +1 = 2⁹ + 2⁸ + 2⁶ + 2⁵ + 2¹ + 2⁰

=> 1101100011

5 => 0101

  • Codificación alfanumérica: si nuestros datos son letras en mayúsculas, números y algunos caracteres especiales (tabla alfanumérica)
  • Codificación por bytes: además de los anteriores, admite letras en minúscula y otros caracteres. Cada caracter es representado por 8 bits (1 byte) según ISO-8859–1, que añade caracteres a los que ya se codificaban mediante ASCII. Por ejemplo, para codificar la letra ‘h’, en la tabla ASCII indica que está representada por el número 104 en decimal, 68 en hexadecimal y 0110 1000 en binario.
  • Codificación para kanjis: al ser creado en Japón también tiene soporte para estos caracteres especiales mediante 16 bits gracias a Shift JIS.

Aún así antes de incorporar estas ristras de 0 y 1 hay que manipularlas un poco para que se adapten al formato y añadir 4 bits para indicar el modo de codificación y 9 bits para indicar la longitud total de bits a leer.

Para más información: QR data encoding

2 - Codificación para la corrección de errores

Es posible que al leer el código haya partes que no puedan ser descifradas correctamente. Para recuperar esa información perdida se utiliza la corrección de errores Reed-Solomon. Se dividen los datos en grupos de bits llamados palabras y se añaden más palabras que servirán de pista para encontrar y “reparar” las partes dañadas.

Esta capacidad de correción varía:

  • Nivel L: el más pequeño, recupera como máximo un 7% del mensaje.
  • Nivel M: un 15%, el más utilizado.
  • Nivel Q: un 25%.
  • Nivel L: hasta un 30%, opción ideal para entornos en los que QR se vaya a ensuciar con facilidad, como en fábricas

Hay que tener en cuenta que a mayor nivel de recuperación, más palabras vamos a necesitar para la corrección y menos espacio quedará para transmitir el mensaje.

Gracias a esta corrección se pueden crear QR con logos o diseños encima sin influir en el mensaje que se obtiene, ya que, aunque tapan parte de la información, ésta se puede recuperar.

3 - Colocar la información en el QR

Toda la información que hemos codificado en los pasos anteriores se incorpora al QR de esta forma:

Bobmath at Wikipedia

Se empieza por la esquina inferior-derecha y se van colocando los bits en zigzag. En este ejemplo, primero se colocan las palabras de información y luego las de corrección de errores, aunque también se pueden intercalar.

4 - Aplicar la mejor máscara

¿No te has preguntado por qué todos los QR se parecen tanto? ¿Por qué no hay algunos con muchos espacios en blanco o muchos espacios en negro?

Esto es debido a las máscara. Básicamente, una máscara es una modificación de los datos mediante un patrón. El objetivo es evitar que se formen patrones difíciles de leer por el lector o en los que haya que usar una cantidad variable de tinta para producir los QR (unos con mucha tinta y otros con muy poca)

Bobmath at Wikipedia

Ejemplos de patrones de máscara.

Estas máscaras digamos que se superponen sobre los datos (solo sobre los datos del mensaje, no sobre la información de formato, versión, localizadores, alineamiento…), las casillas que coinciden con un cuadrado negro cambian su color (actúa como una XOR, 1+1 = 0, 1+0 =1, 0+1 =1, 0+0 = 0).

Se aplica el primer tipo de máscara y se calcula la puntuación de penalización en base a el porcentaje de cuadrados negros y blancos, si se forman grupos horizontales, verticales, cuadrados totalmente negros o blancos 2x2, 3x3… Luego se vuelve a calcular esta puntuación aplicando sólo el segundo tipo de máscara y así con el resto. La máscara que tenga la penalización más baja es la que finalmente se aplica. Por eso hay que especificar qué máscara se ha aplicado en la información de formato para decodificarlo.

Con todo esto dicho, la próxima vez que escanees uno de estos QR en un bar o restaurante recuerda todo lo que ha tenido que pasar para su creación y que te muestre tu comida favorita. Más abajo tienes enlaces para ampliar información por si te has quedado con ganas de más.

Referencias:

DENSO WAVE: QR code

What is a QR code and how does it work?

Project Nayuki: Creating a QR code step by step

QR code tutorial by Thonky

Wikipedia

Como curiosidad:

--

--