Funciones básicas y operadores
Arduino esta basado en C y soporta todas las funciones del estándar C y algunas de C++. A continuación se muestra un resumen con todas la estructura del lenguaje Arduino:Sintaxis Básica
- Delimitadores: ;, {}
- Comentarios: //, /* */
- Cabeceras: #define, #include
- Operadores aritméticos: +, -, *, /, %
- Asignación: =
- Operadores de comparación: ==, !=, <, >, <=, >=
- Operadores Booleanos: &&, ||, !
- Operadores de acceso a punteros: *, &
- Operadores de bits: &, |, ^, ~, <<, >>
- Operadores compuestos:
- Incremento/decremento de variables: ++, --
- Asignación y operación: +=, -=, *=, /=, &=, |=
Estructuras de control
- Condicionales: if, if...else, switch case
- Bucles: for, while, do... while
- Bifurcaciones y saltos: break, continue, return, goto
Variables
En cuanto al tratamiento de las variables también comparte un gran parecido con el lenguaje C.Constantes
- HIGH / LOW: niveles alto y bajo en pines. Los niveles altos son aquellos de 3 voltios o más.
- INPUT / OUTPUT: entrada o salida
- true / false
Tipos de datos
- void, boolean, char, unsigned char, byte, int, unsigned int, word, long, unsigned long, float, double, string, array
Conversión entre tipos
Estas funciones reciben como argumento una variable de cualquier tipo y devuelven una variable convertida en el tipo deseado.- char(), byte(), int(), word(), long(), float()
Cualificadores y ámbito de las variables
- static, volatile, const
Utilidades
- sizeof()
Funciones Básicas
En cuanto a las funciones básicas del lenguaje nos encontramos con las siguientes:E/S Digital
- pinMode(pin, modo)
- digitalWrite(pin, valor)
- int digitalRead(pin)
E/S Analógica
- analogReference(tipo)
- int analogRead(pin)
- analogWrite(pin, valor)
E/S Avanzada
- shiftOut(dataPin, clockPin, bitOrder, valor)
- unsigned long pulseIn(pin, valor)
Tiempo
- unsigned long millis()
- unsigned long micros()
- delay(ms)
- delayMicroseconds(microsegundos)
Matemáticas
- min(x, y), max(x, y), abs(x), constrain(x, a, b), map(valor, fromLow, fromHigh, toLow, toHigh), pow(base, exponente), sqrt(x)
Trigonometría
- sin(rad), cos(rad), tan(rad)
Números aleatorios
- randomSeed(semilla), long random(máx), long random(mín, máx)
Bits y Bytes
- lowByte(), highByte(), bitRead(), bitWrite(), bitSet(), bitClear(), bit()
Interrupciones externas
- attachInterrupt(interrupción, función, modo)
- detachInterrupt(interrupción)
Interrupciones
- interrupts(), noInterrupts()
Comunicación por puerto serie
Las funciones de manejo del puerto serie deben ir precedidas de "Serial." aunque no necesitan ninguna declaración en la cabecera del programa. Por esto se consideran funciones base del lenguaje.- begin(), available(), read(), flush(), print(), println(), write()
Manipulación de puertos
Los registros de puertos permiten la manipulación a más bajo nivel y de forma más rápida de los pines de E/S del microcontrolador de las placas Arduino. Los pines de las placas Arduino están repartidos entre los registros B(0-7), C (analógicos) y D(8-13). Mediante las siguientes variables podemos ver y modificar su estado:- DDR[B/C/D]: Data Direction Register (o dirección del registro de datos) del puerto B, C ó D. Sirve para especificar que pines queremos usar como de entrada y cuales de salida. Variable de Lectura/Escritura.
- PORT[B/C/D]: Data Register (o registro de datos) del puerto B, C ó D. Variable de Lectura/Escritura.
- PIN[B/C/D]: Input Pins Register (o registro de pines de entrada) del puerto B, C ó D. Variable de sólo lectura.
DDRD = B11111110;Como se ha podido comprobar, si conocemos el lenguaje C, no tendremos dificultades para programar en Arduino puesto que se parecen enormemente. Tan sólo debemos aprender algunas funciones específicas de que dispone el lenguaje para manejar los diferentes parámetros de Arduino. Se pueden construir aplicaciones de cierta complejidad sin necesidad de muchos conceptos previos.
A.V.R. Libc
Los programas compilados con Arduino (salvo en las placas con CorteX M3) se enlazan contra AVR Libc por lo que tienen acceso a algunas de sus funciones. AVR Libc es un proyecto de software libre con el objetivo de proporcionar una C de alta calidad para utilizarse con el compilador GCC sobre microcontroladores Atmel AVR. Se compone de 3 partes:- avr-binutils
- avr-gcc
- avr-libc
Interrupciones
Para desactivar las interrupciones:cli(); // desactiva las interrupciones globalesPara activarlas:
sei(); // activa las interrupcionesEsto afectará al temporizador y a la comunicación serie. La función delayMicroseconds() desactiva las interrupciones cuando se ejecuta.
Temporizadores
La función delayMicroseconds() crea el menor retardo posible del lenguaje Arduino que ronda los 2μs.Para retardos más pequeños se debe utilizar la llamada de ensamblador 'nop' (no operación). Cada sentencia 'nop' se ejecutará en un ciclo de máquina (16 Mhz): unos 62.5ns. Se haría de la siguiente manera:
__asm__("nop\n\t");
Manipulación de puertos
La manipulación de puertos con código AVR es más rápida que utilizar la función digitalWrite() de Arduino.Establecer Bits en variables
cbi y sbi son mecanismos estándar (AVR) para establecer o limpiar bits en PORT y otras variables.Será necesario utilizar las siguientes cabeceras para poder utilizarlos:
# ifndef cbi# define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))# endif# ifndef sbi# define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))# endif
Gracias a estos pequeños hacks tendremos la posibilidad de mejorar los tiempos de ejecución de ciertas tareas críticas o de aquellas que se repitan muchas veces obteniendo mejores resultados. No obstante el código fuente que escribamos resultará probablemente menos legible si los utilizamos por lo que habrá que sopesarlo en función de nuestras necesidades.
Primer contacto: Hola Mundo en Arduino
El primer paso antes de comprobar que la instalación es correcta y empezar a trabajar con Arduino es abrir algunos ejemplos prácticos que vienen disponibles con el dispositivo. Es recomendable abrir el ejemplo “led_blink” que encontraremos en el menú File, Sketchbook, Examples, led_blink. Este código crea una intermitencia por segundo en un led conectado en el pin 13. Es cuestión de comprobar que el código es correcto, para eso, presionamos el botón que es un triángulo (en forma de "play") y seguidamente haremos un "upload" (que es la flecha hacia la derecha) para cargar el programa a la placa. Si el led empieza a parpadear, todo estará correcto.Veamos el código necesario para conseguirlo:
# define LED_PIN 13void setup () { // Activamos el pin 13 para salida digital pinMode (LED_PIN, OUTPUT);}// Bucle infinitovoid loop () { // Encendemos el led enviando una señal alta digitalWrite (LED_PIN, HIGH); // Esperamos un segundo (1000 ms) delay (1000); // Apagamos el led enviando una señal baja digitalWrite (LED_PIN, LOW); // Esperamos un segundo (1000 ms) delay (1000);}
Bibliotecas en Arduino
Para hacer uso de una biblioteca en Sketch (el IDE de Arduino), basta con hacer clic sobre “Import Library” en el menú, escoger una biblioteca y se añadirá el #include correspondiente. Las bibliotecas estándar que ofrece Arduino son las siguientes:Serial
Lectura y escritura por el puerto serie.EEPROM
Lectura y escritura en el almacenamiento permanente.- read(), write()
Ethernet
Conexión a Internet mediante “Arduino Ethernet Shield“. Puede funcionar como servidor que acepta peticiones remotas o como cliente. Se permiten hasta cuatro conexiones simultaneas.- Servidor: Server(), begin(), available(), write(), print(), println()
- Cliente: Client(), connected(), connect(), write(), print(), println(), available(), read(), flush(), stop()
Firmata
Comunicación con aplicaciones de ordenador utilizando el protocolo estándar del puerto serie.LiquidCrystal
Control de LCDs con chipset Hitachi HD44780 o compatibles. La biblioteca soporta los modos de 4 y 8 bits.Servo
Control de servo motores. A partir de la versión 0017 de Arduino la biblioteca soporta hasta 12 motores en la mayoría de placas Arduino y 48 en la Arduino Mega.- attach(), write(), writeMicroseconds(), read(), attached(), detach()
SoftwareSerial
Comunicación serie en pines digitales. Por defecto Arduino incluye comunicación sólo en los pines 0 y 1 pero gracias a esta biblioteca podemos realizar esta comunicación con el resto de pines.Stepper
Control de motores paso a paso unipolares o bipolares.- Stepper(steps, pin1, pin2), Stepper(steps, pin1, pin2, pin3, pin4), setSpeed(rpm), step(steps)
Wire
Envío y recepción de datos sobre una red de dispositivos o sensores mediante Two Wire Interface (TWI/I2C).Además las bibliotecas Matrix y Sprite de Wiring son totalmente compatibles con Arduino y sirven para manejo de matrices de leds.
También se ofrece información sobre diversas bibliotecas desarrolladas por contribuidores diversos que permiten realizar muchas tareas.
Creación de biblioteca
Además de las bibliotecas base, las que son compatibles y las que han aportado otras personas tenemos la posibilidad de escribir nuestra propia biblioteca.Esto es muy interesante por varias razones: permite disponer de código que puede reutilizarse en otros proyectos de forma cómoda; nos permite mantener el código fuente principal separado de las bibliotecas de forma que sean mantenibles de forma separada; y la organización de los programas construidos es más clara y elegante.Veamos un ejemplo de la creación de una biblioteca que envía código Morse:
Creamos el fichero Morse.h que incluye la definición de la clase Morse que tiene 3 funciones: un constructor (Morse()), una función para enviar 1 punto (dot()) y una función para enviar una raya (dash()). La variable _pin permite indicar el pin que vamos a utilizar.
/* Morse.h - Library for flashing Morse code. Created by David A. Mellis, November 2, 2007. Released into the public domain. */ # ifndef Morse_h# define Morse_h # include "WProgram.h" class Morse { public: Morse(int pin); void dot(); void dash(); private: int _pin;}; # endif
/* Morse.cpp - Library for flashing Morse code. Created by David A. Mellis, November 2, 2007. Released into the public domain. */ # include "WProgram.h"# include "Morse.h" Morse::Morse(int pin){ pinMode(pin, OUTPUT); _pin = pin;} void Morse::dot(){ digitalWrite(_pin, HIGH); delay(250); digitalWrite(_pin, LOW); delay(250);} void Morse::dash(){ digitalWrite(_pin, HIGH); delay(1000); digitalWrite(_pin, LOW); delay(250);}
morse.dot(); morse.dot(); morse.dot(); morse.dash(); morse.dash(); morse.dash(); morse.dot(); morse.dot(); morse.dot();
La plataforma arduino incluye algunos ejemplos demostrativos los cuales ayudan al usuario a familiarizarse con el lenguaje, en el siguiente enlace se encuentran los diferentes ejemplos que se encuentran en diche plataforma
http://arduino.cc/es/Tutorial/HomePage
Lo bueno de arduino es que puedes encontrar ejemplos por todos lados, a diferenciar de otros lenguajes que basicamente son lo mismo en cuanto a la logica la cual no cambia, pero si el modo de conectarlo al micro, o a veces como declararlo u obtener informacion de los puertos. Gracias por el aporte :)
ResponderEliminarhubiera estado mejor que en vez de postear el lenguaje C,al inicio, hubieras hecho mas extenso el apartado de las bibliotecas de arduino, la vdd es que no he trabajado mucho con ellos a pesar de que se que hay mucha informacion, pero simplemente no me llaman la atencion, pero se me interesa saber a detalle con que bibliotecas cuenta, para poder hace runa compracion un poco mas objetiva en cuanto a que microcontorlador elegir en un futuro proyecto
ResponderEliminarHola Gonz pues si tal vez y posteamos esta parte por que es lo que en ese momento nos sirvió para la realización de la primera practica pero aquí te dejo el link donde aparece lo que tu necesitas hay cuando tengas tiempo lo checas y haces tu comparación
Eliminarhttp://arduino.cc/es/Reference/Libraries
Muchas gracias por tu aporte Adri, en particular para nuestro equipo nos sirvió de mucha ayuda ya que nuestra tarjeta de programación al igual que la de su equipo es la Teensy 3.0 la cual emplea el entorno Arduino para ser programada, concuerdo con Kristy en lo fácil que se puede encontrar ejemplos o tutoriales en la red para diferentes proyectos empleando este entorno de programación, sin embargo como se puede apreciar en tu publicación pues si es muy sencillo este lenguaje ya que emplea las funciones de C que casi todos conocemos, creo que un poco de más información sobre las bibliotecas con las que cuenta el Arduino para las diferentes aplicaciones que podemos realizar sería muy buena por ejemplo para tu siguiente aporte, pero estuvo muy genial tu publicación gracias :)
ResponderEliminarHola Diana si puedes notar le contestamos la misma duda a Gonzalo en la pregunta anterior así que en el siguiente link puedes encontrar esa información
Eliminarhttp://arduino.cc/es/Reference/Libraries
Gracias por leernos :)
Hasta ganas de comprar una teensy me dio. Se ve muy sencillo para aprender. Muy buen aporte, parece que has condensado lo más básico para programar. Aunque igual de PIC hay ejemplos por todos lados y no siempre resulta más sencillo. Sigo creyendo que el fuerte del arduino es su casi interminable cantidad de librerías, pero aún así es un gran aporte.
ResponderEliminarLo considero un aporte bastante completo para lo que es una pequeña introducción a la programación en arduino, ya que cuenta con una de las cosas mas comunes como es la escritura y lectura de los puertos, igual pues para aquellos que les llegue a faltar o querer ver algo del contenido de las librerias, estas se pueden encontrar desde aquí: http://arduino.cc/en/Reference/Libraries, y así poder compararlas debidamente.
ResponderEliminarPor otro lado, cabe mencionar que al instalar el software para el arduino, este posee gran cantidad de ejemplos incluso para establecer comunicaciones como I2C, UART y SPI.
Gracias por el aporte, algunas veces al estar usando arduino, al tener tantas funcoines y librerías, no sabemos que función hace tal cosa. Así que me parece un buen resumen de las principales funciones que nos pueden sacar de un apuro en cualquier momento. Gracias.
ResponderEliminaren mi opinion todo esto de hubieras puesto algo mas especifico de lo que estamos usando ahorita para facilitar la busqueda por que toda esta inforamcion esta en cualquier lado inclusive manuels de arduino hasta en el oxxo los venden jjajaja para la proxima haber si puedes buscar algo sobre si se pueden hacer interrupciones u contadores con el arduino.
ResponderEliminarno entiendo como programar hay alguna forma clara de programación
ResponderEliminar