Archivos Mensuales: diciembre 2012

Comunicación Serie II

Funciones usadas en la comunicación por puerto serie (parte II).

Serial.end().Desactiva la comunicación serie, permitiendo que los pines de recepción y transmisión puedan ser usados como pines de entrada/salida digitales.

Serial.available(). Devuelve, como entero, el número de bytes (caracteres) disponibles para ser leídos por el puerto serie. Se refiere a datos ya recibidos y disponibles en el buffer de recepción del puerto, cuya capacidad es de 128 bytes.

Serial.read().Lee los datos entrantes al puerto serie. Devuelve como entero el primer byte disponible recibido por el puerto serie, o -1 si no hay datos disponibles.

Serial.flush().Vacía el buffer de la entrada de datos serie.No requiere parámetros ni devuelve nada.

FUNCIONES ALEATORIAS

randomSeed(valor)

Inicializa el generador de números pseudoaleatorios, asignándole un valor como el punto de partida para la función random(). Esta secuencia, aunque muy larga y aleatoria, es siempre la misma. Debido a que Arduino es incapaz de crear un número aleatorio, con la función randomSeed, permite colocar una variable, constante, u otra función dentro de la función random, la cual ayuda a que la generación de números aleatorios se ajuste más al azar. Existen una variedad de diferentes valores o funciones, que pueden ser usadas para este fin, incluyendo millis(), micros() o incluso analogRead(), que aprovecha el ruido eléctrico a través de un pin analógico para dar un valor no definido.

No obstante, si queremos que la secuencia pseudoaleatorias se repitan exactamente, solo tenemos que llamar a randomSeed() con un número fijo antes de empezar la generación de la secuencia.

Valor debe ser un dato del tipo “long” o “int”

  randomSeed(analogRead(0));

random(max)

random(min, max)

La función random te permite devolver números pseudoaleatorios en un rango especificado por los valores min y max.

valor = random(100, 200); //asigna a ‘valor’ un número aleatorio entre 100 y 200.

Comunicación Serie(valor de  un Potenciómetro)

Esquema Eléctrico:

Comunicacion_Serie_II

Esquema Práctico:

Comunicacion_Serie_II_Practico

Código del Programa:

Comunicacion_Serie_II_Codigo

Código fuente:

Comunicacion_Serie_II.pde

Ficha del Proyecto:

Comunicacion_Serie_Ficha_8

Vídeo resumen:

Anuncios

Comunicación Serie I

Las placas Arduino disponen de un puerto serie que permite la comunicación con un ordenador u otros dispositivos. Los pines que se usan para esto, están marcados con las siglas (0) RX, por el que se enviarán los datos y (1) TX, por el que se recibirán los datos. Cuando se usa la comunicación serie, los pines digitales 0 y 1 no pueden ser usados al mismo tiempo.

Para poder realizar una comunicación serie de una manera correcta, hay que conectar el pin de recepción (RX) al pin de transmisión del dispositivo externo, y el pin de transmisión (TX) al pin de recepción de dicho dispositivo y las tierras entre ellas.

transmision_serie

Funciones usadas en la comunicación por puerto serie(parte I).

Serial.begin(velocidad).Establece la velocidad en bits por segundo (baudios) para la transmisión de datos en serie. El parámetro velocidad se puede configurar con los siguientes valores, 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 o 115200.

Serial.print(valor, formato).Esta función imprime los datos al puerto serie como texto ASCII.

valor:

  • Los números son impresos mediante un juego de caracteres ASCII para cada dígito.
  • Los valores de tipo flotante (float) se imprimen en forma de dígitos ASCII con 2 decimales por defecto, es decir, si ejecutamos Serial.print(1.23456) se imprimirá “1.23”.
  • Los valores de tipo “byte” se enviarán como un único carácter.
  • Los caracteres y las cadenas se enviarán tal cual.

formato(opcional) permite especificar el formato que se desea usar.

  • BYTE, BIN (valores binarios, en base 2)
  • DEC (valores decimales, en base 10)
  • HEX (valores hexadecimales, en base 16).
  • Si lo que se está imprimiendo son números con coma flotante, este parámetro especificará el número de decimales a usar.

