Sunteți pe pagina 1din 25

LABERINTO

Copyright (c) 2007 Xabier Ugarte Pedrero.


Estedocumento,ascomoelcdigofuentecontenidoenl,estprotegidobajo laLicenciaReconocimientoNocomercialCompartirbajolamismalicencia2.5 EspaaLicensedeCreativeCommons.Ustedeslibredeutilizarlo,copiarlo, distribuirlo,ymodificarlo,siemprequesehagabajoestosmismostrminos,y bajofinesnocomerciales.

ndicedecontenido
1.INTRODUCCION............................................................................................... .........................4 2.LAPRUEBA....................................................................................................................... ..........4 3.ANALISISDELMAPADELLABERINTO...................................................... ........................4 4.FORMATODELAINFORMACIONDECADANODO................................................ ..........7 5.REPRESENTACIONDELAORIENTACION................................................................... ......10 6.NUESTROALGORITMO.................................................................................... .....................10 7.CODIGODELPROGRAMACOMPLETO.............................................................. ................12 8.ACERCADELAESTRUCTURAFISICA................................................................... ............26 9.CONCLUSION................................................................................................................ ...........26

1.

INTRODUCCION

Estedocumentotratadedescribirelprocesoquesegu paraconstruirun robot capaz de salir de un laberinto, en el VI Campeonato de Euskadi de microbtica,organizadoporlaUniversidaddeDeusto. Principalmente me voy a centrar en el cdigo del programa, que en un principioibaaserescritoenlenguajeensambladordePIC,parasergrabadoen unPIC16F876,peroporrazonesdetiempo,acabutilizandoelBasicStampII,de Parallax.

2.

LAPRUEBA

Lapruebaconsisteenconseguirqueunmicrobotencuentreunobjetodentro deunlaberinto,ytrasello,salgadelmismoporcualquieradelasdossalidas. Es esencial tener en cuenta que elpropio objeto, existe fsicamente, y puede bloquearunadelassalidas. El laberinto es de madera, con suelo y paredes de color blanco. Cada casillatieneunasdimensionesde20x20cm.Noexistelimitacinparalasmedidas o peso del robot, pero debe ser lo suficientemente pequeo como para tener libertaddegirodentrodecadacasilla. Paraello,elrobotpuedealmacenarenmemoriadatosacercadellaberinto, deformaqueunavezen lpuedaguiarse.Elmapadellaberintoesconocidode antemano. Ladificultadconsisteenqueelrobotsaldr desdecualquiercasilla,es decir,hastael momento de la pruebano se conocelacasilladesdela queel robotpartir,nilaposicindelobjetodentrodellaberinto.Elrobotnose puedereprogramar,perosinembargosepermiteintroducirlemediantepulsadores, interruptores,R.F.,infrarrojos,lasdosposiciones,ascomosuorientacin.

3.

ANALISISDELMAPADELLABERINTO Enestaimagenpodemosobservarcomoeselmapadellaberinto

Comopodemos observar,ellaberintotiene dos salidas, cualquieradelas dos totalmente vlidas. Existe un nico camino directo entre ellas, es decir, ambas ests unidas directamente, y en dicho camino, existen desviaciones que acabanenramassinsalida. Parairdeunasalidaaotra,hayuncaminoobligatorioquedebemosseguir, esdecir,unasucesindecasillas,ocomomstardellamaremos,nodos,porlos quedebemospasarnecesariamente.Adems,podemosrecorreralgunasdelasramas, queharnmaslargoelrecorrido. Apartirdeahora,parabuscarelcaminodentrodellaberinto,envezde centrarnos en las paredes que no podemos atravesar, nos centraremos en los caminos,comolineasqueatraviesanelcentrodecadacasilla.

