AccessFID, Sistema de control de Faltas

El proyecto «Control de faltas» básicamente consiste en un envió de datos (tagRFID) y la recogida de esos datos (Lector RFID) para después mostrar en un panel todos los usuarios que hayan entrado en la habitación o sala de reuniones y a su vez esos datos serán almacenados en una base de datos.

.

1. INTRODUCCIÓN
  
¿Por qué hay gente que es incapaz de llegar a tiempo a los sitios aunque se esfuerce?

Todos conocemos a alguien que siempre llega con retraso a las citas  y ahora podemos entender el motivo. Según la  investigación llevada a cabo por el Doctor Jeff Conte, existen dos clases de personas las de clase A y las de clase B. Las primeras disponen de la capacidad para percibir el tiempo de una manera más precisa, mientras que las segundas perciben el tiempo de forma más lenta.

Esta conclusión, fue alcanzada tras realizar un experimento que consistía en evaluar a personas sobre su percepción del tiempo. Los sujetos debían determinar el tiempo transcurrido hasta llegar a un minuto. Previamente, se había separado a los individuos según su respuesta a la pregunta sobre si se consideran puntuales o no.

El resultado fue evidente. Los que decían ser puntuales tenían una percepción del tiempo casi exacta, ya que habían calculado un minuto de tiempo a los 58 segundos. En cambio, el otro grupo pensó que se había cumplido el minuto a los 77 segundos aproximadamente.

Sin embargo, también cabe destacar que la percepción temporal de las personas se resuelve con un simple reloj, por lo que las excusas para las personas impuntuales no serán del todo justificadas. Por ejemplo, mientras que en España llegar cinco minutos tarde se contempla como cierta puntualidad, en otros países como Alemania esos cinco minutos suponen un retraso considerable.

Se viene observando los últimos años que algunos alumnos de Don Bosco empiezan a faltar de forma reiterada a algunas o todas las asignaturas y vuelven a las aulas en un momento dado por motivos, en general desconocidos para el centro. Dado que estos alumnos han faltado a muchas explicaciones de la materia y no siguen ya el curso normal de la programación pierden el interés por atender y realizar los trabajos asignados.

Pierden el derecho a la evaluación continua y como consecuencia el derecho a la asistencia a las clases de dicha materia, pudiendo permanecer en la biblioteca del centro durante la impartición de la clase. Si el alumno es menor de edad, a los padres o tutores se les informará del riesgo de perder la evaluación continua y el derecho de asistencia cuando el alumno haya faltado aproximadamente la mitad de las horas.

El procedimiento para evaluarlos tanto en junio como en septiembre consistirá en:

– Un examen propuesto por el departamento cuyos contenidos se ajustarán a la programación.

– Entregar los trabajos que determine el departamento y que se ajusten a la programación de la asignatura.

Otro de los factores importantes es la falta de puntualidad:
La falta de puntualidad responde a algo más que una mera cuestión de mala educación.

En este contexto, se ha decidido desarrollar el proyecto “control de faltas” . Se pretende diseñar, desarrollar y construir un dispositivo para mantener a los alumnos lo más controlado posible. El dispositivo facilitará tanto al alumnado como al profesorado las entradas y salidas de cada integrante de Don Bosco, obteniendo los datos así en una base de datos y facilitando el trabajo para ambas partes.

 

2. JUSTIFICACIÓN DEL PROYECTO.

El objetivo del proyecto viene marcado por las necesidades surgidas en consecuencia de la falta de puntualidad y ausencias de los alumnos en los centros escolares.

2.1. Consecuencias.

La implantación y puesta en marcha de este proyecto podría tener las siguientes consecuencias a corto-medio plazo:

-Reducir las faltas del alumnado.

-Ahorro de tiempo a la hora de comenzar las clases.

-Omitir equivocaciones de faltas del alumnado para poder ser evaluado.

-Puntualidad de todos los alumnos.

-Saber desde fuera mediante un panel quien está dentro y que materia se está impartiendo.

2.2. Objetivos.

