2. Programación en Arduino Tallerine Android/LED Instituto de Ingenería Eléctrica 13 de marzo de 2017 IIE (TallerIne) Programación 13 de marzo de 2017 1 / 27
Repaso Conocimos al Arduino Vimos nociones de programación Trabajamos con sus salidas digitales Usamos las salidas para prender y apagar leds. IIE (TallerIne) Programación 13 de marzo de 2017 2 / 27
El taller de hoy Entradas digitales Entradas y salidas analógicas Arquitectura básica de un sistema Más sobre funciones IIE (TallerIne) Programación 13 de marzo de 2017 3 / 27
Entrada y salida digital parte 2 IIE (TallerIne) Programación 13 de marzo de 2017 4 / 27
Entradas digitales Los pines 0 a 13 pueden ser usados para leer datos binarios 0 2,5V es considerado como un 0 o FALSE 2,5 5V es un 1 o TRUE Debemos congurar un pin como entrada usando la función pinmode IIE (TallerIne) Programación 13 de marzo de 2017 5 / 27
Entradas digitales const int ENTRADA = 4; // leeremos del pin 4 const int SALIDA = 13; // para ver lo que se lee void setup (){ pinmode ( ENTRADA, INPUT ); // entrada desde pin ENTRADA pinmode ( SALIDA, OUTPUT ); // salida al pin SALIDA } void loop (){ bool valor ; valor = digitalread ( ENTRADA ); // leemos digitalwrite ( SALIDA, valor ); // prendemos o apagamos segun valor delay (50); } IIE (TallerIne) Programación 13 de marzo de 2017 6 / 27
Entradas digitales pull up y pull down Problema Qué valor tiene un pin cuando no está conectado? En general no está denido! Caso muy común: botón pulsador IIE (TallerIne) Programación 13 de marzo de 2017 7 / 27
Entradas digitales pull up y pull down Solución eléctrica Pull-up: pin conectado a VCC Pull-down: pin conectado a GND IIE (TallerIne) Programación 13 de marzo de 2017 8 / 27
Pull-up y pull-down en Arduino pull-up y pull-down incorporados en la placa Pull-up: escribir HIGH en pin de entrada Pull-down: escribir LOW en pin de entrada const int ENTRADA = 4; // pin a usar como entrada void setup (){ pinmode ( ENTRADA, INPUT ); digitalwrite ( ENTRADA, HIGH ); // pull - up! una vez alcanza } void loop (){ bool valor = digitalread ( ENTRADA ); // hacer algo con el valor... } IIE (TallerIne) Programación 13 de marzo de 2017 9 / 27
Entradas digitales ejercicios en taller Programa 1 Usar como base al entregable del primer taller Leer periódicamente el pin 8 Cambiar la dirección de los LEDs según valor de lpin Programa 2 Utilizar el pin 8 como pulsador En circuito abierto, debe leerse 1 Al cerrarse el circuito, debe bajar a 0 Invertir la dirección de los LEDs con cada pulsación IIE (TallerIne) Programación 13 de marzo de 2017 10 / 27
Entrada y salida analógica IIE (TallerIne) Programación 13 de marzo de 2017 11 / 27
Entradas analógicas: conversor A/D Las entradas analógicas se leen en los pines A0 a A5 Sólo sirven para leer, no para escribir Los datos son leídos como números mediante un Conversor A/D: Conversor Analógico/Digital (A/D) de 10 bits: recibe señales continuas entre 0 y 5V y retorna números enteros entre 0 y 1023 la función analogread(int pin) se usa para leer un dato analógico IIE (TallerIne) Programación 13 de marzo de 2017 12 / 27
Entradas analógicas del Arduino int dato ; // variable que va a almacenar lo que lee un pin int pin = 0; // pin A0 de entrada analogica void setup (){ // no es necesario inicializar nada } void loop (){ dato = analogread ( pin ); // dato es un entero entre 0 y 1023 } IIE (TallerIne) Programación 13 de marzo de 2017 13 / 27
Salidas analógicas (PWM) del Arduino Pueden emular 256 voltajes distintos entre 0 y 5V. Por ejemplo para controlar motores de un robot, intensidad de un LED Funcion analogwrite(pin,valor) pin pin de salida del Arduino (debe tener ) valor número entre 0 (0V) y 255 (5V) IIE (TallerIne) Programación 13 de marzo de 2017 14 / 27
Ejercicios Ejercicio 3 Determinar qué valor entero corresponde a una tensión de entrada de 3,5 volts en un pin de entrada analógica. Ejercicio 4 Determinar el valor a poner en un pin de salida PWM para emular una tensión de 3,5 volts. IIE (TallerIne) Programación 13 de marzo de 2017 15 / 27
Ejemplo: entrada analógica El siguiente código lee el valor de una entrada analógica y saca ese valor a través de una salida PWM: int pwmpin = 9; // pin de salida que soporta PWM int analogpin = A0 ; // pin de entrada analogica int val = 0; // variable para almacenar el valor leido y a escribir float volt = 0; // variable para almacenar el voltaje leido en la entr void setup () { pinmode ( pwmpin, OUTPUT ); // inicializa el pin como salida } void loop () { val = analogread ( analogpin ); // lee la entrada analogica volt =(5.0 * val ) / 1023; // calcula el voltaje leido val = 255 * ( volt / 5); // calcula el valor a sacar que corresponde al voltaje leido analogwrite ( pwmpin, val ); // saca el valor correspondiente } IIE (TallerIne) Programación 13 de marzo de 2017 16 / 27
Arquitectura de sistemas IIE (TallerIne) Programación 13 de marzo de 2017 17 / 27
Arquitectura del sistema Von Neumann Memoria (estado interno) Programa Entrada de datos Salida de datos Programación estructurada en arduino Constantes Variables globales Tipos de variables Funciones y variables locales Dispositivos de E/S IIE (TallerIne) Programación 13 de marzo de 2017 18 / 27
Funciones IIE (TallerIne) Programación 13 de marzo de 2017 19 / 27
Funciones (concepto general) Abstracción matemática recibe un conjunto de parámetros como entrada... produce un resultado como salida IIE (TallerIne) Programación 13 de marzo de 2017 20 / 27
Funciones en Arduino Conjunto de sentencias en un bloque ({}) Nombre único, conjunto de parámetros (opcional) Valor de retorno (opcional) float promediar ( float param1, float param2 ) { float p; p = ( num1 + num2 ) / 2.0; return p; } IIE (TallerIne) Programación 13 de marzo de 2017 21 / 27
Llamada a funciones Denición // DEFINIMOS promediar : // recibe 2 parametros float // devuelve un float float promediar ( float num1, float num2 ) { // encabezado float p; // variable local p = ( num1 + num2 ) / 2.0; // sentencia return p; // termina ( RETORNA ) y devuelve resultado } Llamada void loop () { int k; // LLAMAMOS a la funcion ' promediar ' con param1 =4, param2 =5 // al RETORNAR el resultado se guarda en variable k k = promediar (4, 5); } IIE (TallerIne) Programación 13 de marzo de 2017 22 / 27
Por qué usar funciones? Sintetizar tareas repetitivas ahorra código, reduce errores Encapsular organiza programa en conceptos y tareas facilita el desarrollo reutiliza código IIE (TallerIne) Programación 13 de marzo de 2017 23 / 27
Funciones y Arduino API: Application Program Interface Denidas en Arduino, llamadas por el programador Ejemplos: delay, analogwrite, digitalread, pinmode Hay muchas mas! Callbacks ciclo de vida Denidas por el programadar y llamadas por el Arduino setup: llamada al prenderse o resetearse el Arduino loop: llamada luego de setup, una y otra vez Denidas por el usuario Pueden denirse todas las que se quiera dentro del Sketch Bibliotecas Conjuntos de funciones hechas por otros para algo particular Ejemplo: manejo de motores, control remoto, wi-, etc. IIE (TallerIne) Programación 13 de marzo de 2017 24 / 27
Funciones y Arduino API: Application Program Interface Denidas en Arduino, llamadas por el programador Ejemplos: delay, analogwrite, digitalread, pinmode Hay muchas mas! Callbacks ciclo de vida Denidas por el programadar y llamadas por el Arduino setup: llamada al prenderse o resetearse el Arduino loop: llamada luego de setup, una y otra vez Denidas por el usuario Pueden denirse todas las que se quiera dentro del Sketch Bibliotecas Conjuntos de funciones hechas por otros para algo particular Ejemplo: manejo de motores, control remoto, wi-, etc. IIE (TallerIne) Programación 13 de marzo de 2017 24 / 27
Ejercicios: funciones Entrada analógica a volts Escribir una función float convertirentrada(int valorentrada) que reciba el entero leído de una entrada analógica y devuelva el en voltios correspondiente volts a PWM Escribir una función int convertirsalida(float valorvolts) que tome un valor en voltios de 0 a 5 y genere el valor de PWM (0 a 255) que genere ese voltaje en la salida. Repetidor analógico Escribir un programa que repita indenidamente esta secuencia: lea un pin analógico, utilice las dos funciones anteriores para generar un valor PWM, escriba el valor PWM obtenido en un pin de salida IIE (TallerIne) Programación 13 de marzo de 2017 25 / 27
Para próxima clase IIE (TallerIne) Programación 13 de marzo de 2017 26 / 27
Voltímetro de LEDs Montar un circuito que maneje cuatro LEDs en la y tome la entrada de un divisor resistivo colocado entre GND y VCC (ver gura) programar al Arduino para que cada 50ms lea una entrada analógica y luego prenda o apague los cuatro LEDs de manera que: el primer pin se prenda si el voltaje en la entrada supera 1,0V el segundo pin se prenda si el voltaje en la entrada supera 2,0V el tercer pin se prenda si el voltaje en la entrada supera 3,0V el cuarto pin se prenda si el voltaje en la entrada supera 4,0V IIE (TallerIne) Programación 13 de marzo de 2017 27 / 27