Introducción a programación de hardware con Arduino

Introducción a programación de hardware con Arduino

Una buena forma para que un principiante comience a programar con hardware es familiarizarse con Arduino, ya que es una plataforma de código abierto que cuenta con una comunidad muy activa, lo que facilita la creación rápida de prototipos de proyectos simples de robótica y de Internet de las Cosas (IOT). En este artículo hablaremos sobre esta plataforma, el lenguaje de programación y los comandos utilizados para leer información de sensores y enviar comandos a actuadores.

El proyecto Arduino surgió en 2005 como una herramienta creada por profesores del Ivrea Interaction Design Institute en Italia, para que los estudiantes pudieran prototipar proyectos de electrónica de forma rápida y sencilla. Al ser un proyecto abierto, rápidamente se hizo popular en todo el mundo, ya que cualquiera podía copiar el proyecto y distribuirlo simplemente cambiando el nombre, que es una marca registrada. Actualmente, las versiones UNO y NANO cuentan con un microcontrolador ATmega328 y la versión Mega cuenta con el microcontrolador ATmega2560, que tiene más capacidad.


Puertos Analógicos y Digitales

Arduino contará con varios puertos, como 5V y GND que proporcionarán energía a los componentes, puertos digitales que trabajarán con información binaria (0 y 1) y puertos analógicos que brindarán mayor flexibilidad. Tanto los puertos analógicos como los digitales se pueden configurar en el código para que actúen como entrada o salida de datos.

Las entradas se utilizan para recibir datos de sensores y detectar botones que se presionan, mientras que la salida se utiliza para controlar actuadores, como motores eléctricos que convierten la energía eléctrica en energía mecánica.

Para escribir el código utilizamos el IDE de Arduino. Este software ya cuenta con un compilador que convierte el lenguaje C++ en un archivo hexadecimal que se puede cargar en Arduino. Si Arduino está conectado a la computadora, pasa el código automáticamente, pero el archivo hexadecimal también se puede pasar a programas que simulan circuitos eléctricos y usan Arduino como Proteus. De esta forma, es posible probar diferentes componentes electrónicos sin conectar todo físicamente o, incluso, sin tener los componentes.

Por defecto, se llaman dos funciones: setup y loop. El código colocado en setup se va a ejecutar una vez que se inicie el microcontrolador y loop mantendrá la repetición después de la inicialización. Entonces, en setup podemos definir si un determinado puerto es entrada o salida y en loop podemos leer o cambiar su estado. Según el siguiente ejemplo, eso define un LED parpadeante.

int LED_PORT = 10;

void setup {
    pinMode(LED_PORT, OUTPUT);
}

void loop {
    digitalWrite(LED_PORT, HIGH);
    delay(500);
    digitalWrite(LED_PORT, LOW);
    delay(500);
}


En este ejemplo, la función pinMode define que el puerto 10 es de tipo output, es decir, la información va a salir de Arduino para ese puerto a fin de controlar el LED. La función digitalWrite sirve para cambiar el estado del puerto, que puede ser HIGH (abierto a vincular) o LOW (llama a desvincular).

Entre cambio de estado sumamos un delay de 500 milisegundos, tiempo que pasará el LED en cada estado antes del cambio. Hecho esto, antes de compilar el código es necesario seleccionar la placa para la cual se compilará el código, como se ilustra a continuación:


Si tienes Arduino conectado a la computadora, también debes seleccionar el puerto USB al que está conectado. Pero si estás probando en Proteus o en otro software de simulación, vas a archivo, luego a Preferencias y donde está el cuadro que dice mostrar mensajes de salida durante: seleccionas compilación.

Entonces, cuando se compila el código, la ubicación donde se guardó el hexadecimal compilado se mostrará en el terminal IDE de Arduino. Copia esta dirección y pégala en el software de simulación. En el caso de Proteus, simplemente haz doble clic en el Arduino y donde tengas un program file, pegas la dirección copiada:


Luego de realizar las conexiones eléctricas físicamente o en software, cargar el código y ejecutar, verás el LED parpadeando cada 500 milisegundos como programamos:


En internet es posible encontrar varios kits con placas genéricas compatibles con Arduino y que ya vienen con varios sensores, resistencias, LED y otros componentes electrónicos.

Pero incluso si ya tienes la placa y los componentes, es una buena idea buscar un software para simular primero el sistema en la computadora, ya que esto asegurará que al menos tu código esté funcionando y, si el sistema en la práctica no funciona, ahora puedes deducirlo: probablemente se trate de un problema de hardware, como un mal contacto o un componente quemado.

Otra función que tiene Arduino por defecto es digitalRead, la cual podemos utilizar para leer un puerto digital, como su nombre indica, conectado a un botón que nos indicará si se está pulsando o no. Podemos reescribir el código que creamos para que el LED solo se encienda cuando se presiona el botón, usando la función digitalRead así:

int LED_PORT = 10;
int BUTTON_PORT = 7;

