proyecto micros

15
UPIITA-IPN INSTITUTO POLITECNICO NACIONAL Unidad Profesional Interdisciplinaria en Ingeniería y Tecnologías Avanzadas Microcontroladores Avanzados Proyecto Final Alumnos: 1. Hernández Galán Víctor 2. Hernández Morales Francisco Javier 3. Martínez González Luis Gerardo Profesor: Mauricio Méndez Martínez Grupo: 4MM5 Ingeniería en Mecatrónica

Upload: sickma-kaoba

Post on 22-Dec-2015

41 views

Category:

Documents


3 download

DESCRIPTION

Proyecto de uC Avanzados

TRANSCRIPT

Page 1: Proyecto Micros

UPIITA-IPN

INSTITUTO POLITECNICO NACIONAL

Unidad Profesional Interdisciplinaria en Ingeniería

y Tecnologías Avanzadas

Microcontroladores Avanzados

Proyecto Final

Alumnos:

1. Hernández Galán Víctor

2. Hernández Morales Francisco Javier

3. Martínez González Luis Gerardo

Profesor:

Mauricio Méndez Martínez

Grupo:

4MM5

Ingeniería en Mecatrónica

Page 2: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 1

Índice

1. Objetivos .................................................................................................................................. 2

1.1 Objetivo General. .............................................................................................................. 2

1.2 Objetivos Específicos. ...................................................................................................... 2

2. Material Empleado. ................................................................................................................. 2

3. Desarrollo. ............................................................................................................................... 3

3.1 Sensores ............................................................................................................................ 3

3.2 Procesamiento de información. ....................................................................................... 4

3.3 Actuación. .......................................................................................................................... 6

3.5 Programación. ................................................................................................................... 7

3.5.1 MrLCD.h...................................................................................................................... 7

3.5.2 MrLCD.c ...................................................................................................................... 7

3.5.3 Proyecto.c ................................................................................................................... 9

4. Resultados. ............................................................................................................................ 12

5. Conclusiones. ........................................................................................................................ 14

Page 3: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 2

1. Objetivos

1.1 Objetivo General.

Diseñar un sistema que implemente todo lo visto en el curso de

microcontroladores avanzados.

1.2 Objetivos Específicos.

El proyecto debe de incluir los siguientes aspectos:

1. Incluir un indicador gráfico, ya sea LCD o GLCD.

2. Manejar mínimo 2 sensores.

3. Debe de tener por lo menos uno de los siguientes temas de clase:

Interrupciones, Timers, PWM o ADC.

4. Debe de manejar EEPROM.

5. Usar cualquiera de los protocolos de comunicación (USART, SPI, I2C).

6. Manejar un actuador.

2. Material Empleado.

- Microcontrolador ATMEGA32

- LCD 16x2

- Sensor de Humedad Analógico

- Sensor de Temperatura (LM35)

- Bomba de pecera

- Relevador

- Cable conversión USB-SERIAL

- Potenciómetro

- Fuente de 5 volts

- Transistor Tip 120

Page 4: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 3

3. Desarrollo.

Se realizó un sistema de medición de humedad y temperatura ambiente para

poder mantener la tierra con un nivel de humedad de acuerdo a la necesidad del

usuario.

El proyecto comprende diversas áreas funcionales que serán explicadas por fases

como se muestra en la Figura 1.

3.1 Sensores

Fig. 2 Sensor de humedad analógico/digital.

El sensor base del proyecto es el sensor de humedad (Fig.2), el cual se entierra

en la superficie donde se desea obtener la información de cantidad de humedad.

En el caso de la lectura analógica que es la que se va a utilizar, el sensor regresa

un valor de resistencia que significa que a mayor resistencia, menor cantidad de

humedad y vice-versa.

Fig. 1 Conformación del proyecto.

Page 5: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 4

Fig. 3 Sensor LM35.

Como información complementaria, se añadió un sensor de temperatura LM35

(Fig. 3) el cual detecta la cantidad de temperatura y lo devuelve con una variación

de voltaje, la cual será tratada para interpretarse como grados centígrados y

después sea desplegada en la información ya tratada con el microcontrolador.

3.2 Procesamiento de información.

Los datos enviados por los sensores llegarán al microcontrolador ATMEGA32 (Fig.

4) en 2 de sus 8 entradas analógicas, con lo cual se habilitará la lectura de datos

con ADC que la hoja de datos del microcontrolador.

Con la información obtenida, se hará una conversión a datos comunes como

porcentaje en el caso de la humedad y °C en el de la temperatura, los cuales

Fig. 4 ATMEGA32.

Page 6: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 5

serán desplegados en una LCD (Fig.5). Para el uso de la LCD, se diseñó un

archivo .h que se puede ajustar a cualquier display LCD para imprimir datos, hallar

