diseÑo de aplicaciones electrÓnicas en … · es un tipo de dato que ocupa un ... las variables...
TRANSCRIPT
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()”
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 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)
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)
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