PROGRAMACIÓN - FUNCIONAMIENTOS DE ARDUINO

 



Como en cualquier lenguaje de programación, el sistema de funciones también está presente en el lenguaje Arduino. Todas las funciones y operadores básicos como “if”, “else”, “switch case”, “==”,”!=”, etc. son comunes a muchos lenguajes.

Función de gestión de E/S digitales

pinMode (spindle, mode): esta función se utiliza para definir un cabezal específico del Arduino (por su número) como entrada o salida.
digitalWrite(huso, valor): se utiliza para definir el estado de una salida en un momento dado. Por ejemplo, si has definido que un LED está conectado al pin 4 ( pinMode(4, OUTPUT);), puede enviar energía a este pin, tanto si se enciende como si no, por ejemplo:
digitalWrite(4, HIGH) ; se utiliza para enviar una señal eléctrica y, por lo tanto, para encender el LED.
digitalWrite(4, LOW) ; se utiliza para conectar a tierra el pin 4 al potencial de tierra y, por lo tanto, para apagar el LED.
int digitalRead(pin): se utiliza para leer el estado de un pin. Si se conecta a un potencial de 5V, el resultado de la lectura será 1, y si se conecta a un potencial cero, el resultado será 0.

Gracias a estas funciones y a algunos componentes electrónicos, es posible, por ejemplo, encender lámparas, accionar motores o comprobar el estado de un elemento conectado a un sensor leyendo su estado.

Función de gestión de E/S analógicas

Muchos Arduino tienen entradas analógicas, pero muy pocos (como Due) tienen salidas analógicas.
int anlogRead(pin): la función analogRead permite leer el estado de un pin analógico. La diferencia entre un pin analógico y un pin digital es que a diferencia de un pin digital que devuelve sólo un 1 o 0, el pin analógico envía un número entre 1 y 256, siendo el 1 0V y 256 5V. Por lo tanto, podemos tener un número que corresponde a una tensión, y por lo tanto conocer el potencial de un cabezal en un momento’T’. También puedes aumentar la precisión del Arduino para obtener más precisión. Las entradas analógicas se utilizan ampliamente para sensores que devuelven una multitud de valores diferentes, como por ejemplo, sensores de temperatura.
analogWrite(pin, valor): pocas tarjetas tienen esta función. Se utiliza para enviar una tensión proporcional a un delta, que puede modificarse si es necesario para aumentar la precisión.

Funciones de temporización


Puesto que Arduino tiene un reloj, es posible realizar retardos de tiempo entre diferentes bloques de código. Aquí están las funciones que le permiten manejar el tiempo:
Delay() : La función Delay(ms) se utiliza para hacer una pausa de una cierta duración establecida por un número entero pasado en la función cuando se llama. Este número entero corresponde al número de milisegundos durante los cuales se debe parar el programa. Esta función es una función de bloqueo y, por lo tanto, mientras se ejecuta, se ignoran todas las demás acciones.
DelayMicrosegundos(): Igual que la función delay(), excepto que el entero pasado en el parámetro se tiene en cuenta como microsegundos y no como milisegundos.
Unsigned long millis(): permite devolver un número de milisegundos que corresponde al tiempo transcurrido desde el inicio del programa. Esta función se reajusta después de unos 50 días después de un desbordamiento.
Unsigned long Micro(): exactamente la misma función que milis(), excepto que micro() devuelve un entero que corresponde a microsegundos y ya no a milisegundos.
Long random(max): devuelve un número entero aleatorio entre 0 y el número pasado en el parámetro.
Long random(min, max): devuelve un número entero aleatorio entre los dos números pasados en los parámetros.

Función Scheduler


La función del programador es una de las funciones más importantes de Arduino, ya que nos permite realizar tareas asíncronas.

De hecho, básicamente, un Arduino no puede manejar varias tareas al mismo tiempo. Por ejemplo, si usas la función delay() para hacer parpadear un LED, y quieres leer el estado de una entrada de Arduino al mismo tiempo, no podrás hacerlo, porque mientras el delay se está acabando, el programa está bloqueado, y está esperando a que termine.

Como vimos al principio, el programa está compuesto sólo por dos funciones: “setup()” y “loop()”. Por supuesto, es posible crear otras funciones, pero se ejecutarán sincrónicamente después de su llamada. La función planificador de procesos< nos permite crear varios bucles infinitos (idénticos a la función de bucle existente) y lanzarlos al mismo tiempo. Un ejemplo del uso de esta función para trabajar diferentes tareas:

// Include Scheduler since we want to manage multiple tasks.
#include

int led1 = 13;
int led2 = 12;
int led3 = 11;

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

// Setup the 3 pins as OUTPUT
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);

