bclose

Los pines cuasi analógicos

Los pines analógicos

 

Objetivos

.

 
    • Comprender las diferencias entre analógico y digital.
    • Conocer las salidas cuasi analógicas de Arduino.
    • Modulación PWM

 

Material requerido.

 

  Tienda España Tienda Mexico
Kit Arduino Uno  Kit inicio UNO Kit inicio UNO
Kit Arduino MEGA Kit Inicio Mega Kit Inicio Mega

 

Analógico y digital

 

Todas las señales que hemos manejado hasta ahora con nuestro Arduino , de entrada o de salida, comparten una característica común: Son digitales, es decir que pueden tomar un valor HIGH o LOW pero no valores intermedios.

Si representamos una el valor de una señal digital a lo largo del tiempo veríamos algo así:

serie de bits

En la vida muchas cosas son así, apruebas o suspendes, enciendes la luz o la apagas, pero muchas otras son variables mensurables continuas y pueden tomar cualquier valor que imaginemos, como el ángulo del reloj o la temperatura, que aun dentro de valores finitos pueden tomar tantos valores intermedios como podamos imaginar,

A esta clase de variables las llamamos analógicas y una representación por contraposición a lo digital, sería algo como esto:

 

Analogico

No es raro que queramos controlar algo del mundo exterior con una señal analógica de forma que el comportamiento del sistema siga esa señal. Podemos por ejemplo querer variar la luminosidad de un diodo LED y no simplemente apagarlo o encenderlo

En esta sesión aprenderemos a enviar señales analógicas a los pines de salida de Arduino.

Salidas cuasi analógicas

.

Hasta ahora hemos visto como activar las salidas digitales de Arduino, para encender y apagar un LED por ejemplo. Pero no hemos visto como modificar la intensidad del brillo de ese LED. Para ello, tenemos que modificar la tensión de salida de nuestro Arduino, o en otras palabras tenemos que poder presentar un valor analógico de salida.

Para empezar tenemos que dejar claro que los Arduino carecen de salidas analógicas puras que puedan hacer esto (con la notable excepción del Arduino DUE).

Pero como los chicos de Arduino son listos, decidieron emplear un truco, para que con una salida digital podamos conseguir que casi parezca una salida analógica.

A este truco se le llama PWM, siglas de Pulse Width Modulation, o modulación de ancho de pulsos. La idea básica es poner salidas digitales que varían de forma muy rápida de modo que  el valor eficaz de la señal de salida sea equivalente a una señal analógica de menor voltaje.

Lo sorprendente es que el truco funciona.

MOdulacion por anchura de pulsos

 

Fijaros en la anchura del pulso cuadrado de arriba. Cuanto mas ancho es, mas tensión promedio hay presente entre los pines, y esto en el mundo exterior es equivalente a un valor analógico de tensión comprendido entre 0 y 5V.  Al 50% es equivalente a una señal analogica del 50% de 5V, es decir 2,5. Si mantenemos los 5V un 75% del tiempo, será el equivalente a una señal analógica de 75% de 5V = 3,75 V.

Para poder usar un pin digital de Arduino como salida analógica, lo declaramos en el Setup() igual que si fuera digital:

pinMode( 9, OUTPUT) ;

La diferencia viene a la hora de escribir en el pin:

digitalWrite(9, HIGH);                        //Pone 5V en la salida
digitalWrite(9, LOW);                         //Pone 0V en la salida
analogWrite( 9, V) ;

analogWrite escribe en el pin de salida un valor entre 0 y 5V, dependiendo de V (que debe estar entre 0 y 255).

De este modo si conectamos un LED a una de estas salidas PWM podemos modificar su brillo sin más que variar el valor que escribimos en el pin.

Pero hay una restricción. No todos los pines digitales de Arduino aceptan poner valores PWM en la salida. Solamente aquellos que tienen un símbolo  ~ delante del número. Fijaros en la numeración de los pines de la imagen:

detalle pines

solo los que llevan simbolo

 
  • Solamente los pines 3, 5, 6, 9, 10 y 11 pueden hacer PWM y simular un valor analógico en su salida.
  • Si intentas hacer esto con un pin diferente, Arduino acepta la orden tranquilamente, sin error, pero para valores de 0 a 127 entiende que es LOW y para el resto pone HIGH y sigue con su vida satisfecho con el deber cumplido.
 

 

Modificando el brillo de un LED

.

Vamos a hacer el típico montaje de una resistencia y un diodo LED, similar al de la sesión 3, pero asegurándonos de usar uno de los pines digitales que pueden dar señales PWM. En la imagen he usado el pin 9.
Podemos escribir un programa parecido a esto:

void setup()                                               //Prog_10_1
   {  
       pinMode( 9, OUTPUT) ;  
   }
void loop()
   {
       for ( int i= 0 ; i<255 ; i++)
           {
                analogWrite (9, i) ;
                delay( 10);
           }
   }

El LED va aumentando el brillo hasta un máximo y vuelve a empezar bruscamente. Podemos modificar un poco el programa  para que la transición sea menos violenta:

void setup()                                      // Prog 10_2
   { 
       pinMode( 9, OUTPUT) ;  
   }

void loop()
{
       for ( int i= -255 ; i<255 ; i++)
             {
                 analogWrite (9, abs(i)) ;
                 delay( 10);
             }
}

Aquí aprovecho ( por pura vagancia) para hacer el ciclo de subir y bajar el brillo del LED con un único bucle. La función abs(num), devuelve el valor absoluto o sin signo de un número num, y por eso mientras que i viaja de -255 a 255, abs(i) va de 255 a 0 y vuelta a subir a 255. ¿Que os parece el truco?

 

Resumen de la sesión

.

 
    • Describimos a grandes rasgos la diferencia ente valores digitales y valores analógicos.
    • Hemos visto como simular valores analógicos en una salida digital de Arduino.
      • Solo con las salidas que lo aceptan: pines 3, 5, 6, 9, 10 y 1.
      • Podemos asignar valores entre 0 y 255.

 

 

 

 

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(24) Comments

  • Avatar for Charly

    Según leo aquí (https://www.arduino.cc/en/Tutorial/AnalogInputPins) parece ser que los pines analógicos sí pueden usarse como salidas digitales, aunque no lo he comprobado físicamente.
    Pone:

    Pin mapping
    The analog pins can be used identically to the digital pins, using the aliases A0 (for analog input 0), A1, etc. For example, the code would look like this to set analog pin 0 to an output, and to set it HIGH:

    pinMode(A0, OUTPUT);
    digitalWrite(A0, HIGH);

  • Avatar for Charly
    • Ivan Uriarte

    Muchas gracias Paco, feliz año para ti también!

  • Avatar for Charly
    • Paco

    Feliz Año y Gracias!, por tan excelente trabajo, de lo mejor que hay en la web.
    Estoy empezando con todo esto y tras leer varios libros y tutoriales, aquí es donde realmente estoy aprendiendo.

    Fantástico lo del abs, son de esas cosas que cuando las ves pareces obvias, pero se te tienen que ocurrir, y hay está la diferencia.

  • Avatar for Charly
    • Ivan

    Hola Marcelo, algunos de los pines se pueden usar como salida analógica o digital, son los que tienen un dibujo de una onda al lado. Usamos analogWrite cuando queremos utilizarlos como salida analógica, y digitalWrite cuando los usamos como salidas digitales.

  • Avatar for Charly
    • Marcelo v

    Buenos días, una pregunta en el uso de analogWrite y digitalwrite tengo una pequeña confusión, hay un sketch de sensor de temperatura y tiene una entrada análogica A0 que conecta la base del transistor, y tengo un led en el pin 13 digital aquí para prender el led usan digitalWrite.
    En otro sketch que usan una fotocelda también hay una entrada analógica A0 que conecta un pin de la fotocelda y hay un led conectado al pin 13 digital, aquí para prender el led usan analogWrite pq me podrían ayudar cuál es la razón por favor

  • Avatar for Charly
    • Chopi

    Todo ok. Supongo que esto servirá, en caso de poner un motor en lugar del led, y así variar velocidades. Interesante.

  • Avatar for Charly
    • Admin

    Es una decision de diseño del fabricante sin una razon especial, podiamos haber usado 10 o 12 bits si hubiera querido

  • Avatar for Charly
    • Admin

    El usar 256 niveles es simplemente porque en efecto usamos un byte para representarlo, permitiendonos 2^8 = 256 valores diferentes a la hora de escribir en las puertas PWM

    Pero fijate que cuando usamos las puertas analogicas para leer arduino usa 10 bits y por eso te permite 2^10 = 1024 niveles distintos
    La decision de cuantos bits se usan es bastante arbitraria de diseño del procesador

  • Avatar for Charly
    • Ivan

    Hola Julio, efectivamente es porque utiliza un byte. Se usan más bytes si necesitas que tener una resolución mayor, es decir si necesitas valores más precisos en la conversión analógico a digital. Con un byte la resolución que tienes 5V/256=19.5mV Un saludo!

  • Avatar for Charly

    Supongo que para representar de 0 a 5V , con 1 byte es suficiente……es ese el motivo?

  • Avatar for Charly

    Buenas…..porqué está acotado a valores entre 0 y 255 ? esto es la información de 1 byte… pero porqué a 1 byte?

  • Avatar for Charly
    • Admin

    Si por un pin de los marcados como analogicos, te refieres a los que tiene capacidad PWM la respuesta es si.
    Pero si te refieres a los pines A0 a A5 que son las entrada sanalogicas la respuesta es no

  • Avatar for Charly
    • Fran

    Primero mi mas sincera enhorabuena, genial la web.
    Ahora una cuestion. ¿Puedo poner un led en un pin de los marcados como analogico y sin cambiarlo a digital, hacer lo mismo con dicho led?, es decir, encenderlo y apagarlo con la intensidad que queramos?

  • Avatar for Charly
    • Admin

    Hola Miguel,
    No puede mostrate el resultado porque no has incializado la puerta serie con: Serial.begin(9600) ;

  • Avatar for Charly
    • Miguel

    Me gustaría saber por qué así no me escribe en pantalla los voltajes que va obteniendo. Gracias.

    void setup() //Prog_10_1
    {
    pinMode( 9, OUTPUT) ;

    }
    void loop()
    {
    for ( int i= 0 ; i<255 ; i++)
    {
    Serial.print(String(i));
    analogWrite (9, i) ;
    delay( 10);

    }

    }

  • Avatar for Charly
    • Admin

    Hola Edgar, era un error de esos que causan los duendes de la ecritura. Ya esta corregido, porque naturalmente con 8 bits para codificarlo podemos asignar del 0 al 255. Muchas gracias por indicarmelo

  • Avatar for Charly
    • Edgar Cano

    Una pregunta, en el resumen de la sesión indica que podemos asignar valores de 0 a 254, sin embargo leí en el libro de proyectos de Arduino que el valor puede ser de 0 a 255, pero no entiendo porque? solo se que el PWM de la Arduino UNO es de 500Hz

  • Avatar for Charly

    Lo mismo mi mas sinceras gracias.

  • Avatar for Charly
    • Juan Luis

    Gracias!
    Gracias por su dedicación en tiempo y trabajo para lograr estos tutoriales, bien explicados, muy bien estructurados y bien acertados.
    En lo poco que he logrado ver de sus explicaciones, opino que es un excelente trabajo y un gran aporte para los seguidores, usuarios y programadores de dispositivos arduino.

  • Avatar for Charly
    • David

    Estoy siguiendo tu tutorial, y solo quería agradecerte todo el trabajo que tiene hacer algo así, he visto varios tutoriales pero la verdad ninguno que lo explique para aprender de forma tan sencilla y bien esquematizada, por no hablar de los trucos como el que has puesto de abs, me ha costado un rato comprenderlo XD.

    Lo dicho, muchas gracias por este gran trabajo!

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login