Apartirdeestemomento,ymediantelaobservacin,podemosconcluirque este conjunto de caminos, no es ms que una sencilla estructura de rbol, compuestopornodos(cadacasilla)yenlacesentrelosnodos. Ahorapodemosvermarcadoelcaminoqueseguiramosparairdeunasalidaa otra, recorriendo todas las casillas del laberinto, y si borramos las lineas rojasquenosllevanaramassinsalida,dejamossoloelcaminodirecto,ypor tantomscorto,ymaseficiente. Nuestroalgoritmotratadeencontrarelcaminomascorto,nosolodesdeuna salidahastalaotra,sinodesdecualquierpuntodel rbol,hastacualquierotro punto,encualquieradelosdossentidosposiblesdelrecorrido.

Aqutenemoselrbolquehabamosmencionado,estirado,yordenado,deuna maneraespecial.Lasdossalidassonla4yla33. Cadanodo,provienedeunsolopadre,ypuedetener1o2hijos. Elordenelegidoeseldeinorden.Esunanumeracinrecursiva,ysebasa enlossiguientespasos: 1. Numeramoslaraz. 2. Numeramoselsubrbolquecuelgadeunodesushijos. 3. Numeramoselsubrbolquecuelgadesuotrohijo(siesquetiene). Estanumeracinnosconvienealahoradeconfeccionarelalgoritmo,yaque siloanalizamos,nosdamoscuentadequelosdescendientesdecadanodo,sonuna sucesin de nmeros comprendidos entre dos lmites. Es decir, si el nodo que buscamos esta entre esos dos limites, significa que est en esa rama, y continuaremosavanzandoporella. Paraentendermejoresto,vemosunejemplo.Imaginemosqueestamosenel nodo 13, y queremos ir al 19. El nodo 13 tiene un solo hijo, y todos sus descendientesestncomprendidosentreel14yel17.Comonuestrodestino(19) noestcomprendidoentreesoslimites,significaquetenemosqueavanzarhacia elpadre. Ahoraestamosenelnodo12,yelprocesoessimilar,el19noestentreel13y el17,asquecontinuamoshaciaarriba. Llegamos al 11, este nodo es un poco mas complejo, ya que tiene dos hijos. Primerocomprobamosunodeellos,cuyosdescendientesestnentreel12yel17,

intervaloenelcualnoestnuestrodestino,sinembargo,siestenelsubrbol quecuelgadesuotrohijo,quecomprendeelintervaloentreel18yel36.As queavanzamosporesarama. Estamosenelnodo18,tambincondoshijos,miramoslosintervaloscomohasta ahorayavanzamoshastael19.Yaestamosennuestrodestino. Comopodemoscomprobar,hemosavanzadoatravsdenodosconunsolohijo, ycondoshijos,subiendoniveleshaciaarriba,atravsdelospadres,yhacia abajo,atravsdesushijos.Tambinhemostrazadoelcaminomscortoentrelos dospuntos.Heaquelpotencialdeestanumeracin. Losnmerosquehemosespecificado,nosonlosdefinitivos,perosiloes el orden relativo. En un futuro, cada nmero corresponder a unadireccin de memoria,enlacualtendremosinformacinsobreesenodo,(Direccindelpadre, deloshijos...orientaciones,etc).

4.

REPRESENTACIONDELAORIENTACION Pararepresentarlaorientacinen2bits,utilizamosensiguienteesquema.

As, comparando los nmeros, 00, 01, 10, 11, podemos determinar si necesitamosgiraralaizquierdaoaladerechaunaovariasveces,parahacer coincidirlaorientacindenuestrorobotconlaorientacindeseada.

5.

FORMATODELAINFORMACIONDECADANODO

Cada nodo con un solo hijo, dispondr de la siguiente informacin, compuestapor4bytes.Imaginemosqueeselprimernodo.Suinformacincomienza enladireccin0delamemoriaeeprom.Elprimerbyte,solotiene2bitstiles, elB7indicasiesunnodocon1hijo(0)osiesunnodocondoshijos(1).El B0,nosindicasilasalidamscercanaaesenodoesla4(segnlanumeracin quehemosindicadoantes)representadoporun0ola33,representadamedianteun 1. El siguiente byte, tiene 6 bits para indicar la direccin del nodo que representaraellimiteinferiordelintervaloquehemosexplicadoantes(LIM1A) y OR1, de dos bits, contiene la orientacin de la rama correspondiente a ese intervalo.Elsiguientebytes(LIM1B),contieneellimitesuperiordelintervalo ylamismaorientacin.El ltimobyte,nosdiceladireccindelnodopadre,y suorientacin.

