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
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
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
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.
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.
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.
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.
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
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(" ");
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)) )
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) {
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; }
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
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.
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.