Explicacion Basica:
Arduino es una plataforma de hardware libre, basada en una placa con un microcontrolador y un entorno de desarrollo, diseñada para facilitar el uso de la electrónica en proyectos multidisciplinares.
El hardware consiste en una placa con un microcontrolador Atmel AVR y puertos de entrada/salida. Los microcontroladores más usados son el Atmega168, Atmega328, Atmega1280, ATmega8 por su sencillez y bajo coste que permiten el desarrollo de múltiples diseños. Por otro lado el software consiste en un entorno de desarrollo que implementa el lenguaje de programación Processing/Wiring y el cargador de arranque (boot loader) que corre en la placa.
Arduino se puede utilizar para desarrollar objetos interactivos autónomos o puede ser conectado a software del ordenador (por ejemplo: Macromedia Flash, Processing, Max/MSP, Pure Data). Las placas se pueden montar a mano o adquirirse. El entorno de desarrollo integrado libre se puede descargar gratuitamente.
Al ser open-hardware, tanto su diseño como su distribución es libre. Es decir, puede utilizarse libremente para el desarrollo de cualquier tipo de proyecto sin haber adquirido ninguna licencia.

La placa Arduino Standard tiene 14 pines con entradas/salidas digitales (6 de las cuales pueden ser usadas como salidas PWM), 6 entradas analógicas, un cristal oscilador a 16Mhz, conexión USB, entrada de alimentación, una cabecera ISCP, y un botón de reset.
Los programas hechos con Arduino se dividen en tres partes principales: estructura, valores (variables y constantes), y funciones. El Lenguaje de programación Arduino se basa en C/C++.

Al ser un entorno Open hardware y ser una gran comunidad, se han diseñado muchos tipos de placas Arduino distintas aparte de las mencionadas anteriormente. Como todas están basadas en la misma base de programación vamos a centrarnos en la Placa Arduino UNO que es una placa standard y nos permite hacer pruebas de una manera sencilla.
Existen varios tipos de Placas Arduino por ejemplo:
- Arduino Nano
- Arduino Mini
- Arduino BT
- LilyPad Arduino
- Arduino Fio
- Arduino Pro
- Arduino Pro Mini
- Xbee shield
- Ethernet shield
- Arduino UNO
- Arduino Mega