Estaeslaformaenlaquesealmacenanlosdatosdeunnodocon2hijos. La nica diferencia, es que ocupamos 8 bytes en lugar de 4, estando los dos ltimos totalmente inutilizados. Esto es debido a que de esta manera, las direccionessonmltiplosde4,yalponerloslimitesdelosintervalosencada byte,escribiremoslos6bitsdemayorpeso,quedandoSIEMPRElos2bitsdemenos pesoa0(sondireccionesmltiplosde4).Aprovechamosestosdosbitsparaponer laorientacin.Siqueremosextraersololadireccin,copiamoslainformaciny ponemosa0losdosbitsdeorientacin. Estaformadedesperdiciarunpocodememoria,nosgarantizaunafacilidad tremendaalahoradeescribirelalgoritmo,porlotanto,noseconsideraalgo negativo,sinotodolocontrario. Despustenemosquecodificarlainformacindecadanodo,bitabit,tarea que hay que realizar con sumo cuidado, ya que un error de un solo bit puede afectarelfuncionamientodelrobot. Vamos situando la informacin en memoria, en el orden en que hemos configuradoel rbol,yteniendocuentaelnumerodebytesquesereservanpara cada tipo de nodo. De esta forma, el nodo 1 quedara en la direccin 0, y a partirdeahora,sunmeroser ese,eldesudireccin.Elsiguienteestaren ladireccin4,despusenla8,enla10,yas sucesivamente(tenedencuenta que usamos numeracin hexadecimal). Los nodos pasarn a llamarse segn la direccindememoriaenlaquecomienzansusdatos.Elmapadellaberinto,si cambiamoslosnmerosdenodo,yvolvemosadotaralrbolconsuformaoriginal, quedadelasiguientemanera:

Vamosahacerunejemplo,decomosecodificaralainformacindeunnodo, ycomoquedararepresentadoenmemoria.Vamosatomarelnodo20.Estoquiere decirquecomenzaramosaescribirestosbytesapartirdelaposicin20. Sabemosqueestmscercadelasalida10,quedela9C,luegoelbitde menospeso,ser0.Tambintenemosencuentaquesolotieneunhijo,asqueel bitdemspesoser0.Elrestoestninutilizados. Primerbyte:00000000=>0x00 El segundo y tercer byte: Sus hijos estn comprendidos entre el 24 (00100100)y el AC(10101100), y para ir por esa rama, tendremos que ir por el oeste(11). Segundobyte:00100111=>0x27 Tercerbyte:10101111=>0xAF El padre es el nodo 1C(00011100), y est situado al este, luego la orientacinser01. Cuartobyte:00011101=>0x1D Ahoratenemosquerepetirestaoperacinconlos36nodos.

Elmapadememoriaquedarepresentadodelasiguienteforma(yaescritoen PBASIC,enformadedirectivasparaalmacenarenmemorialosdatosentiempode grabacin). En el cdigo del programa, como norma general, utilizar notacin hexadecimal. Cada linea representauna casillao nodo, algunas con 4 bytes, y otrascon6.Encadalineaespecificoladireccinenlaquecomienzaacopiarse lasiguienteinformacin. DATA@$00,$00,$04,$AC,$00 DATA@$04,$00,$09,$AD,$02 DATA@$08,$80,$16,$AE,$10,$10,$07 DATA@$10,$00,$FF,$FF,$0A DATA@$14,$00,$1A,$AE,$08 DATA@$18,$00,$1F,$AF,$14 DATA@$1C,$00,$23,$AF,$19 DATA@$20,$00,$27,$AF,$1D DATA@$24,$00,$2A,$AE,$21 DATA@$28,$00,$2E,$AE,$24 DATA@$2C,$81,$35,$49,$53,$AF,$28 DATA@$34,$01,$38,$4C,$2F DATA@$38,$01,$3D,$4D,$36 DATA@$3C,$81,$45,$45,$4A,$4E,$3B DATA@$44,$01,$FF,$FF,$3F DATA@$48,$01,$4D,$4D,$3C DATA@$4C,$01,$FF,$FF,$4B DATA@$50,$81,$60,$AC,$5B,$5F,$2D DATA@$58,$01,$5C,$5C,$51 DATA@$5C,$01,$FF,$FF,$5A DATA@$60,$01,$64,$AC,$52 DATA@$64,$81,$70,$AC,$6F,$6F,$62 DATA@$6C,$01,$FF,$FF,$65 DATA@$70,$81,$88,$AC,$79,$85,$66

