B002 Nociones Básicas de Programación

Programa de ordenador 
Es un conjunto de instrucciones para el ordenador, es básicamente como una receta de cocina…pero para un ordenador.


Cuando programamos quien debe entendernos es un ordenador que espera instrucciones precisas respecto a lo que debe hacer y que además carece por completo de la imaginación o capacidad de improvisación de los humanos.

El ser humano y los ordenadores no hablan el mismo idioma, por ello se han desarrollado los lenguajes programación, para dar instrucciones a una máquina de forma precisa, sin ambigüedades, Univoca que solo se pueda interpretar de una manera. y concisa, es decir con ódenes los más cortas posible.
El IDE de Arduino se programa en una variante de C++ , que es un lenguaje muy extendido por sus características, aunque no es un lenguaje sencillo.  C++, que fija reglas estrictas de cómo escribir estas instrucciones.

El programa es una serie de instrucciones que se ejecutan en secuencia, excepto que indiquemos expresamente condiciones precisas para altera esta secuencia.

El IDE tiene un programa interno  comprueba que la sintaxis de nuestro programa es acorde a la norma de C++, y si hay cualquier cosa que no le convence dará un error y finalizará la comprobación obligándonos a revisar lo que hemos escrito.

Cuando el comprobador acepta nuestro programa, invoca a otro programa que traduce lo que hemos escrito a instrucciones que entienda el procesador de nuestro Arduino. 

A este nuevo programa se le llama compilador.

Compilador
Funcion del compilador
El compilador convierte nuestras instrucciones que se llama código fuente, en instrucciones del procesador al que llamarémos código ejecutable.

Estructura de un programa Arduino.


Un programa o sketch de Arduino consiste en dos secciones o funciones básicas:
  • Setup: Sus instrucciones se ejecutan solo una vez, cuando se arranca el programa al encender Arduino o cuando pulsamos el botón de reset. Generalmente incluye definiciones e inicializaciones, establece los parámetros de inicio de ahí su nombre.
  • Loop: Sus instrucciones se van ejecutando en secuencia hasta el final…. Y cuando acaba, vuelve a empezar desde el principio haciendo un ciclo sin fin.

Cuando abrimos el IDE de Arduino o hacemos MENÚ / ARCHIVO / NUEVO, el propio IDE nos escribe ya estas dos funciones (en color cobre):
 

Sin nos fijamos, al principio de cada función se ve la apertura de llave “ { “ y el cierre llaves “ } “. Estas llaves delimintan la función, es decir todo el código que pertenece a la función se va a escribir entre estas dos llaves.  De hecho el conjunto de instrucciones contenidas entre una apertura y cierre de llaves se llama bloque y es de capital importancia a la hora de que nuestro Arduino interprete de una u otra manera las instrucciones que le damos.

Es obligatorio que a cada apertura de una llave corresponda un cierre de llave. 

Luego vemos que aparecen dentro de los bloques principales las líneas:
// put your setup code here, to run once
// put your main code here, to run repeatedly

Estas líneas son comentario, cualquier cosa que escribamos precedido por “ // “ son comentarios, y serán ignorados. Sirven para poder escribir mensajes dentro del código, sin que afecte al funcionamiento del código, que de otro modo darían errores. El compilador ignorará cualquier cosa entre // y el fin de línea.

Primeras instrucciones en Arduino C++.


Igual que es tradición cuando uno aprende un lenguaje de programación, el primer programa es el famoso "hola mundo" en el mundo Arduino, que el primer programa que se suele hace es el blinking LED, porque ilustra algunas ideas interesantes en cuanto a las posibilidades que brinda arduino, como son la capacidad para interactuar con el mundo externo y la sencille del entorno de trabajo.
Arduino puede relacionarse de diferentes maneras con el mundo que le rodea, así que empezaremos por los pines digitales que pueden usarse como 

Entradas para leer la información que le llega del mundo exterior  o como Salidas para activar una señal al mundo exterior
Arduino dispone de 14 pines que pueden ser usados de este modo, numerados del 0 al 13:

pines del 0 al 13


A modo de ejemplo vamos a cargar un programa que hace parpadear un microLED que hay en la placa que está asociado al pin 13. Este parpardeo tendrá una cadencia definida por nosotros con ayuda del programa.

