jueves, 28 de abril de 2016

Array de salidas Arduino

En esta entrada utilizare una variable del tipo Array para guardar los pines de las salidas que utilizare, también utilizare la función switch case.
La aplicación de todo esto será un medidor de potencia que nos indicara el valor de la entrada analógica en función del número de leds encendidos siendo uno el mínimo y diez el máximo.


Comencemos por el código:

Primero declararemos la variable array como un array de enteros y añadiremos los valores que contendrá esta cadena:

   int Leds[]={2,3,4,5,6,7,8,9,10,11};

Luego declaramos otras variables de utilidad:

   int estado;
   int Poten = 0;
   int valorPoten = 0;
   int i;

Ahora configuraremos los pines del array Leds como pines de salida dentro del void setup(), para hacerlo de una manera mas rápida y sencilla utilizare un bucle for para configurar cada uno de los pines:

   void setup()
  {
     for(i=0;i<10;i++) // la variable i la iniciamos en 0 ya que la primera posición del array siempre es        // 0 posición que en nuestro caso equivale al valor 2 este bucle se ejecutara 10 veces con lo que el        // ultimo valor de i sera 9 que coincide con la ultima posición  del array
     {
       pinMode(Leds[i],OUTPUT);
     }
  }

Bien una vez configurados los pines como salidas digitales llega la parte de crea nuestro "indicador de potencia" con led, esto lo haremos dentro de una función propia que ejecutaremos dentro del void loop(). Primero escribiré el código dentro del void loop() y luego creare la función que se encargara de encender los led en la secuencia correcta cada vez que la llamemos desde el void loop:

  void loop()
  {
    valorPoten = analogRead(Poten);// guardamos el valor de la entrada analógica dentro de una               variable
    estado = map(valorPoten,0,1023,0,10);//Convertimos el valor de la variable en valores de 0 a 10
    Secuencia();// Llamamos a la función secuencia
  }

Una vez creado el codigo que se ejecutara en bucle creamos la función Secuencia, esta función es la encargada de crear la secuencia de leds, tendrá como característica que sera del tipo void y no recibirá ningún valor de la función principal ya que la variable estado es de carácter global. Dentro de ella habrá un switch case que sera el encargado de encender los leds en función del valor de estado:

  void Secuencia()
  {
    switch(estado)
    {
      case 0:
      digitalWrite(Leds[0],HIGH);
      for(i=1;i<10;i++)
     {
       digitalWrite(Leds[i],LOW);
      }
      delay(50);
      break;
    case 1:
    for(i=0;i<2;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=2;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 2:
    for(i=0;i<3;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=3;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 3:
    for(i=0;i<4;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=4;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 4:
    for(i=0;i<5;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=5;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 5:
    for(i=0;i<6;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=6;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 6:
    for(i=0;i<7;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=7;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 7:
    for(i=0;i<8;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=8;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 8:
    for(i=0;i<9;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=9;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 9:
    for(i=0;i<10;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    delay(50);
    break;
   
  }
}

Aquí abajo os dejo el esquema de cableado y el código completo:
Las resistencias de de 220 Ohm y el potenciómetro es de 10 kOhm.



Código completo:

int Leds[]={2,3,4,5,6,7,8,9,10,11};
int estado;
int Poten = 0;
int valorPoten = 0;
int i;
void setup()
{
  for(i=0;i<10;i++)
  {
    pinMode(Leds[i],OUTPUT);
  }
}

void loop() 
{
  valorPoten = analogRead(Poten);
  estado = map(valorPoten,0,1023,0,10);
  Secuencia();
}
void Secuencia()
{
  switch(estado)
  {
    case 0:
    digitalWrite(Leds[0],HIGH);
    for(i=1;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 1:
    for(i=0;i<2;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=2;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 2:
    for(i=0;i<3;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=3;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 3:
    for(i=0;i<4;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=4;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 4:
    for(i=0;i<5;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=5;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 5:
    for(i=0;i<6;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=6;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 6:
    for(i=0;i<7;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=7;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 7:
    for(i=0;i<8;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=8;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 8:
    for(i=0;i<9;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    for(i=9;i<10;i++)
    {
    digitalWrite(Leds[i],LOW);
    }
    delay(50);
    break;
    case 9:
    for(i=0;i<10;i++)
    {
    digitalWrite(Leds[i],HIGH);
    }
    delay(50);
    break;
    
  }
}



jueves, 14 de abril de 2016

Comunicación Serial 2

En esta entrada enviaremos datos desde el ordenador al arduino, en concreto enviaremos un "0" con el cual al recibirlo el arduino encenderá un led y cuando se le envié cualquier otra cosa el led se apagara. Ahora os dejo un ejemplo muy sencillo de como haríamos lo descrito anteriormente:



Comencemos con el código:

Primero comenzaremos con la declaración de las variables:

     int Led = 13;
     char Estado; //En esta variable guardaremos el carácter recibido por el puerto serie

Una vez declaradas las variables iniciamos el puerto serie y configuramos el pin 13 como una salida dentro del void setup():

   void setup()
   {
     Serial.begin(9600);
     pinMode(Led,OUTPUT);
     Serial.println("Inicio...");
     delay(500);
   }

Bien ahora escribiremos el código que nos permitirá leer el puerto serie desde el arduino dentro del void loop(), el valor enviado desde el ordenador lo guardaremos dentro de la variable Estado para luego compararla dentro de un if(), esto también se podría hacer con la función switch case de la cual hablaré en otra entrada:

  void loop()
  {
    if(Serial.available() > 0)//Cuando reciba datos por el puerto serial
    {
      Estado = Serial.read();//Cargara el dato recibido dentro de la variable  Estado
 
      if(Estado == '0')
      {
        digitalWrite(Led,HIGH);
        Serial.println("Led on");
        delay(1000);
      }
      else
      {
        digitalWrite(Led,LOW);
        Serial.println("Led off");
        delay(500);
      }
    }
  }

Aquí os dejo el código completo.

int Led = 13;
char Estado;
void setup()
{
  Serial.begin(9600);
  pinMode(Led,OUTPUT);
  Serial.println("Inicio...");
  delay(500);
}

void loop()
{
  if(Serial.available() > 0)
  {
    Estado = Serial.read();
 
    if(Estado == '0')
    {
      digitalWrite(Led,HIGH);
      Serial.println("Led on");
      delay(1000);
    }
    else
    {
      digitalWrite(Led,LOW);
      Serial.println("Led off");
      delay(500);
    }
  }
}

lunes, 11 de abril de 2016

Salidas PWM en arduino

Los pines pwm permiten simular una salida analógica con el arduino con valores de 0V a 5V, estos valores los produce activando el pin durante un tiempo determinado con una frecuencia de 500Hz, este tiempo vendrá determinado por el valor que escribamos en la salida con la función analogWrite(), en ella podremos escribir valores entre 0 y 255 siendo 0 siempre apagado y 255 siempre encendido, esto se entiende mejor en esta gráfica, las líneas verdes representan periodos de 2 milisegundos:

Bien ahora llega el momento del ejemplo. En esta entrada veremos como variar la intensidad de un led utilizando el valor de entrada de un potenciómetro y un pin pwm, los pines pwm son todos aquellos marcados con ~, o lo que es lo mismos los pines 3, 5, 6, 9, 10, y 11 en el arduino uno.

Al final de la entrada dejare el código completo del ejemplo:

Comencemos con el código:
Primero declaramos las variables que contendrán el valor de salida, el valor de entrada del potenciómetro y los pines que utilizaremos:

   int valor = 0; //Esta variable contendrá el valor del potenciómetro
   int VSalida  = 0; // Mientras que esta contendrá el valor de la salida
   int Led = 9;
   int poten = 0;

Ahora dentro del void setup() iniciamos el puerto serie para poder observar los valores del potenciómetro y de la salida desde el pc y declaramos el pin 9 como salida:

   void setup() 
   {
     pinMode(Led,OUTPUT);
     Serial.begin(9600); 
     Serial.println("Iniciando..."); 
     delay(50);
   }

Dentro del void loop leeremos la entrada analógica del potenciómetro y la convertiremos con la ayuda de la función map(), ya que los valores de salida van de 0 a 255 mientras que los valores de entrada van de 0 a 1023, para luego escribirlos en la salida utilizando la función analogWrite():

  void loop() 
  {
    valor = analogRead(poten);
    VSalida = map(valor,0,1023,0,255); /*En la función map() primero escribimos la variable que             queremos convertir seguido del valor mínimo y del valor máximo de dicha variable, después de           estos valores escribimos los valores a los que deseamos convertir nuestra variable comenzando           tambien por el valor mínimo y luego el máximo aunque estos valores se podrian invertir para              conseguir el efecto contrario por ejemplo: cuando el valor de la variable sea 0 la salida puede ser        255*/
    Serial.print("Valor del potenciómetro: ");
    Serial.println(valor);
    Serial.print("Valor de la Salida: ");
    Serial.println(VSalida);
    analogWrite(Led,VSalida); //Esta función trabaja de una manera parecida a la función                         //digitalWrite() solo que en ella se pueden escribir valores concretos
    delay(50);
  }

Aquí os dejo el cableado:


Código completo:

int poten = 0;
int valor = 0;
int Led = 9;
int VSalida = 0; 
void setup() 
{
 pinMode(Led,OUTPUT);
 Serial.begin(9600); 
 Serial.println("Iniciando..."); 
 delay(50);

}

void loop() 
{
  valor = analogRead(poten);
  VSalida = map(valor,0,1023,0,255);
  Serial.print("Valor del potenciómetro: ");
  Serial.println(valor);
  Serial.print("Valor de la Salida: ");
  Serial.println(VSalida);
  analogWrite(Led,VSalida);
  delay(50);
}

miércoles, 6 de abril de 2016

Lectura de entada Analógica desde el puerto Serial (Comunicación Serial 1)

En esta entrada explicaré como leer un potenciómetro con el arduino y observar el valor del mismo en vuestro ordenador, como en las entradas anteriores al final encontrareis el código completo:


Las entradas analógicas del Arduino leen valores comprendidos entre 0 y 1023 ya que tiene una resolución de 10 bits.

El puerto serie del arduino uno está relacionado con los pines 0 y 1 con lo que si se está utilizando el puerto serie para leer valores desde el ordenador no podremos utilizar estos pines ni como entradas ni salidas normales. Los valores a los que se puede configurar los baudios del puerto en Arduino son: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, o 115200.

Empecemos con el programa:

     1.Lo primero es declarar las variables que contendrán el pin de analógico y el valor del mismo:
             int Led = 13;
             int Poten = 0; //Esta variable corresponde al pin A0 en nuestro Arduino
             int VAnalog = 0; //En esta variable guardaremos el valor del potenciómetro

    2.Declaramos el Led como una salida e iniciamos el puerto serie, todo esto lo hacemos dentro del          void setup:
            void setup() 
            {
               pinMode(Led,OUTPUT);
               Serial.begin(9600); //Con esta función iniciamos el puerto serie del Arduino y le indicamos                  //los Baudios entre paréntesis en mi caso lo configuro a 9600
               Serial.println("Iniciando..."); //Con esta función escribimos en el puerto serie el texto entre                  //paréntesis y situamos el cursor en la siguiente línea
               delay(50);// hacemos una pequeña pausa de 50 milisegundos
             }
     3.Ahora llega el momento de la lectura del pin analógico, esto lo haremos dentro del void loop:
        void loop() 
        {
           VAnalog = analogRead(Poten);//Con esta función leemos el pin analógico A0 y guardamos el              //valor en la variable para luego trabajar con el 
           Serial.print("Valor del potenciómetro: ");
           Serial.println(VAnalog);
           if(VAnalog >= 512)//En estas lineas del código encenderemos el Led cuando el valor del                      //potenciómetro sea mayor o igual de 512 apagando cuando sea menor de ese valor
          {
            digitalWrite(Led,HIGH);
           }
           else
          {
            digitalWrite(Led,LOW);
           }
         }
Como cablear el potenciómetro:
El potenciómetro tiene una resistencia de 100 Kohms.

Como visualizar los datos desde el ordenador y el IDE de Arduino:
El propio compilador de arduino cuenta con una herramienta que nos permite leer y escribir en el puerto serie del Arduino, esto es muy útil para programas como este en el que leemos un valor de una entrada analógica. Para acceder a el hacemos clic en la lupa y nos abrirá una ventana desde la cual podremos visualizar y configurar la comunicación serie con el arduino.

Aquí os dejo el código completo:
   int Led = 13;
   int Poten = 0;
   int VAnalog = 0;
   void setup() 
  {
    pinMode(Led,OUTPUT);
    Serial.begin(9600); 
    Serial.println("Iniciando..."); 
    delay(50);
   }

   void loop() 
  {
    VAnalog = analogRead(Poten);
    Serial.print("Valor del potenciómetro: ");
    Serial.println(VAnalog);
    if(VAnalog >= 512)
    {
      digitalWrite(Led,HIGH);
    }
    else
   {
      digitalWrite(Led,LOW);
   }

  }





lunes, 4 de abril de 2016

Ejemplo de Botón con Arduino

En esta entrada veremos como se debe conectar un pulsador o un botón al arduino, al final de la entrada encontrareis el cableado y el código completo.


Lo primero es el código:

En primer lugar declararemos las variables que contendrán los pines que utilizaremos.
  int Boton = 2; //La entrada del botón estará situada en el pin 2.
  int Led = 13; //La salida del led estará en el pin 13.

Después crearemos una variable que contendrá el valor del pulsador.
   int estado; 

Bien ahora viene la parte de declarar el pin del boton como entrada y el pin del led como una salida esto lo haremos dentro del void setup:
  void setup() 
  {
    pinMode(Boton,INPUT); //Declaramos el Pin del botón como una entrada.
    pinMode(Led,OUTPUT); //Declaramos el Pin del led como salida.
  }

Una vez que declaramos los pines escribiremos el programa dentro del void loop, en mi caso al pulsar el botón se encenderá el led de la placa vinculado a la salida 13 mientras permanezca pulsado una vez que lo sueltes tardara medio segundo en apagarse:
  void loop() 
  {
    estado = digitalRead(Boton); //Leemos el pin del botón
    if(estado == HIGH) //Comparamos el valor del pin
    {
      //Cada vez que pulsemos el Botón la salida se activará
      //mientras el boton este pulsado
      digitalWrite(Led,HIGH);
      delay(500);  
    }
    else
    {   
      digitalWrite(Led,LOW);
     }
 }

Una vez finalizado el código nos toca cablear el botón al arduino los botones se cablean a la entrada siguiendo un esquema pull down ya que de esta manera cuando el interruptor este abierto la corriente se dirigida hacia la resistencia dejando un valor 0 en el Pin y si el interruptor esta cerrado la corriente se moverá hacia el Pin dejando un valor lógico HIGH. La resistencia utilizada es de 10Kohm y recordad que yo utilizo el propio led del arduino y por eso no cableo la salida 13.


Ahora solo queda cargar el código en el Arduino y comprobar que el led se enciende cada vez que pulsamos el botón, aquí os dejo el código completo:

//Ejemplo de Botón con arduino
int Boton = 2; //La entrada del botón estará situada en el pin 2
int Led = 13; //La salida del led estará en el pin 13
int estado; //Creamos una variable para guardar el estado del botón
void setup() 
{
  pinMode(Boton,INPUT); //Declaramos el Pin del botón como una entrada
  pinMode(Led,OUTPUT); //Declaramos el Pin del led como salida
}

void loop() 
{
  estado = digitalRead(Boton); //Leemos el pin del botón
  if(estado == HIGH) //Comparamos el valor del pin
  {
    //Cada vez que pulsemos el Botón la salida se activará
    //mientras el boton este pulsado
    digitalWrite(Led,HIGH);
    delay(500);  
  }
  else
  {   
    digitalWrite(Led,LOW);
   }
}