Entradas y Salidas
Cada uno de los 14 pines digitales del Arduino puede ser usado como entrada o salida digital, usando las funciones :
-pinMode()
-digitalWrite()
-digitalRead()
Operan a 5 voltios. Cada pin puede proporcionar o recibir un máximo de 40 mA y tiene una resistencia interna "pull-up" (desconectada por defecto) de 20-50 KOhms. Además, algunos pines tienen funciones especiales:
Pines serie Rx y Tx : Sirven para recibir transmitir datos (TTL), están conectados al chip FTDI, el cual hace conversión de USB a serie- TTL.
Interruptores externos: 2 y 3. Estos pines pueden ser configurados para disparar un interruptor en un valor bajo, un margen creciente o decreciente, o un cambio de valor. Con la función:
-attachInterrupt().
PWM: 3, 5, 6, 9, 10 y 11. Proporcionan salida PWM de 8 bits con la función:
- analogWrite() .
I ²C: 4 (SDA) y 5 (SCL): El software Arduino incluye una librería Wire para simplifcar el uso del bus I ²C. Son buses para comunicarse con otros dispositivos. Soportan comunicación con libreria Wire. Esta libreria se utiliza para comunicarse con elementos TWI (Two Wire Interfaces) que tienen mas velocidad.
SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Estos pines soportan comunicación SPI, la cual, aunque proporcionada por el hardware subyacente, no está actualmente incluida en el lenguaje Arduino.
LED: 13. Hay un LED empotrado conectado al pin digital 13. Cuando el pin está a valor HIGH, el LED está encendido, cuando el pin está a LOW, está apagado.
Tiene 6 entradas analógicas, cada una de las cuales proporciona 10 bits de resolución (por ejemplo 1024 valores diferentes). Por defecto miden 5 voltios desde tierra, aunque es posible cambiar el valor más alto de su rango usando el pin AREF y algún código de bajo nivel. Para programar y leer la entrada de estos pines analógicos utilizamos la función:
-analogRead()
Además, algunos pines tienen funcionalidad especializada:
AREF: Voltaje de referencia para las entradas analógicas. Usado con analogReference(). Es para entradas analógicas. Nos permite dar a la placa un voltaje de referencia al suministrarle una alimentación externa. si queremos medir el voltaje con un rango máximo de 3,3v, alimentaríamos 3,3v en el pin AREF con un regulador de voltaje IC. entonces el ADC representaría 3,22 mV.
Reset. Pone esta linea a LOW para resetear el microcontrolador. Típicamente usada para añadir un botón de reset a dispositivos que bloquean a la placa principal.
Comunicación
Serial: Arduino tiene un numero de infraestructuras para comunicarse con un ordenador, otro Arduino, u otros microcontroladores. Los microcontroladores mas populares actualmente son los ATmega que utiliza proveen comunicación serie UART TTL (5 V), la cual está disponible en los pines digitales 0 (Rx) y 1 (Tx). Usados para recibir (Rx) y transmitir (Tx) datos TTL en serie. Estos pines estan conectados a los pines correspondientes del chip FTDI USB-a-TTL Serie.
Por ejemplo: Las placas Arduino Diecimila y Duemilanove utilizan chip FTDI FT232RL como conversor USB-Serial. La Arduino UNO utiliza un chip Atmega16U2.
Un FTDI en la placa canaliza esta comunicación serie al USB y los drivers FTDI (incluidos con el software Arduino) proporcionan un puerto de comunicación virtual al software del ordenador. El software Arduino incluye un monitor serie que permite a datos de texto simple ser enviados a y desde la placa Arduino.
Una librería SoftwareSerial permite comunicación serie en cualquiera de los pines digitales de Arduino.
Programación
El Arduino puede ser programado con el software Arduino.
El ATmega del Arduino vienen con un bootloader pregrabado que permite subirle nuevo código sin usar un programador hardware externo. Se comunica usando el protocolo original STK500. También puedes saltar el bootloader y programar el ATmega a través de la cabecera ICSP (In-Circuit Serial Programming).
Alimentación
Puede ser alimentado vía la conexión USB o con una fuente de alimentación externa. El origen de la alimentación se selecciona automáticamente. Las fuentes de alimentación externas (no-USB) pueden ser tanto un transformador o una batería. El transformador se puede conectar usando un conector jack macho de 2.1mm con centro positivo en el conector hembra de la placa. Los cables de la batería puede conectarse a los pines Gnd y Vin en los conectores de alimentación (POWER).
Los pines de alimentación son los siguientes:
-VIN. La entrada de voltaje a la placa Arduino cuando se esta usando una fuente externa de alimentación (en opuesto a los 5 voltios de la conexión USB). Se puede proporcionar voltaje a través de este pin.
-5V. La fuente de voltaje estabilizado usado para alimentar el microcontrolador y otros componentes de la placa. Esta puede provenir de VIN a través de un regulador integrado en la placa, o proporcionada directamente por el USB o otra fuente estabilizada de 5V.
-3V3. Una fuente de voltaje a 3.3 voltios generada en el chip FTDI integrado en la placa. La corriente máxima soportada 50mA.
-GND. Pines de toma de tierra..

Arduino UNO
La Placa Arduino UNO tiene un micro controlador ATMEGA16U2-MU que utiliza como conversor USB en vez del chip FTDI que utilizaban las antiguas placas.
Ademas tiene un procesador micocontrolador Atemega328, siendo mas rápida y optima que las antiguas Arduino Duemilanove y la Diecimila con microcontrolador Atemega168.
IOREF
En el bloque de alimentación se han añadido 2 pines, uno marcado como IOref servirá para que la placa reconozca el tipo de alimentación que requieren los shieds (3.3v ó 5v) y al otro se le dará uso en futuras versiones.
Entorno de Desarrollo para Arduino (Arduino Software)