Con este proyecto, los objetivos que se quieren lograr son los que salen aquí debajo. Para ello, hemos clasificado de menor a mayor dificultad los objetivos que pretendemos conseguir. Aunque nuestro principal objetivo es el primer escalón de la pirámide.

1.3 Pirámide de la innovación

 

3. DESCRIPCIÓN TÉCNICA.

El objetivo principal es construir y desarrollar un sistema para el control del alumnado en los institutos ya sea secundaria, bachiller y formación profesional.

Hay que tener en cuenta que en nuestro sistema de educación donde la asistencia a clase es obligatoria y hay un porcentaje de ausencias que conviene cuantificar.

Es una herramienta ademas  que puede facilitar la tarea del profesorado, puesto que servirá para realizar dicho control.

El proyecto contará de dos partes: La parte informática y la electrónica. En la parte electrónica irá un panel al lado de  la puerta de entrada a clase para que se pueda ver desde fuera quién está dentro y controlaremos las entradas y salidas de los alumnos mediante el sistema RFID. También utilizaremos un microcontrolador arduino para la programación.  En la parte informática nos basaremos en los comandos GET y POST además de realizar diferentes aplicaciones, como guardar el historial de la asistencia de los alumnos.

El prototipo que veis a continuación es lo que queremos llegar a conseguir. Como se puede observar en la imagen hay una puerta con un panel en la parte superior, en el cual cuando un alumno entre por la puerta mediante la tecnología RFID, quedará registrado en una base de datos y se verá visualmente en el panel tanto los alumnos que acuden a clase tanto la materia que se está dando.

Por otro lado mediante comandos GET y POST se enviarán y recibirán datos. Y por último nuestros compañeros de Zubiri realizarán una aplicación web donde crearán un Google calendar con los eventos en nuestras aulas y otras funciones.

Control de acceso RFID y pantalla ULCD

Control de acceso RFID y pantalla ULCD

En este caso hemos creado un Control de Accesos que permite el acceso a los usuarios que tengan una tarjeta de identificación válida mediante un lector RFID, y a la vez acertar la contraseña que irá a continuación de la lectura de la tarjeta y que saldrá en una pantalla µLCD. Cuando se acierte la contraseña se abrirá la puerta.


El proceso de este proyecto:

Edición del esquema: En este caso se ha creado con el programa Capture Cis del software OrCad.

                .
Prueba del circuito: Se ha montado en una placa-board, ya con los componentes fisicos y se comprueba que se consiguen los valores necesarios para su correcto funcionamento. Para ello dejamos un video:

.
Diseño de la PCB: Se ha creado utilizando el programa Layout Plus, en la siguiente imagen lo podrás ver.
.

.
Fabricación de la PCB: Utilizando el programa Layout Plus hemos imprimido la cara TOP y la cara BOT para así poder hacer los cliches. Imprimimos también el archivo .DRD para hacer los agujeros de la placa.
.

DRD
.

TOP Y BOT
.
CLICHES

.

En este caso es necesario metalizar los agujeros, ya que es una placa de dos caras, se ha realizado mediante un proceso quimico en cubetas. Lo mismo pasa con la placa, la hemos hecho por quimico, entonces se ha realizado mediante procesos quimicos en cubetas.
.
.
.
.
    –Montaje y soldadura: Es el último paso, una vez comprobada la placa y ver que no esta defectuosa, es colocar los componentes y soldarlos para que quede como en la siguiente imagen.
.
.
.
    –Maqueta del control de accesos: Una vez echa la placa, utilizando la impresora 3D, se ha creado la maqueta del control de accesos (puerta, pared, marco, suelo, corredera, cremallera, sin fin, engranaje)
.
.
.
Material utilizado para la creación del control de accesos
         -L293D
          -PIC18F2550
          -JACK
          -OSCILADOR 4MHZ
          -DIODO
          -INTERRUPTOR
          -7805
          -LED
          -LED RGB
          -2 CONDENSADORES 22 uF
          -2 CONDENSADORES 100nF
          -BATERIA LIPO 7,4V
          -3 RESISTENCIAS 100K
          -4 RESISTENCIAS 330OHM
          -4 CONECTORES DOBLES
          -CONECTOR DE 5
          -2 CONECTORES DE 4

          -BOTON RESET

