Felix Maocho

Para quien le interese lo que a nosotros nos interesa

Curso de Arduino – Utilizar los pin digitales como salida de corriente a un circuito

Por Félix Maocho
22/11/2015

Objetivo de este post

Curso de Arduino – Utilizar los pin digitales como entradas de corriente a un circuito

Objetivo de este post

Repaso de los pin digitales de Arduino utilizados como OUPUT es decir como interruptores de circuitos así como de algunas de las instrucciones o mandatos más habituales.

Para las prácticas de este post se necesita la tarjeta controladora Arduino, la tarjeta de prototipado protoboard, (conveniente pero no necesaria), un PC, el cable de conexión a Arduino, un led, (en nuestro caso rojo, puede ser de cualquier color), una resistencia variable (llamadas a veces reostatos o potenciometros) y una resistencia fija de 220 homios, así como los cables de conexión , (macho/macho si se trabaja con tarjeta protoboard).

Preliminar

La tarjeta Arduino es una controladora de circuitos eléctricos, es decir un sistema capaz de activar mediante un programa, diversos  interruptores para mantener con ellos apagados o encender, diversos circuitos eléctricos a corriente continua de 5 voltios. Por tanto su misión principal es encender y apagar según le indiquen algunas instrucciones sus múltiples salidas/entradas. En este post nos centraremos en el uso como OUTPUT o sea salidas digitales es decir, como interruptores de los pines  las marcados con los números 0 al 13 que solo tienen en estado OUPUT dos estados posibles, (con alguna matización que estudiaremos). o estar abiertas, o estar cerradas y actuar permitiendo fluir la energía, del pin hacia el sumidero o tierra marcado con las letras GND,  o cortar circuito y no dejar fluir la electricidad.

En la imagen de entrada se encuentran en el borde superior de la tarjeta Arduino, Los pines 0 y 1, además de ser digitales como las demás, tiene un uso específico que es servir de entrada/salida de las comunicaciones asíncronas, (Reception/trasmition),(RX/TX), o sea de transmisión y recepción de de datos enviados o procedentes de otros aparatos. Ello hace que, de no ser imprescindible, deban dejar en el proyecto libres y sin usarlos como pines digitales, pues con frecuencia, durante el proceso de depuracion de programas, es muy conviente comunicar al PC, por esta vía, el valor que adquire una variabe en un determinado paso de ejecución de un programa.

Las entadas numeradas A1 a A5 son fundamentalmente entradas/salidas anlógicas, de las que hablaremos en otro post y como en el caso de los pines 0 y 1, conviene de ser posible no utilizarlos como digitales de no ser necesarios, pero igualmente conviene, que sepamos que en caso de necesidad, podemos utilizarlas como los pines digitales con los número 14 a 20, tanto para entrada como para salida, exactamente igual que las anteriores, motivo por el cual, simando el 0 y el 1  estos seis pines con una sola tarjeta Arduino podemos llegar a controlar hasta 20 circuitos diferentes, lo que nos da idea de la caacidad de control de esta sencilla máquina.

También utilizaremos alguna entradas y salidas no programables es decir que siempre y en cualquier caso actúan de la misma forma, como la 5V que cede siempre una corriente a 5 voltios y la GND que siempre funciona como tierra.

Salida digitales

Siendo la misión de controlar las salidas/entradas, la fundamental de Arduino vanos a dedicar este post a estudie el uso de esas salidas digitales  de todas las formas posibles, para ello partiremos de un ejemplo ya utilizado, encender y apagar un led como vimos en un post anterior.

Los pines vienen configurados como de entrada por defecto, El motivo es que así protegen mejor la placa si por error reciben una descarga de 5 volts, Cando se configuran como de salida y por error de reciben una descarga eléctrica, posiblemente resulta dañada la placa. Por ese motivo y como medida de precaución  cualquier pin de salida se le pone en serie habitualmente una resistencia de nos 220 Ω como protección.

Las salidas input/ouput de Arduino son capaces de producir una salida de electricidad a 5 Voltios, aunque con un transferencia de energía de 40 miliamperimetros, y como total podremos tener funcionando a la vez 5 salidas es decir 200 miliamperímetros, cantidad muy reducida, pero suficiente para hacer brillar un lee un led que conectemos a estos Pin, así como podemos conseguir que el Led parpadee, simplemente mandando salir o no salir energía por el pin.

El montaje del hardware es muy sencillo conectamos el pin 13 que es el que vamos a utilizar en este caso con un resistencia de 220 Ω precaución que se toma para evitar cortocircuitos, a esta resistencia se conecta el ánodo (la pata mas larga) del Led y el cátodo se conecta a un cable que va a tierra (GND).

Parpadea

Para que luzca el led. la corriente debe circular en el sentido del ánodo al cátodo, en el sentido contrario, ni luce ni deja pasar la corriente. Tal como está si el Pin 13 deja pasar corriente el led lucirá si no pasa estará apagado.

Puesto que en el post indicado allí tiene detallado este ejemplo, aquí como recordatorio sólo pongo el programa que gobernaba este ejemplo.

/*
Parpadea
Enciende un LED un segundo , luego por otro segundo lo apaga y repite
Este ejemplo es de dominio público
*/

// Declaración de variables
int salida = 13; // Damos al parámetro “salida” el valor 13

void setup() {
// inicializa el pin Numero = “salida”· (=13) como de salida (output).
pinMode(salida, OUTPUT);
}

void loop() {
digitalWrite(salida, HIGH); // Ponemos el pin parámetro “salida” en HiGH (alto)
// HIGH equivale a 5 volts que es lo que da el pin
delay(1000);                             // espera por un segundo = 1000 milisegundos
digitalWrite(salida, LOW);   // Ponemos el pin parámetro “salida” en LOW (bajo)
// LOW equivale a 0 volts o sea sin corriente
delay(1000);                            // espera por un segundo = 1000 milisegundos
}

Si no entiende hasta aquí le recomiendo repasar este post.

El funcionamiento es sencillo. En la zona de declaración de variables se define el pin que vamos a utilizar (el 13 en nuestro caso, podía ser cualquiera del 2 al 13 ) como la variable “salida”. Esto no es necesario, pues bataría substituir por el valor 13 ahí donde utilicemos “salida” pero es cómodo, porque si por cualquier causa, por ejemplo por problemas de construcción del hardware, deseamos posteriormente utilizar otra salida, basta cambiar en esta línea el valor que damos a “salida” para que el programa siga  funcionando perfectamente el programa. Hay que tener en cuenta que este programa es muy sencillo, pero si tiene cientos de lineas y la variable “salida” se utilizara en muchos lugares, de no hacerlo así, tendríamos que buscar entre todas las lineas de programa, donde la utilizamos y cambiar el valor.

En la función “setup”, (que Arduino como viene mandado de fábrica solo recorre la primera vez que se ejecuta el programa enciende de fabrica), informamos a la tarjeta que utilizaremos el pin “salida” como OUPUT, es decir que permitirá salir energía a 5 volts.

En la función “loop”, (que Arduino como viene mandado de fábrica recorre en bucle una vez tras otra mientras el programa esté conectado a la fuente de energía), indicamos que ponga en HIGH el pin llamado “salida” espere un segundo, ponga el pin llamado “salida” en LOW y espere un segundo, es decir que deje salir corriente a 5 volts, durante un segundo y lo tenga apagado durante otro segundo.

Variación sobre este programa

Si en este circuito sustituimos la resistencia que hay en el circuito por una resistencia variable, podremos hacer que el led luzca más o menos brillante, aumentando y disminuyendo la resistencia, lo cual es lógico porque la ley fundamental de la electricidad dice que la intensidad de la corriente es da diferencia de potencial dividido por la resistencia:

I =V/ R                     o lo que es lo mismo                        IxR = V

Como el pin produce siempre corriente a 5 Voltios (V), a más resistencia (R) tiene que haber menor intensidad de corriente (I) y como la energía eléctrica consumida de una corriente es en un determinado tiempo. es proporcional a la intensidad de la corriente. Para dispar la energía más deprisa, el led lucirá más brillante mientras que si la resistencia aumenta el led tendrá que disipar menos energía en el mismo tiempo, por tanto lucirá más tenue.

Potenciometro

El circuito tendrá entonces esta forma, como ven hemos sustituido una resistencia de 220 Ω, que evita que llegue excesivo voltaje al led por una resistencia variable, potenciómetro o reostato, que según se gire la cabeza presenta mas o menos resistencia, logícamente si aumentamos la resistencia disminuye el brillo de la luz y viceversa.

En este caso como ya no va a parpadear, pues si queremos que no luzca bata con poner la máxima resistencia no necesitamos los tiempos de espera, ni encender ni apagar el led, basta encenderlo en la primera vuelta y ya está, la luz subirá o bajará según demos nosotros al reostato, el programa por tanto lo modificaremos de esta forma.

/*
Regulador de luz
Enciende un LED en la primera y luce más o menos de acuerdo
con lo que giremos a el reostato
Este ejemplo es de dominio público
*/

// Declaracion de variables
int primera_vuelta =1                    // Damos a la varianble “primera_vuelta” el valor inicial 1
int salida = 13;                                 // Damos al parámetro “salida” el valor 13

void setup() {
// incializa el pin Numero = “salida”· (=13) como de salida (output).
pinMode(salida, OUTPUT);
}

void loop() {
// Solo si “primera_vuelta” = 1 hace lo siguiente
if primera_vuelta = 1 {
digitalWrite(salida, HIGH);   // Ponemos el pin parámetro “salida” en HiGH (alto)
// HIGH equivale a 5 volts que es lo que da el pin
primera_vuelta = 0                 // pone primera_vuelta a 0 para no volverlo a hacer
}
// en la primera vuelta  enciende el pin y en las demás no hace nada mas.
}

Como podemos comprobar moviendo el reostato podemos hacer que luzca mas o menos fuerte o incluso apagar del todo girando al máximo de resistencia el reostato.

Variación de la intensidad de luz del led  a través de  un programa.

El ejemplo anterior tiene el inconveniente de necesitar de la participación humana que gira el potenciómetro ¿No podríamos buscar un medio para hacer subir y bajar la intensidad de la luz solo mediante un por programa?

– Pues si. Si es posible.

Recordemos lo que es el cine, una serie de fotogramas que se enseñan en rápida secuencia de forma que le ojo humano no detecta lo que ocurre entre ambos fotogramas, que no es mas que una cortinilla negra que cubre la imagen mientras se sustituye un fotograma por el siguiente, el cine va a 24 imágenes por segundo y en televisión son 25.

Pues bien, como solo podemos ver 24 imágenes por segundo, vamos a hacer que esas imágenes brillen más o menos, ¿Como, si no podemos cambiar la intensidad de la corriente, pues jugando con la duración, como la energía consumida es la intensidad por el tiempo, si reducimos el tiempo durante el cul pasa la intensidad, reducimos la energía, es decir que si en el mismo tiempo se gasta menos energía, la luz brillará menos.

Así pues cada segundo haremos pasar 25 ciclos de apagado y encendido, por tanto cada ciclo dura una venticincoava parte de mil milésimas, es decir 40 milésimas, de las que un tiempo, estará encendido y el resto apagado, cuanto más tiempo esté encendido mas energía se gastará y más brillará.

Vamos a comprobarlo. Sólo nos basta modificar algo el primer programa de intermitencia. Cada ciclo en vez de durar dos segundos, durar-a solo 40 milsegundos y repartidos en dos periodos, uno encendido, que durara 40-x milisegundos y otro apagado que durará x segundos. Vamos a ir aumentando y disminuyendo poco a poco a para cver que la intensidad de la luz baja y sube.
El hardware será igual que en el primer caso y el led estará alimentado por el pin 13
Parpadea

Lo que cambiamos en este caso es el software como hemos indicado.

/*
Parpadeo del brillo
Enciende un LED poco a poco, y lo vuelve a a apagar lentamente y repite
Este ejemplo es de dominio público
*/

// Declaracion de variables
int salida = 13;                      // Damos al parámetro “salida” el valor 13
int x = 0;                                // Damos a la variable “x” el valor 0
int sube = 1 ;                          // Damos al parámetro “sube” el valor 1

void setup() {
// incializa el pin Numero = “salida”· (=13) como de salida (output).
pinMode(salida, OUTPUT);
}

void loop() {

if sube = 1 {                                    // Si “sube” vale 1 aumentamos el valor de x

x= x + 1;
if x = 40 {                                       // Si x alcanza el valor 40  cambiamos a “sube” = 0

sube = 0;

}

}

else {                                                 // si “sube” no es 1 = 0  hacemos lo contrario, reducir x

x= x – 1;
if x = 0  {

sube = 1;

}

]

digitalWrite(salida, HIGH);    // Ponemos el pin parámetro “salida” en HiGH (alto)
// HIGH equivale a 5 volts que es lo que da el pin
delay(x);                                      // espera x milisegundos encendido
digitalWrite(salida, LOW);      // Ponemos el pin parámetro “salida” en LOW (bajo)
// LOW equivale a 0 volts o sea sin corriente
delay(40 – x);                              // espera 40-x segundos apagado
// el ciclo completo dura  en cualquier caso 40 milisegundos
}

Salidas PWM o salida de pulsos modulados

Claro está, que como casi siempre en informática hay otras forma de conseguir hacer las mismas cosas y unas son más sencillas que otras. Los informáticos valoramos la sencillez, pues cuanto más sencillo es algo menos probabilidades hay de que al programarlas se mos pase por alto algo y metamos la pata, aparte que para poner a punto un programa, cuantas menos líneas tenga mejor que mejor.

Existen unos determinados pin que internamente por hardware hacen exactamente lo mismo que yo he hecho a mano, encender y apagar muchas veces el pin de forma que se pueda controlar con cierta facilidad, cuanta energía sale por el pin son las salidas PWM (puelse width modulation) o en castellano pines de pulso modulado, que son los pines que habitualmente junto al número de pin tienen dibujado el carácter “~” y que en Arduino UNO  normalmente son los pines 3, 5, 6, 9, 10 y 11.

Si se fijan bien en las placas Arduno UNO representadas en los esquemas anteriores a las salidas   3, 5, 6, 9, 10 y 11 las antecede un pequeño “~”, mientras que al resto de los pines o sea el 2, 4, 7, 8, 12 y 13, carecen de este símbolo, eso indica que las salidas 3, 5, 6, 9, 10 y 11 son ademas de salidas con las mismas características que el resto de los pines, Salidas PWM o salida con modulación.

La diferencia es que mientras que todos los pines puede enviar una corriente continua de 5 voltios, o no enviarla, los que pueden modular la corriente, en vez de mandar una corriente continua, mandan pulsos eléctrico de corta duración seguido de otro corto momento en que esta apagada la corriente. Como ven exactamente lo mismo que lo que hemos hecho nosotros con software en el caso anterior. Y puesto que lo hacen ellos no lo tendremos que hacer nosotros.

Lo que si le tendremos que decir que tipo de pulso queremos mandar. Como ven en el dibujo, en nuestra mano esta desde no mandar nada de energía, tener la salida siempre a 0 volts, a estar mandando siempre, o sea tener la salida a 5 volts.

En estos casos extremos, funcionan como cualquier pin o mandan o no mandan energís, pero hay muchas posibilidades intermedias, como mandar un 35% un 50% o un 75% del tiempo 5 voltios y el resto de tiempo cero voltios,

En concreto tenemos 256 pulsos diferentes, Este numero 256 se lo encontraran muchas veces en informática, como en general se encuentran cualquiera de las  potencias de 2 (256 es 2 a la octava potencia, y en base dos se es el número mayor que se escribe en un octeto, (ocho bits, o mínimos de información binaria, que tiene dos valores posibles, si o no, cargado o descargado, 0 ó y 1 ). El  nuestro caso serán ocho unos, que indican que el número 255 = 1+2+4+8+16+32+64+128  o sea con el “cero” los 255 posibles pulsos que pueden salir por los pin PWM.

PIN PWM

¿Como se usan estos pin? – Pues observe las diferencia con el programa anterior, Lo primero será que el circuito eléctrico del Led ha de estar unido a un pin PWM. Como el 13, no lo es PWM, lo trasladamos al 11, El resto del circuito sigue valiendo igual como se ve en la foto. También hemos puesto nuevamente la resistencia de 220 homios pues en algun momento el voltaje será de 5 voltios y se podría provocar un cortocircuito. Lo que varia bastante es el programa que pasa a ser ;

/*
Parpadea del brillo usando pin PWM
Enciende un LED poco a poco, y lo vuelve a a apagar lentamente y repite
Este ejemplo es de dominio público
*/

// Declaracion de variables
int salida = 11;         // Damos al parámetro “salida” el valor 11 en vez de 13
int x = 0;                   // Damos a la variable “x” el valor 0
int sube = 1;             // Damos al parámetro “sube” el valor 1

void setup() {
// No es necesario unuculzar el pin como output.
// por tanto en este caso en la funcion setup no hay que hacer nada
}

void loop() {

if sube = 1 {                     // Si “sube” =e 1 aumentamos el valor de x

x= x + 1;
if x = 255; {             // Si x=255 cambiamos el valor sube a 0

sube = 0;

}

}

else {                                // si sube = 0 hacemos lo contrario reducir x

x= x – 1;
if x = 0 {

sube = 0;

}

]

analogWrite(salida, x);                                   // Ponemos el pin parámetro “salida” en pulso “x”
// x=0 apagado x =255 equivale a 5 volts continuos
delay(25);                                                          // espera 50 milisegundos en ese estado. Entre subir y bajar la luz
//  tardará 255 x 2 x 25 = 12400 milisegundos =12,4 ”
}

Observen que tuvimos que definir las mismas variables y con los mismos valores, excepto “salida” que ahora vale 11 porque utilizaremos el pin 11 que es PWM La estructura de subir y bajar el valor del brillo no cambia salvo que en este caso tenemos que movernos entre los valores 0 y 255

En setup no hacemos nada los pin PMW están siempre abiertos indistintamente como de salida y entrada, según hagamos analogWrite o analogRead sabran actuar de salida (Write=Escribir) o entrada (Read=Leer)

Como internamente ya genera los impulsos variables según le indique x no tenemos que apagarlos, los generara hasta que se mande otra cosa.

Aqui dejamos el primer capítulo dedicado al repaso del manejo de los pin de Arduino

Félix Maocho

PD

Resuminos las funciones de Arduino que hemos utilizado  de no entender el funcionamiento o la sintaxis de alguna buscarla en el Manual en español en PDF

Documentacion

Párrafo  /* ……….   */
Comentario    // …………

Declaracion de variables y parametros 

Declaracion de numero enterio     int parva = valor

Ciclo de trabajo de Ardunino 

Función Setup   que solo se ejecuta al incio del programa    void setup() { ……….}

Función Loop     que se repite indefinidamente   void loop() { ……………….}

Mandatos en la función setup
Definir pin como salida   pinMode(salida, OUTPUT)

Mandatos en la función loop

Condicional if   if variabe = valor {….}
Codicionales if  anidados            if var1 = valor1 {….  if var2 = valor2 {…. }….}
Condicionales if else           if variabe = valor {….}   else  {….}
( Tanto l parte “if” como la “else” admiten en su interior otras funciones if o if else anidades

Abrir un pin digital  digitalWrite(pin, HIGH);
Cerrar un pin digital digitalWrite(pin, LOW);
Utilizar de salida un pin PWM  analogWrite(pin, var);

Pausa  delay(tiempo);
Incrementar una vriable  var = var +1
Reducir una variable         var = var – 1

 

22 noviembre 2015 - Posted by | General, Robotica | , , ,

Aún no hay comentarios.

Deja un comentario

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: