diseÑo de aplicaciones electrÓnicas en … · es un tipo de dato que ocupa un ... las variables...

50
DISEÑO DE APLICACIONES ELECTRÓNICAS EN ARDUINO Luis David Goyes Garcés Día 2

Upload: dinhtram

Post on 19-Sep-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

DISEÑO DE APLICACIONES

ELECTRÓNICAS EN ARDUINO

Luis David Goyes Garcés

Día 2

Instrucciones Básicas

setup() Se establece cuando se inicia un programa.

Se emplea para:

• iniciar variables,

• establecer el estado de los pines,

• inicializar librerías, etc.

Se ejecutará una única vez después de que se conecte la placa Arduino a la fuente de alimentación o cuando se pulse el botón de reinicio de la placa.

loop() Luego de crear la función setup(), la cual inicializa y

prepara los valores iniciales, la función loop() se

ejecuta consecutivamente, permitiéndole al

programa variar y responder.

Se usa para controlar de forma activa la placa

Arduino.

¡Cuidado! Todo programa (sketch) debe tener las funciones

setup() y loop().

Si se quiere “limpiar” el microcontrolador hay que

escribir las funciones setup() y loop(), aunque estés

vacías:

void setup(void){}

void loop(void){}

Funciones Segmentar el código en funciones permite crear

piezas modulares de código que realizan una tarea

definida y vuelven a la zona del programa en la que

fueron llamadas.

El caso típico para crear una función es cuando uno

necesita realizar la misma acción múltiples veces

dentro de un mismo programa.

Funciones Segmentar el código tiene sus ventajas:

Incrementa el orden.

Sólo deben ser depuradas de errores una vez.

Reducen las posibilidades de error, si hay cambio.

El sketch se hace más pequeño (MEMORIA!!)

Se puede reutilizar código

Hay dos funciones necesarias en un sketch de Arduino: setup() y loop().

Cualquier otra función debe ser declarada antes o después de la función “loop()”

Funciones

Tipos de Datos 1. Boolean (booleano)

2. Char (caracter)

3. Byte

4. Int (entero)

5. Unsigned int (entero sin signo)

6. Long (entero 32b)

7. Unsigned long (entero 32b sin signo)

8. Float (en coma flotante)

9. Double (en coma flotante de 32b)

10.String (cadena de caracteres)

11.Array (cadena)

boolean Un booleano sólo puede tomar dos valores,

Verdadero o Falso.

Cada booleano ocupa un único byte en la memoria.

Ejemplo:

boolean pruebaF = false;

boolean pruebaT = true;

char Es un tipo de dato que ocupa un byte de memoria y almacena un valor de caracter.

Los caracteres literales se escriben con comillas simples como „A‟.

Para varios caracteres (string) se usa comillas dobles “AAA”.

El tipo de datos char tiene signo. Esto significa que codifica números desde -128 hasta 127. Para un dato de un byte (8 bits), hay que usar un dato de tipo “byte”

Ejemplo: Char prueba2 = „A‟; Char _prueba2 = 65; //Los dos son equivalentes

byte Un byte almacena un número sin signo de 8-bits,

desde 0 hasta 255;

Ejemplo

Byte b = B10011; //”B” es el formateador binario

(B10010 = 18 decimal)

int Integers (números enteros) son el principal tipo de datos para almacenar números y guardan valores de 2 bytes.

Esto produce un rango entre -32.768 hasta 32.767

(-2^15 hasta (2^15)-1)

Las variables tipo int almacenan números negativos mediante su complemento a dos. El MSB indica que el número es negativo.

Puede haber problemas con el “bitshift()”

Ejemplo:

Int led = 13;

unsigned int Los enteros sin signo son los mismos enteros de modo

que almacenan un valor de dos bytes. En lugar de

almacenar números negativos, sólo almacenan

valores positivos, generando un rango útil desde 0 a

65.535 (2^16-1).

Ejemplo:

Unsigned int led = 13;

long Las variables tipo Long son variables de tamaño extendido para almacenamiento de números y de 4 bytes (32 bits), desde -2,147,483,648 hasta 2,147,483,647

Ejemplo:

Long prueba3 = 1000000L;

La “L” sirve para forzar la constante a un formato de datos long. Una “U” obliga la constante a ser unsigned y una “UL” la obliga a ser unsigned long.

unsigned long Una variable long sin signo es una variable extendida

para almacenar números de 4 bytes (32 bits). Ésta no

almacena números negativos por lo que su rango es

de 0 a 2^32-1

0 – 4.294.967.295

Ejemplo:

Unsigned long prueba5 = 1000000000;

float Números con coma flotante.

La variable flotante ocupa 4 bytes (32 bits) con precisión

de 6 ó 7 dígitos decimales. (Número total de dígitos).

En Arduino esta variable es muy mala. La matemática en

coma flotante es mucho más lenta que la matemáticas

de enteros para realizar operaciones.

Ejemplo:

Float prueba6 = 3.1416;

double Número en coma flotante de doble precisión. Ocupa

4 bytes.

La implementación “double” en Arduino es