DATA@$78,$01,$7D,$85,$73 DATA@$7C,$01,$80,$84,$7B DATA@$80,$01,$87,$87,$7E DATA@$84,$01,$FF,$FF,$81 DATA@$88,$81,$90,$9C,$A3,$AF,$72 DATA@$90,$01,$95,$9D,$8A DATA@$94,$01,$99,$9D,$93 DATA@$98,$01,$9D,$9D,$97 DATA@$9C,$01,$FF,$FF,$9B DATA@$A0,$81,$A8,$A8,$AE,$AE,$89 DATA@$A8,$01,$FF,$FF,$A2 DATA@$AC,$01,$FF,$FF,$A0

6.

NUESTROALGORITMO

Ya tenemos lo necesario para desarrollar el algoritmo. Nuestro robot en todo momento sabr en que orientacin se encuentra. Se la especificaremos inicialmente,y concadamovimiento la actualizaremos.Tambin en todomomento conocemos en nodo en el que estamos, actualizando este dato cuando avanzamos haciaotronodo,ascomoeldestinoalquevamos,queserenlaprimerafaseel objeto,yenlasegundafaselasalidamscercana.Adems,tenemosqueteneren cuentaqueelobjetopuedebloquearlasalida,yquenopodemosatravesarlo,por lo queal llegara l,nos quedaremosenelnodoanterior,y giraremossies necesarioparaencararlo,decidiendodespusaquesalidanosvamosadirigir,y volviendoarepetirtodoelprocesodelaprimerafase,paraencontrarlasalida. Para entender el algoritmo, incluyo un diagrama de flujo que explica el funcionamientogeneraldelprograma.

7.

CODIGODELPROGRAMAPASOAPASO

Nota: Este cdigo no incluye un sistema para la introduccin de coordenadas,necesariopararealizarlaprueba.Lasconstantesdelaspausasde losmovimientos,seajustansegnelniveldepilasparaquelosmovimientossean lomscercanosa20cmenelcasodeavanzar,y90enelcasodegirar.Hayuna constantedecorreccinalavanzar,quesirveparaconseguirqueelavancesea masrecto,dadoqueunmotorgiraunpocomsrpidoqueelotro. Adems,elcdigodelprogramaincluyeinstruccionesDEBUG,parafacilitar elseguimientoysimularelcomportamientodelrobotenellaberinto. Yahemosvistoantescomoquedaralainformacinquedebemosgrabarenla memoria,paraalmacenarelmapadellaberinto,as queahoraprocedemosconel resto del cdigo. En primer lugar, tenemos la declaracin de constantes del programa.
AVANZAR CON %0110 RETROCEDER CON %1001 DER CON %1010 IZQ CON %0101 QUIETO CON %0000

PAUSA_AVANZAR CON 1290 PAUSA_CO CON 6 PAUSA_IZQ CON 445 PAUSA_DER CON 445

Elprimerbloquecorrespondealosbitsquesacaremosporlaspatitas03 pararealizarlosmovimientos.Elsegundo,sonpausas,enmilisegundos,paraque elrobotsemuevaaproximadamente20cmalavanzar,ygire90.PAUSA_COesuna constantedecorreccin,paraconseguirqueelrobotavanceenlnearecta,dado queunmotorgiramsrpidoqueelotro. Ahora,pasamosalasvariablesdelprograma.


ORIENTACION VAR Nib ORI VAR Nib ORIGEN VAR Byte DESTINO VAR Byte NODO VAR Byte INFO VAR Byte LIM1A VAR Byte LIM1B VAR Byte LIM2A VAR Byte LIM2B VAR Byte

PADRE VAR Byte AUX1 VAR Byte AUX2 VAR Byte AUX3 VAR Byte AUX4 VAR Byte OBJETO VAR Byte

EmpecemosconORIENTACIONyORI,ambasde4bits.Solousaremoslosdos bitsdemenospeso.Laprimera,representalaorientacindelrobotentodo momento,ylasegunda,eslavariableenlaqueindicaremoslaorientacinque queremostomar,antesdellamaralasubrutinaSITUAR.Estasubrutinahargirar alrobothastaqueambasvariablescoincidan. ORIGEN,DESTINOyOBJETO,laprimerarecogeeldatoinicialsobrela casilladesdedondeparteelrobot.OBJETOrecogelaposicindelobjeto,y DESTINOtendrentodomomentonuestrodestino,alcomienzosteserelobjeto, ydespuslasalidamscercana. NODO,tendrentodomomentoelnmerodelnodoenelqueelrobotse encuentra. INFO,LIM1A,LIM1B,LIM2A,LIM2ByPADREestndeclaradaspararecogerlos datosenlamemoriaacercadecadanodo.Finalmente,AUX1,AUX2,AUX3,yAUX4, sirvenparamanipularestosdatos. Laconfiguracindeentradas/salidaseslasiguiente:
OUTPUT 0 OUTPUT 1 OUTPUT 2 OUTPUT 3

Comienzodelprogramaens:
INICIO:

DESTINO = OBJETO

'Debug de la situacin inicial

DEBUG "LABERINTO",CR DEBUG "=========",CR,CR DEBUG "ORIGEN: ", HEX ORIGEN,CR DEBUG "DESTINO: ", HEX DESTINO,CR DEBUG "ORIENTACION: ", BIN ORIENTACION,CR,CR,CR

PAUSE 2000

'El nodo en curso es igual al origen

NODO = ORIGEN

Primeroseestableceeldestino,ytrasellohacemosundebugdela situacininicialdelrobot.Unapausade2segundos,yactualizamoselvalorde nodo,indicandoalrobotqueseencuentraenelorigen.Pasamosalaprimera lecturasobreelnodoencurso.


LECTURA:

'Lectura del primer byte de info sobre el nodo en curso READ NODO,INFO DEBUG "NODO EN CURSO: ",HEX NODO,CR

Leemoselprimerbyte,quenosindicaelnmerodehijosylasalidams cercanadelnodo.Despushacemosundebugindicandoelnodoencurso.
HIJOS:

'Evaluamos el numero de hijos que tiene el nodo (INFO.BIT7)

IF INFO.BIT7 = %0 THEN GOTO UNHIJO ELSE GOTO DOSHIJOS ENDIF

Aquhemosevaluadoelnmerodehijosquetieneelnodoencurso,y dependiendodelresultado,saltamosadosetiquetasdistintas,yaqueencada casotenemosqueleerunnmerodistintodebytesdelaeeprom.


UNHIJO:

'Leemos 3 bytes ya que tiene un hijo READ NODO+1,LIM1A READ NODO+2,LIM1B READ NODO+3,PADRE

'Depuramos la informacin sobre los limites de sus descendientes

AUX1 = LIM1A AUX2 = LIM1B AUX1.BIT0 = 0 AUX2.BIT0 = 0 AUX1.BIT1 = 0 AUX2.BIT1 = 0

IF AUX1 <= DESTINO AND AUX2 >= DESTINO THEN SIGUIENTE = LIM1A ELSE SIGUIENTE = PADRE ENDIF

GOTO MOVIMIENTO

Talcomoindicanloscomentarios,leemoslainformacincorrespondientede laeeprom,lafiltramosenunasvariablesauxiliares,yentoncesescuando comprobamossieldestinoestentrelosdescendientes,oavanzandohaciaelnodo padre.Enelcasodequetengadoshijos:


DOSHIJOS:

'Leemos 5 bytes ya que tiene dos hijos READ NODO+1,LIM1A READ NODO+2,LIM1B READ NODO+3,LIM2A READ NODO+4,LIM2B READ NODO+5,PADRE

'Depuramos la informacin sobre los limites de sus descendientes

AUX1 = LIM1A AUX2 = LIM1B AUX1.BIT0 = 0 AUX2.BIT0 = 0 AUX1.BIT1 = 0 AUX2.BIT1 = 0

AUX3 = LIM2A AUX4 = LIM2B AUX3.BIT0 = 0 AUX4.BIT0 = 0 AUX3.BIT1 = 0 AUX4.BIT1 = 0

IF AUX1 <= DESTINO AND AUX2 >= DESTINO THEN SIGUIENTE = LIM1A 'Si se encuentra entre los limites (el destino es descendiente del nodo (primer hijo)) ELSEIF AUX3 <= DESTINO AND AUX4 >= DESTINO THEN SIGUIENTE = LIM2A 'Si se encuentra entre los limites (el destino es descendiente del nodo) (segundo hijo)) ELSE SIGUIENTE = PADRE 'Si no se encuentra entre los limites (el destino es ascendente del nodo) ENDIF

GOTO MOVIMIENTO

Realizamoselmismoproceso,leer,filtrar,ycomprobar.Enestecaso tenemosquetenerencuentaqueeldestinopuedeestarentrelosdescendientesa travsdedoshijosdistintos,omovindonosatravsdelnodopadre.

MOVIMIENTO: 'Si no se encuentra entre los limites (el destino es ascendente del nodo)

'Capturamos la orientacion ORI.BIT0 = SIGUIENTE.BIT0 ORI.BIT1 = SIGUIENTE.BIT1 SIGUIENTE.BIT0 = 0 SIGUIENTE.BIT1 = 0