Con el programa le pediremos a Arduino que active su pin 13 como de salida digital y después encenderemos y apagaremos esta señal lo que hará que el LED que tiene conectado de serie se encienda o apague al ritmo que marquemos.

Para indicar al sistema que deseamos usar el pin 13 como salida digital utilizamos la instrucción:
pinMode ( 13, OUTPUT ) ; 
 
La instrucción pinMode, significa que el pin cuyo número se indica, se establece en modo que indica en el paréntesis.  El primer parámetro indica el pin a usar en este caso el 13 y el segundo parámetro indica el modo en el que va a trabajar el pin que es “OUTPUT”  que significa salida, también podría usarse el valor “INPUT” para indicar que vamos a el pin en modo de entrada.  Cada instrucción al final acaba en ; que es la forma de decirle al compilador que la instrucción esa ha terminado.

Estas definiciones se hacen solo una vez al principio, en la función setup(). La nuestra quedará, con una única instrucción que declara que vamos a usar el pin 13 como salida digital:
     void setup()
          {
               // initialize the digital pin as an output
               pinMode( 13, OUTPUT) ;
          }
  • Es importante fijarse en que a pesar de ser una única instrucción, hemos delimitado el  bloque de esta función mediante abrir y cerrar llaves.
  •  Obsérvese que la instrucción finaliza en “ ;” . C++  obliga a acabar las instrucciones con un punto y coma que delimite la orden. Si se omite generará un error.
Importante, a pesar de que solo se ha puesto una instrucción, siempre se tiene poner las llaves de apertura y cierre

Para encender el LED usaremos la instrucción:
digitalWrite( 13 ,  HIGH) ;
 
Para encender el LED usaremos la instrucción:
digitalWrite( 13 ,  LOW) ;
 
digitalWrite viene a significa algo así como "escribe el valor digital correspondiente en el pín indicado" El 13 indica el pin a utilizar y HIGH, LOW indican el valor que deseamos poner en esa salida, que en Arduino corresponden a 5 Voltios de tensión para HIGH y 0 Voltios de tensión para LOW.

Si en la función loop() escribiéramos estas dos instrucciones seguidas, Arduino cambiaría estos valores tan deprisa que no percibiríamos cambios, así que necesitamos frenarle un poco para que podamos percibir el cambio.

Para hacer este retraso de, digamos, un segundo, utilizaremos la instrucción:

delay(1000) ;                       

Esto viene a significar retardar o demorar 1000 milisegundos, que es igual a 1 segundo. Digamos que arduino se queda quieto sin hacer nada como si estuviera congelado durante ese tiempo.
Por tanto para programar una luz que se enciende y se apaga, tendríamos que generar una secuencia de órdenes igual que en una receta de cocina que hicieran:
  1. Informar a Arduino de que vamos a utilizar el pin 13 como una salida.
  2. Enciende el LED conectado al pin 13
  3. Esperar un segundo.
  4. Apagar el LED conectado al pin 13
  5. Espera un segundo
Con el primer delay decidimos el tiempo que el LED va a permanecer encendido
Con el segundo delay decimimos el tiempo que el LED va a permanecer apagado 

Si no ponemos los delays, arduino enciende y apaga el LED unas 15.000 veces por segundo y percibiríamos que el LED está permanentemente encendido

El primer concepto importante, es que los ordenadores procesan las ordenes en secuencia, una instrucción después de otra y en el orden en que se las damos.
La forma de escribir un programa en Arduino C++ que haga lo anteriormente descrito es algo parecido a esto


Fijaros en el sangrado de las líneas para destacar los bloques de código. Esto es una buena práctica porque facilita la comprensión del programa y ayuda a visualizar el código.

Ya solo falta  comprobar si hay errores y para ello pulsamos el icono en amarillo:






Si todo va bien y no hay errores en rojo podemos compilar y volcar el programa en el arduino con el icono de la flecha



En caso contrario habrá que revisar los posibles errores y corregirlos.

Si modificamos los valores del delay, modificaremos el tiempo que el LED estará encendido y apagado y con ello tendremos varios tipos de cadencia. 

Nota el único pin que tiene asociado un LED de la placa es el 13, si quieres utilizar otro pin tendrás que conectarles un LED y su resistencia de protección de forma externa.