Archivos para descargar:

Proyecto_v1.c:

Proyecto_v1.h:
http://dl.dropbox.com/u/61585409/Blogspot/Control%20de%20accesos%20Urtzi%20Aitor%202012-2013/proiekto_v1.h

Proyecto_v1.cof:
http://dl.dropbox.com/u/61585409/Blogspot/Control%20de%20accesos%20Urtzi%20Aitor%202012-2013/proiekto_v1.cof 

Proyecto_v1.hex:
http://dl.dropbox.com/u/61585409/Blogspot/Control%20de%20accesos%20Urtzi%20Aitor%202012-2013/proiekto_v1.hex

Proeycto_v1.PJT:
http://dl.dropbox.com/u/61585409/Blogspot/Control%20de%20accesos%20Urtzi%20Aitor%202012-2013/proiekto_v1.PJT

Archivos OrCad y Layout:
http://dl.dropbox.com/u/61585409/Blogspot/Control%20de%20accesos%20Urtzi%20Aitor%202012-2013/plaka_proyeko.rar

Todas las piezas hechas por impresora 3D están en Thiingiverse:
http://www.thingiverse.com/search?q=elektronikadonbosco&sa= 

VIDEO

.

Mapear los pines de Arduino

Mapear los pines de Arduino

Últimamente ando un poco liado y me está costando escribir. Estoy intentando delegar en mis alumnos la tarea de documentar lo que van trabajando. Pero a veces sin darse cuenta lo publican y por mucho que les diga que tengan cuidado se suelen confundir. Por este motivo puede que veáis que un día se a publicado un artículo y al día siguiente ha desaparecido.
Cuando vamos avanzando con la placa Arduino y se ha realizado algún proyecto, suele llegar el momento de crear un proyecto final. Una solución es usar la placa de Arduino, pero 23 euros + iva sale un poco caro para dejarlo muerto de risa. Ademas si solo tenemos una placa tendríamos que comprar otra para poder seguir haciendo proyectos. Por muy elegante y mañoso que se sea, siempre da peor sensación dejarlo con los cables por el aire, por no decir que a nada que algún cable se suelte dejará de funcionar.
.

.

La solución es usar un microcontrolador y realizar el proyecto fuera de la placa Arduino. El microcontrolador que necesitamos es el ATMEGA 328p-pu. Se puede encontrar entre 3,5 y 6 euros dependiendo de la tienda en la que se compre, hay que sumarle gastos de envio… A la hora de comprar el microcontrolador hay que tener en cuenta que necesitará tener metido el Bootloader de Arduino UNO. Esto es un pequeño programa que funciona como la bios de un pc, al arrancar el micro realizar y configura unos parámetros del microcontrolador. Si sabemos como meter el bootloader, no hay problema pero si no sabemos es muy recomendable comprar el microcontrolador con el bootloader cargado.

Iba a comentar que con el bootloader cargado suelen ser un poquito más caros pero por lo visto desde que la última vez que busque en ebay el micro a bajado mucho de precio. Que cada uno valore que busca, precio, urgencia en recibirlo, servicio post venta, cercania… Os pongo un par de sitios donde se pueden comprar aunque no garantizo nada ni tengo ninguna relación ni interés en ninguno.

  • Ebay (desde 2,5€ con gastos de envio incluidos)
  • msebilbao (6€ más gastos de envio)
Hay que tener claro que los pines de la placa Arduino UNO y los pines del microcontrolador no coinciden. Con esto quiero decir que en la placa han colocado mediante pistas los pines del microcontrolador en un determinado orden para que sea más fácil empezar a trabajar con la placa. Si nosotros queremos trabajar directamente con el microcontrolador tenemos que conocer exactamente cada pin de la placa con que pin del microcontrolador corresponde. Como una imagen vale más que 1000 palabras, os dejo una imagen para que podáis ver como están ruteados los pines del micro con los pines de conexión de la placa Arduino UNO.
.
.
Antes usaba un dibujo que creo que en algún otro articulo lo publiqué, incluso se puede buscar en la hoja de características del microcontrolador o dado que la placa es Hardware Abierto mirar en Eagle como está ruteado. Esto requiere trabajo y concentración para no confundirse, ahora gracias a la Comunidad de Arduino han publicado en su foro unos esquemas muy interesantes donde se puede ver cada pin de una manera mucho más visual.
.
Encima no solo se han tomado la molestia de crearlo para el Arduino UNO, sino que han sacado para otras placas de Arduino. Os dejo la documentación que han creado hasta ahora.
Unidad de control de un motor de gasolina