'Si el siguiente nodo al que nos dirigimos es nuestro destino (objeto o salida) IF (SIGUIENTE = DESTINO) THEN 'Entraremos dos veces en este bucle, cuando estemos en el nodo anterior al objeto (elegiremos la salida 'ms cercana como destino), y cuando estemos en el nodo anterior a la salida (iniciaremos una serie 'de movimientos que nos llevarn a la salida GOSUB OBJETO_SALIDA

ENDIF

'Si hemos elegido la salida $9C, pero el objeto nos bloquea la salida, cambiamos de salida IF (SIGUIENTE = OBJETO) AND (DESTINO = $9C) THEN DESTINO = $10 GOTO LECTURA ENDIF

'Si hemos elegido la salida $10, pero el objeto nos bloquea la salida, cambiamos de salida IF (SIGUIENTE = OBJETO) AND (DESTINO = $10) THEN DESTINO = $9C GOTO LECTURA ENDIF

'Actualizamos el valor del nodo en curso NODO = SIGUIENTE

'Llevamos a cabo el movimiento para situarnos sobre el 'Primero orientamos el robot GOSUB SITUAR 'Despues avanzamos 20 cm GOSUB DELANTE 'una vez realizado el movimiento, repite el bucle de lectura 'de datos el nodo GOTO LECTURA

Elprocesoalahoraderealizarelmovimientoeselsiguiente,primero capturamoslaorientacinguardndolaenORI.Antesdecomenzaramovernos, comprobamossielnodoalquevamosaavanzareseldestino.Larazn,esquesi setratasedelobjeto,nopodramosavanzarysituarnossobrel,yaquenos impideelpaso.Enelcasodequeelsiguientenodoseaelobjetoolasalida, saltamosaOBJETO_SALIDA. OBJETO_SALIDA,determinarcualeslasalidamscercana,siesquehemos encontradoelobjeto,peronocomprobarsiestenosbloqueaelpasohaciadicha salida.Porlotanto,enestemismobloquedecdigotenemosquehaceresta comprobacinycambiardesalida,enelcasoquedequeelobjetonosimpidael paso. Elprocesoalllegaralnodoanteriorseraelsiguiente: 1.Comoestamosenelnodoanterioraldestino,saltamosaOBJETO_SALIDA. 2.Estarutinacambianuestrodestino,estableciendolasalidamscercana. 3.Ahoracomprobamossielobjetobloquealasalida,encasoafirmativocambiamos desalida 4.Continuamosconlanavegacin. Elprocesodecontinuarconlanavegacinconsistiraen,finalmente, actualizarelnodoencurso,yavanzarsobrel(SITUARNOSYAVANZAR).
SITUAR: 'Rutina para que el robot se coloque en la orientacion que deseamos, saltando a DERECHA e IZQUIERDA, y realizando 'los movimientos

'Borramos los bits de ms peso (inutiles) de la orientacion actual (ORIENTACION) y la orientacion que deseamos (ORI) ORIENTACION.BIT3 = 0 ORIENTACION.BIT2 = 0 ORI.BIT3 = 0 ORI.BIT2 = 0

IF ORIENTACION = ORI THEN 'Si hemos alcanzado la orientacion deseada... RETURN

ELSEIF ORI - ORIENTACION = 1 OR (ORI = $0 AND ORIENTACION = $3) THEN 'Si ORI es una unidad mayor que ORIENTACION GOTO DERECHA ELSE GOTO IZQUIERDA ENDIF 'En el resto de los casos giramos a la izquierda 'o si el robot mira al este y debe avanzar al norte

Estasubrutinahacequenuestrorobotgireparasituarseenunaorientacin queguardaremosenORI.BsicamentecomparalosvaloresdeORIyORIENTACION,y gira(alhacerlocambiaORIENTACION)hastaqueambosvalorescoinciden. Larutinasaltaaderechaoizquierda,ysevuelvearepetir,hastaque ambosvaloressoniguales,yentoncesretorna.


DERECHA: DEBUG "MOV: DERECHA",CR

OUTA = DER PAUSE PAUSA_DER OUTA = QUIETO ORIENTACION = ORIENTACION + 1 GOTO SITUAR

IZQUIERDA: DEBUG "MOV: IZQUIERDA",CR

OUTA = IZQ PAUSE PAUSA_IZQ

OUTA = QUIETO

ORIENTACION = ORIENTACION - 1

GOTO SITUAR

DELANTE: DEBUG "MOV: DELANTE",CR,CR

OUTA = AVANZAR PAUSE PAUSA_AVANZAR/2 OUTA = DER PAUSE PAUSA_CO OUTA = AVANZAR PAUSE PAUSA_AVANZAR/2

OUTA = QUIETO

RETURN

LosmovimientosDERECHAeIZQUIERDA,sonpartedelasubrutinaSITUAR, hacenundebugnotificndolo,ydespusactualizanlavariablequealmacenala orientacindelrobot. ElmovimientodeAVANZAR,ejecutaelmovimiento,ytraselloretorna.


OBJETO_SALIDA:

'Encaramos el objeto o la salida GOSUB SITUAR

'Si el destino es la salida $9C, estamos en el nodo anterior a esta, y el objeto ya 'est encontrado, asi que iniciamos una secuencia de movimientos que nos sacan del laberinto IF (DESTINO = $9C) THEN

DEBUG "MOV: DELANTE",CR OUTA = AVANZAR PAUSE PAUSA_AVANZAR/2 OUTA = DER PAUSE PAUSA_CO OUTA = AVANZAR PAUSE PAUSA_AVANZAR/2

OUTA = IZQ PAUSE PAUSA_IZQ

OUTA = AVANZAR PAUSE PAUSA_AVANZAR DEBUG "MOV: IZQUIERDA",CR DEBUG "MOV: DELANTE",CR GOTO FIN

ENDIF

'Si el destino es la salida $10, estamos en el nodo anterior a esta, y el objeto ya 'est encontrado, asi que iniciamos una secuencia de movimientos que nos sacan del laberinto IF (DESTINO = $10) THEN

OUTA = AVANZAR PAUSE PAUSA_AVANZAR/2 OUTA = DER PAUSE PAUSA_CO OUTA = AVANZAR PAUSE PAUSA_AVANZAR/2

DEBUG "DELANTE",CR GOTO FIN ENDIF

'Si llegamos aqui, significa que el destino es el objeto, y acabamos de encontrarlo, 'estamos en el nodo anterior y lo hemos encarado, asi que ahora actualizamos el destino 'con la salida mas cercana

IF INFO.BIT0 = 0 THEN DESTINO = $10 ELSE DESTINO = $9C ENDIF

'Repetimos todo el proceso RETURN

Estarutinahadeserllamadacuandonosencontramosenelnodoanterioral destino,quepuedeserelobjetoolasalida.Sufuncines,salirsisetratade lasalida,odeterminarlasalidamscercanasihemosencontradoelobjeto. Paraello,primerollamaaSITUAR,esdecir,sieldestinoeselobjeto, encaraelobjeto,ysisetratadelasalida,simplementesepreparapara avanzar. Despustenemosdosbloquesqueevalansieldestinoesalgunadelas salidas,yentalcaso,ejecutanunaseriedemovimientosquenosllevanhastala salida.Paracadasalidahayunbloquedistintodemovimientos.Ambosacaban saltandoalaetiquetaFIN,quefinalizaelprograma,avisandomedianteundebug. Sinoseejecutaningunodeestosdosbloques,significaqueeldestinoes elobjeto,yentonces,teniendoencuentaelnodoenelquenosencontramos, (nodoanterioralobjeto),especificalasalidamscercanamedianteelbit correspondienteensusdatos.Trasello,retorna.
FIN: DEBUG CR,CR,"FIN DEL PROGRAMA" END

Unavezsalimosdellaberinto,elprogramaloindicamedianteundebug,y acaba.

8.

ACERCADELAESTRUCTURAFISICA

No me voy a extender sobre la estructura fsica, ni sobre detalles de electrnica,porquenoeselpuntofuertedemiproyecto.Consideroqueesla partemejorable,lapartequenotuvetiemponipacienciaparadesarrollarmejor, einvitoacualquierlectoratomarloqueheempezadoycontinuarlo,mejorarlo, tantoaniveldesoftwarecomoaniveldehardware. ParaconstruirelrobotheusadounmicrocontroladorBasicStampII,enla placadeunHomeBoeBOT.Paraelmovimiento,servomotorestrucadosparafuncionar como motores de CC, manejados por un driver de motores basado en el circuito L293B,yalimentadoscon6V(4Pilasde1,5V).Laplacaens est alimentada conunapilade9V.Paraintroducirlacoordenadas,medecid porutilizarun mandodetelevisinbajoelstandarddeSony,yunreceptordeI.R.incluidoen el pack del HomeBoeBOT, para recibir la seal de este mando, y aceptar secuencialmente nosnmeros correspondientes alas coordenadas de saliday del objeto,as comolaorientacininicial.Ademsdeestos,notieneningnsensor paradetectarlasparedes. La estructura para soportar el robot, est basada en placas finas de metacrilato,unidasporbarraroscada,tornillosytuercas.

9.

CONCLUSIONYMEJORAS

Conestadocumentacin,esperohaberconseguidomiobjetivo,compartirde una manera sencilla el trabajo que he realizado sobre este laberinto, que consideroqueesaplicableaotroslaberintosdistintos.Encuantoalafaltade informacinacercadesuestructura,motores,etc,comoyaheexplicado,sedebe a su sencillez, y su falta de calidad en comparacin con el algoritmo. He de decir, que el robot consigue salir del laberinto y realizar su tarea, con pequeascorreccionesmanualesensutrayectoria,debidoalaimprecisindelos movimientos.Unaposibleampliacin,seraaadirlealgnsistemadecorreccin delatrayectoria,enfuncindediversossensoresmedidoresdedistancias,como losultrasnicos,brjulaelectrnica,retroalimentacinbasadaenencoders,etc.

10.

CONTACTO

Sitienesalgunadudaocuriosidadsobreelproyecto,oquieres transmitirmetuopinin,nodudesenponerteencontactoconmigoen xabiugarte@gmail.com.

S-ar putea să vă placă și