void setup() {
  pinMode(LED_PORT, OUTPUT);
  pinMode(BUTTON_PORT, INPUT);
}

void loop() {
  if (digitalRead(BUTTON_PORT)) {
    digitalWrite(LED_PORT, HIGH);
  } else {
    digitalWrite(LED_PORT, LOW);
  }
}


Para el botón, definimos en setup que el pinMode va a ser de tipo input, entonces en loop utilizamos la función digitalRead para verificar si pasa energía en el puerto 7. Si hay corriente, el estado del puerto de LED va para HIGH, pero si no, el estado quedará como LOW. Para conectar el botón, basta conectar el 5V de Arduino en el GND con un botón y una resistencia conectados en serie. De esa forma, cuando el botón esté presionado, va a pasar corriente y, cuando no lo esté, no pasará. Basta crear una conexión entre el botón y la resistencia con el puerto 7 de Arduino para saber si está pasando corriente o no.



Así como los comandos digitalRead y digitalWrite, también hay comandos para leer y controlar componentes a través de los puertos analógicos, que son analogRead y analogWrite. Se pueden utilizar para recibir datos de un sensor o controlar el voltaje de salida para configurar la intensidad de la luz de un LED, respectivamente.

int sensorPin = A0;
int sensorValue = 0;

void setup() {
    Serial.begin(9600);
}

void loop() {
    sensorValue = analogRead(sensorPin);
    Serial.println(sensorValue);
    delay(1000);
}


El código anterior es un ejemplo para leer datos analógicos que provienen de un sensor, en el que usamos la función Serial.begin para comunicarse entre Arduino y la computadora para enviar los datos que están siendo capturados por el sensor y leídos por Arduino con la función analogRead, entonces estos datos se muestran en el Serial monitor del IDE al llamar la función Serial.println.

Comunicación Serial

Otra función que tiene Arduino es la Comunicación Serial, como se ilustra arriba, en la que es posible conectar dispositivos electrónicos para que intercambien datos entre sí. El nombre Serial significa que los datos se envían en serie, uno tras otro a través del mismo medio, ya sea un canal de comunicación inalámbrico o un solo cable. Existen diferentes protocolos de comunicación serie, los presentes en Arduino son UART, I2C y SPI.

La comunicación UART se hace a través de los pines Tx y Rx, el GND de los dos dispositivos son conectados y el Tx de uno es conectado al Rx del otro. UART, que en inglés significa Transmisión y Recepción Universal Asíncrona, es un protocolo que no utiliza clock para sincronizar los dispositivos. De esa forma, se comunicarán sin tener una orden. Un ejemplo que utiliza esa comunicación es el propio Arduino cuando se conecta con la computadora. La comunicación empleada es UART y un chip externo hace la conversión de esos datos para USB. Otro ejemplo es el módulo bluetooth.

I2C, que significa Inter Integrated Circuit, utiliza dos elementos, siendo uno clock y el otro los datos propiamente. Clock se representa por el pin SCL y los datos por el pin SDA. A diferencia de UART, en el cual los dispositivos pueden cambiar información al mismo tiempo, en I2C va a haber master y slave. El master envía los datos y después el slave responde. El beneficio de este protocolo es que es más rápido y permite conectar varios dispositivos al mismo tiempo, con múltiples masters y slaves.

SPI, que significa Interfaz Serial Periférica, funciona como una mezcla de UART e I2C. Posee el SCK que es el clock, el MOSI (Master Out, Slave In), el MISO (Master In, Slave Out) y el CS que es el chip select. Aquí es posible conectar múltiples slaves, pero solo un master. Los pines SCK, MOSI y MISO son compartidos entre todos, aunque es preciso tener un pin CS en el master para cada slave del sistema.

De las tres, la comunicación SPI es la más rápida, en segundo lugar I2C y por último UART, pero cabe mencionar que, a pesar de ser más rápida, la complejidad a la hora de implementarla también aumenta. Entonces la elección del bus dependerá del proyecto: si es solo una computadora comunicándose con un microcontrolador, podría ser el UART, pero si fuera necesario monitorear múltiples sensores, entonces lo ideal sería I2C.

Conclusión

En este artículo vimos un poco sobre el hardware, utilizando la placa Arduino. Es importante resaltar que la programación Arduino es una habilidad que cualquier persona puede aprender, independientemente de su nivel de conocimiento técnico, ya que fue diseñada precisamente para ayudar a los principiantes a crear prototipos rápidamente de proyectos de hardware y software. Entonces, con la ayuda de la comunidad activa de usuarios de Arduino y los recursos disponibles en línea, es posible llevar a cabo proyectos creativos y funcionales de una manera asequible.

Dicho esto, espero haber proporcionado una introducción clara y útil a la programación de hardware con Arduino. Ahora es el momento de poner en práctica lo aprendido y empezar a desarrollar tus propios proyectos. Recuerda siempre explorar y experimentar, ya que así surgen las mejores ideas y soluciones.

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.