top of page

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)

Anchor 1

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

Anchor 2

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

Anchor 3

Cerradura electrónica con teclado de 4x4

Anchor 4

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

 

 

 

 

Anchor 5

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

Sensor de proximidad con sensor de ultrasonido HC-SR04

bottom of page