Serial.println(valor, formato).Imprime los datos al puerto serie como texto ASCII seguido de un retorno de carro(ASCII 13 o ‘\r’) y un carácter de avance de línea (ASCII 10 o ‘\n’). Por lo demás, este comando tiene la misma forma y los mismos parámetros que Serial.print() descrito anteriormente.

Serial.write().Esta función escribe datos binarios en el puerto serie. Estos se enviarán como un byte o como una serie de bytes. Si lo que se desea es envíar los caracteres que representan los números, es mejor usar la función Serial.print() en su lugar. Puede tomar distintos parámetros:

  • Serial.write(valor) enviará un solo byte.
  • Serial.write(str) enviará una cadena como una serie de bytes.
  • Serial.write(buf, len) enviará un array como una serie de bytes. El tamaño del array se indicará en el segundo parámetro.

FUNCIONES DE TIEMPO

micros()     

// Devuelve el número de microsegundos desde que la placa Arduino inició el funcionamiento del programa (unsigned long). Este número se reinicia al cabo de aproximadamente 70 minutos.

 delayMicroseconds( tiempo)   

//  Detiene brevemente el programa por la cantidad en tiempo (en microsegundos) especificado (unsigned int).

Actualmente, el valor más grande producirá un retraso exacto de 16383. Esto puede cambiar en una futura versión de Arduino. Para retrasos más largos que algunos miles de microsegundos, deberías usar delay() .

Comunicación Serie(valor de  un Potenciómetro)

Esquema Eléctrico:

Comunicacion_Serie_Esquema

Esquema Práctico:

transmision_serie_practico

Código del Programa:

Comunicacion_Serie_Codigo

Código fuente:

Comunicacion_Serie.pde

Ficha del Proyecto:

Comunicacion_Serie_Ficha_7

Vídeo resumen:

Control de un Servo con un Potenciómetro

CONTROL DE FLUJO III

 Switch case

La sentencia switchcase es una instrucción de decisión múltiple, donde el compilador busca el valor de una variable en una lista de valores especificados en las sentencias case, cuando encuentra el valor de igualdad entre variable y constante, ejecuta el grupo de instrucciones asociados a dicha constante, si no encuentra el valor de igualdad entre variable y constante, entonces ejecuta un grupo de instrucciones asociadas a un default, aunque este ultimo es opcional.

El resultado de la evaluación debe ser un valor perteneciente a un tipo de dato finito y ordenado.

La palabra clave break se utiliza al final de cada bloque casey la delimita, sin ella la sentencia switch continuará ejecutando las siguientes expresiones hasta el final de la sentencia switch.

switch (var) {

case etiqueta1:

            conjunto de sentencias1;

break;

case etiqueta2:

            conjunto de sentencias2;

break;

default:

            conjunto de sentencias si ninguno de los anteriores;

}

var – variable a validar con cada uno de los casos declarados.

default – si no se da ninguno de los casos anteriores, se ejecutará la parte definida en el default

break – le indica a la estructura que pare de buscar en el resto de los casos, y finalice la función, sin “break”, la estructura de control continúa realizando la comprobación con el caso siguiente.

switch (datoEntrada) {

case 1:

digitalWrite(1, HIGH);

digitalWrite(2, LOW);

break;

case 2:

digitalWrite(1, LOW);

digitalWrite(2, HIGH);

break;

default:

digitalWrite(1, LOW);

digitalWrite(2, LOW);

break;

}

break

La sentencia break también se utiliza para salir de los controles de flujo do, for o while, por encima de la condición de ciclo normal.

while(intensidadLuz < 200)             //comprueba si es menor que 200

{

intensidadLuz = digitalRead(2);

if (intensidadLuz < 1) break;

}

continue

La sentencia continue se salta el resto de la iteración actual de un bucle do, for o while.

for(int i=0; i<20; i++)

{

if (temperatura > 180) continue      // si la lámpara está caliente salta

digitalWrite(13, HIGH);                    //activa el pin 13

delay(i);                                             //pausa de i milisegundo

digitalWrite(13, LOW);                    //desactiva el pin 13

delay(i);                                             //pausa de i milisegundo

}

return

La sentencia return terminar la ejecución de una función y devuelve un valor desde esta si lo deseas.

int temperatura(){

if (analogRead(0) > 400) {

return 1;

else{

return 0;

}

}

goto

La sentencia goto transfiere el flujo de programa a otro punto marcado en el programa.

El uso de la sentencia goto no se recomienda en programación, ya que con el uso incontrolado de esta, es fácil crear un programa con el flujo del programa no definido, que nunca puede ser depurado.

if (intensidadLuz < 1){goto pocaLuz;}

.

.

.

.

pocaLuz:

FUNCIONES MATEMÁTICAS

min(x, y) – Calcula el mínimo de dos números  y devuelve el más pequeño entre los dos números.

max(x, y) – Calcula el máximo de dos números y devuelve el mayor de ambos parámetros.

abs(x) – Calcula el valor absoluto de un número y devuelve “x” si x es mayor o igual que 0  o “-x” si x es menor que 0.

Debido a la forma en la que se ha implementado las funciones matemáticas min(), max() y abs(), evite usar otras funciones como parámetro debido a que puede ocasionar que se devuelva un resultado incorrecto.

constrain(x, a, b) – Restringe un número a un rango definido, siendo “x” el número a restringir, “a” el número menor del rango y “b” el número mayor del rango. Devuelve “x si x está entre a y b, “a” si x es menor que a  y “b si x es mayor que b

map(value, fromLow, fromHigh, toLow, toHigh) – Remapea un número desde un rango hacia otro. Esto significa que value con respecto al rango fromLow-fromHight será mapeado al rango toLow-toHigh, siendovalue” el valor a mapear, “fromLow” el límite inferior del rango actual del valor, “fromHigh” el límite superior del rango actual del valor, “toLow” el límite inferior del rango deseado y “toHigh” el límite superior del rango deseado. Devuelve el valor  mapeado.

No se limitan los valores dentro del rango, ya que los valores fuera de rango son a veces objetivos y útiles.

La función constrain() puede ser usada tanto antes como después de ésta función, si los límites de los rangos son deseados.

Ten en cuenta que los límites “inferiores” de algún rango pueden ser mayores o menores que el límite “superior” por lo que map() puede utilizarse para revertir una serie de números.

La función map() usa matemática de enteros por lo que no generará fracciones, aunque fuere el resultado correcto. Los resultados en fracciones se truncan, y no son redondeados o promediados.

pow(base, exponente) – Calcula el valor de un número elevado a otro número, siendo  “base” la base que queremos elevar (float) (Coma flotante) y “exponente” la potencia a la que se quiere elevar la base (float) (Coma flotante). Pow() puede ser usado para elevar un número a una fracción.

sq(x) – Calcula el cuadrado de “x”

sqrt(x) – Calcula la raíz cuadrada de “x”.

Ejemplos:

int val;

int val2 = 255;

int val3 = 5;

float valfloat;

void setup()

{

}

void loop()

{

val = min(val2, val3);                             // val vale 5

val = max(val2, val3);                            // val vale 255

val= abs(val);                                        // val vale 255

val = constrain(val2, 1,180);                 // val vale 180

val = map(val, 0, 1023, 0, 179);            // val vale 31

valfloat = pow(3, 1/3);                        // valfloat vale la raíz cúbica de 3

val = sq(val3);                                      // val vale el cuadrado de val3 (25)

valfloat = sqrt(val);                             // valfloat vale la raiz cuadrada de val (5) }

Control de un Servo con un Potenciómetro

Esquema Eléctrico:

Esquema Práctico:

Código del Programa:

Código fuente:

Control_Servo.pde

Ficha del Proyecto:

Control_Servor_Ficha_6

Vídeo resumen: