


Sistemas Embebidos
Que es un sistema embebido?
El sistema embebido, como dice el nombre, forma parte de un conjunto más amplio, como puede ser una máquina, un electrodoméstico u otro sistema más amplio. Esta parte que está instalada en el interior de la máquina, es la que llamamos sistema embebido o empotrado. Su misión consiste en resolver una pequeña parte del conjunto de procesos que tiene que resolver la máquina en cuestón.
Por ejemplo, en el caso de una lavadora, esta se compone de un chasis, de motores eléctricos y bombas de agua, de un frontal con varias teclas para que el usuario pueda poner en marcha la lavadora, contiene temporizadores y válvulas eléctricas que controlan el flujo del agua, y más componentes.
En este conjunto nos podemos fácilmene imaginar la necesidad un circuito electrónico que contenga los diferentes programas de lavado del que disponga el electrodoméstico. Y por razones obvias, esta electrónica no serÃa otra cosa que un micro-ordenador, especialmente diseñado para dicho fin. Por lo tanto pdemos hablar de un sistema embebido o empotrado en el interior de la lavadora. fuente "http://www.idose.es/faq/49-sistemas-embebidos/54-que-es-un-sistema-embebido"
Objetivo
La aplicación puntual de los dispositivos de control en todas las áreas de la vida cotidiana, nos ha llevado al estudio de los sistemas embebidos desde el punto de vista teórico-práctico, se pretende que el estudiante al final del curso pueda desarrollar sistemas de control con las diferentes plataformas de desarrollo embebido (microprocesadores, microcontroladores, Arduino, Raspberry Pi, Udoo) desde el planteamiento del problema hasta el montaje y puesta en funcionamiento del proyecto.
El Objetivo general es el diseño de máquinas basadas en sistemas de control embebido, encaminadas a la Medición, análisis y control de variables del mundo fÃsico tales como: voltaje, frecuencia, peso, velocidad, temperatura, tiempo, movimiento y posición etc.

Empezando a programar
Apuntes

Software Arduino
Laboratorios
Lo primero que debemos hacer antes de empezar a realizar nuestros proyectos con arduino es descargar el sofware para poder compilar y cargar nuestro codigo.
En este espacio se consolidarán todos los laboratorios a medida que avancemos en los temas teóricos.
1.
Microcontroladores y Asembler
2.
Para empezar a programar micros y simular nuestros trabajos necesitaremos un conjunto de herramientas:
Software:
-
Mplab ide v 8.92
-
Pickit2
-
Proteus Professional v8 P
-
Compilador CCS C
-
Arduino Ide v 1.0.5-r2
-

Sistemas Númericos, algoritmos y diagramas de flujo.
Microcontroladores Pic y asembler.
Para realizar el 2d° laboratorio es necesario tener claro cuales son las principales instrucciones que se manejan en un programa, estas instrucciones y su funcion las puedes encontrar en el siguiente boton:
Adicional es necesario tener a la mano el Datasheet del Dispositivo con el que estemos trabajando, en el siguiente boton encontraran el Datasheet del Pic 16f877a.
Curso de Microcontroladores PIC basado en el 16f877a.
3.
Microcontroladores Pic y CCS C Compiler.
4.
Microcontroladores Pic y CCS C Compiler (conversion A/D)
Libros:
Compilador CCCS y Simulador Proteus
Manual de Programacion de Arduino
PIC 16F84 desarrollo de proyectos
Descargar (download).
Configuracion de pines (Vdd, Vcc, OSC y MCLR)

Nuestro Primer Programa con PIC (encender un led)
Despues de estudiar el manejo de los registros en el computador y realizar diferentes prácticas con programas de suma, resta, multiplicacion, division, mostrar mensajes en pantalla y hallar el área de un triangulo, ya estamos preparados para empezar a trabajar con MPlab, y quemar nuestros programas en un Pic para ver el funcionamiento real de nuestro codigo.
Lo primero que tenemos que tener son las aplicaciones y dispositivos:
-
Mplab
-
PicKit 2
-
Proteus
-
Pic (16f87xx).
-
Leds.
-
Resistencias (220 Ohm, 1KOhm, 10 KOhm).
-
Pulsador.
-
Cristal de Cuarzo de 4mhz.
-
2 condensadores ceramicos de 22 pF.
Antes de escribir nuestro codigo tenenos que crear un nuevo proyecto en Mplab, el paso a paso para realizarlo se explica en el siguiente video tutorial.
Despúes de crear nuestro proyecto en Mplab ya podemos escribir nuestro codigo.
Codigo:
; Titulo: encender un led
; Autor: Ing Victor Jaramillo
list p=16f877 ; llamo a la lista de comandos del pic para poder compilarlo
include <p16f877a.inc>
TIEMPO EQU 0X0C
org 0
bsf STATUS,RP0 ; SE COLOCA EN 1 EL BIT RP0
CLRF PORTB ; BORRAR EL PUERTO B Y SE CONFIGURA COMO SALIDA
BCF STATUS,RP0
;XXXX INICIO DE CODIGO XXXXX
INICIO BCF PORTB,0 ; PONER EN 1 EL PIN 1 DEL PUERTO B
CALL RETARDO
BSF PORTB,0
GOTO INICIO
RETARDO
MOVLW D'255' ;CARGA W CON 255
MOVFW TIEMPO ;TIEMPO =255
DEC DECFSZ TIEMPO ;DECREMENTAR
GOTO DEC
RETURN
END
Despues de escribir nuestro código fuente ya estamos preparados para compilarlo, simplemente oprimimos la tecla F9 y se realizara la compilacion de nuestro codigo, generando el ejecutable para cargarlo en el pic (xxx.hex), el siguiente paso es simular nuestro sistema en Proteus, esto con el fin de encontrar posibles errores de funcionamiento tanto en el Hardware como en el Programa que cosntruimos.

Montaje para Simulación en Proteus
Esquema del Montaje FÃsico

Ahora vamos a cargar el codigo al Pic
Para pasar nuestro codigo al pic debemos seguir los siguientes pasos:
-
Tener ya nuestro archivo.hex
-
Instalar el Pickit 2
-
Contar con un quemador de Pics
Despues de tener lo anteriormente mencionado debemos conectar el quemadore de pic al computador por el puerto USB, despúes abrimos el Pickit 2, en este punto ya se debe haber reconocido el pic que tenemos en el quemador, luego en cargamos nuestro codigo.hex desde asi:
-
File
-
Import hex
-
Buscamos la ubicacion de nuestro archivo.hex
-
aceptar
-
Luego de tener el codigo.hex cargado en el Pickit 2 es hora de pasarlo al Pic presionando el boton Write, en este paso debe aparecer un mensaje que dice que se ha cargado correctamente y listo ya tenemos nuestro programa en el pic.
-
-
Estos pasos los debes seguir con todos los programas que le vayas a cargar al Pic!.
Para realizar el esquema se recomienda utilizar la herramienta Fritzing, disponible de manera grátuita en el siguiente enlace
Segundo Programa con Microcontroladores (Pics) y Asembler
Contador de 0 a 9
Este programa tiene como objetivo realizar un contador ascendente de 0 a 9, además familiarizarnos con el manejo de librerias y como incluirlas dentro de nuestros programas, las librerias estan diseñadas y se pueden encontrar facilmente en internet estas se hacen con el fin de facilitarnos la vida y hacer que nuestros programas no lleven tantas lineas de codigo.
Codigo:
os e
; TITULO: CONTADOR DE 0 A 9
;AUTOR: VICTOR JARAMILLO
;INFO: www.elprofejaramillo.tk
LIST P=16F877A
INCLUDE <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ; CONFIGURACIONES GENERALES
CBLOCK 0x0c ; INSTRUCCION PARA LLAMAR LAS INSTRUCCIONES DE LAS LIBRERIAS QUE AGUREGUEMOS
ENDC
#DEFINE DISPLAY PORTB ;DEFINES LOS PUERTOS PUERTO B=DISPLAY
ORG 0 ;INDICAMOS EL ORIGEN DE NUESTRO CODIGO
BSF STATUS,RP0 ;ENTRAMOS AL BANCO DE MEMORIA PARA CONFIGURACION
CLRF DISPLAY ;SE DEFINE EL PUERTO B=DISPLAY COMO SALIDA
BCF STATUS, RP0 ;DEVOLVEMOS AL BANCO DE MEMORIA
INICIO ;ETIQUETA DE INICIO
MOVLW B'11000000' ;CARGAMOS EL DATO 0
MOVWF DISPLAY ;LO MOVEMOS AL PUERTO B
CALL Retardo_200ms
MOVLW B'11111001' ;1
MOVWF DISPLAY
CALL Retardo_200ms
MOVLW B'10100100' ;2
MOVWF DISPLAY
CALL Retardo_200ms
MOVLW B'10110000' ;3
MOVWF DISPLAY
CALL Retardo_200ms
MOVLW B'10011001' ;4
MOVWF DISPLAY
CALL Retardo_200ms
MOVLW B'10010010' ;5
MOVWF DISPLAY
CALL Retardo_200ms
MOVLW B'10000010' ;6
MOVWF DISPLAY
CALL Retardo_200ms
MOVLW B'11111000' ;7
MOVWF DISPLAY
CALL Retardo_200ms
MOVLW B'10000000' ;8
MOVWF DISPLAY
CALL Retardo_200ms
MOVLW B'10011000' ;9
MOVWF DISPLAY
CALL Retardo_200ms
GOTO INICIO ; VOLVEMOS AL INICIO PARA EMPEZAR DE NUEVO
INCLUDE <Retardo.INC> ; LIBRERIRA DE RETARDOS
END ; FIN DEL PROGRAMA
Monaje para Simulación en Proteus