// Add "loop2" and "loop3" to scheduling.
// "loop" is always started by default.
Scheduler.startLoop(loop2);
Scheduler.startLoop(loop3);
}

// Task no.1: blink LED with 1 second delay.
void loop() {
digitalWrite(led1, HIGH);

// IMPORTANT:
// When multiple tasks are running 'delay' passes control to
// other tasks while waiting and guarantees they get executed.
delay(1000);

digitalWrite(led1, LOW);
delay(1000);
}

// Task no.2: blink LED with 0.1 second delay.
void loop2() {
digitalWrite(led2, HIGH);
delay(100);
digitalWrite(led2, LOW);
delay(100);
}

// Task no.3: accept commands from Serial port
// '0' turns off LED
// '1' turns on LED
void loop3() {
if (Serial.available()) {
char c = Serial.read();
if (c=='0') {
digitalWrite(led3, LOW);
Serial.println("Led turned off!");
}
if (c=='1') {
digitalWrite(led3, HIGH);
Serial.println("Led turned on!");
}
}

// IMPORTANT:
// We must call 'yield' at a regular basis to pass
// control to other tasks.
yield();
}



Puesto que el microprocesador de Arduino no está diseñado para hacer asíncronos, esta función le permite hacerlo como hemos visto anteriormente, pero de una forma un tanto indirecta. De hecho, cuando se usa la función de programar, el Arduino no ejecuta ambos bucles al mismo tiempo; el primer bucle ejecutará una parte muy pequeña de su código, pasará el relé al segundo bucle que también ejecutará una parte del código, luego pasará la mano al primer bucle, y así sucesivamente. En general, en el caso de los proyectos pequeños, esto no es en absoluto perturbador. Sin embargo, para aquellos que quieran ejecutar código en un tiempo específico, esta función debe ser evitada, ya que cambiar de un bucle a otro aumenta el tiempo de cálculo de Arduino.

Además, es imprescindible utilizar la función “yield()” al final de cada bucle, ya que es la que permite gestionar la transición de uno a otro.
Funciones personalizadas

Por supuesto, también podemos crear funciones personalizadas que satisfagan nuestras necesidades. En lugar de códigos largos, aquí hay un ejemplo de un código que te permite hacer que un LED parpadee un número específico de veces al presionar un botón, el número de repeticiones se especifica durante la llamada:

/*
* Impulsos programados
* -----------------
* Cambia de estado ON Off un lED conectado en el una salida digital
* pin 13. El se encenderá y apagará tantas veces como se indique mediante un digito
* ASCII leído desde el puerto serie. * * Created 18 October 2006
* copyleft 2006 Tod E. Kurt <tod@todbot.com>
* http://todbot.com/
*
* based on "serial_read_advanced" example
*/
int ledPin = 13;
// selecciona el pin para el LED
int val = 0;
// variable que almacena el valor leído del puerto
void setup() { pinMode(ledPin,OUTPUT);
// declara el PIN del LED como salida
Serial.begin(19200);
// conecta con el puerto serie a la velocidad de 19200
Serial.println("Bienvenido al Generador de Impulsos Programados"); } void loop () { val = Serial.read();
// lee el numero del puerto (una sola cifra)

//si el valor leído es un solo digito se ejecuta el programa



El uso de funciones personalizadas es idéntico al de los lenguajes C y C++.


Monitor en serie

Gracias al serial monitor (el pequeño icono de la lupa en la parte superior derecha) tienesla posibilidad de mostrar información del código. Esto se usa a menudo para depurar, o simplemente para registrar información devuelta por el Arduino, en vivo. En el código que escribimos, podemos especificar al Arduino que queremos mostrar cierta información, o variables. Aquí hay un ejemplo:

/*

DigitalReadSerial


Reads a digital input on pin 2, prints the result to the serial monitor

This example code is in the public domain.
*/

// digital pin 2 has a pushbutton attached to it. Give it a name:
int pushButton = 2;

// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// make the pushbutton's pin an input:
pinMode(pushButton, INPUT);
}

// the loop routine runs over and over again forever:
void loop() {
// read the input pin:
int buttonState = digitalRead(pushButton);
// print out the state of the button:
Serial.println(buttonState);
delay(1); // delay in between reads for stability
}



Este programa nos permite ver el estado de un botón en vivo. Cuando se encuentra en la ventana del monitor serie y el programa se inicia en el Arduino, puede ver las palabras “Press button” cuando se pulsa.

La línea “Serial.begin(9600)” en la configuración es obligatoria, y se utiliza para inicializar el enlace serie de Arduino, asignándole una velocidad de transmisión. Esta velocidad puede, por supuesto, ser cambiada, pero también será necesario modificar este valor en el monitor serial para que la información sea leída en la misma frecuencia que su transmisión.






Comentarios