Unidad de control de un motor de gasolina

 

La idea u objetivo del proyecto es controlar un motor de un automóvil, para después de ponerlo en funcionamiento,  poder controlar diferentes reacciones. Para ello hemos creado una CPU o Unidad de control que controle diferentes parámetros. También se conoce como centralita y su función es controlar varios parámetros para poder dar respuesta a las peticiones del usuario. El motor es de la marca OPEL, tiene 4 cilindros y en cada cilindro tiene un inyector y una bujía para poder crear la combustión  necesaria para su funcionamiento.

La CPU o Unidad de control debe controlar los siguientes parámetros:

  • Cantidad de masa de aire de entrada al motor en porcentajes (%0, %5, %25, %50, %75, %100).
  • Tiempo de inyección de gasolina en milisegundos (de 0ms a 16ms).
  • Angulo de avance del salto de chispa respecto al PMS (Punto muerto superior) y PMI (Punto muerto inferior). También conocido como ángulo Dwell.

Para poder controla todos estos parametros tendremos una señal situada en el motor.

Esta señal nos la proporcionara un sensor inductivo situado en el bolante motor. Interpretando esta señal y conociendo los diferentes parámetros debemos dar respuesta a las peticiones del usuario.

 

Tiempo de inyeccion y angulo Dwell
(Alimentacion, etapa de control y etapa de potencia)

.
Medidor de masa de aire
(Etapa de control )
.
(Etapa de potencia; puente en H)
.
.
.
PROGRAMA
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*********************************************************************
*********************************************************************
                 AUTOAREN CPU OPEL 2000 16v
                 MOTOREAN PROBATZEKO BERTSIOA
********************************************************************
OPEL: Sensor Inductivo: 57+1 Dientes=58 flanko positibo
                                                    Tiempo inyeccion+Angulo Dwell
*********************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <16F877.H>  //16F877 PIC-a erabiliko dugu Inyekzioa eta txispa kontrolatzeko
#device ADC=10       //Bihurgailu analogiko/digitalak 10 byte edukiko ditu//1024
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M) //4MHz-tako kristal harria
#use RS232(baud=19200, xmit=PIN_C6, rcv=PIN_C7,DISABLE_INTS)//Serie Portua
#include <math.h>                                           //19200Abiadura//Pin C6 datuak bidaltzeko
                                                            //Disable_Ints Etendurak desabilitatzen ditu RS232 Serie Portutik                    datuak bidaltzerakoan
int1 k=0;         //RPM-ak kalkulatzeko agindua
float t1=0;       //Hortzen arteko oraingo denbora
float t2=0;       //Hortzen arteko aurreko denbora
int8 kont_dient=0;  //Bira batean hortz kopurua
float aux_rpm=0;  //Abiadura RPM-tan
int16 rpm;        //Abiadura RPM-tan
int16 t_grado;    //Gradu bat igarotzeko behar den denbora
int16 pot_iny;    //Inyekzio denbora; Potentziometroa balio digitala
int16 pot_av;     //Angulo Avance; Potentziometroa balio digitala
int16 VDmax=1024; //Balio digital maximoa;ADC=10(byte) bada->1024/ADC=8(byte) bada->255
int8 Tmax=17;     //Inyekzio denbora maximoa
int8 T=0;         //Inyekzio denbora
int8 Gmax=43;     //Gradu maximoa ez errealak;24 gradu negatibo+18 gradu positibo=42 gradu guztira
int8 G=0;         //Graduak ez errealak; 0 gradutik 43 gradu arte
signed int8 Gr=0; //Gradu errealak; Gradu ez errealak-24
float a=0;        //Hortzetik hortzera dagoen denbora segunduetan, hau da t1-etik t2-ra dagoen denbora
float b=0;        //1 bira zenbat segundu diren kalkulatzeko;1 bira = 360º = 58 flanko positibo = 60 hortz
int8 i;
char bidali[7];   //Portu serietik bidaltzeko datuak;
                  //rpm (2 digitu)/angelu (zeinua + 2 digitu)/inyekzio (2 digitu)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/********************************************************************
   Interrupcion TIMER 2 Etendura
   Inyekzioa mozteko erabiliko dugu
********************************************************************/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#int_timer2
void tiempo2(void)
{
   output_low(PIN_C2);  //Inyektorea itzali
   output_low(PIN_C3);  //Inyektorea itzali
   disable_interrupts(INT_TIMER2);   //Timer 2 Etendura desaktibatu
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**********************************************************************
   Kampoko Etendura PIN_B0
   Birak kontatzeko erabiliko dugu
***********************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#int_ext
void birak(void)
{
   t1=get_timer1(); //2 hortzen harteko denbora hartu//get timer-aren bidez momentuan timerraren akumulagailuan dagoen balioa artuko du
   set_timer1(0);  //Timer1 Hasieratu, momentu honetan timer-a kontatzen hasiko da
   if((t1>1.5*t2)||(kont_dient>=58))    //Oraingo denbora, aurreko denbora baino andiagoa bada
   {                                   //PMS -ean dagoela esan nahi du beraz kontaketa hasi
      kont_dient=1;
   }
   else
   {
      kont_dient ++; //Kont_dient inkrementatu
      if((kont_dient==5)||(kont_dient==34)) //Gasolina inyektatu
      {
         output_high(PIN_C2); //Inyectar
         output_high(PIN_C3); //Inyectar
         setup_timer_2 ( T2_DIV_BY_16,pot_iny/4,4 ); //Timer 2 konfiguratu//Inkrementu bakoitzak 16uS,potentziometroaren bidez kargatu behar dugun balioa artuko du.
         set_timer2(0); //Timer2 Hasieratu//etendura abilitatu bezahin laster asiko da kontaketa gainezka egin arte, timer-ak gainezka egitean etendurara joango da eta inyektoreak itzali egingo ditu
         enable_interrupts(INT_TIMER2);   //Timer 2 Etendura aktibatu
      }
      if(kont_dient==10)    //RPM-ak kalkulatzeko
      {
         k=1;
      }
   }
   t2=t1; //Oraingo denbora aurreko bezala gorde
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**********************************************************************
   Funtzio Nagusia
**********************************************************************/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main(void)
{
   delay_ms(2000);
   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1 );  //Timer 1 konfiguratu//Inkrementu bakoitzak 1uS
   set_timer1(0);  //Timer1 Hasieratu
   //setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_64 );   //Timer 0//0-16,320ms//Inkrementu bakoitzak 64uS
   //set_rtcc(0); //Timer0 hasieratu
   setup_timer_2 ( T2_DIV_BY_16,0xff,4 );   //Timer 2 konfiguratu//Inkrementu bakoitzak 16uS
   set_timer2(0); //Timer2 Hasieratu
   enable_interrupts(INT_TIMER2);   //Timer 2 Etendura aktibatu
   enable_interrupts(GLOBAL);       //Etendura guztiak aktibatu
   enable_interrupts(INT_EXT); //Kampoko etendura aktibatu B0 portua, B0 portuan kanpoko seinale bat jasotzean programa nagusia utzi eta programa zati zehatz batetara joaten da
   ext_int_edge(H_TO_L);      //Kampoko etendura aktibatu LtoH(goranzko flankoa), hau da 0v-tik 5v-rako aldaketa somatzen duenean exekutatzen hari den programa utzi eta int_ext etendurara joango da bertan dauden aginduak exekutatzeko
   setup_adc_ports(AN0_AN1_AN3);      //PIN A0,A1 eta A3 Analogiko bezala konfiguratu, hau da pin hauetan balio analogiko bat sartuko dugu eta pic-ak balio hau digital bihurtuko du//ADC=10 bada 10 byteraino hau da 1024 arteko balio tartea// ADC=8 bada 8 byterain, hau da 255 arteko balio tartea.
   setup_adc(adc_clock_internal);    //CAD Konfiguratu
   while(1)
   {
      //RPM//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      if(k==1)
      {
         a=((t1/1000.0)/1000.0); //Hortzetik hortzera dagoen denbora microsegundutatik segundutara pasatu //3300uS = 0,0033s
         b=a*58.0;       //1 bira zenbat segundu diren kalkulatzeko// Motorrean 58 hortz
         aux_rpm=60.0/b; //Bira kopurua minutuko RPM    //60/0,2=300rpm
         rpm=aux_rpm;    //aux_rpm:float/rpm:int16
         k=0;            //RPM-ak kalkulatzeko balioa 0-an jarri
      }
      //TIEMPO INYECCION/////////////////////////////////////////////////////////////////////////////////////////////////////
      set_adc_channel(0);   //A0 kanala aktibatu
      delay_us(10);
      pot_iny=read_adc();   //A0-tik sartutako balioa irakurri
      T=pot_iny*Tmax/VDmax; //Inyekzio denbora milisegundutan
      //ANGULO AVANCE////////////////////////////////////////////////////////////////////////////////////////////////////////
      set_adc_channel(1);   //A1 kanala aktibatu
      delay_us(10);
      pot_av=read_adc();    //A1-etik sartutako balioa irakurri
      G=pot_av*Gmax/VDmax;  //Angulo avance gradutan
      Gr=G-24;
      //DATUAK EGOKITU///////////////////////////////////////////////////////////////////////////////////////////////////////
      bidali[0]=rpm/1000;   bidali[0]=bidali[0]+0x30;//RPM; Milakoak kalkulatu eta ASCII kodera pasa
      bidali[1]=(rpm%1000)/100;  bidali[1]=bidali[1]+0x30;//RPM; Ehunekoak kalkulatu eta ASCII kodera pasa
      if(Gr<0) //Angulo de Avance negatiboa
         bidali[2]=’-‘;
      else     //Angulo de Avance positiboa
         bidali[2]=’+’;
      bidali[3]=fabs(Gr)/10;   bidali[3]=bidali[3]+0x30;//Angulo de Avance; Hamarrekoa kalkulatu eta ASCII kodera pasa
      bidali[4]=fabs(Gr)%10;   bidali[4]=bidali[4]+0x30;//Angulo de Avance; Batekoak kalkulatu eta ASCII kodera pasa
      bidali[5]=T/10;   bidali[5]=bidali[5]+0x30;//Inyekzioa: Hamarrekoak kalkulatu eta ASCII kodera pasa
      bidali[6]=T%10;   bidali[6]=bidali[6]+0x30;//Inyekzioa; Batekoak kalkulatu eta ASCII kodera pasa
      //PORTU SERIEA RS232////////////////////////////////////////////////////////////////////////////////////////////////////
      disable_interrupts(global);   //Etendurak desaktibatu
      putc(‘Z’); //Komunikazioa hasteko marka
      for(i=0;i<7;i++)
         putc(bidali[i]);  //Datuak bidali portu serietik
      enable_interrupts(global); //Etendurak aktibatu
     //BUJIAK////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      if((Gr<=18)&&(Gr>12))   //18º
      {
         while(kont_dient!=3)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C0); //Bujias 1-4 Deskargatu!!¡!¡!
         delay_us(500);
         while(kont_dient!=32)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C1); //Bujias 2-3 Deskargatu!!¡!¡!
         delay_us(500);
      }
      else if((Gr<=12)&&(Gr>6))  //12º
      {
         while(kont_dient!=2)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C0); //Bujias 1-4 Deskargatu!!¡!¡!
         delay_us(500);
         while(kont_dient!=31)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C1); //Bujias 2-3 Deskargatu!!¡!¡!
         delay_us(500);
      }
      else if((Gr<=6)&&(Gr>0)) //6º
      {
         while(kont_dient!=1)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C0); //Bujias 1-4 Deskargatu!!¡!¡!
         delay_us(500);
         while(kont_dient!=30)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C1); //Bujias 2-3 Deskargatu!!¡!¡!
         delay_us(500);
      }
      else if((Gr<=2)&&(Gr>=-2))    //0º
      {
         while(kont_dient!=58)//PMS//
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C0); //Bujias 1-4 Deskargatu!!¡!¡!
         delay_us(500);
         while(kont_dient!=29)//Erdia PMI//
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C1); //Bujias 2-3 Deskargatu!!¡!¡!
         delay_us(500);
      }
      else if((Gr<0)&&(Gr>=-6))  //-6º
      {
         while(kont_dient!=57)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C0); //Bujias 1-4 Deskargatu!!¡!¡!
         delay_us(500);
         while(kont_dient!=28)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C1); //Bujias 2-3 Deskargatu!!¡!¡!
         delay_us(500);
      }
      else if((Gr<-6)&&(Gr>=-12))  //-12º
      {
         while(kont_dient!=56)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C0); //Bujias 1-4 Deskargatu!!¡!¡!
         delay_us(500);
         while(kont_dient!=27)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C1); //Bujias 2-3 Deskargatu!!¡!¡!
         delay_us(500);
      }
      else if((Gr<-12)&&(Gr>=-18))  //-18º
      {
         while(kont_dient!=55)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C0); //Bujias 1-4 Deskargatu!!¡!¡!
         delay_us(500);
         while(kont_dient!=26)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C1); //Bujias 2-3 Deskargatu!!¡!¡!
         delay_us(500);
      }
      else if((Gr<-18)&&(Gr>=-24))  //-24º
      {
         while(kont_dient!=54)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C0); //Bujias 1-4 Deskargatu!!¡!¡!
         delay_us(500);
         while(kont_dient!=25)
         {
            output_high(PIN_C0); //Bujias 1-4 kargatu
            output_high(PIN_C1); //Bujias 2-3 kargatu
         }
         output_low(PIN_C1); //Bujias 2-3 Deskargatu!!¡!¡!
         delay_us(500);
      }
   }  //While(1)bukaera
}  //main() bukaera
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*********************************************************************
**********************************************************************
                 AUTOAREN CPU OPEL 2000 16v
                 MOTOREAN PROBATZEKO BERTSIOA
**********************************************************************
LCD
**********************************************************************/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <16F876.H>//16F876 PIC-a erabiliko dugu datuak jaso eta LCD-an pantailaratzeko
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4M)
#use RS232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) //Portu seriea Pin C6 datuak jasotzeko
#include «LCD.c»  //LCD-a erabiltzeko Programa gehigarria
char datuak[7];//Portu serietik jasotako datuak gordetzeko
int8 i;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/***********************************************************************
   Funtzio Nagusia
************************************************************************/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main(void)
{
   lcd_init();       //LCD Hasieratu
   lcd_gotoxy(6,1);   //Lehenengo lerroa,6.posizioa
   printf(lcd_putc,»RPM»);
   lcd_gotoxy(4,2);  //Bigarren lerroa, 5.posizioa
   printf(lcd_putc,»ms»);
   lcd_gotoxy(12,2);  //Bigarren lerroa, 11.posizioa
   printf(lcd_putc,»Gradu»);
   while(1)
   {
      while(getc()!=’Z’);  //Itxaron datuak jasotzeko marka jaso arte
      for(i=0;i<7;i++)
         datuak[i]=getc(); //Portu serietik datuak jaso
      for(i=0;i<7;i++)
         write_eeprom(i,datuak[i]); //Eeprom memorian jasotako datuak gorde
      //LCD RPM///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      lcd_gotoxy(1,1);                 //Lehenengo lerroa,1.posizioa
      printf(lcd_putc,»%c»,datuak[0]);    //RPM; Milakoak
      printf(lcd_putc,»%c»,datuak[1]);    //RPM; Ehunekoak
      printf(lcd_putc,»00″);              //RPM; Hamarrekoak eta Batekoak
      //LCD ANGULO AVANCE///////////////////////////////////////////////////////////////////////////////////////////
      lcd_gotoxy(8,2);                 //Bigarren lerroa,8.posizioa
      printf(lcd_putc,»%c»,datuak[2]);    //Angulo Avance; Seinua +-
      printf(lcd_putc,»%c»,datuak[3]);    //Angulo Avance; Hamarrekoa
      printf(lcd_putc,»%c»,datuak[4]);    //Angulo Avance; Batekoa
      //LCD TIEMPO INYECCION///////////////////////////////////////////////////////////////////////////////////////
      lcd_gotoxy(1,2);                 //Bigarren lerroa, 1.posizioa
      printf(lcd_putc,»%c»,datuak[5]);    //Inyekzioa; Hamarrekoa
      printf(lcd_putc,»%c»,datuak[6]);    //Inyekzioa; Batekoa
   }//while(1) bukara
}//main() bukaera
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*********************************************************************************************
                VDO
Medidor masa de aire
**********************************************************************************************
output_high(PIN_c3);//1
output_low(PIN_c4);//0
delay_ms(5000);
output_low(PIN_c3);//0
output_low(PIN_c4);//0
delay_ms(5000);
output_low(PIN_c3);//0
output_high(PIN_c4);//1
delay_ms(5000);
output_high(PIN_c3);//1
output_high(PIN_c4);//1
***********************************************************************************************/
#include <16F876A.H>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
int16 a;
int1 b,c,d,e,f,g;
void main(void)
{
   setup_adc_ports(AN0);
   setup_adc(adc_clock_internal);
   set_adc_channel(0);
   while(1)
   {
      a=read_adc();
      b=input(PIN_B1);//0%
      c=input(PIN_B2);//punto muerto
      d=input(PIN_B3);//25%
      e=input(PIN_B4);//50%
      f=input(PIN_B5);//75%
      g=input(PIN_B6);//100%
      if(b==0)
      {
         output_low(PIN_c4);//guztiz itxi
         output_high(PIN_c3);
      }
      else if(c==0)
      {
         output_high(PIN_c4);//jetsi baina motorrak lagunduta
         output_high(PIN_c3);//punto muerto
      }
      else if(d==0)
      {
         if(a>637)//50%   380
         {
            output_high(PIN_c4);//Ireki
            output_low(PIN_c3);
         }
         else
         {
            output_high(PIN_c3);//jetsi baina motorrak lagunduta
            output_high(PIN_c4);
         }
      }
      else if(e==0)
      {
         if(a>515)//50%   380
         {
            output_high(PIN_c4);//Ireki
            output_low(PIN_c3);
         }
         else
         {
            output_high(PIN_c3);//jetsi baina motorrak lagunduta
            output_high(PIN_c4);
         }
      }
      else if(f==0)
      {
         if(a>392)//50%   380
         {
            output_high(PIN_c4);//Ireki
            output_low(PIN_c3);
         }
         else
         {
            output_high(PIN_c3);//jetsi baina motorrak lagunduta
            output_high(PIN_c4);
         }
      }
      else if(g==0)
      {
         if(a>392)//50%   380
         {
            output_high(PIN_c4);//Ireki
            output_low(PIN_c3);
         }
      }
   }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

Como capturar una comunicación serie USART

Como capturar una comunicación serie USART

Para capturar una comunicación serie no hace falta nada más que un osciloscopio digital. El osciloscopio hay que conectarlo a una de las lineas de comunicación (RxD o TxD) y a masa (Gnd). En esta práctica se comunican dos microcontroladores entre si. En este caso son dos PICs pero se podría hacer lo mismo con cualquier otro microcontrolador como Arduino o el 8051.
.
.
En el video se puede ver como al mandar el dato 45 en hexadecimal (creo que es el F en Ascii) como es enviado ese dato. Esto se ha conseguido con un pequeño programa donde una y otra vez se envia el dato y un pequeño delay para que se vea más claro la información enviada.
.