Felix Maocho

Para quien le interese lo que a nosotros nos interesa

1º Ejercicio de uso de pines PWM – Simular un faro y qué es una “función”

Félix Maocho
19/2/2017
.

MAQUETA-FARO-2-costense-domus-40211Enunciado

Para una maqueta nos proponemos hacer un faro que luzca con la misma cadencia del faro existente en la Ria de Ribadeo cuyo ciclo de funcionamiento es como se indica a continuación:

  • Destello de 5 décimas de segundos
  • Apagado 3 décimas de segundo
  • Destello de 5 décimas de segundos
  • Apagado 3 décimas de segundo
  • Destello de 5 décimas de segundos
  • Apagado 9 décimas de segundo
  • Destello de 10 décimas de segundos
  • Apagado 16 segundo

Material necesario

  • Tarjeta Arduino
  • Tarjeta “protoboard”
  • 2 Cables (preferiblemente uno gris y uno rojo
  • Resistencia de 220 Ω
  • Led (preferible de color blanco)
  • Simular el faro de la ria de Ribadeo

Hardware

La única diferencia que vanos a hacer es iniciar el circuito en un led PWM en ves de un digital. En este caso utilizaremos el del 9.

faro-pwm

Software

Simplemente vamos a cambiar en el programa inicial el valor del pin de salida, que ahora va a ser el 9, eliminar del “setup” la declaración del pin como OUPUT, porque los pin PWM no lo necesitan y cambiar el mandato “digitalWrite” por el mandato “analogWriter” al nivel máximo o sea 255. o 0 para apagar

/* Sketch E72.1 Simular un faro auténtico con PWM
* 1º Tres destellos de 5 décimas separados 3 décimas
* 2º Mantener apagado 6 décimas
* 3º Destello de 10 décimas
* 4º Apagado 16 segundos
* Repetir el ciclo
*/
// Área de definición de variables y parámetros
int pinblanco = 9;
int tiempo1 = 500; // duración del destello corto
int tiempo2 = 300; // separación entre destellos cortos
int tiempo3 = 600; // previo al destella largo
int tiempo4 = 1000; // duración del destello largo
int tiempo5 = 16000; // Apagado final a fin de ciclo

void setup() { }
void loop() {
// 1º Tres destellos de 5 décimas seguidos de apagado 3 décimas
// **** 1 destello
analogWrite(pinblanco, 255);
delay(tiempo1);
analogWrite(pinblanco, 0);
delay(tiempo2);
// **** 2 destello
analogWrite(pinblanco, 255);
delay(tiempo1);
analogWrite(pinblanco, 0);
delay(tiempo2);
// **** 3 destello
analogWrite(pinblanco, 255);
delay(tiempo1);
analogWrite(pinblanco, 0);
delay(tiempo2);
// 2º Mantener apagado 6 décimas de segundo (600 ms) ******
delay(tiempo3);
// 3º Destello de 10 décimas de segundos (1000 ms) **********
analogWrite(pinblanco, 255);
delay(tiempo4);
// 4º Apagado 16 segundo (16000 ms) **********************
analogWrite(pinblanco, 0);
delay(tiempo4);
// Repetir el ciclo *******************************************
}

Simulación

Les muestro el resultado en el simulador UnoArduSim. En primer lugar arranco el sketch e inmediatamente empieza el led a emitir tres ráfagas cortas y una larga y después un espacio apagado. Para que se vea mejor como funciona el programa pongo en funcionamiento  “Animate“, (barra azul), para que  puedan ver como el “loop” se realiza de arriba a abajo sin mas interrupciones que las programadas por los “delay”

 Funciones

Como ven, la cosa ha sido demasiado sencilla, Así que voy a aprovechar para enseñar una cosa nueva, el uso de funciones..

Una función es una agrupación de mandatos que se efectúan siempre en el mismo orden. Tanto “setup” como “loop” son dos funciones del sistema, El sistema sabe que primero ejecuta una sola vez “setup” y a continuación se repite indefinidamente “loop”,

Estas funciones son de lo mas sencillo, pues no necesitan ni parámetros de entrada, o valores que precisan conocer las funciones para efectuar su trabajo, ni devuelven ningún valor o parámetro de salida., Simplemente cuando se inician ejecutan los mandatos que tiene en le interior de las llaves {… } y no calculan ningún valor que haya que devover, pero ello se denominan vaciás, “void” y en la zona donde se depositan los parámetros de entrada tampoco hay nada “()” Ese sentido exactamente tienen las expresiones “void setup () ” y “void loop()” que no devuelven nada y que no necesitan ningún parámetro de entrada.

Estas son dos funciones del sistema, pero podemos construir nuestras propias funciones, que utilicen, o no, parámetros de entrada y que devuelvan, o no algún valor. La sintaxis de una función es como sigue:

tipo nombreDeLaFuncion(tipo parentrada1, tipo paraentrada2 ,….)
{
declaración de las variables que se utilicen en cálculos internos;
declaración de “salida” (si existe), o lugar donde depositamos los cálculos de la funcion;
Todos los mandatos que deseemos que ejecute la función ;
return(salida);
}

Donde

“tipo” ó “void”, es el tipo del valor que devuelve la funcion de entre todos plos posinbles. (init, long, bite,…), sólo se permite salir un unico valor, si deseamos sacr varios lo sacaremos en un “string” de varios elementos en el que cada valor que deseamos sacar ocupa una posicion determinada
nombreDeLaFuncion” nombre que damos a á función. tal cual con mayúsculas y minúsculas y  que no sea nombre reservado del sistema (por ejemplo “setup” “loop” o nombres de mandatos como “delay”, “int”, “if”,  etc
“tipo parentrada1“ tipo y nombre que  se usará internamente en lq funcion con el parámetro que se introduzca mos en primer lugar. Se pueden introducir varios parámetros  de igual forma separándolos con una, dentro del mismo paréntesis (…).

Las llaves “{….}”, limitan los mandatos sobre los que actúa la función. Dentro de la función hay que definir necesariamente las variables que se utilicen entre los paréntesis diferentes de los parámetros de entrada, incluidas si se precisa la variable que hemos llamado “parsalida” que puede tener cualquier nombre De existir un parámetro de salida entrada la última linea del programa será “return(parsalida);” , o sea el mandato que manda salir fuera de la funcion el valor del para metro de salida. Si la función no devuelve nada, esta linea se omite.

Ejemplo de función

Como sé que todo lo explicado, es un poco confuso, creo que lo mejor es poner una ejemplo cuanto antes. Definamos una función que vamos a llamar “destelloPWM” que lo que va a hacer es mandar salir por un determinado pin, un destello de determinados microsegundos de duración. Según eso la función será como sigue

void destelloPWM( int pinpwm, int tiempo) {
analogWrite(pinpwm, 255);
delay(tiempo);
analogWrite(pinblanco, 0);
}

Podíamos incluso mejorar la función y poder modificar la intensidad, añadiendo un paramento más de entrada. Esto es una de las ventajas de las funciones que con muy poco esfuerzo se puede “reciclar” una funcion para que haga cosa diferentes.

Quedaría entonces así

void destelloPWM(pinpwm, tiempo, intensidad) {
analogWrite(pinpwm, intensidad);
delay(tiempo);
analogWrite(pinpwm, 0);
}

Hemos hecho una función que una vez probada funcionará sea cual sea el pin PWM que deseemos manejar, la duración que queremos de la ráfaga e incluso la intensidad que deseamos que tenga la luz.

Pues bien hecho esto volvamos a nuestro programa anterior y utilicemos la funcion

/* Sketch E72.2 Simular un faro auténtico con PWM y funciones
* 1º Tres destellos de 5 décimas separados 3 décimas
* 2º Mantener apagado 6 décimas
* 3º Destello de 10 décimas
* 4º Apagado 16 segundos
* Repetir el ciclo
*/
// Área de definición de variables y parámetros
int pinblanco = 9; // pin pwm que vamos a utilizar
int tiempo1 = 500; // duración del destello corto
int tiempo2 = 300; // separación entre destellos cortos
int tiempo3 = 600; // previo al destella largo
int tiempo4 = 1000; // duración del destello largo
int tiempo5 = 16000; // Apagado final a fin de ciclo
int nivelPWM = 255 ; // iintensidad de la luz
// Función setup
void setup() { }
void loop() {
// 1º Tres destellos de 5 décimas seguidos de apagado 3 décimas
destelloPWM(pinblanco, tiempo1, nivelPWM);
delay(tiempo2);
destelloPWM(pinblanco, tiempo1, nivelPWM);
delay(tiempo2);
destelloPWM(pinblanco, tiempo1, nivelPWM);
delay(tiempo2);
// 2º Mantener apagado 6 décimas de segundo (600 ms) ******
delay(tiempo3);
// 3º Destello de 10 décimas de segundos (1000 ms) **********
destelloPWM(pinblanco, tiempo4, nivelPWM);
delay(tiempo5);
} // Repetir el ciclo *************
// Área de definición de funciones *************
/* Función destelloPWM
* void destelloPWM(pinpwm, tiempo, intensidad)
* Función vacía (void)
* nombre destelloPWM
* tipos y parámetros de entrada ( pin que se usa, duración de la ráfaga, nivel PWM)
*/
void destelloPWM(int pinpwm, int tiempo, int nivel) {
analogWrite(pinpwm, nivel);
delay(tiempo);
analogWrite(pinpwm, 0);
}

Como van a ver el la simulación, el programa funciona exactamente ifual al arrancar el programa empieza a emitir el “faro de Ribadeo” lanzando sus tres destello yseguido del mas largo y un silencio. Para que se vea como trabaja la función pongo el programa en  “Animate”, (la barra azul), y en “Slow Motion”,  (cámara lenta), para que se vea que cada vez que se invoca a la funcion el prgrama baja al Área de definición de las funciones y recorre la función.

Observen como se invoca una función sin respuesta, (es una función “void”)

destelloPWM(pinblanco, tiempo1, nivelPWM);

Directamente se nombra la funcion y seguido se abre paréntesis y se colocan los parámetros que alimentan a la funcion uno tras otro, separados por comas.

Como ven la forma de definir la funcion,, aparte de documentarlo un poco, (algo de buena educación hacia los demás y para uno mismo), de modo que explique que se pretende que haga la función, la función en si. consiste en una cabecera, que indica el tipo del  el parámetro de salida, (si existe) o “void! si no existe, el nombre de la función y entre paréntesis, “(….)”, los tipos y nombres de los parámetros de entrada que se utilizan dentro de la función, A continación se abre las llaves “{” y se declaran las variables locales, o variables que sólo tiene existencia dentro de la función. Es decir de coincidir su nombre con otra que este ela función “loop” u otra variable la máquina las reconoce como diferentes, una con un valor fuera de la función y otra con el valor que corresponda dentro de la función.  Luego viene los mandatos que hacen lo que se pretende que haga la función  y por último, de efectuar la función un cálculo, este valor se “saca”· fuera de la función con el mandato “return”. Como en nuestro caso la funcion no hace ningún calculo, es una función “void”,  se omite esta sentencia.

Con la incorporación del “Ärea de definición de variables“, nuestro tradicional esquema de un sketrch  le hemos añadido una sección más Con lo que cualquier sketch pasa a tener mas o menos esta estructura

*/  Nombre de sketch
* descripción de su funcionamiento si no tiene repuesta
*/
// Área de definición de variables
// definicion del tipo  y nombre de la variables // uso que las damos
void setup () ¨{…………}
void loop () {…………..}
// ´´Area de definición de funciones
* descripción de las funciones y sus mandatos

Ventajas en el uso de las funciones

La ventaja de utilizar funciones cuando la misma rutina se utiliza varias veces en el mismo sketch, como ocurre en este caso es evidente. Con ponerlo a punto en un solo lugar, tiene a punto su funcionamiento en diversos puntos. Por otra parte da claridad al programa pues dejan claro lo que hacen una colección de mandatos que a veces no se sabe bien que hacen de un primer vistazo.

Ademas vamos crean do con el s uso una librería de rutinas que ya están probadas, Por tanto si en otro programa vamos a utilizar ráfagas de luz desde un pin PWM,  ya la tenemos programadas y probadas, por tanto si somos veteranos y tenemos una extensa librería de funciones, adquirimos una alta velocidad de programación junto con una alta fiabilidad.

Por otra parte permite dividir un sckech complejo en diversos módulos independientes que actuan como cajas negras, se les entrega unos parámetros, hace unas cosas y da un parámetro de salida, esto tiene la ventaja de permitir dividir un proceso complejo 4en otrosd msas sencillos que podermos depurar más fácilmente,

La importancia de este tema que hemos introducido aquí un poco a contrapelo, es tan grande que a partir de este momento lo iremos incluyendo en nuestro curso en todos los ejemplos.

 

Félix Maocho

indice

Anuncios

19 febrero 2017 - Posted by | Curso de Arduino, Robotica | , , ,

Aún no hay comentarios.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: