La programación de Arduino es la programación de un microcontrolador. Esto era algo más de los ingenieros electrónicos, pero Arduino lo ha extendido a todo el público. Arduino ha socializado la tecnología.
Programar Arduino consiste en traducir a líneas de código las tareas automatizadas que queremos hacer leyendo de los sensores y en función de las condiciones del entorno programar la interacción con el mundo exterior mediante unos actuadores.
Arduino proporciona un entorno de programación sencillo y potente para programar, pero además incluye las herramientas necesarias para compilar el programa y “quemar” el programa ya compilado en la memoria flash del microcontrolador. Además el IDE nos ofrece un sistema de gestión de librerías y placas muy práctico. Como IDE es un software sencillo que carece de funciones avanzadas típicas de otros IDEs, pero suficiente para programar.
Estructura de un Sketch
Un programa de Arduino se denomina sketch o proyecto y tiene la extensión .ino. Importante: para que funcione el sketch, el nombre del fichero debe estar en un directorio con el mismo nombre que el sketch.
No es necesario que un sketch esté en un único fichero, pero si es imprescindible que todos los ficheros estén dentro del mismo directorio que el fichero principal.
void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: }
La estructura básica de un sketch de Arduino es bastante simple y se compone de al menos dos partes. Estas dos partes son obligatorios y encierran bloques que contienen declaraciones, estamentos o instrucciones.
- setup() – http://arduino.cc/en/Reference/Setup
- loop() – http://arduino.cc/en/Reference/Loop
Adicionalmente se puede incluir una introducción con los comentarios que describen el programa y la declaración de las variables y llamadas a librerías.
setup() es la parte encargada de recoger la configuración y loop() es la que contiene el programa que se ejecuta cíclicamente (de ahí el término loop –bucle-). Ambas funciones son necesarias para que el programa trabaje.
La estructura del sketch está definida en el siguiente enlace: http://arduino.cc/en/Tutorial/Sketch
Se puede resumir un sketch de Arduino en los siguientes diagramas de flujo:
Un ejemplo puede ser el diagrama de flujo de un sistema de arranque y parada de un motor DC:
Esquema de conexiones:
El código asociado a este diagrama se puede encontrar en https://github.com/jecrespo/Aprendiendo-Arduino-Proyectos/tree/master/Proyecto_02-Motor_DC_Controlado
Lenguaje de Programación Arduino
El lenguaje de programación de Arduino es C++. No es un C++ puro sino que es una adaptación que proveniente de avr-libc que provee de una librería de C de alta calidad para usar con GCC (compilador de C y C++) en los microcontroladores AVR de Atmel y muchas utilidades específicas para las MCU AVR de Atmel como avrdude: https://learn.sparkfun.com/tutorials/pocket-avr-programmer-hookup-guide/using-avrdude
Las herramientas necesarias para programar los microcontroladores AVR de Atmel son avr-binutils, avr-gcc y avr-libc y ya están incluidas en el IDE de Arduino, pero cuando compilamos y cargamos un sketch estamos usando estas herramientas.
Aunque se hable de que hay un lenguaje propio de programación de Arduino, no es cierto, la programación se hace en C++ pero Arduino ofrece una api o core que facilitan la programación de los pines de entrada y salida y de los puertos de comunicación, así como otras librerías para operaciones específicas. El propio IDE ya incluye estas librerías de forma automática y no es necesario declararlas expresamente. Otra diferencia frente a C++ standard es la estructuctura del programa que ya hemos visto anteriormente.
Toda la información para programar Arduino se encuentra en el reference de la web de Arduino: https://www.arduino.cc/en/Reference/HomePage y es la capa superior que ofrece Arduino para programar los microcontroladores de una forma sencilla y con un lenguaje de programación entendible fácilmente.
Un manual sencillo de entender para la programación es el “arduino programming notebook” de brian w. Evans. Puedes consultarlo o descargarlo desde:
- http://playground.arduino.cc/uploads/Main/arduino_notebook_v1-1.pdf
- Y su traducción: http://www.ardumania.es/wp-content/uploads/2011/10/Arduino_programing_notebook_ES.pdf
En contraposición al core de Arduino, es posible usar comandos estándar de C++ en la programación de Arduino siempre que estén incluidos en el avr libc:
- Reference: http://www.atmel.com/webdoc/AVRLibcReferenceManual/
- Módulos http://www.atmel.com/webdoc/AVRLibcReferenceManual/ch20.html
- Standard Library: http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__stdlib.html
Cuando compilamos y cargamos el programa en Arduino esto es lo que ocurre:
Además todo esto no solo es válido para las placas Arduino, sino para muchas otras placas y microcontroladores que usando el mismo lenguaje de programación tenemos soporte para compilarlo y transferir el código binario a la memoria flash del microcontrolador.
Un ejemplo de uso de funciones AVR que no dispone el entorno de Arduino es cuando queremos hacer delays muy pequeños. La función delayMircoseconds() puede hacer el delay más pequeño con el lenguaje de Arduino que es de 2 microsegundos.
Para delays menores es necesario usar ensamblador y en concreto la función ‘nop’ (no operation. Cada llamada a ‘nop’ ejecuta un ciclo de reloj que para 16 MHz es un retraso de 62,5 ns.
__asm__("nop\n\t"); __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
Otra característica propia de la programación de microcontroladores en C++ son el acceso a los elementos de HW mediante la lectura y escritura en los registros del microcontrolador.
Los registros son unas zonas concretas de la memoria RAM accesibles directamente desde la CPU o desde otros elementos del microcontrolador que permite hacer operaciones directas.
Cálculos de la velocidad de las operaciones en Arduino: http://forum.arduino.cc/index.php?topic=200585.0
Librerías
Las librerías son trozos de código hechos por terceros que usamos en nuestro sketch. Esto nos facilita mucho la programación y hace que nuestro programa sea más sencillo de hacer y de entender. En este curso no veremos como hacer o modificar una librería pero en este curso debemos ser capaces de buscar una librería, instalarla, aprender a usar cualquier librería y usarla en un sketch.
Las librerías normalmente incluyen los siguientes archivos comprimidos en un archivo ZIP o dentro de un directorio. Estas siempre contienen:
- Un archivo .cpp (código de C++)
- Un archivo .h o encabezado de C, que contiene las propiedades y métodos o funciones de la librería.
- Un archivo Keywords.txt, que contiene las palabras clave que se resaltan en el IDE (opcional).
- Muy posiblemente la librería incluye un archivo readme con información adicional de lo que hace y con instrucciones de como usarla.
- Directorio denominado examples con varios sketchs de ejemplo que nos ayudará a entender cómo usar la librería (opcional).
La instalación de librerías se puede hacer directamente desde el gestor de librerías o manualmente.
En el Arduino Playground también tenemos un listado mucho más amplio de librerías, ordenadas por categorías: http://playground.arduino.cc/Main/LibraryList
También tenemos información de como interactuar con diferente HW en http://playground.arduino.cc/Main/InterfacingWithHardware
Además de estas librerías “oficiales” que podemos obtener desde el gestor de librerías y las publicadas en el playground de Arduino, existen muchos desarrollos disponibles en Internet y los propios fabricantes de componentes HW publican las librerías para poder usarlo o incluso la propia comunidad de usuarios.
Ejemplo de librería: https://github.com/jecrespo/simpleNTP
Ejemplo de Programación
Como ejemplo del proceso de programación con Arduino es el contador de minutos para charlas hecho con una matriz 8×8 de leds tricolor: https://www.adafruit.com/product/1487
Este contador marca los minutos que llevas durante la charla y marca en bloque de 10 colores para indicar la finalización de cada capítulo de 10 minutos
Pasos:
- Leer caracteristicas del HW y como conectarlo: https://learn.adafruit.com/adafruit-neopixel-uberguide
- Elegir una librería para manejarlo: http://fastled.io/
- Instalar la librería: https://github.com/FastLED/FastLED
- Leer cómo manejar la librería: https://github.com/FastLED/FastLED/wiki/Basic-usage
- Escribir el código y publicarlo: https://github.com/jecrespo/Aprendiendo-Arduino/blob/master/Otros/Neopixel_contador/Neopixel_contador.ino
Computación Física
La computación física (physical computing) se refiere al diseño y construcción de sistemas físicos que usan una mezcla de software y hardware para medir e interactuar con el medio que le rodea.
La computación física significa la construcción de sistemas físicos interactivos mediante el uso de software y hardware que pueden detectar y responder al mundo analógico. En un sentido amplio, la computación física es un marco creativo para entender la relación de los seres humanos con el mundo digital. En el uso práctico, el término describe con mayor frecuencia proyectos artesanales, de diseño o de hobby que utilizan sensores y microcontroladores para traducir entradas analógicas a un sistema de software y controlar dispositivos electromecánicos tales como motores, servos, iluminación u otro hardware.
La computación física es un enfoque para aprender cómo los seres humanos se comunican a través de computadoras que comienza por considerar cómo los seres humanos se expresan físicamente. La interacción clásica con los ordenadores es a través de teclados, ratones, pantalla, altavoces, etc… y toda la programación se hace con esos límites. En el caso de la computación física, no existen esos límites sino los del ser humano que interactúa.
Programación en Tiempo Real (RTC)
En informática, la programación en tiempo real (RTC) o reactive computing describe sistemas de hardware y software sujetos a una «restricción en tiempo real», por ejemplo, un evento a una respuesta del sistema. Los programas en tiempo real deben garantizar la respuesta dentro de las limitaciones de tiempo especificadas. A menudo se entiende que las respuestas en tiempo real están en el orden de milisegundos, ya veces microsegundos. Un sistema no especificado como en tiempo real normalmente no puede garantizar una respuesta dentro de un periodo de tiempo, aunque pueden darse tiempos de respuesta reales o esperados.
Un sistema en tiempo real ha sido descrito como aquel que «controla un entorno recibiendo datos, procesándolos y devolviendo los resultados lo suficientemente rápido para afectar el entorno en ese momento». El término «tiempo real» se utiliza en el control de procesos y sistemas empresariales significa «sin demora significativa».
El software en tiempo real puede usar:
- lenguajes de programación síncronos (p.e. ADA https://es.wikipedia.org/wiki/Ada_(lenguaje_de_programaci%C3%B3n))
- sistemas operativos en tiempo real (RTOS)
Con Arduino hacemos una programación en tiempo real recibiendo continuamente datos de los sensores o de los puertos de comunicación, analizandolos y respondiendo al entorno mediante los actuadores o las comunicaciones en un tiempo muy rápido.
Los sistemas operativos en tiempo real (RTOS) son sistemas que responden a la entrada inmediatamente. Se utilizan para tareas tales como la navegación, en las que el ordenador debe reaccionar a un flujo constante de nueva información sin interrupción. La mayoría de los sistemas operativos de uso general no son en tiempo real porque pueden tardar unos segundos, o incluso minutos, en reaccionar.
Implementación de multitarea:
Existen sistemas operativos en tiempo real (RTOS) para Arduino como freeRTOS: http://www.freertos.org/
freeRTOS en Arduino: https://feilipu.me/2015/11/24/arduino_freertos/
Pingback: Saber Más Arduino Empresas | Aprendiendo Arduino
no se pueden conseguir links donde el idioma sea español, por fauda
vor ay
Me gustaLe gusta a 1 persona
Para empezar a programar usa este pdf en español http://www.ardumania.es/wp-content/uploads/2011/10/Arduino_programing_notebook_ES.pdf es muy bueno
Si necesitas algo en concreto que esté en español, mándame un correo a aprendiendoarduino@gmail.com
Me gustaMe gusta
Interesante post sobre Arduino. Si queréis seguir profundizando os recomiendo este post donde explican cuáles son los reductores idóneos para conectar con Arduino y qué elementos hay que tener en cuenta a la hora de elegir un motor o actuador: https://clr.es/blog/es/actuadores-arduino/
Me gustaLe gusta a 1 persona
quiero aprender a programar esta placa
Me gustaLe gusta a 1 persona
Puedes seguir este curso, te doy más detalles por correo.
Me gustaMe gusta
quiero seguir el curso para programar máquina herramienta (torno mecánico,taladro,fresadora, etc.)
Me gustaLe gusta a 1 persona
Excelente, es muy motivador ver explicaciones claras y muy detalladas como las que das aquí.
Me gustaLe gusta a 1 persona
excelente tutorial
Me gustaLe gusta a 1 persona
Muy interesante y bien explicado.
Me gustaLe gusta a 1 persona
Excelente post, explican muy bien y dan ganas de seguir aprendiendo
Me gustaLe gusta a 1 persona
excelente me ayudo en un proyecto de escuela
Me gustaLe gusta a 1 persona
Me interesa aprender a programar arduino
Me gustaLe gusta a 2 personas
// Práctica encender LED con botón pulsador y luego apagar LED con el mismo
//boton pulsador
const int LED =13;
const int BOTON = 7;
int val = 0; //val se emplea para almacenar el estado del boton
int state = 0; // 0 LED apagado, mientras que 1 encendido
int old_val = 0; // almacena el antiguo valor de val
void setup(){ // definir si la variable es de entrada // o salida.
pinMode(LED,OUTPUT); // establecer que el pin digital es una señal de salida
pinMode(BOTON,INPUT); // y BOTON como señal de entrada
}
void loop() { // loop = realice un lazo continuamente
val= digitalRead(BOTON); // lee el estado del Boton
if ((val == HIGH) && (old_val == LOW)){
state=1-state;
delay(10);
}
old_val = val; // valor del antiguo estado
if (state==1){
digitalWrite(LED, HIGH); // enciende el LED
}
else{
digitalWrite(LED,LOW); // apagar el LED
}
}
necesito modificarlo para que al pulsarlo tarde 5 segundos en encender y 5 segundos en apagarlo
Me gustaLe gusta a 1 persona
Me ha parecido muy interesante y muy bien explicado. Siempre he tenido interés por iniciarme y veo que puedo adentrarme para realizar mis propios proyectos. Lo que queria preguntar es si arduino y que placa serviría, si fuera el caso, para adaptar un LCD de los que venden en la actualidad a un sintetizador del cual ya no hay repuestos. Este sinte que en concreto es un Roland Juno G tiene un defecto de fabrica por el cual las pantallas fallan y hacen casi imposible su uso puesto que toda la informacion de configuracion y programación esta en la pantalla. Mi idea seria traducir el codigo que manda a la original para su uso en una que pudiera adquirir en la actualidad. La pantalla es un LCD de 240×96 puntos.
Gracias
Me gustaLe gusta a 1 persona
Proyecto muy interesante, para leer la información del sintetizador y “traducirla” para mandar a una pantalla con un arduino nano creo que sería suficiente.
Me gustaMe gusta
Pues seria de mucha ayuda. sabrias donde localizar info al respecto.
Gracias por tu respuesta
Me gustaLe gusta a 1 persona
Mándame un correo a aprendiendoarduino@gmail.com
Me gustaMe gusta
Gracias ya esta
Me gustaLe gusta a 1 persona
Pingback: Arduino ≫ What is it, how does it work, its uses and applications - Correo Total
25/11/21 enseñeme mas sobre arduino atentamente raul mendoza hernandez de 51 años soltero discacitado
Me gustaMe gusta
25/11/21 ayudenme a conprender las programasiones de arduino etc porque casi no se nada por fabor atentamente raul mendoza hernandez de 51 soltero discapacitado
Me gustaMe gusta
Pingback: Arduino: qué es, de qué manera marcha, usos y aplicaciones – Trucos App
Pingback: Arduino: qué es, cómo funciona, usos y aplicaciones - Novedades Tecnologia