Esquema para el Montaje FÃsico

Nota: las conexiones del display de 7 segmentos no son las reales estas se deben realizar con base al tipo de display que esten manejando si es de anodo común o catodo común, ademas de revisar el datasheet del dispositivo para verificar (a,b,c,d,e,f,g,h, voltaje + y voltaje -).
Puente H con integrado L293 Puente H con transistores


Cerradura electrónica con teclado de 4x4
Con este proyecto vamos a utilizar las librerias para manejar el LCD y para poder utilizar el teclado matricial, este proyecto puede tener multiples usuos como los son el acceso a una habitación u oficina
los compónentes que vamos a necesitar son:
-
Pantalla de cristal lÃquido LCD
-
Pic 16f877a
-
Teclado matricial de 4x4 (en caso de no tener el teclado se puede construir con pulsadores).
-
Relé
-
Transistor BD135.
Adicional a los materiales y dispositivos electrónicos necesitamos la libreria kbd_lib.c que la pueden descargar en el siguiente botón.
Esta libreria se deve copiar en la carpeta de Drivers donde se tiene instaldo el programa PICCse
Código en CCS C (PIC C COMPILER)
#include <16f877a.h>
#fuses XT,nowdt, noprotect, nolvp
#use delay (clock=4M)
#use standard_io(a) //gestion de puertos
#include <lcd.c> //libreria del lcd
#include <kbd_lib.c> //libreria del teclado
#include <stdlib.h> //libreria para crear datos de memoria dinamica de datos aleatorios
#rom 0x2100={'7','2','3'} //posicion 0,1 y 2 de la eeprom con los datos
void main (){
char k;
int i;
char data[3], clave[3]; //matrices para guardar clave y datos
lcd_init(); //inicaia lcs
kbd_init(); //inicia teclado
port_b_pullups(true); //habilitan las resistencias pull up para evitar resistencias en el teclado
while(true){
i=0; //posicion de la matriz
printf(lcd_putc,"\fpulsar tecla 1\n"); //primer dato
while(i<=2){ //para 3 datos
k=kbd_getc(); //lee el treclado
if(k!=0) //si se pulsa alguna tecla
{data[i]=k; //se guarda el dato en la posicion corres. de la matriz
i++;
printf(lcd_putc,"\fpulsar tecla %u\n",i+1); //siguiente dato
}
}
for (i=0;i<=2;i++){ //pasa los datos de eeprom a la matriz
clave[i]=read_eeprom(i);}
if((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2]))
{
printf(lcd_putc,"\fpuerta abierta"); //compara los datos y la clave
output_high(PIN_A0); //Clave correcta pone en alto el pin RA0
delay_ms(500);
output_low(pin_a0); //el alto en el pin rA0 esta durante 500ms luego se apaga
}
else printf(lcd_putc,"\fpuerta cerrada"); //clave errada cuando la clave no es correcta
delay_ms(1000);
}
}
Montaje en proteus