su localización en el display y hacer operaciones con ellos.

Además, para abarcar otro de los requerimientos del proyecto, se agregó una

comunicación por puerto serial (Fig. 6), configurada a 9600 baudios, que enviará la

temperatura a la computadora.

Fig. 6 Cable USB/TTL.

Fig. 5 LCD 16x2.

Page 7: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 6

3.3 Actuación.

Fig. 7 Bomba de pecera.

La salida del microcontrolador va a enviar además de los datos desplegados,

operaciones para que de acuerdo a la cantidad de temperatura y humedad del

ambiente, permitan el trabajo de una bomba de pecera (Fig.7) que aumente la

cantidad de agua en la tierra. La bomba será conectada a un relevador de 5 volts,

que será activado con un 0 cuando se desee que opere.

Page 8: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 7

3.5 Programación.

A continuación se colocará por partes el código que el microcontrolador antes

mencionado manejó para su programación.

3.5.1 MrLCD.h

Este archivo incluye toda la programación de las características de la LCD.

#ifndef MrLCD #define MrLCD #include <avr/io.h> #include <stdlib.h> #define MRLCDsCRIB PORTB #define DataDir_MRLCDsCRIB DDRB #define MRLCDsCONTROL PORTD #define DataDir_MRLCDControl DDRD #define LightSwitch 5 #define ReadWrite 7 #define BiPolarMood 2 void Check_If_MrLCDisBusy(void); void Peek_A_Boo(void); void Send_A_Command(unsigned char command); void Send_A_Character(unsigned char Character); void Send_A_String(char *StringOfCharacters); void Goto_MRLCDsLocation(uint8_t x, uint8_t y); void InitializeMrLCD(void); void Send_A_StringToMrLCDWithLocation(uint8_t x, uint8_t y, char *StringOfCharacters); void Send_An_IntegerToMrLCD(uint8_t x, uint8_t y, int IntegerToDisplay, char NumberOfDigits); #endif

3.5.2 MrLCD.c

Este archivo hace las operaciones propuestas en MrLCD.h.

#include "MrLCD.h" void Check_If_MrLCDisBusy(void) { DataDir_MRLCDsCRIB = 0; MRLCDsCONTROL |= (1 << ReadWrite); MRLCDsCONTROL &= ~1 << BiPolarMood; while(MRLCDsCRIB >= 0x80) // D7 PORTB Pin7 0b10000000 0x80, está ocupado { Peek_A_Boo(); } DataDir_MRLCDsCRIB = 0xFF; // 0xFF 11111111

Page 9: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 8

} void Peek_A_Boo() { MRLCDsCONTROL |= (1 << LightSwitch); asm volatile ("nop"); asm volatile ("nop"); MRLCDsCONTROL &= ~1 << LightSwitch; } void Send_A_Command(unsigned char Command) { Check_If_MrLCDisBusy(); MRLCDsCRIB = Command; MRLCDsCONTROL &= ~ ((1 << ReadWrite) | (1 << BiPolarMood)); Peek_A_Boo(); MRLCDsCRIB = 0; } void Send_A_Character(unsigned char Character) { Check_If_MrLCDisBusy(); MRLCDsCRIB = Character; MRLCDsCONTROL &= ~ (1 << ReadWrite); MRLCDsCONTROL |= (1 << BiPolarMood); Peek_A_Boo(); MRLCDsCRIB = 0; } void Send_A_String(char *StringOfCharacters) { while(*StringOfCharacters > 0) { Send_A_Character(*StringOfCharacters++); } } char firstColumnPositionsForMrLCD[2] = {0,64}; void Goto_MRLCDsLocation(uint8_t x, uint8_t y) { Send_A_Command(0x80 + firstColumnPositionsForMrLCD[y] + x); } void Send_A_StringToMrLCDWithLocation(uint8_t x, uint8_t y, char *StringOfCharacters) { Goto_MRLCDsLocation(x, y); Send_A_String(StringOfCharacters); } void Send_An_IntegerToMrLCD(uint8_t x, uint8_t y, int IntegerToDisplay, char NumberOfDigits) { char StringToDisplay[NumberOfDigits]; itoa(IntegerToDisplay, StringToDisplay, 10); Send_A_StringToMrLCDWithLocation(x, y, StringToDisplay); Send_A_String(" ");

Page 10: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 9

} void InitializeMrLCD() { DataDir_MRLCDControl |= (1 << LightSwitch) | (1 << ReadWrite) | (1 << BiPolarMood); Send_A_Command(0x01); // Limpia la Pantalla 0x01 = 00000001 Send_A_Command(0x38); Send_A_Command(0b00001110); }

3.5.3 Proyecto.c

El archivo principal del proyecto en donde se hacen todas las operaciones,

lecturas y salidas de datos.

#include <avr/io.h> #include <avr/interrupt.h> #include "MrLCD.h" uint16_t PorHum = 0; uint16_t Tempo = 0; unsigned char var=0; unsigned char var1=0; //EEPROM void EEPROM_write(unsigned int uiAddress, unsigned char ucData) { /* Wait for completion of previous write */ while(EECR & (1<<EEWE)) ; /* Set up address and data registers */ EEAR = uiAddress; EEDR = ucData; /* Write logical one to EEMWE */ EECR |= (1<<EEMWE); /* Start eeprom write by setting EEWE */ EECR |= (1<<EEWE); } // UART void USART_Transmit( unsigned char data ) { /* Wait for empty transmit buffer */ while ( !( UCSRA & (1<<UDRE)) ) ; /* Put data into buffer, sends the data */ UDR = data; } unsigned char USART_Receive( void ) { /* Wait for data to be received */ while ( !(UCSRA & (1<<RXC)) )

Page 11: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 10

; /* Get and return received data from buffer */ return UDR; } int main(void) { InitializeMrLCD(); Send_A_StringToMrLCDWithLocation(0,0,"HHumedad:"); Send_A_StringToMrLCDWithLocation(0,1,"TTemp °C:"); DDRC=0x03; ADCSRA |= 1<<ADPS2; ADMUX |= 1<<REFS0 | 1<<REFS1; ADCSRA |= 1<<ADIE; ADCSRA |= 1<<ADEN; sei(); ADCSRA |= 1<<ADSC; ////////////////////////////////////////////////////////////////////////////////////////////////////// //UBRRH //configura a 9600 UBRRL =51; //habilita RX y TX y parcialmente configura a 8 bits UCSRB |= (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2); //brinda acceso al registro //modo asincrono //sin paridad //1 bit de paro //configra a 8bits UCSRC |= (1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ0) | (1<<UCSZ1); ////////////////////////////////////////////////////////////////////////////////////////////////////// while (1) { } } ISR(ADC_vect) { uint8_t theLow = ADCL; uint16_t theTenBitResult = ADCH<<8 | theLow; PorHum=theTenBitResult; Tempo=theTenBitResult/40; switch (ADMUX) { case 0xC0: Send_An_IntegerToMrLCD(10, 0, PorHum+10000 , 5); if (PorHum>500) {

Page 12: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 11

PORTC=0x01; } else { PORTC=0x00; } var1=PorHum; EEPROM_write(0x00,var1); ADMUX = 0xC1; break; case 0xC1: Send_An_IntegerToMrLCD(10, 1, Tempo+10000, 5); var=Tempo; USART_Transmit(var); ADMUX = 0xC0; break; default: //Default code break; } ADCSRA |= 1<<ADSC; }

Page 13: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 12

4. Resultados.

El circuito de la Fig.8 se conectó y se probó su comportamiento en el ambiente

común de la ciudad de México, donde nos entregó la temperatura de 23° C y una

humedad mínima, ya que regresaba la cantidad mayor de resistencia que dispone

el sensor.

La entrega de datos por medio del display funcionó correctamente, ya que en el

display se observaban los datos y sus variaciones en el tiempo de manera

adecuada.

Fig. 8 Proyecto Armado

Page 14: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 13

La actuación del sensor se probó sumergiendo el sensor de humedad en una

botella con agua. Al sumergirse, el relevador de la bomba se accionaba y permitía

la operación para intentar hacer que la bomba trabajara con el agua que tenía.

En el caso del protocolo de comunicación, se conectó por medio del circuito USB/TTL

antes propuesto a la computadora, en donde los RX y TX del microcontrolador eran

enviados y leídos a través de la terminal que provee el software Mikro C en su plataforma

para AVR. Se configuró a 9600 baudios y al conectarse se pudo ver la temperatura.

Fig. 9 Despliegue de temperatura en la computadora.

Page 15: Proyecto Micros

MICROCONTROLADORES AVANZADOS[ ] UPIITA-IPN

Práctica 3: Timer. 14

5. Conclusiones.

Conforme el proyecto se iba trabajando, surgieron muchas dificultades para que

su funcionamiento fuera el adecuado, desde las variaciones de las lecturas de los

datos en la LCD, hasta las salidas irregulares de respuestas para la actuación

correcta de la bomba. Pero finalmente se pudo ver mediante un proyecto simple,

la gran utilidad que tienen los microcontroladores en la ingeniería mecatrónica, ya

que nos sirven como intermediarios y cerebros del trabajo de nuestros

dispositivos. Se pudo apreciar la gran cantidad de aplicaciones y posibilidades que

un microcontrolador como el AVR ATMEGA32 podía darnos para resolver las

problemáticas que nos aquejaban y con una eficacia bastante buena.