/*****************************************************************************/
/* libreria_skybot.c Julio-2007 */
/*---------------------------------------------------------------------------*/
/* Libreria de funciones auxiliares para el manejo del skybot */
/*---------------------------------------------------------------------------*/
/* Este fichero contiene el codigo de las funciones de movimiento del skybot */
/* es indispensable incluir en los ficheros de codigo creados por el usuario */
/* el fichero de firmas correspondiente a estas funciones (libreria_skybot.h)*/
/*---------------------------------------------------------------------------*/
/* Dependencias: */
/* */
/* -> delay0 - Libreria de acceso al temporizador del pic 16f876a */
/* -> pic16f876a - Libreria de acceso a los registros del pic 16f876a */
/* -> libreria_skybot.h - Fichero de cabecera que contiene las firmas y */
/* constantes necesarias para esta libreria */
/*---------------------------------------------------------------------------*/
/* Autor: Javier Valiente <javier.valiente@gmail.com> */
/*---------------------------------------------------------------------------*/
/* LICENCIA GPL */
/*****************************************************************************/
#include "libreria_skybot.h"
/**************************************************************
* *
* ConfigurarSkybot *
* ---------------- *
* *
* Funcion encargada de configurar el puerto B del skybot *
* para que sepa leer la informacion de los 4 sensores *
* infrarrojos, y para que sea capaz de manejar ambos *
* motores. *
* Tambien inicializa el temporizador a 0. *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: Ninguno *
* *
**************************************************************/
void ConfigurarSkybot()
{
//-- Configurar el puerto B para trabajar con el Skybot
//-- RB0, RB5, RB6 y RB7 como entradas
//-- RB1, RB2, RB3 y RB4 como salidas
TRISB=0xE1;
//TRISA=0xFF;
//-- Configurar el puerto A para leer los bumpers del Skybot
ADCON1 = 0x0E;
//-- Inicializar temporizador a 0
timer0_configurar();
}
/**************************************************************
* *
* PausaTiempo *
* ---------------- *
* *
* Funcion encargada de pausar la ejecucion del codigo del *
* PIC del skybot. De este modo, la ultima instruccion se *
* queda activa durante la pausa que se indique. *
* Tambien inicializa el temporizador a 0. *
* *
* Parametros de la funcion: *
* - unsigned int segundos: Nš de segundos de pausa *
* - unsigned int centesimas: Nš de segundos de pausa *
* *
* Retorno de la funcion: Ninguno *
* *
**************************************************************/
void PausaTiempo(unsigned int segundos,unsigned int centesimas)
{
// Centesimas:
while (centesimas > 255)
{
delay0(255);
centesimas-=255;
}
delay0(centesimas);
while (segundos > 2)
{
delay0(200);
segundos-=2;
}
if (segundos==2) {
delay0(200);
}
else if (segundos==1) {
delay0(100);
}
}
/**************************************************************
* *
* Avanzar *
* ---------------- *
* *
* Funcion que configura y activa los motores del skybot *
* para que avance hacia delante. *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: Ninguno *
* *
**************************************************************/
void Avanzar()
{
// TRISB &= ~(TRISB_MOTOR_IZQUIERDO | TRISB_MOTOR_DERECHO);
PORTB=AVANZA;
return;
}
/**************************************************************
* *
* GirarIzq *
* ---------------- *
* *
* Funcion que configura y activa los motores del skybot *
* para que gire hacia la izquierda *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: Ninguno *
* *
**************************************************************/
void GirarIzq()
{
// TRISB&=~(TRISB_MOTOR_IZQUIERDO | TRISB_MOTOR_DERECHO);
PORTB=IZQUIERDA;
return;
}
/**************************************************************
* *
* GirarDer *
* ---------------- *
* *
* Funcion que configura y activa los motores del skybot *
* para que gire hacia la derecha *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: Ninguno *
* *
**************************************************************/
void GirarDer()
{
// TRISB&=~(TRISB_MOTOR_IZQUIERDO | TRISB_MOTOR_DERECHO);
PORTB=DERECHA;
}
/**************************************************************
* *
* Retroceder *
* ---------------- *
* *
* Funcion que configura y activa los motores del skybot *
* para que retroceda *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: Ninguno *
* *
**************************************************************/
void Retroceder()
{
// TRISB&=~(TRISB_MOTOR_IZQUIERDO | TRISB_MOTOR_DERECHO);
PORTB=ATRAS;
}
/**************************************************************
* *
* Parar *
* ---------------- *
* *
* Funcion que configura y activa los motores del skybot *
* para se detenga *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: Ninguno *
* *
**************************************************************/
void Parar()
{
// TRISB&=~(TRISB_MOTOR_IZQUIERDO | TRISB_MOTOR_DERECHO);
PORTB=STOP;
}
/**************************************************************
* *
* SensorIR_Izq_Lee_Negro *
* ---------------- *
* *
* Funcion que comprueba si el sensor infrarrojo izquierdo *
* esta leyendo negro. *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: VERDADERO o FALSO *
* *
**************************************************************/
unsigned char SensorIR_Izq_Lee_Negro()
{
if (LeerSensor3() == NEGRO) return VERDADERO;
return FALSO;
}
/**************************************************************
* *
* SensorIR_Der_Lee_Negro *
* ---------------- *
* *
* Funcion que comprueba si el sensor infrarrojo derecho *
* esta leyendo negro. *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: VERDADERO o FALSO *
* *
**************************************************************/
unsigned char SensorIR_Der_Lee_Negro()
{
if (LeerSensor4() == NEGRO) return VERDADERO;
return FALSO;
}
/**************************************************************
* *
* SensorIR_Izq_Lee_Blanco *
* ---------------- *
* *
* Funcion que comprueba si el sensor infrarrojo izquierdo *
* esta leyendo blanco. *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: VERDADERO o FALSO *
* *
**************************************************************/
unsigned char SensorIR_Izq_Lee_Blanco()
{
if (LeerSensor3() == BLANCO) return VERDADERO;
return FALSO;
}
/**************************************************************
* *
* SensorIR_Der_Lee_Blanco *
* ---------------- *
* *
* Funcion que comprueba si el sensor infrarrojo derecho *
* esta leyendo blanco. *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: VERDADERO o FALSO *
* *
**************************************************************/
unsigned char SensorIR_Der_Lee_Blanco()
{
if (LeerSensor4() == BLANCO) return VERDADERO;
return FALSO;
}
/**************************************************************
* *
* LeerInfrarrojos *
* ---------------- *
* *
* Funcion que lee ambos sensores infrarrojos y *
* devuelve un valor distinto dependiendo de lo que lee cada *
* sensor. *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: *
* 3 - Ambos sensores estan detectando algo negro *
* 2 - El sensor derecho lee negro, el sensor izquierdo *
* lee blanco *
* 1 - El sensor izquierdo lee negro, el sensor derecho *
* lee blanco *
* *
**************************************************************/
unsigned char LeerInfrarrojos()
{
unsigned char sI=0,sD=0;
if (SensorIR_Izq_Lee_Negro()) sI=1;
if (SensorIR_Der_Lee_Negro()) sD=1;
if (sI && sD) return 3;
else if (sD) return 2;
return 1;
}
/**************************************************************
* *
* LeerSensor1 *
* ---------------- *
* *
* Funcion que devuelve la lectura del sensor 1 (infrarrojo) *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: NEGRO o BLANCO *
* *
**************************************************************/
unsigned char LeerSensor1()
{
if ((PORTB & SENSOR1) != 0) return NEGRO;
return BLANCO;
}
/**************************************************************
* *
* LeerSensor2 *
* ---------------- *
* *
* Funcion que devuelve la lectura del sensor 2 (infrarrojo) *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: NEGRO o BLANCO *
* *
**************************************************************/
unsigned char LeerSensor2()
{
if ((PORTB & SENSOR2) != 0) return NEGRO;
return BLANCO;
}
/**************************************************************
* *
* LeerSensor3 *
* ---------------- *
* *
* Funcion que devuelve la lectura del sensor 3 (infrarrojo) *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: NEGRO o BLANCO *
* *
**************************************************************/
unsigned char LeerSensor3()
{
if ((PORTB & SENSOR3) != 0) return NEGRO;
return BLANCO;
}
/**************************************************************
* *
* LeerSensor4 *
* ---------------- *
* *
* Funcion que devuelve la lectura del sensor 4 (infrarrojo) *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: NEGRO o BLANCO *
* *
**************************************************************/
unsigned char LeerSensor4()
{
if ((PORTB & SENSOR4) != 0) return NEGRO;
return BLANCO;
}
/**************************************************************
* *
* Bumper_Izq_esta_apretado *
* ---------------- *
* *
* Funcion que comprueba si el bumper izquierdo esta apretado *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: VERDADERO o FALSO *
* *
**************************************************************/
unsigned char Bumper_Izq_esta_apretado()
{
if (LeerBumperIzquierdo() == APRETADO) return VERDADERO;
return FALSO;
}
/**************************************************************
* *
* Bumper_Der_esta_apretado *
* ---------------- *
* *
* Funcion que comprueba si el bumper derecho esta apretado *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: VERDADERO o FALSO *
* *
**************************************************************/
unsigned char Bumper_Der_esta_apretado()
{
if (LeerBumperDerecho() == APRETADO) return VERDADERO;
return FALSO;
}
/**************************************************************
* *
* LeerBumperIzquierdo *
* ---------------- *
* *
* Funcion que devuelve el estado del bumper izquierdo *
* (visto desde arriba, desde la rueda loca del skybot) *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: APRETADO o SIN_APRETAR *
* *
**************************************************************/
unsigned char LeerBumperIzquierdo()
{
if (LeerPuertoALinea3() == 1) return APRETADO;
return SIN_APRETAR;
}
/**************************************************************
* *
* LeerBumperDerecho *
* ---------------- *
* *
* Funcion que devuelve el estado del bumper derecho *
* (visto desde arriba, desde la rueda loca del skybot) *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: APRETADO o SIN_APRETAR *
* *
**************************************************************/
unsigned char LeerBumperDerecho()
{
if (LeerPuertoALinea2() == 1) return APRETADO;
return SIN_APRETAR;
}
/**************************************************************
* *
* LeerPuertoALinea1 *
* ---------------- *
* *
* Funcion que lee el pin 1 del puerto A *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: 1 / 0 *
* *
**************************************************************/
unsigned char LeerPuertoALinea1()
{
if ((PORTA & 0x01) != 0) return 1;
return 0;
}
/**************************************************************
* *
* LeerPuertoALinea2 *
* ---------------- *
* *
* Funcion que lee el pin 2 del puerto A *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: 1 / 0 *
* *
**************************************************************/
unsigned char LeerPuertoALinea2()
{
if ((PORTA & 0x02) != 0) return 1;
return 0;
}
/**************************************************************
* *
* LeerPuertoALinea3 *
* ---------------- *
* *
* Funcion que lee el pin 3 del puerto A *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: 1 / 0 *
* *
**************************************************************/
unsigned char LeerPuertoALinea3()
{
if ((PORTA & 0x04) != 0) return 1;
return 0;
}
/**************************************************************
* *
* LeerPuertoALinea4 *
* ---------------- *
* *
* Funcion que lee el pin 4 del puerto A *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: 1 / 0 *
* *
**************************************************************/
unsigned char LeerPuertoALinea4()
{
if ((PORTA & 0x08) != 0) return 1;
return 0;
}
//-- SECCION LED:
//-- IMPORTANTE!: El led comparte su "informacion" con el motor 1,
//-- de modo que al encender/apagar LED se está cambiando el valor
//-- que indica el sentido de giro de dicho motor.
/**************************************************************
* *
* EncenderLed *
* ---------------- *
* *
* Funcion que enciende el LED del skybot *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: Ninguno *
* *
**************************************************************/
void EncenderLed()
{
PORTB |= LED;
}
/**************************************************************
* *
* ApagarLed *
* ---------------- *
* *
* Funcion que apaga el LED del skybot *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: Ninguno *
* *
**************************************************************/
void ApagarLed()
{
PORTB &= ~LED;
}
/**************************************************************
* *
* Led_esta_encendido *
* ---------------- *
* *
* Funcion que comprueba si el LED del skybot se encuentra *
* encendido *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: VERDADERO / FALSO *
* *
**************************************************************/
unsigned char Led_esta_encendido()
{
if (EstadoLed() == ENCENDIDO) return VERDADERO;
return APAGADO;
}
/**************************************************************
* *
* Led_esta_apagado *
* ---------------- *
* *
* Funcion que comprueba si el LED del skybot se encuentra *
* apagado *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: VERDADERO / FALSO *
* *
**************************************************************/
unsigned char Led_esta_apagado()
{
if (EstadoLed() == APAGADO) return VERDADERO;
return APAGADO;
}
/**************************************************************
* *
* EstadoLed *
* ---------------- *
* *
* Funcion que devuelve el estado del LED del skybot *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: ENCENDIDO / APAGADO *
* *
**************************************************************/
unsigned char EstadoLed()
{
if ( (PORTB&0x02)==0 ) return APAGADO;
return ENCENDIDO;
}
/**************************************************************
* *
* CambiarLed *
* ---------------- *
* *
* Funcion que invierte el estado del led de apagado a *
* encendido, y viceversa *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: Ninguno *
* *
**************************************************************/
void CambiarLed()
{
if (EstadoLed()==0) {
EncenderLed();
}
else {
ApagarLed();
}
}
//-- SECCION PULSADOR:
//-- IMPORTANTE!: El pulsador comparte su "informacion" con el sensor 1,
//-- de modo que al apretar/soltar el pulsador, el skybot cree que el
//-- sensor 1 esta emitiendo informacion de algun tipo.
//-- Por eso el pulsador sirve como "emulador" del sensor1.
/**************************************************************
* *
* LeerPulsador *
* ---------------- *
* *
* Funcion que lee el estado del pulsador del skybot *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: PULSADO / SIN_PULSAR *
* *
**************************************************************/
unsigned char LeerPulsador()
{
if ((PORTB & SENSOR1) != 0) return SIN_PULSAR;
return PULSADO;
}
/**************************************************************
* *
* Pulsador_esta_pulsado *
* ---------------- *
* *
* Funcion que comprueba si el pulsador del skybot esta *
* pulsado *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: VERDADERO / FALSO *
* *
**************************************************************/
unsigned char Pulsador_esta_pulsado()
{
if (LeerPulsador() == PULSADO) return VERDADERO;
return FALSO;
}
/**************************************************************
* *
* Pulsador_no_esta_pulsado *
* ---------------- *
* *
* Funcion que comprueba si el pulsador del skybot no esta *
* pulsado *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: VERDADERO / FALSO *
* *
**************************************************************/
unsigned char Pulsador_no_esta_pulsado()
{
if (LeerPulsador() == SIN_PULSAR) return VERDADERO;
return FALSO;
}
//-- SECCION LDR:
//-- IMPORTANTE!: La LDR hace uso de un coversor de señal se la skypic.
//-- Para leer el valor de la LDR, se ha de convertir a un valor entre
//-- 0 y 255, que representa el nivel de "oscuridad" que lee la LDR.
//-- La conversion tarda una fraccion de tiempo que hay que tener en
//-- cuenta si se quiere incluir en esquemas de temporizacion estrictos.
//-- La funcion lee el valor de la LDR y comprueba si supera un determinado
//-- valor umbral (pasado como argumento a la funcion).
/**************************************************************
* *
* LeerLDR *
* ---------------- *
* *
* Funcion que configura la skypic para leer la informacion *
* suministrada por la LDR. La obtiene. Convierte la lectura *
* obtenida a un valor entre 0 y 255 y comprueba si dicho *
* valor sobrepasa el valor umbral suministrado. *
* *
* Parametros de la funcion: Ninguno *
* Retorno de la funcion: valor entre 0 y 255 *
* *
**************************************************************/
unsigned char tmp=0x00;
unsigned char LeerLDR()
{
//-- Configurar conversor analogico/digital
//-- Entrada analogica: PA0 (Clema 2 de la CT293)
//-- Resto de entradas del puerto A: digitales
ADCON0 = 0x01; // enciendo el conversor
ADCON1 = 0x0E; // configuro AN0 como entrada analogica, resto digital
//-- Activar la conversion
//-- Hay que hacerlo cada vez que se quiere realizar una conversion nueva
ADCON0 |= 0x04;
//-- Esperar a que se haga la conversion
// tmp = ADCON0 & 0x04;
// while ( (ADCON0 & 0x00000100b) == 0x00000100b);
while ( ADCON0 & 0x04 == 0);
//-- El dato se encuentra en el registro ADRESH. Se corresponde
//-- con un valor entre 0 y 255, y me indica el nivel de intensidad
//-- de luz recibida por el sensor.
//-- Debido al circuito de polarizacion de la SKY293 y al propio sensor
//-- el umbral ha de situarse cerca del 200. Cuando se ilumina el sensor
//-- el valor leido disminuye.
tmp = ADRESH;
return tmp;
}