APP INVENTOR 2 :
http://ai2.appinventor.mit.e http://ai2.appinventor.mit.edu du
Buscamos y diseñamos imágenes en Paint, para que lo utilicemos como botones.
a : Avanzar b : Girar Izquierda c : Parar d : Girar Derecha e : Retroceder f : : Izquierda una rueda g : Derecha una rueda
h : Aumenta velocidad (PWM) i : Disminuye velocidad (PWM) o : Solicita medida del Ultrasonido (cm) En la página de internet https://www.youtube.com/watch?v=MiWLzbpfqr0 se encuentra un video, el cual se apoyó este trabajo en la parte de programación a bloques (app inventor 2).
Configuramos bluetooth con un antes de haber oprimido la tecla listPicker (tecla conetar) para fijar los elementos bluetooth cliente con direcciones direccion es y nombre; luego con un después donde se llama al bluetooth para la conexión a la dirección que hayamos seleccionado.
Después programamos las diferentes teclas restantes, las cuales cada vez que sean oprimidas mandaran el carácter correspondiente al dispositivo bluetooth antes seleccionado. Estos caracteres serán responsables de diversas funciones que el programa del pic18f4550 del robot interprete.
Luego ponemos un programa para recibir un dato en este caso los centímetros medidos del ultrasonido y ponerlo en un label para visualizarlo en la aplicación.
PROGRAMA DEL MICROCONTROLADOR :
El programa que manda al robot está diseñado en CCS, este recibe un dato en formato carácter para luego hacer la función específica.
// Especificaciones generales del programa en CCS diseñado por PEDRO ALONZO SUAREZ TUN.//////////////////// TUN.//////////////////// // programa que recibe del puerto serial un valor en formato carácter para realizar una función especifica: // a,b,c,d,e,f,g a,b,c,d,e,f,g : activa los motores motores de tracción. // h : aumenta velocidad(PWM). velocidad(PWM). // i : disminuye velocidad(PWM). velocidad(PWM). // j : activa ULTRASONIDO y el valor de la distancia en cm es transmitido transmitido por puerto serial.
// ROBOT con tracción a orugas que se maneja por dispositivo bluetooht, así mismo transmite el valor del ultrasonido. // El ultrasonido está montado en un servo para tener movilidad. // Todo esto se controla por otro programa (APP INVENTROR 2) que se instaló en un sistema ANDROID.
#include <18F4550.h> #fuses INTRC_IO,NODEBUG,NOWRT,NOVR INTRC_IO,NODEBUG,NOWRT,NOVREGEN EGEN #fuses MCLR,NOWDT,NOPROTECT,NOPUT,NOB MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN ROWNOUT,NOPBADEN,NOLVP,NOCPD ,NOLVP,NOCPD #use delay(clock=4000000) delay(clock=4000000) #use rs232(baud=9600,parity=N,xmit= rs232(baud=9600,parity=N,xmit=PIN_C6,rcv= PIN_C6,rcv=PIN_C7,bits=8, PIN_C7,bits=8,stream=PORT1) stream=PORT1) #define PulsoInicioUltra
PIN_C0
#define PulsoEcoUltra
PIN_C1
#define servo PIN_B2
int16 TiempoUltra=0; int16 Distancia=0; int16 ValorPosicion=1500; ValorPosicion=1500; int1 Salir=0; char ValorBluetooh=0; int8 ValorPWM=90;
void Ultrasonido (void); void Servomotor (void); /////////esta /////////esta interrupcion se activa si el sensor ultrasonico no encuentra obstaculos de reflexión sonar a 5 metros.////////////// metros.//////////////// #int_TIMER3 void TIMER3_isr(void) { setup_timer_3 ( T3_DISABLED ); printf ( " no no hay medida "); Salir=1;
//mando al dispositivo dispositivo bluetooh el mensaje por medio del del puerto serial.
// salgo de la interrupcion y obligamos a salir de la espera de retorno del ultrasonido.
}
#int_RDA void serial_isr() { ValorBluetooh=getc(); ValorBluetooh=getc();
//recibe dato del bluetooh y lo guarda en ValorBluetooh
switch (ValorBluetooh) { case 'a': output_B(0b10010000);
//adelante
break;
case 'b': output_B(0b01010000);
//izquierda
break;
case 'c': output_B(0b00000000);
//parar
break;
case 'd': output_B(0b10100000);
//derecha
break;
case 'e': output_B(0b01100000);
//reverza
break;
case 'f': output_B(0b00010000); output_B(0b00010000);
//derecha un solo motor
break;
case 'g': output_B(0b10000000); output_B(0b10000000);
//izquierda un solo motor
break;
case 'h':
//aumenta velocidad al motor (pwm)
if (ValorPWM <= 40){ ValorPWM=41;} ValorPWM--; set_pwm1_duty(valorPWM); set_pwm1_duty(valorPWM);
//carga Duty de PWM
break;
case 'i':
//disminuye velocidad a los motores (pwm
if (ValorPWM >= 124){ ValorPWM=123;} ValorPWM++; set_pwm1_duty(valorPWM); set_pwm1_duty(valorPWM);
//carga Duty de PWM
break;
case 'j': Ultrasonido (); //
LlamarUltrasonido=1; LlamarUltrasonido=1;
//activamos al dispositivo ultrasonico
break;
case 'k': output_high(PIN_B1); delay_us(1000); break;
case 'l':
//disminuye velocidad a los motores (pwm)
if (ValorPosicion >= 2200){
ValorPosicion=2150;} ValorPosicion += (200); break;
case 'm':
//disminuye velocidad a los motores (pwm)
if (ValorPosicion<= 700){ ValorPosicion=701;} ValorPosicion -= (200); break;
} }
void main() { setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_PLL_OFF); setup_timer_2(T2_DIV_BY_4,124,1 setup_timer_2(T2_DIV_BY_4,124,1); );
//500 us de INT aproximadamente para PWM.
setup_ccp1(CCP_PWM); set_pwm1_duty(valorPWM); setup_comparator(NC_NC_NC_NC); setup_timer_3(T3_INTERNAL|T3_DIV_BY_1); enable_interrupts(INT_TIMER3); enable_interrupts(INT_RDA); enable_interrupts(INT_RDA);
// activamos INT SERIAL.
enable_interrupts(GLOBAL);
while(true){
Servomotor ();
///llamamos la funcion servomotor
} }
void Servomotor (void){ output_high(PIN_B2); delay_us(ValorPosicion);
output_low(PIN_B2); delay_ms(19); ///////////////////////////////////////// if (input(PIN_D1)== (input(PIN_D1)== 0){ //
// cada ves que se tenga oprimido tecla D1 incrementa
delay_ms(10);
//el tiempo del pulso (pwm)que da como resultado la posicion del servo
if (ValorPosicion >= 2200){ ValorPosicion=2199;} ValorPosicion++; }
if (input(PIN_D2)== (input(PIN_D2)== 0){ //
// cada ves que se tenga oprimido tecla D2 decrementa
delay_ms(10);
// tiempo de tecla
if (ValorPosicion<= 700){ ValorPosicion=701;} ValorPosicion--;} }
////////Funcion ////////Funcion que Activa el ultrasonido y manda por bluetooth su medida /////////////////////// /////////////////////////////// //////////
void Ultrasonido (void){
output_high(PulsoInicioUltra); output_high(PulsoInicioUltra);
//mandamos un pulso de 10us min. min. para activar activar al sensor sensor
delay_us(20); output_low(PulsoInicioUltra); /////////////////// ///////////////////// esperamos el pulso (eco) de inicio de la rafaga ultrasonica para dar marcha al timer1. while(true){ if(input(PulsoEcoUltra)==1){ setup_timer_3(T3_INTERNAL setup_timer_3(T3_INTERNAL | T3_DIV_BY_1); set_timer3(36535); set_timer3(36535); //precarga del timer = 36535 = 65535-29000. 29000us es la duracion del sonido en ir y regresar de un objeto a 5 metros break;}}
////////////////// ////////////////// esperamos flanco de bajada del pulso que indica el retorno del sonido
salir=0; while(salir==0){ if(input(PulsoEcoUltra)==0){salir= if(input(PulsoEcoUltra)==0){salir=1;} 1;} //salimos con el retorno del ultrasonido o con la interrupcion con la bandera salir=1. }
/////////////// /////////////// tomamos el valor del timer y aplicamos formula para la distancia TiempoUltra=get_timer3(); setup_timer_3 ( T3_DISABLED ); // paramos al timer para que que no de otra lectura lectura
TiempoUltra -= 36535; //obtengo la distancia en cm por medio de la formula: distancia=((duracion pulso de salida)*(1/29cm/us))/2 // velocidad de sonido=1/29cm/us=340m/s Distancia = TiempoUltra / 29; Distancia /= 2;
printf ( "%04lu \r ", Distancia); Distancia); //mandamos datos datos al bluetooht. delay_ms(200);
}
DISEÑO FISICO DEL ROBOT :
BIBLIOGRAFIA :
www.superrobotica.com www.todopic.com.ar