MODULO 4
Instructores:
Ing. Baldezzari, Lucas.
21 de Junio de 2018
Podemos leer una señal analógica utilizando alguno de los pines desde A0 hasta A5 de
nuestro Arduino.
La forma de hacerlo es muy sencilla, para esto usamos la función analogRead():
valordDigital = analogRead(analoguePin)
Esta función nos devuelve un valor comprendido entre 0 y 1023, correspondiente al conversor
ADC de 10bits de nuestra placa Arduino UNO.
La forma de saber el valor digital ante un determinado valor de voltaje para sensar es,
𝑉𝑜𝑙𝑡𝑎𝑗𝑒 𝐸𝑛𝑡𝑟𝑎𝑑𝑎 ∗ 2𝑛
𝑉𝑎𝑙𝑜𝑟 𝑑𝑖𝑔𝑖𝑎𝑙 =
𝑉𝑜𝑙𝑡𝑎𝑗𝑒 𝑅𝑒𝑓𝑒𝑟𝑒𝑛𝑐𝑖𝑎
• n = cantidad de bits de nuestro conversor
• Voltaje de referencia = generalmente es el voltaje de nuestra placa (5volts en la UNO).
Arduino • Voltaje de entrada = Voltaje a sensar Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Podemos leer una señal analógica utilizando alguno de los pines desde A0 hasta A5 de
nuestro Arduino.
La forma de hacerlo es muy sencilla, para esto usamos la función analogRead():
EJERCICIO valordDigital = analogRead(analoguePin)
• ¿Qué
Esta función nos devuelve un valor
valor digital comprendido
nos arrojaría entre
nuestro 0 y 1023,
Arduino UNOcorrespondiente
para un valor de al conversor
ADC de 10bits de nuestra
voltaje de 1,25placa Arduino UNO.
volts?
• ¿Qué valor de voltaje equivale un valor digital igual a 915 para la placa
La forma deArduino
saber el UNO?
valor digital ante un determinado valor de voltaje para sensar es,
𝑉𝑜𝑙𝑡𝑎𝑗𝑒 𝐸𝑛𝑡𝑟𝑎𝑑𝑎 ∗ 2𝑛
𝑉𝑎𝑙𝑜𝑟 𝑑𝑖𝑔𝑖𝑎𝑙 =
𝑉𝑜𝑙𝑡𝑎𝑗𝑒 𝑅𝑒𝑓𝑒𝑟𝑒𝑛𝑐𝑖𝑎
• n = cantidad de bits de nuestro conversor
• Voltaje de referencia = generalmente es el voltaje de nuestra placa (5volts en la UNO).
Arduino • Voltaje de entrada = Voltaje a sensar Baldezzari, Lucas
Modulo 4 21 de Junio 2018
La técnica de control por ancho de pulso se utiliza para transmitir información
a través de un canal de comunicaciones pero sobre todo para controlar la
cantidad de energía que se transmite una carga mediante el ciclo de trabajo o
duty cycle (D), el cual se expresa en porcentaje y expresa el tiempo que la
señal esta en alto.
Ʈ
D=
𝑇
Aplicaciones típicas son:
• Controles de motores
• Lectura de un valor analógico utilizando un pin de entrada digital.
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
La técnica de control por ancho de pulso se utiliza para transmitir información
a través de un canal de comunicaciones pero sobre todo para controlar la
cantidad de energía que se transmite una carga mediante el ciclo de trabajo o
duty cycle (D), el cual se expresa en porcentaje y expresa el tiempo que la
señal esta en alto.
Ʈ
D=
𝑇
Aplicaciones típicas son:
• Controles de motores
• Lectura de un valor analógico utilizando un pin de entrada digital.
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
La técnica de control por ancho de pulso se utiliza para transmitir información
a través de un canal de comunicaciones pero sobre todo para controlar la
cantidad de energía que se transmite una carga mediante el ciclo de trabajo o
duty cycle (D), el cual se expresa en porcentaje y expresa el tiempo que la
señal esta en alto.
Ʈ
D=
𝑇
Aplicaciones típicas son:
• Controles de motores
• Lectura de un valor analógico utilizando un pin de entrada digital.
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Arduino UNO posee 6 señales de PWM. Los pines asociados son 3, 5, 6, 9, 10, y 11.
Arduino posee una forma muy sencilla de generar una señal de PWM utilizando la función,
analogWrite (pin , dutyCicle);
El ciclo de trabajo es un valor comprendido entre 0 y 255.
Donde 0 es un duty de 0% y 255 es un duty de 100%, entonces:
0 − 255
𝑑𝑢𝑡𝑦𝐶𝑖𝑐𝑙𝑒 = ∗ 100
255
Podríamos usar la señal de un potenciómetro obtenido por un puerto analógico y en base a
dicho valor, obtener un ciclo de trabajo variante. De esta forma controlamos la velocidad de
un motor, la intensidad de un led, la velocidad de un ventilador, etc.
Arduino
NOTA: [Link]
Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Arduino UNO posee 6 señales de PWM. Los pines asociados son 3, 5, 6, 9, 10, y 11.
Arduino posee una forma muy sencilla de generar una señal de PWM utilizando la función,
analogWrite (pin , dutyCicle);
El ciclo de trabajo es un valor comprendido entre 0 y 255.
Donde 0 es un duty de 0% y 255 es un duty de 100%, entonces:
0 − 255
𝑑𝑢𝑡𝑦𝐶𝑖𝑐𝑙𝑒 = ∗ 100
255
Podríamos usar la señal de un potenciómetro obtenido por un puerto analógico y en base a
dicho valor, obtener un ciclo de trabajo variante. De esta forma controlamos la velocidad de
un motor, la intensidad de un led, la velocidad de un ventilador, etc.
Arduino
NOTA: [Link]
Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Una Interrupción (IRQ – “Interruption Request”) es un evento que genera una suspensión
temporal de la ejecución de un proceso de nuestro progama, para pasar a ejecutar una
subrutina de servicio de servicio de interrupción. Finalizada la subrutina, el programa se
reanuda.
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Una Interrupción (IRQ – “Interruption Request”) es un evento que genera una suspensión
temporal de la ejecución de un proceso de nuestro progama, para pasar a ejecutar una
subrutina de servicio de servicio de interrupción. Finalizada la subrutina, el programa se
reanuda.
Proceso de Interrupción
1. Terminar de ejecutar la instrucción en curso.
2. Salvar el estado de valores de registros, flags y
el valor del contador de programa en la pila.
3. La CPU salta a la dirección donde está
almacenada la rutina de servicio de interrupción
(Interrupt Service Routine, o ISR) y la ejecuta.
4. Una vez que la rutina de la interrupción
termina, el procesador restaura el estado que
había guardado en la pila en el paso 2 y retorna
al programa que se estaba usando
anteriormente.
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
• En un programa complejo es casi una obligación usar interrupciones para ordenar y hacer
mas eficiente nuestro procesamiento.
• Permiten la MULTITAREA.
• Sirven para no sobrecargar el bucle loop().
• Estructurar el código.
• Ejecutar subrutinas solo cuando es necesario.
• [Link]
Las ISRundeben
evente
serexterno, solo cuando
lo más cortas sucedelo
y ejecutarse y nomásestar “escuchando”
rápidamente todo el tiempo.
posible.
• [Link] eventos delay()
Las funciones que suceden mas rápidos
no funciona que ellaloop()
y tampoco de LA
millis(). nuestro programa
función micros() funciona
• Etc..
correctamente hasta 1 ms. La función delayMicroseconds() no usa contadores, y
funciona correctamente dentro de las ISR.
3. Los datos serie se pueden perder mientras se este ejecutando una interrupción.
4. Se deben declarar como “volatile” cualquier variable que sea modificada dentro de la
función de interrupción.
5. Dos ISR no se ejecutan al mismo tiempo, en caso de llamarse a ambas, primero se
ejecuta una y luego la otra.
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Para definir una interrupción en Arduino, necesitamos considerar tres cosas:
1. Un pin de nuestra placa Arduino que recibirá la señal de disparo.
2. Una condición de disparo.
3. Una subrutina, o función, que se ejecutara al producirse la interrupción (call back
function).
Dependiendo la versión de ardunio, tendremos diferentes pines para atender una
interrupción:
MODELO INT 0 INT 1 INT 2 INT 3 INT 4 INT 5
UNO Pin 2 Pin 3
MEGA Pin 2 Pin 3 Pin 21 Pin 20 Pin 19 Pin 18
DUE TODOS LOS PINES PUEDEN USARSE COMO INTERRUPCIONES
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Para atender el llamado de una interrupción externa usamos attachInterrupt().
attachInterrupt( digitalPinToInterrupt(pin), ISRFunctionName, mode);
Parámetros Uso
interrupt (int) Indica que interrupción será atendida.
pin Número del pin
ISRFunctionName Es la función que será llamada cuando
salte la interrupción.
mode Es el modo por el cual se disparará la
MODOS interrupción.
LOW: La interrupción se dispara cuando el pin es LOW.
CHANGE: Se dispara cuando pase de HIGH a LOW o viceversa.
RISING: Dispara en el flanco de subida (Cuando pasa de LOW a HIGH).
FALLING: Dispara en el flanco de bajada (Cuando pasa de HIGH a LOW).
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
1. Se necesita aumentar y disminuir la intensidad de iluminación de un LED utilizando la
salida PWM de nuestro Arduino.
A. Utilizar dos botones. Un botón deberá ser usado para aumentar la intensidad del LED
y el otro para disminuirla.
a) De ser posible, implemente lo mismo, pero utilizando interrupciones externas.
B. Conectar un potenciómetro según la figura de abajo. Deberá leerse el voltaje del
punto medio y con dicho valor se cambiará la intensidad con la que el LED emite.
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Todo programa basado en microcontrolador hace uso de Timers para llevar a cabo tareas
complejas. Los Timers / Contadores son piezas de especiales del Hardware de nuestro
microntrolador.
Mediante Timers podemos “temporizar” tareas y ejecutar rutinas sólo cuando la rutina de
interrupción es llamada. Así, tendremos un control mas eficaz y eficiente de nuestro Sketch.
El microcontrolador del Arduino 1 R3 – Atmega 328 posee tres timers:
• Timer 0: Timer/Counter0 is a general purpose 8-bit Timer/Counter module, with two
independent Output Compare Units, and with PWM support. It allows accurate program
execution timing (event management) and wave generation.
• Timer 1: The 16-bit Timer/Counter unit allows accurate program execution timing (event
management), wave generation, and signal timing measurement.
• Timer 2: Timer/Counter2 is a general purpose, single channel, 8-bit Timer/Counter
module.
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Los Timers son simple contadores que cuentan a una frecuencia equivalente a los 16MHz del
clock de nuestro Arduino. Es decir, que podríamos generar una interrupción cada:
1
= 62,5 𝑛𝑎𝑛𝑜𝑠𝑒𝑔𝑢𝑛𝑑𝑜𝑠
16000000
Este tiempo es sumamente rápido y la mayoría de las instrucciones llevan mas tiempo, por lo
tanto es necesario “escalar” este tiempo. Para esto existen los “pre-scalers” o divisores. El
cálculo que debemos hacer para saber cada cuanto tiempo tendremos una interrupción, es:
𝐹𝑟𝑒𝑐𝑢𝑒𝑛𝑐𝑖𝑎 𝐴𝑟𝑑𝑢𝑖𝑛𝑜
𝐹𝑟𝑒𝑐𝑢𝑒𝑛𝑐𝑖𝑎 𝑑𝑒 𝐼𝑛𝑡𝑒𝑟𝑟𝑢𝑝𝑐𝑖ó𝑛 =
𝑃𝑟𝑒 𝐸𝑠𝑐𝑎𝑙𝑒𝑟 ∗ (𝑐𝑜𝑚𝑝𝑎𝑟𝑒 𝑚𝑎𝑡𝑐ℎ 𝑟𝑒𝑔𝑖𝑠𝑡𝑒𝑟 + 1)
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Los Timers son simple contadores que cuentan a una frecuencia equivalente a los 16MHz del
clock de nuestro Arduino. Es decir, que podríamos generar una interrupción cada:
1
= 62,5 𝑛𝑎𝑛𝑜𝑠𝑒𝑔𝑢𝑛𝑑𝑜𝑠
16000000
Este tiempo es sumamente rápido y la mayoría de las instrucciones llevan mas tiempo, por lo
tanto es necesario “escalar” este tiempo. Para esto existen los “pre-scalers” o divisores. El
cálculo que debemos hacer para saber cada cuanto tiempo tendremos una interrupción, es:
𝐹𝑟𝑒𝑐𝑢𝑒𝑛𝑐𝑖𝑎 𝐴𝑟𝑑𝑢𝑖𝑛𝑜
𝐹𝑟𝑒𝑐𝑢𝑒𝑛𝑐𝑖𝑎 𝑑𝑒 𝐼𝑛𝑡𝑒𝑟𝑟𝑢𝑝𝑐𝑖ó𝑛 =
𝑃𝑟𝑒 𝐸𝑠𝑐𝑎𝑙𝑒𝑟 ∗ (𝑐𝑜𝑚𝑝𝑎𝑟𝑒 𝑚𝑎𝑡𝑐ℎ 𝑟𝑒𝑔𝑖𝑠𝑡𝑒𝑟 + 1)
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018
Los Timers son simple contadores que cuentan a una frecuencia equivalente a los 16MHz del
clock de nuestro Arduino. Es decir, que podríamos generar una interrupción cada:
1
= 62,5 𝑛𝑎𝑛𝑜𝑠𝑒𝑔𝑢𝑛𝑑𝑜𝑠
16000000
Este tiempo es sumamente rápido y la mayoría de las instrucciones llevan mas tiempo, por lo
NOTAS
tanto es necesario “escalar” este tiempo. Para esto existen los “pre-scalers” o divisores. El
cálculo
- Las que debemos
funciones hacer para
delay(), millis() saber utilizan
y micros() cada cuanto tiempo
el timer0 paratendremos una interrupción, es:
temporizar.
- La librería Servo utiliza el timer1.
- La función tone() utiliza el timer2. 𝐹𝑟𝑒𝑐𝑢𝑒𝑛𝑐𝑖𝑎 𝐴𝑟𝑑𝑢𝑖𝑛𝑜
𝐹𝑟𝑒𝑐𝑢𝑒𝑛𝑐𝑖𝑎 𝑑𝑒 𝐼𝑛𝑡𝑒𝑟𝑟𝑢𝑝𝑐𝑖ó𝑛 =
𝑃𝑟𝑒 𝐸𝑠𝑐𝑎𝑙𝑒𝑟 ∗ (𝑐𝑜𝑚𝑝𝑎𝑟𝑒 𝑚𝑎𝑡𝑐ℎ 𝑟𝑒𝑔𝑖𝑠𝑡𝑒𝑟 + 1)
Arduino Baldezzari, Lucas
Modulo 4 21 de Junio 2018