Estructura de decision IF

Hola a todos una vez mas:

En esta ocasión veremos la estructura de decisión IF. Cuando queremos comenzar a darle un poco mas de "inteligencia" a nuestros programas es ideal poner partes en las que nuestro programa tome decisiones del tipo:

Si pasa "ESTO", haga "ESTO OTRO".

La sintaxis es la siguiente:

If (condición)
    {
           Instrucciones;

           Instrucciones;
    }
Todo lo que esta dentro de las llaves se ejecuta cuando se cumple la condición entre el paréntesis, de modo contrario el programa ignora todo el bloque que esta entre las llaves.

Para evaluar la condición se ocupa lo que se llama, "Operadores de comparación".

A continuación  los operadores usados en Arduino:

If (a == b)   a es igual a b. Notar que "=" es asignación, y "==" es comparación.
If (a != b)    a es distinto de b.
If (a < b)     a es menor que b.
If (a > b)     a es mayor que b.
If (a <= b)   a es menor o igual a b.
If (a >= b)   a es mayor o igual a b.


Esta estructura es fundamental para la toma de decisiones de nuestros robots. Ahora un ejemplo de como podemos usar esta estructura. Junto a la comunicación serial para poder controlar luces desde el teclado del PC.

Materiales necesarios:
1.- Arduino uno.
2.- 3 diodos led rojo, verde y amarillo
3.- Computador con entorno Arduino instalado.

Montaje:


Codigo:

#define ledRojo 7
#define ledVerde 8
#define ledAmarillo 9

char lecturaDeTeclado;

void setup()
{
  Serial.begin(9600);
  pinMode(ledRojo,OUTPUT);
  pinMode(ledVerde,OUTPUT);
  pinMode(ledAmarillo,OUTPUT);
}

void loop()
{
  if(Serial.available() > 0)
  {
    digitalWrite(ledRojo,LOW);
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmarillo,LOW);
    
    lecturaDeTeclado = Serial.read();
    
    if(lecturaDeTeclado == 'a')
    {
      digitalWrite(ledRojo,HIGH);
    }
    
    if(lecturaDeTeclado == 's');
    {
      digitalWrite(ledVerde,HIGH);
    }
    
    if(lecturaDeTeclado == 'd')
    {
      digitalWrite(ledAmarillo,HIGH);
    }
  }

}





Comunicación Serial en Arduino

¿Que es la comunicación serial?

La comunicación serial consiste en el envio de un bit de informacion por vez, por eso es serial, y se realiza a un cierto ritmo acordado entre el emisor y receptor.

Este ritmo es conocido como "baud rate" , que es la cantidad de baudios por segundo que manejará nuestro puerto serie. El baudio es una unidad de medida que representa la cantidad de simbolos por segundo en un medio de transmision analógico.


Para que arduino se comunique con tu computadora, necesita una especie de traductor que transforme esta señal. Arduino usa el integrado FT232R, que es un conversor Serial - USB.

En el programa o Sketch no es necesario incluir la libreria Serial al principio. Solo se debe iniciar la comunicación en el bloque de setup con el comando Serial.begin(baud rate);.

Luego de eso, en el bloque loop(), podemos usar las distintas funciones incluidas en la librería Serial, que a continuación se describen.



write()

Escribe datos en forma de bytes o series de bytes y los envía por el puerto serie. Su sintaxis, o la forma de insertar esta función dentro de tu código es la siguiente:

Serial.write(dato_a_enviar);



print() y println()
A diferencia del comando anterior, la función print() y println(), Imprime datos en el puerto serie, los que pueden ser leídos desde el monitor serial incluido en el IDE de Arduino.
La diferencia entre estas dos funciones es que print(), imprime los valores seguido uno de otro. En cambio println() imprime un salto de linea al termino de cada sentencia
La sintaxis y el resultado a continuación, para poder analizar la diferencia.


Serial.print("Saludos");
Serial.print("desde");
Serial.print("ArduRobotics");

SaludosdesdeArduRobotics


Serial.println("Saludos");
Serial.println("desde");
Serial.println("ArduRobotics");

Saludos
desde
ArduRobotics

Ademas, la funcion print() puede imprimir en distintos formatos que son especificados en el segundo argumento de la función quedando la sintaxis como sigue:

Serial.print(dato,FORMATO);

Las opciones para FORMATO son:
BIN: formato binario, base 2
OCT: formato octal, base 8
DEC: formato decimal, base 10
HEX: formato hexdecimal, base 16

Carga en tu Arduino el siguiente código y podrás ver el valor que entrega la función print() con los diferentes formatos.

int entrada = 0;
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if(Serial.available()>0)
  {
    entrada = Serial.read();
    Serial.print("Formato Binario: ");
    Serial.println(entrada,BIN);
    Serial.print("Fomato Octal: ");
    Serial.println(entrada,OCT);
    Serial.print("Formato Decimal: ");
    Serial.println(entrada,DEC);
    Serial.print("Formato Hexadecimal: ");
    Serial.println(entrada,HEX);
    Serial.println("**************************");
  }
}


read()
La función read lee los datos que se escriban en el puerto serie, si se hace un programa en el que el usuario tenga que ingresar información, este comando haría posible leer y luego procesar el ingreso de información, por ejemplo desde teclado.
También se puede usar una variable para almacenar el dato que se lea desde el puerto serial.
Si se analiza el código anterior se puede ver que se usa Serial.read() para leer lo que se ingresa por el teclado y se guarda en la variable 'entrada'.

available()
 Esta función devuelve el numero de bytes disponibles para lectura, o sea, que si es mayor que cero es por que hay datos disponibles para lectura. Estos bytes se guardan provisoriamente en un buffer o espacio de memoria disponible para tal fin.
Entonces si se quiere que un programa solo reaccione cuando hayan datos en el puerto serie, se puede usar esta función.


Funcionamiento del Servomotor

Hola otra vez:

Para esta ocasión quiero explicar de forma sencilla, espero, la teoría de funcionamiento de un servomotor. Elemento que es muy usado en robótica por algunas características como:
  • Torques elevados
  • Control de ángulo de giro
  • Estabilidad en el ángulo deseado
  • Control de velocidad
  • Facilidad de control
 El servo se compone de algunas partes principales
  1. El motor, normalmente DC de 5V para los servos de uso general
  2. Un sistema de reducción de engranajes, que reduce las revoluciones y aumenta el troque del servo
  3. La electrónica que se encarga del control del servo, esta incluye un potenciómetro que controla la posición en el caso de servos de giro restringido o la velocidad en los de giro continuo.
PWM

La electrónica del servomotor trabaja con "Modulación de Ancho de Pulso", que es mas común escuchar por sus siglas en ingles "Pulse Width Modulation" PWM.
No pretendo profundizar en este aspecto pero es básicamente el tiempo en que la señal es de 5V respecto al tiempo que es 0V en cada ciclo. Cuanto mayor sea el ancho de pulso (5V) de la señal, mayor es el ángulo del servo.
La relacion entre el angulo del servo y el ancho del pulso (medido en milisegundos) es la siguiernte:
 

FUNCIONAMIENTO

Por otra parte el sistema electrónico lo que hace es simple (lo que no es tan simple es COMO lo hace): compara el ángulo deseado con el ángulo actual del servo y realiza una corrección.
En todo este proceso, la velocidad a la que gire el motores proporcional a la diferencia entre el ángulo deseado y el actual del servo, es por esta razón que podemos controlar la velocidad de un servomotor de giro continuo.

Servo de giro restringido
En el servo de giro restringido, el eje de salida del servo va conectado a un potenciómetro que registra la posición actual del servo y la va comparando con la posición deseada. Cuando estas posiciones son iguales el servo queda fijo en la posición.
Este servo es ideal para manipuladores robóticos, es de fácil montaje y control.


Servo de giro continuo
En un servo de giro continuo, el eje de salida esta desconectado del potenciómetro y este ultimo viene normalmente fijo a 90°. Por lo que el motor puede girar libre. 
Para el control de este servo si establecemos nuestra posición deseada a 0° el motor girará en un sentido a máxima velocidad intentando corregir el error generado por la diferencia entre posicion deseada y posicion actual.
Si la posición deseada fuera 180°, el motor gira a toda velocidad en el otro sentido. 
Y cuando la posición deseada es 90°, o sea, igual a la posición que tiene el potenciómetro, el motor se detiene, ya que el error calculado es cero.




El ciclo For en Arduino

Hola a todos:

En esta ocasión veremos una estructura de programación que sirve para repetir una o varias acciones un determinado numero de veces, el ciclo FOR.
Muchas veces queremos que nuestro Arduino realice alguna actividad cierta cantidad de veces, o que repita algún patrón como llenar una Matriz de datos o leer dicha matriz.
Esta estructura, personalmente la he ocupado en manipuladores robóticos, dando una pequeña pausa entre el avance grado a grado de un servomotor. Con esto se consigue que el motor avance mas lento y el movimiento sea mas suave. Pero eso es tema para otra ocasión.
La cosa es que para nuestro Arduino también contamos con esta estructura de programación, la sintaxis es la siguiente:

for(valor_inicial ;  valor_final ; incremento o decremento de valor)
{
   //dentro de las llaves van los comandos que se repetirán
  //cuantas veces se repita el ciclo
}

Ejemplo:

for(int i=0;i<5;i++)
{
// instrucciones y comandos
}

Esta estructura se puede ocupar para controlar la intensidad de un LED, manejar un Servomotor, manejar secuencias entre otros.


Variar la intensidad de un LED
Lo primero que hay que hacer es montar el siguiente circuito, siempre teniendo en cuenta que la patita larga del led va al positivo y la patita corta al negativo:



Conectando el Led al pin 11 y a la tierra del Arduino, te dejo el siguiente código para que puedas copiar y pegar en la IDE de arduino, puedes ir modificando los tiempos de delay cambiando el valor de la variable "Pausa" y ver como cambia el comportamiento.

int i = 0;
int Pausa = 10;

void setup()
{
   pinMode(11,OUTPUT);
}

void loop()
{
   for(i = 0 ; i < 255 ; i++)
   {
      analogWrite( 11, i );
      delay(Pausa);
   }
}

Podrán ver como el led va cambiando su intensidad de brillo, esto puede ser usado en el control de iluminación en una casa por ejemplo...

Puedes modificar el circuito y el código a gusto y experimentar distintos comportamientos y secuencias con Arduino.

Hasta la proxima!

Semáforo con Arduino

Hola a todos:

En esta ocasión vamos a realizar un montaje un poco mas complejo que el anterior. Una simulación de un semáforo controlado desde Arduino.
Ya vimos lo que hacia el comando delay(milisegundos); que produce una pausa en nuestro programa de el tiempo que nosotros especifiquemos en el argumento del comando.

Materiales necesarios:

1.- Arduino UNO
2.- Cable USB para Arduino
3.- Tres diodos led: verde, rojo y amarillo. (uno de cada color, no 3 de cada uno)
4.- Protoboard
5.- Cables conectores
6.- Computador con el Software Arduino instalado

Montaje del circuito

El circuito que vamos a montar ira en la protoboard, tal vez no esta demás decir que en la protoboard los orificios de cada fila están unidos, pero entre filas no hay conexión.
Las conexiones a realizar son las del siguiente esquema:


Una vez montado este circuito, conectamos nuestro Arduino al PC, abrimos el entorno de desarrollo y escribimos el siguiente código:

void setup()
{
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
}

void loop()
{
  digitalWrite(13,LOW);
  digitalWrite(12,LOW);
  digitalWrite(11,HIGH);
  delay(5000);
  digitalWrite(13,LOW);
  digitalWrite(12,HIGH);
  digitalWrite(11,LOW);
  delay(1000);
  digitalWrite(13,HIGH);
  digitalWrite(12,LOW);
  digitalWrite(11,LOW);
  delay(5000);
}


Con el código anterior el semaforo parte en verde y se mantiene por 5 segundos, luego pasa al amarillo durante un segundo y finalmente a rojo otros 5 segundos. Pasados los 5 segundos en rojo volverá a verde y empieza el ciclo otra vez.
Se puede modificar el código en las lineas de delay para cambiar los tiempos del ciclo.

Hasta la proxima!