exactamente lo mismo que la “float”, sin ganar nada

de precisión.

Tener mucho cuidado porque puede requerirse

mayor precisión en double sabiendo que no la hay.

string Arrays de caracteres (tipo char) que terminan con el carácter NULL. Ejemplos: Char udea1[15]; //Se puede dejar sin inicializar

Char udea2[5] = {„u‟, „d‟, „e‟, „a‟}; //Se debe dejar el espacio para el carácter NULL Char udea3[5] = {„u‟, „d‟, „e‟, „a‟, „\0‟};

//El carácter NULL se pone explícito Char udea4[] = “udea”; //El compilador pone el espacio adecuado Char udea5[5] = “udea”; //Se respeta el espacio para el NULL

Char udea6[50] = “udea”; //Poner espacio de sobra en el arreglo

arrays Colección de variables que son accedidas mediante un índice. Los “arrays” de Arduino sin idénticos a los de C!

Int myInts[6];

Int myPins[] = {2, 4, 8, 3, 6};

Int mySensVals[6] = {2, 4, -8, 3, 2};

Char message[6] = “hola”;

El primer elemento de una matriz de n elementos es el 0. El último es el n-1.

Define Define permite dar un nombre a un valor constante

antes de que se compile el programa.

Ejemplo:

#define ledPin 3

//El compilador remplazará cualquier cosa que diga

ledPin con el valor 3 en tiempo de compilación

const Const es un cualificador de variable que indica que ésta es de “sólo-lectura”. Significa que la variable puede ser usada como cualquiera de su tipo pero su valor no puede ser modificado.

Las constantes definidas con la palabra clave const obedecen a las reglas de ámbito de las variables que rigen otras variables.

Ejemplo:

Const float pi = 3.14;

Se puede usar #define o const para cadenas o números. Para matriz se necesitará usar const únicamente.

Constantes HIGH

LOW

INPUT

OUTPUT

True

False

Constantes booleanas • False

False se define como 0

• True

True se define como 1, pero en realidad tiene una

definición más amplia. Cualquier entero que es no-

cero es TRUE, en un sentido BOOLEANO.

Así, -1, 2 y -200 son todos true.

Niveles lógicos • HIGH

Si el pin es de entrada, habrá HIGH si en el pin hay

más de 3V.

Si el pin es de salida, un HIGH es poner 5V a través

de una resistencia de pull-up.

• LOW

Si el pin es de entrada, habrá LOW si en el pin hay

menos de 2V.

Si el pin es de salida, un LOW es poner 0V.

Estado de un pin digital Los pines digitales se pueden usar como entrada

(INPUT) o salida (OUTPUT).

Cambiando un pin de INPUT a OUTPUT con pinMode()

el comportamiento eléctrico del pin cambia

drásticamente.

E/S Digitales pinMode(pin, modo)

Configura el pin especificado para comportarse como una entrada o una salida.

digitalWrite(pin,valor)

Escribe un valor HIGH o LOW hacia un pin digital.

digitalRead(pin)

Lee el valor de un pin digital especificado, HIGH o LOW. No hay estado de HIGH Z.

Los pines analógicos pueden ser usados como pines digitales (A0-14 a A5-19)

E/S Analógicas analogRead(pin)

Lee el valor de tensión en el pin analógico especificado.

La placa Arduino posee 6 canales (9 MINI y NANO y 16 MEGA) de un conversor analógico digital de 10 bits.

Convertirá tensiones de 0 a 5 con resolución de 4,9mV por unidad.

El conversor tarda 100us en leer una entrada analógica.

analogWrite(pin, valor)

Escribe un valor analógico (PWM) en un pin. El pin generará una onda cuadrada estable con el ciclo de dureza especificado hasta que se ejecute otra instrucción en el mismo pin.

La frecuencia del PWM es de 490 Hz

Tiempo Delay(ms)

Pausa el prorgama por un tiempo determinado (en

milisegundos).

DelayMicroseconds(us)

Detiene brevemente el programa por la cantidad de

tiempo (en microsegundos) especificada como parámetro

NOTA:

La última función trabaja de manera exacta en el rango

de 3us y valores superiores.

Estructuras de control • If

Condicional que puede ser usado en conjunto com

uno o más operadores de comparación

• If/else, else if

Permite más control sobre el flujo de código que la

declaración if básica por permitir agrupar múltiples

comprobaciones.

Con If, else if, else se pueden hacer ramificaciones y

comprobaciones mutuamente exclusivas.

Estructuras de control • Switch / case Switch…case controla el flujo de un programa con varias condiciones.

La palabra clave break sale de la sentencia switch y es usada típicamente al final de cada case. Sin la sentencia break, la sentencia switch se ejecutaría hasta encontrar un break. switch (var) { case etiqueta:

// sentencias break; case etiqueta: // sentencias break; default:

// sentencias }

Operadores de Comparación

• x == y (x es igual a y) ojo con la asignación =

• x != y (x no es igual a y)

• x < y (x es menor a y)

• x > y (x es mayor a y)

• x <= y (x es menor o igual a y)

• x >= y (x es mayor o igual a y)

Operadores Booleanos

• && (y)

• || (o)

• ! (negación)

Bucles • FOR

Se declara un FOR para repetir un bloque encerrado

entre llaves.

El bucle for tiene tres partes o argumentos en su

inicialización:

For (inicialización; condición; incremento) {

//función(es);

}

Bucles • WHILE

Los bucles while se ejecutan continuamente hasta

que la instrucción dentro del paréntesis pase a ser

falsa.

while(expresion){

// sentencia(s)

}

Bucles • Do – While

El bucle “do” trabaja de la misma manera que el

bucle “while” con la excepeción de que la condición

se comprueba al final del bucle, por lo que este bucle

se ejecuta “siempre” al menos una vez.

do {

// bloque de instrucciones

} while (condición);

Operadores de Composición

• ++ (incrementa)

• -- (decrementa)

• += (composición suma)

• -=(composición resta)

• *= (composición multiplicación)

• /= (composición división)

Break Break es usado para salir de los bucles do, for, o while, pasando por alto la norma del bucle.

Es usado también para salir de una estructura de control switch.

Ejemplo

for (x = 0; x < 255; x ++) {

digitalWrite(PWMpin, x);

sens = analogRead(sensorPin); if (sens > threshold){

x = 0;

break; // sale del bucle for.

}

delay(50); }

Return Termina una función y devuelve a la función que la llama. Puede no devolver nada.

Sintaxis

• return;

• return valor; // ambas formas son correctas

La palabra clave return es útil para depurar una sección de código sin tener que comentar una gran cantidad de líneas de código posiblemente incorrecto:

void loop(){

// código magnífico a comprobar aquí

return;

// el resto del programa del que se desconfía

// que nunca será ejecutado por estar detrás de return

}

Serial • Begin()

Establece la velocidad de datos en bits por segundos

(baudios) para la transmisión de datos en serie. Por

defecto aparece 9600, pero pueden especificarse

otras velocidades. Por ejemplo, si se va a usar los

pines 0 y 1 con algún componente que requiera una

velocidad de transmisión en particular.

Serial.begin(speed)

Serial • End()

Desactiva la comunicación serial, permitiendo a los

pines Rx y Tx ser usados como entradas o salidas

digitales. Para reactivar la comunicación serial basta

con llamar el método Serial.begin()

Serial.end()

Serial • Print()

Imprime los datos al puerto serie como texto ASCII.

Serial.print(78) imprime "78"

Serial.print(1.23456) imprime "1.23"

Serial.print(byte(78)) imprime "N" (cuyo código ASCII es 78)

Serial.print('N') imprime "N"

Serial.print("Hello world.") imprime "Hello world.“

Otra forma es especificar la base o formato a usar:

• Serial.print(78, BYTE) imprime "N"

• Serial.print(78, BIN) imprime "1001110"

• Serial.print(78, OCT) imprime "116"

• Serial.print(78, DEC) imprime "78"

• Serial.print(78, HEX) imprime "4E"

• Serial.println(1.23456, 0) imprime "1"

• Serial.println(1.23456, 2) imprime "1.23"

• Serial.println(1.23456, 4) imprime "1.2346"

Serial

• Println()

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

Serial.println(val)

Serial.println(val, formato)

Operadores Aritméticos

• = (asignación)

• + (suma)

• - (resta)

• * (multiplicación)

• / (división)

• % (resto)

Matemáticas • min(x,y) (mínimo)

• max(x,y) (máximo)

• abs(x) (valor absoluto)

• constrain(x,a,b) (limita)

Retorna

x: si x está entre a y b

a: si x es menor que a

b: si x es mayor que b

• pow(base,exponente) (eleva a un número 2float)

• sq(x) (eleva al cuadrado)

• sqrt(x) (raíz cuadrada, devuelve doble)

Trigonometría

• Sin(rad)

• Cos(rad)

• Tan(rad)

Rad es float y retorna doble

Punteros

El operador puntero & (referencia) y

*(dereferencia) pueden ser muy útiles para

manipular ciertos tipos de estructuras de

datos.

Materiales Próxima Sesión Arduino

Computador

Protoboard

5 LEDs de distintos colores

1 Display de 7 segmentos

2 pulsadores (1 N cerrados y 1 N abierto)

Resistencias y potenciómetros

1 Fotoresistor

Un Amplificador Operacional (LM339)

Pinzas y pelacables

Materiales Sesión del Jueves

Arduino

Computador

Protoboard

5 LEDs de distintos colores

Resistencias y potenciómetros

1 motor DC de juguete ($3.800 en I+D)

1 servo-motor. El más pequeño ($15.000 en I+D)

El servo tiene conector HEMBRA así que traer cables!!

Pinzas y pelacables

Materiales Sesión del Viernes

Arduino

Computador

Protoboard

Sensor infrarrojo CNY70

Sensor de temperatura - Transductor LM35 ($3450 en suconel)

Resistencias y potenciómetros

Optoacoplador (MOC 3010)

Relevo

Triac (BT137)

Bombillo (el de menor potencia posible)

Pinzas y pelacables