Documentos de Académico
Documentos de Profesional
Documentos de Cultura
UNIDAD II
Programación de entradas y salidas
del microcontrolador.
INGENIERÍA MECATRÓNICA
Elementos básicos:
Comentario, este permite la documentación del código y se usa de
acuerdo a la siguiente sintaxis
/* Este es un comentario */ o // Este es un comentario
Ejemplo:
char c;
void main()
{
c=0x31; // en hexadecimal
c=49; // en decimal
c=’1’; // en carácter
}
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Elementos básicos…
Operadores y signos de puntuación, un operador es usado para describir una
operación aplicada a uno o varios objetos. Los operadores son usados en
muchas expresiones y en diversos tipos de declaraciones. Los operadores
consisten en una secuencia de caracteres no-alfanuméricos (uno o dos).
Pueden ser: Aritméticos (+), Booleanos (&), de Comparación (>), de
Desplazamiento (>>), Manejo de apuntadores (->), Compilación (#), Paréntesis-
Corchetes ({ }).
Operadores Aritméticos: Operadores Lógicos:
char i,j, k; char i,j, k;
void main() void main()
{ {
i=10; k=i&j; // operación AND entre i y j bit a bit
j=20; k=i|j; // operación OR entre i y j bit a bit
k=i+j; //suma de 2 enteros k=~i; // operación negación de i asignado a
k=i-j; // resta de 2 enteros k
k=i*j; // multiplicación de 2 enteros k=i<<1; // i desplazado en un bit a izquierda
k=i%j; // Division entera (debe dar el k=i<<2; // i desplazado en 2 bit a izquierda
resto) k=i>>1; // i desplazado en un bit a la derecha
k++; // incremento k=k+1 k=i<<2; // i desplazado en 2 bit a la derecha
k--; // decremento k=k-1; }
}
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Elementos básicos…
Un signo de puntuación se usa para separar o terminar una lista de
elementos.
Pueden ser: Punto y coma (;), Dos puntos (:) y Coma (,)
Operadores Símbolos
Aritméticos + - * / % = += -= *= /= ++ --
Puntuación ;:,
Compilación y Declaración # ##
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Instrucciones básicas
char i,j,k,h;
void main()
{
i=10;
j=20;
if(i==j) k=1; // si i=j entonces k=1, sino k=2
else k=2;
}
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Sentencia if-else…
Otros ejemplos:
char i,j,k,h;
void main()
{
i=10;
j=20;
if(i==10) // si i=10 entonces k=20, j=10, sino k=40, j=20, h=60
{
k=20;
j=10;
}
else
{
k=40;
j=20;
h=k+j;
}
}
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Sentencia if-else…
Otros ejemplos:
char i,j,k;
void main()
{
i=10;
j=20;
if((i==10) && (j==20)) // Si i=10 y j=20 entonces...
{
k=20;
j=10;
}
if(i) i=0; // si i es mayor que cero
if(!i) i=30; // si i es cero
}
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Sentencia while( )
Esta evalúa la condición al inicio, si ésta es verdadera, entonces se ejecuta
el bloque que viene a continuación en caso contrario lo salta.
El formato es el siguiente:
while(condición) instrucción;
while(condición)
{
instrucción_1;
...
instrucción_n;
}
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Sentencia while( )…
En el siguiente código fuente se muestra que el ciclo while se realiza ya que i
siempre sea mayor que 0. Sin embargo en algún momento i será menor que 0,
dado que k se va decrementando y se hace igual a i dentro del ciclo.
char i,j,k,h;
void main()
{
i=1; k=2; j=3;
while(i>0) // Solo mientras i>0 hace lo que viene a continuación
{
h=k+j;
k--;
i=k;
}
}
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Sentencia while( )…
En el ejemplo sólo se evalúa la condición verdadera, pero nunca sale del ciclo.
char i,j,k,h;
void main()
{
i=1;
while(i) // Se usa while(1), solo mientras i mayor que cero hace lo
siguiente
{
k=40;
j=20;
h=k+j;
}
}
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Sentencia while( )…
Para salir de un ciclo donde no existe posibilidad de que la condición sea alterada,
se puede usar la sentencia break.
char i,j,k,h;
void main()
{
i=0;
while(1)
{
i++;
if(i==5) break; // Sale cuando i=5
}
}
La instrucción de salto break se usa para interrumpir (romper) la ejecución normal de un
bucle, es decir, la instrucción break finaliza (termina) la ejecución de un bucle y, por tanto,
el control del programa se transfiere (salta) a la primera instrucción después del bucle.
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Sentencia while( )…
La sentencia do-while es una variación de la sentencia while, pero en ésta se
evalúa la condición al final, por ejemplo “Hágalo mientras se cumpla la
condición”.
void main()
{
char i;
i=10;
do
{
i--;
}
while(i!=5); // Sale cuando i=5
}
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Sentencia switch - case
La instrucción switch - case se usa cuando se deben seleccionar entre varias
opciones tipo numéricas; es básicamente un selector. Ejemplo:
char c;
void main()
{
c=1;
switch(c)
{
case 1: c++; break;
case 2: c++; break;
case 3: c++; break;
default: break;
}
}
Si el valor que toma la variable no coincide con los valores especificados en los casos, se
realizarán las acciones definidas en la etiqueta default.
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Sentencia for
Permite el uso de los clásicos ciclos for. El formato es el siguiente:
for(expr_1;expr_2;expr_3) instrucción; for(expr_1;expr_2;expr_3)
{
instrucción_1;
instrucción_n;
}
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Sentencia for…
Hacer un programa que cuente los números enteros pares que hay de
0 a 100:
char i, contador;
Void main( )
{
contador=0;
for(i=1; i<=100; i++)
{
if(i%2==0)
{
contador++;
}
}
}
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Sentencia for…
Hacer un programa que muestre cuántos números enteros múltiplos
de 5 hay hasta el 50:
char i, contador;
Void main( )
{
contador=0;
for(i=1; i<=50; i++)
{
if((i>0)&&(i%5==0))
{
contador++;
}
}
}
2. Programación de entradas y salidas del
microcontrolador.
Introducción
Funciones y Llamados a funciones
Para el paso de los argumentos, estos son definidos entre los paréntesis de la función
considerando el tipo de la variable requerida. La siguiente función recibe un parámetro
tipo char por valor y no retorna valor.
char h;
void main() void suma(char i) // Definición de la función
{ {
h=10; char j,k;
suma(h); // Llamada j=20;
} k=i+j;
}
2 Programación de entradas y salidas del
microcontrolador.
Introducción
Funciones y Llamados a funciones…
Las que reciben parámetros y devuelven información.
Aquí, una función recibe parámetros y retorna un valor. El valor retornado a su vez
puede ser usado por una sentencia de control para tomar alguna decisión.
Las funciones que nos ofrece el lenguaje Arduino para trabajar con entradas y
salidas digitales son:
Programa en
ambiente Arduino
“LED On-Off”
2. Programación de entradas y salidas del
microcontrolador.
2.2 Configuración y características eléctricas de los puertos de
E/S.
USO DE LAS ENTRADAS Y SALIDAS DIGITALES...
Programa en
ambiente Arduino
“Semáforo”
2. Programación de entradas y salidas del
microcontrolador.
2.2 Configuración y características eléctricas de los puertos de
E/S.
USO DE LAS ENTRADAS Y SALIDAS DIGITALES...
Programa en ambiente
Arduino “Selector
semáforo”
2. Programación de entradas y salidas del
microcontrolador.
2.2 Configuración y características eléctricas de los puertos de
E/S.
El circuito conversor es de 6 canales (uno por cada entrada) y cada canal dispone
de 10 bits (los llamados “bits de resolución”) para guardar el valor del voltaje
convertido digitalmente.
2. Programación de entradas y salidas del
microcontrolador.
2.2 Configuración y características eléctricas de los puertos
de E/S.
analogRead(): Devuelve el valor leído del pin de entrada analógico cuyo número
(0, 1, 2...) se ha especificado como parámetro. Este valor se obtiene mapeando
proporcionalmente la entrada analógica obtenida (que debe oscilar entre 0 y un
voltaje llamado voltaje de referencia, el cual por defecto es 5V) a un valor
entero entre 0 y 1023. Esto implica que la resolución de lectura es de 5V/1024,
es decir, de 0,049 V. Ejemplo: Valor=analogRead(0);
Nota: El Pin AREF ofrece un voltaje de referencia externo para poder aumentar la precisión de las
entradas analógicas.
Programa “Pot_Analog”
Programa “PT100_Analog”
2. Programación de entradas y salidas del
microcontrolador.
2.2 Configuración y características eléctricas de los puertos
de E/S.
Las Entradas Analógicas…
Por último, decir que estos pines-hembra de entrada analógica tienen
también toda la funcionalidad de los pines de entrada-salida digitales.
Por otro lado, hay que saber que el convertidor analógico/digital tarda
alrededor de 100 microsegundos (0,0001s) en procesar la conversión y
obtener el valor digital, por lo que el ritmo máximo de lectura en los
pines analógicos es de 10000 veces por segundo. Esto hay que tenerlo en
cuenta en los sketches
2. Programación de entradas y salidas del
microcontrolador.
2.2 Configuración y características eléctricas de los puertos
de E/S.
“Temp_LM35”
2. Programación de entradas y salidas del
microcontrolador.
2.2 Configuración y características eléctricas de los puertos
de E/S.
Las Salidas Analógicas (PWM)
En los proyectos a desarrollar con µCC se necesitará enviar señales analógicas hacia
al entorno, por ejemplo, para variar progresivamente la velocidad de un motor, la
frecuencia de un sonido emitido por un zumbador o la intensidad con la que luce
un LED.
No basta con simples señales digitales: tenemos que generar señales que varíen
continuamente. La placa Arduino no dispone de pines-hembra de salida analógica
propiamente dichos (porque la arquitectura interna no tiene un convertidor digital-
analógico), sino que utiliza algunos pines-hembra de salida digitales concretos para
“simular” un comportamiento analógico.
Los pines-hembra digitales que son capaces trabajar en este modo no son todos:
solo son los marcados con la etiqueta “PWM”. En concreto para el modelo Arduino
UNO son los pines número: 3, 5, 6, 9, 10 y 11.
2. Programación de entradas y salidas del
microcontrolador.
2.2 Configuración y características eléctricas de los puertos
de E/S.
Las Salidas Analógicas (PWM)…
Las siglas PWM significa Modulación de
Ancho de Pulso. Lo que hace este tipo de
señal es emitir, en lugar de una señal
continua, una señal cuadrada formada por
pulsos de frecuencia constante
(aproximadamente de 490 Hz).
Al variar la duración de estos pulsos,
estaremos variando proporcionalmente la
tensión promedio resultante; cuando la
duración del pulso coincidiera con el
período de la señal, la tensión promedio
de salida sería la máxima posible (5 V).
Las figuras ilustran lo anterior:
2. Programación de entradas y salidas del
microcontrolador.
2.2 Configuración y características eléctricas de los puertos
de E/S.
Los pines PWM viene controlados por tres temporizadores diferentes que
mantienen la frecuencia constante de los pulsos emitidos;
concretamente, los pines 3 y 11 son controlados por el “Timer1”, los
pines 5 y 6 por el “Timer2” y los pines 9 y 10 por el “Timer3”.
2. Programación de entradas y salidas del
microcontrolador.
2.2 Configuración y características eléctricas de los puertos
de E/S.
Las Salidas Analógicas (PWM)
Las funciones que sirven para gestionar salidas analógicas son las siguientes:
analogWrite(): Envía un valor de tipo “byte” (especificado como segundo
parámetro) que representa una señal PWM, a un pin digital configurado como
OUTPUT (especificado como primer parámetro). En la placa Arduino UNO los
pines digitales que pueden generar señales PWM son los pines 3, 5, 6, 9, 10 y 11
(están marcados en la placa); cada vez que se ejecute esta función se
regenerará la señal. Esta función no tiene valor de retorno. Ejemplo:
pinMode(9,OUTPUT); analogWrite(9,valorPromedio);
Recordemos que una señal PWM es una señal digital cuadrada que
simula ser una señal analógica. El valor simulado de la señal analógica
dependerá de la duración que tenga el pulso digital (es decir, el valor
HIGH de la señal PWM).
2. Programación de entradas y salidas del microcontrolador.
2.2 Configuración y características eléctricas de los puertos de E/S.
Ejemplo 1:
Para conseguir cambiar la intensidad lumínica de un LED, primero deberemos
montar el circuito. La conexión del LED no tiene ningún misterio: su terminal
positivo ha de ir enchufado a un pin PWM de nuestra placa Arduino (por ejemplo el
nº 9) y su terminal negativo a tierra. Se recomienda también conectarle en serie un
divisor de tensión (de unos 220 ohmios está bien). A continuación, debemos escribir
el sketch, el cual modificará el voltaje PWM ofrecido por la salida analógica donde
esté conectado el LED (recordemos, de 0 –valor mínimo– a 255 –valor máximo–).
Programa “Brillo_LED”
2. Programación de entradas y salidas del
microcontrolador.
2.2 Configuración y características eléctricas de los puertos
de E/S.
“Temp_PT100”
2. Programación de entradas y salidas del
microcontrolador.
2.2 Configuración y características eléctricas de los puertos
de E/S.
Figura A.6
2. Programación de entradas y salidas del
microcontrolador.
2.3 Estructura de los programas para microcontrolador
Figura A.7
/* COMENTARIOS */
int mivariable=50; // Declaración e inicialización de una variable global
void setup() // Preconfiguraciones iniciales
{
Serial.begin(9600); // Instrucción que abre el canal serie para que pueda…
} // empezar la comunicación por él (Arduino-PC)
Al crear nuestras propias funciones, escribimos código mucho más legible y fácil de
mantener. Segmentar el código en diferentes funciones permite al programador crear
piezas modulares de código que realizan una tarea definida. Las funciones hacen más
fácil la reutilización de código en otros programas (provocando que estos sean más
pequeños, modulares y legibles).
Para crear una función propia, debemos “declararlas”. Esto se hace en cualquier
lugar fuera de “void setup()” y “void loop()”, siguiendo la sintaxis marcada por la
plantilla siguiente:
Arduino IDE proporciona una herramienta que permite enviar y visualizar los datos
que se manejan a través del puerto Serie. Dicha herramienta se conoce como
Monitor Serial y se puede encontrar en el menú de herramientas, en la opción
“Monitor Serial”. Es la forma más simple que existe para establecer la
comunicación serial con Arduino.
Ejemplo:
void setup()
{
Serial.begin(9600); // abre el Puerto serie
} // configurando la velocidad en 9600 bps
Nota: Cuando se utiliza la comunicación serie los pines digitales 0 (RX) y 1 (TX) no
pueden utilizarse para otros propósitos.
2. Programación de entradas y salidas del
microcontrolador.
2.3 Estructura de los programas para microcontrolador
COMUNICACIÓN SERIAL…
Serial.println(data): Imprime los datos en el puerto serie, seguido por un retorno de
carro (CR) y salto de línea (LF). Este comando toma la misma forma que
Serial.print(), pero es más fácil para la lectura de los datos en el Monitor Serie del
software.
Serial.println(analogValue); // envía el valor 'analogValue' al puerto
El siguiente ejemplo toma de una lectura analógica del pin 0 y envía estos datos al
ordenador cada segundo.
Ejemplo:
void loop()
{
void setup() int valor=analogRead(0);
{ Serial.println(valor); //envía valor
Serial.begin(9600); delay(1000); // espera 1 seg
} }
2. Programación de entradas y salidas del
microcontrolador.
2.3 Estructura de los programas para microcontrolador
COMUNICACIÓN SERIAL…
Ejemplo:
int dato=0; //almacena el dato void loop()
{ // envía datos sólo si los recibe
void setup() if (Serial.available() > 0)
{ { // lee el byte de entrada
Serial.begin(9600); dato = Serial.read();
} Serial.print("He recibido: ");
Serial.println(dato, DEC);
}
}
2. Programación de entradas y salidas del
microcontrolador.
2.3 Estructura de los programas para microcontrolador
COMUNICACIÓN SERIAL…
Serial.write(): Escribe los datos binarios al puerto serie. Estos datos se envían como
un byte o una serie de bytes; para enviar los caracteres que representan los dígitos de
un número use la función de print() en su lugar.
Sintaxis Parámetros
Serial.write(val) val: un valor a enviar como un solo byte
Serial.write(str) str: una cadena a enviar como una serie de bytes
Serial.write(buf, len) buf: una matriz a enviar como una serie de bytes
len: la longitud del buffer
Ejemplo 3:
Se tienen 3 LED’s (rojo, verde y amarillo) conectados cada uno a través de
su divisor de tensión; se pretende manipular el brillo de un LED mediante
el envío de un comando adecuado a través del canal serie. La idea es
utilizar el “Serial monitor” para enviar a la placa Arduino un comando que
especifique qué LED queremos manipular (indicado por la letra “r”, “g” o
“y”) y qué cantidad de brillo le queremos asignar (indicado por un valor
entre 0 y 255).
Así, si queremos por ejemplo apagar el LED rojo el comando a enviar
debería ser “r0”. Y si queremos iluminar al máximo el LED amarillo, el
comando debería ser “y255”.
Programa “Brillo_3 LEDs”
2. Programación de entradas y salidas del
microcontrolador.
2.3 Estructura de los programas para microcontrolador
2. Programación de entradas y salidas del
microcontrolador.
2.3 Estructura de los programas para microcontrolador
2. Programación de entradas y salidas del
microcontrolador.
2.3 Estructura de los programas para microcontrolador
LED se define por sus siglas como diodo emisor de luz, no es más que
un pequeño chip de material semiconductor, que cuando es
atravesado por una corriente eléctrica, en sentido apropiado, emite
luz monocromática sin producir calor, es decir un componente
electrónico semiconductor, con polaridad por lo que se usará en
funciones de señalización, estética y, actualmente iluminación.
De la misma forma que existen dos tipos de display de 7 segmentos, hay dos
tipos de decodificadores, uno cuyas salidas se activan con un 1, para displays de
7 segmentos de cátodo común, y otro que se activan con un cero para display
de 7 segmentos de ánodo común. Evidentemente, decodificador y display tienen
que ser del mismo tipo para poder ser conectados. A continuación se muestra
una imagen de lo que sería un decodificador BCD de 7 segmentos, 74LS47.
2. Programación de entradas y salidas del
microcontrolador.
2.4 Programación de puertos con interfaces para el manejo de
dispositivos periféricos sin manejo de potencia.
2.5.1 Transistores.
2. Programación de entradas y salidas del
microcontrolador.
2.5 Programación de puertos con interfaces de potencia
2.5.2 Relevadores
2. Programación de entradas y salidas del
microcontrolador.
2.5 Programación de puertos con interfaces de potencia
2.5.3 Optoacopladores.
2. Programación de entradas y salidas del
microcontrolador.
2.5 Programación de puertos con interfaces de potencia
2.6.3 Motores de CD
2. Programación de entradas y salidas del
microcontrolador.
2.6 Desarrollo de aplicaciones para el manejo de (actuadores)
2.6.5 Servomotores.
2. Programación de entradas y salidas del
microcontrolador.
2.6 Desarrollo de aplicaciones para el manejo de actuadores
Tenemos dos bombas (PUMP 1 y PUMP 2) que se utilizan para transferir dos líquidos
separados a este tanque. Dentro del tanque hay un flotador unido a un sensor de nivel
(potenciómetro angular) para medir el volumen de la mezcla en el tanque.
También hay un mezclador eléctrico (MIXER) dentro del tanque que comienza a funcionar
durante un período de tiempo definido (6 segundos), mezclando los dos líquidos después
de que el tanque se haya llenado.
También contamos con una válvula de descarga (VALVE) en el fondo del tanque que
controla el drenaje del líquido del tanque.
Cuando el nivel del líquido cae al nivel de la posición baja (50% del tanque), el sensor en la
entrada del canal analógico en la placa de Arduino envía el voltaje correspondiente. Se
quiere escribir el programa para que cuando el nivel del líquido alcance este mínimo, las
bombas se activen y comiencen a llenar el tanque con los líquidos.
2. Programación de entradas y salidas del
microcontrolador.
2.6 Desarrollo de aplicaciones para el manejo de actuadores
Practica #2 unidad II
Mezcladora de líquidos.---
Las bombas continúan llenando el tanque hasta que el nivel alcanza su máximo (85% del
tanque) de nivel superior. Cuando esto suceda, el sensor enviará un voltaje indicándonos
que el tanque alcanzó su nivel máximo permitido.
Cuando se envía esta señal, primero se deben apagar las bombas para que no ingrese más
líquido al tanque, y luego se debe encender este mezclador. Queremos que el mezclador
funcione durante 6 segundos, mezclando los líquidos que se han bombeado al tanque.
Después de este tiempo, el mezclador debería apagarse automáticamente y la válvula de
descarga debería abrirse. Con la válvula abierta, el líquido se descargará del tanque y se
transferirá a otro lugar dentro de la fábrica para ser procesado.
Cuando el nivel del líquido en el tanque desciende al nivel mínimo establecido por el sensor,
la señal analógica de nivel bajo activará las bombas nuevamente, comenzando así un ciclo
repetitivo. El sistema tiene un paro de emergencia (STOP) para cuando sea requerido.
2. Programación de entradas y salidas del
microcontrolador.
2.6 Desarrollo de aplicaciones para el manejo de actuadores
Evaluación de la unidad II
El proceso de riego consiste en activar los aspersores cuando la humedad del suelo esté por debajo del
20% de humedad en el suelo lo cual se puede medir con el sensor YL-69. El riego solo puede hacerse
durante la tarde o la noche para evitar el daño de la flora causado por la evaporación, el nivel de luz
solar se puede detectar con un sensor de intensidad luminosa (LDR).
Es importante utilizar una pantalla LCD y otros dispositivos indicadores para emitir alertas en el proceso.