Control de temperatura (conversor analogo digital)
Código
# include <16f877a.h> //llamamos la libreria del micro
# device *=16 //definimos el dispositivo de medicion
# device adc=10 //llamamos el adcon1 registros adresh y adresl
# use delay(clock = 4M) //definimos la velocidad con la que vamos a trabajar
# include <lcd.c> //incluimos la libreria lcd para visualizar
# fuses xt,nowdt
float temperatura; //declaramos una variable de tipo flotante,
void main () {
setup_ccp1(ccp_pwm); //configuracion modo pwm
setup_timer_2(T2_DIV_BY_16,255,1); //configuracion del timer 2 y postcaler
setup_adc_ports (all_ANALOG); //configuramos este pin como entrada del LM35
setup_adc(ADC_CLOCK_INTERNAL); //llamamos el convertidor analogo digital del pic que trabaja con el reloj interno
setup_COUNTERS(RTCC_internal.rtcc_div_1); //comparamos la diferenca de potencial creada en el potenciometro o resistencia del lm 35
set_adc_channel(0);
//************** ESTA PARTE ES PARA LA CONVERSIÓN EN EL PIC 16F887***************
//setup_ccp1(ccp_pwm); //configuracion modo pwm
//setup_oscillator(OSC_4MHZ|OSC_INTRC); //Programamos oscilador interno del Pic a 4MHZ
//setup_adc_ports (ALL_ANALOG); //configuramos todas las entradas analogas
//setup_adc(ADC_CLOCK_INTERNAL); //llamamos el convertidor analogo digital del pic que trabaja con el //reloj interno
//setup_COUNTERS(RTCC_internal.rtcc_div_1); //comparamos la diferenca de potencial creada en el potenciometro o resistencia del lm 35
//set_adc_channel(0);
lcd_init(); // inicializamos el lcd
lcd_gotoxy(5,1); // nos da la posicion donde empieza el mensaje
printf(lcd_putc,"TEMPERATURA"); // nos muestra el mensaje en el lcd
delay_ms(300);
lcd_init(); // tambien printf(putc,(\f)) para borrar
while (true) {
temperatura=(float)read_adc()/2; // lee el valor y lo asigna a la variable temperatura y nos da el dato en grados centigrados
lcd_gotoxy(5,1);
printf(lcd_putc,"%f",temperatura); // el % nos indica que es una variable de punto flotante
lcd_gotoxy(12,1);
printf (lcd_putc,"Grados °C");
delay_ms(200);
//*********** si la temperatura esta entre 0 y 12
if(temperatura>=0&&temperatura<=12) {
set_pwm1_duty(57) ; // enciende MOTOR AL 25%
output_high(pin_B0); // enciende LED
output_low (pin_b1);
output_low (pin_b2);
output_low (pin_b3);
lcd_gotoxy(7,2);
printf(lcd_putc,"Temp. Baja....");
delay_ms(500);
lcd_gotoxy (1,2);
printf (lcd_putc,"V..25");
delay_ms(500);
}
//*********** si la temperatura esta entre 13 y 25
if(temperatura>=13&&temperatura<=25) {
set_pwm1_duty(115) ; // enciende MOTOR AL 50%
output_low (pin_b0);
output_high(pin_B1); // enciende LED
output_low (pin_b2);
output_low (pin_b3);
lcd_gotoxy(7,2);
printf(lcd_putc,"Temp. Ambiente");
delay_ms(500);
lcd_gotoxy (1,2);
printf (lcd_putc,"V..50");
delay_ms(500);
}
//*********** si la temperatura esta entre 26 y 37
if(temperatura>=26&&temperatura<=37) {
set_pwm1_duty(171) ; // enciende MOTOR AL 75%
output_low (pin_b0);
output_low(pin_B1); // enciende LED
output_high (pin_b2);
output_low (pin_b3);
lcd_gotoxy(7,2);
printf(lcd_putc,"Temp. Media...");
delay_ms(500);
lcd_gotoxy (1,2);
printf (lcd_putc,"V..75");
delay_ms(500);
}
//*********** si la temperatura esta entre 38 y 50
if(temperatura>=38&&temperatura<=50) {
set_pwm1_duty(228) ; // enciende MOTOR AL 100%
output_low (pin_b0);
output_low(pin_B1); // enciende LED
output_low (pin_b2);
output_high (pin_b3);
lcd_gotoxy(7,2);
printf(lcd_putc,"Temp. Alta...");
delay_ms(500);
lcd_gotoxy (1,2);
printf (lcd_putc,"V.100");
delay_ms(500);
}
}
}
Montaje en Proteus