El entorno de Desarrollo Arduino está constituido por un editor de texto para escribir el código, un área de mensajes, una consola de texto, una barra de herramientas con botones para las funciones comunes, y una serie de menús. Permite la conexión con el hardware de Arduino para cargar los programas y comunicarse con ellos.
Referencia del lenguaje
https://www.arduino.cc/en/Reference/HomePage
Librerias
https://www.arduino.cc/en/Reference/Libraries
REFERENCIA PARA EL PROGRAMADOR DEL LENGUAJE ARDUINO
Referencias para el programador del lenguaje Arduino, con las distintas instrucciones y sentencias disponibles en el lenguaje, organizados por categorías y con un ejemplo de cada caso.
Esta referencia no es un manual de programación. Es una orientacion a gente con conocimientos de programación, que sirve para aprendizaje rápido, consulta, y compendio de la sintaxis de programación del lenguaje Arduino.
OPERADORES Y COMPARADORES
COMPARADORES
//x igual a y
x == y
//x distinto de y
x != y
//x menor que y
x < y
//x mayor que y
x > y
//x menor o igual que y
x <= y
//x mayor o igual que y
x >= y
OPERADORES ARITMÉTICOS
//operador de asignación
a = b
//adición
a + b
//substracción
a - b
//multiplicación
a * b
//división
a / b
//modulo
a % b
OPERADORES DE BITS
/ /and binario
a & b
//or binario
a ' b
//xor binario
a ^ b
//not binario
a ~ b
//desplazamiento a izquierda
a << b
//desplazamiento a derecha
a >> b
OPERADORES COMPUESTOS
//incremento
a++
//decremento
a--
//adición compuesta
a += b
//substracción compuesta
a -= b
//multiplicación compuesta
a *= b
//división compuesta
a /= b
//and compuesto
a &= b
//or compuesto
a '= b
OPERADORES BOOLEANOS
//not
!a
//and
a && b
//or
a '' b
OPERADORES DE ACCESO
//operacion indirección
*variable
//operacion dirección
&variable
DECLARACIÓN Y CONVERSIÓN DE TIPOS DE VARIABLES
//tipo vacio (solo para funciones)
void
BOOLEANOS
//booleano, false o true
boolean = false;
o
boolean = true;
ENTEROS
//entero, 16 bits, de -32,768 a 32,767
int var = 100;
//entero, 16 bits, de 0 a 65535 (excepto en Due, donde son 32 bits)
unsigned int var = 100;
//entero, 16 bits, de 0 a 65535
short var = 100;
//entero, 32 bits, de -2,147,483,648 a 2,147,483,647
long var = 100000L;
//entero, 32bits, de 0 a 4,294,967,295
unsigned long var = 100000L;
COMA FLOTANTE
//coma floante, 32 bits, de -3.4028235E+38 a 3.4028235E+38. Precision 6 digitos
float var = 1.117;
//idéntico a float, excepto en Arduino Due donde es flotante de 64 bits
double var = 1.117;
BYTES
//8 bits, de 0 a 255
byte var = B10010;
//16bits, sin signo, de 0 a 65535
word var = 10000;
CARACTERES
//8 bits, de -128 a 127
char var = 'A';
//8 bits, de 0 a 255
unsigned char var = 240;
CONVERSIÓN ENTRE VARIABLES
//convierte a char
char(variable);
//convierte a byte
byte(variable);
//convierte a int
int(variable);
//convierte a word
word(variable);
//convierte a long
long(variable);
//convierte a floa
tfloat(variable);
CUALIFICADORES DE VARIABLES
//STATIC: Variables visibles únicamente en el interior de una función, y cuyo valor se mantiene entre llamadas a la misma.
static int variable;
//CONST//Variables cuyo valor no puede ser redefinido tras la inicialización
const float pi = 3.14;
//VOLATILE: Variables en las que se indica al compilador que no guarde en los registros del microprocesador, sino que fuerza la actualización en memoria. Esto se hace cuando existe la posibilidad de que el valor de la variable sea modificado por otro proceso que se ejecuta concurrentemente con el actual (por ejemplo cuando se emplean hilos o interrupciones)
volatile int variable = LOW;
VECTORES
CREACIÓN DE VECTORES
//declarar vector
int miArray[5];
//iniciar vector
int miArray[] = {2, 4, 8, 3, 6};
//declarar e iniciar vector
int miArray[5] = {2, 4, -8, 3, 2};
MANIPULACIÓN VECTORES
//asignar valor a elemento del vector
miArray[0] = 10;
//obtener valor de elemento del vector
x = miArray[4];
CADENAS DE TEXTO
TEXTOS COMO VECTOR DE CARACTERES
char cadena1[15];
char cadena2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
char cadena3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};
char cadena4[ ] = "texto";
char cadena5[8] = "texto";
char cadena6[15] = "texto";
//vector de cadenas
char* cadenaArray[]={"Cadena 1", "Cadena 2", "Cadena 3","Cadena 4", "Cadena 5", "Cadena 6"};
TEXTOS COMO OBJETO STRING
// literal de cadena de texto
String txtMsg = "Hola";
// convirtiendo un char a String
String txtMsg = String('a');
// convirtiendo un literal a String
String txtMsg = String("Texto");
// concatenando dos literales a String
String txtMsg = String("texto1" + "texto2");
CONDICIONALES
CONDICIONAL ABREVIADO
condition ? true : false;
CONDICIONAL IF
if (variable < 10){
// accion A
}
if (variable < 10){
// accion A
}else{
//
accion B
}
if (variable < 10){
// accion A
}else if (variable >= 100){
// accion B
}else{
// accion C
}
CONDICIONAL SWITCH / CASE OF
switch (variable) {
case 1:
// accion A
break;
case 2:
// accion B
break;
default:
// caso por defecto (opcional)}
BUCLES
BUCLE FOR
for (int i=0; i <= 100; i++){
// accion
}
BUCLE WHILE
variable = 0;
while(variable < 100){
// accion
variable++;
}
BUCLE DO WHILE
do
{
//accion
variable++;
}
while (variable < 100);
FUNCIONES MATEMÁTICAS
FUNCIONES DE RANGO
//devuelve mínimo entra a y b
min(a,b);
//devuelve máximo entra a y b
max(a,b);
//devuelve valor absoluto de a
abs(a);
//devuelve x restringido a (a,b)
constrain(x, a, b);
//interpola linealmente y entre x1,y1 x2,y2
map(x, x1, x2, y1, y2);
POTENCIACIÓN
//devuelve a^b (ambos tipo float)
pow(a,b);
//devuelve la raiz cuadrada de a
sqrt(a);
NÚMEROS ALEATORIOS
//inicializa la semilla del generador de numeros pseudo aleatorios
randomSeed(semilla);
//devuelve un numero aleatorio entre a y b (ambos tipo long)
random(a, b);
TRIGONOMETRIA
//devuelve el seno de a (a tipo float y en radianes)
sin(a);
//devuelve el coseno de a (a tipo float y en radianes)
cos(a);
//devuelve la tangente de a (a tipo float y en radianes)
tan(a);
FUNCIONES DE BITS Y BYTES
//devuelve el byte menos signiticativo de una palabra o variable.
lowByte(variable);
//devuelve el byte más significativo de una palabra (o el segundo byte menos significativo en variables mayores)
highByte(variable);
//devuelve el bit n de una variable x (siendo el bit 0 el menos significativo)
bitRead(x, n);
//escribe el bit n de la variable x con el valor b (siendo el bit 0 el menos significativo)
bitWrite(x, n,b );
//pone a 1 el bit n de la variable
xbitSet(x, n);
//pone a 0 el bit n de la variable
xbitClear(x, n);
//obtiene el valor del bit n (idéntico a 2^n)
bit(n);
FUNCIONES DE TEXTOS
//delvuelve el caracter en la posición 3 (idéntico a txtMsg[3];)
txtMsg.charAt(3);
//sustituye el caracter en la posición 3 por "A" (idéntico a txtMsg[3]="A";)
txtMsg.setCharAt("A", 3);
//concatena texto 1 y texto 2 (idéntico a texto1=texto1+texto2;)
texto1.concat("texto2");
//devuelve la longitud de la cadena
txtMsg.length();
//devuelve la cadena convertida en minúsculas
txtMsg.toLowerCase();
//devuelve la cadena convertida en mayúsculas
txtMsg.toUpperCase();
//elimina espacios y carácteres incorrectos
txtMsg.trim();
//devuelve la cadena de texto como entero
txtMsg.toInt();
COMPARACIÓN
//compara dos cadenas. Devuelve 1 si texto1 es mayor que texto2, 0 si son iguales, y -1 en caso contrario
texto1.compareTo(texto2);
//compara si dos cadenas son iguales (idéntico a texto1==texto2)
texto1.equals(texto2);
//compara si dos cadenas son iguales, ignorando mayúsculas y minúsculas
texto1.equalsIgnoreCase(texto2);
SUBCADENAS
//devuelve una subcadena de la posicion 3 a la 10
txtMsg.substring(3, 10);
//comprueba si la cadena empieza por "texto", con offset 3
txtMsg.startsWith("texto", 3);
//comprueba si la cadena empieza por "texto", con offset 3
txtMsg.endsWith("texto");
BÚSQUEDA Y SUSTITUCIÓN
//devuelve el índice de la primera ocurrencia de 'A', a partir de la posición offset
txtMsg.indexOf('A', offset);
//devuelve el índice de la última ocurrencia de 'A' previa a la posición offset
txtMsg.lastIndexOf('A', offset);
//sustituye las ocurrencias de "texto1" por "texto2"
txtMsg.replace("texto1", "texto2");
FUNCIONES DE USUARIO
VARIABLES GLOBALES
int option=1;
int cambiar(){
option=4;
}
void setup(){
Serial.begin(9600);
}
void loop(){
cambiar();
Serial.print(option); //muestra 4
delay(10000);
}
PASO DE PARÁMETROS POR VALOR
int cambiar(var){
var=4;
}
void setup(){
Serial.begin(9600);
}
void loop(){
int option=1;
cambiar(option);
Serial.print(option); //muestra 1
delay(10000);
}
PASO DE PARÁMETROS POR REFERENCIA
int cambiar(int &var){
var=4;
}
void setup(){
Serial.begin(9600);
}
void loop(){
int option=1;
cambiar(option);
Serial.print(option); //muestra 4
delay(10000);
}
PASO DE PARÁMETROS POR PUNTERO
int cambiar(int* var){
*var=4;
}
void setup(){
Serial.begin(9600);
}
void loop(){
int option=1;
cambiar(&option);
Serial.print(option); //muestra 4
delay(10000);
}
DEVOLUCIÓN DE VALORES
int cambiar(){
int var=4; return var;
}
void setup(){
Serial.begin(9600);
}
void loop(){
int option=1;
option=cambiar();
Serial.print(option); //muestra 4
delay(10000);
}
TIPOS DATOS AVANZADOS (ENUM / STRUCT / TYPEDEF)
ENUMERACIONES
//declaracion
enum miEnumeracion {
opcion1,
opcion2,
opcion3
};
//ejemplo de uso
miEnumeracion variable = opcion2;
if (variable==opcion2){
//accion
}
ESTRUCTURAS
//declaracion
struct miEstructura
{
int campo1;
int campo2;
char campo3;
};
//ejemplo de uso
struct miEstructura variable;
variable.campo1=10;
DEFINICION DE TIPOS DE DATOS DE USUARIO
//declaraciones
typedef int nuevotipo;
typedef enum miEnumeracion nuevotipo;
typedef struct miEstructura nuevotipo;
//ejemplo de usonuevo
tipo variable;
CLASES
EJEMPLO DE USO DE CLASE
class MiRobot;
//definicion de clase ejemplo
class MiRobot{
public:
void saludar(); //muestra "Hola"
void incCont(); //incrementa contador
int getCont(); //devuelve contador
void sayCont(); //muestra valor contador
void setCont(int); //inicializa contador a un valor
private:
int cont=0; //variable contador privada
};
//muestra "Hola"
void MiRobot::saludar(){
Serial.println("Hola");
}
void MiRobot::incCont(){
this->cont++;
}
//devuelve contador
void MiRobot::getCont(){
return this->cont;
}
//muestra valor contador
void MiRobot::sayCont(){
Serial.println(this->cont);
}
//inicializa contador a un valor
void MiRobot::setCont(int _cont){
this->cont=_cont;
}
void setup(){
Serial.println("Iniciando");
Serial.begin(9600);
MiRobot robot;
robot.saludar(); //se muestra hola
}
void loop(){
robot.incCont(); //se incrementa el contador
robot.sayCont(); //muestra el valor
delay(1000);
}