«

»

Ene 29

Imprimir esta Entrada

Como juan palomo…

… yo me lo guiso yo me lo, bueno no, que el silicio es un poco indigesto.Como llevo tiempo sin escribir nada de nada, y la última entrada fue la de los robot’s aspiradores, os dejo un código -aun por terminar y depurar- para el 8051 que está siendo escrito por el menda que esta ahora mismo publicando esta entrada.

/**********************************//* INFO DE PINES *//* PIN_C6 -> Motor derecho: *//* 1=adelante; 0=atras *//* PIN_C5 -> Motor izquierdo: *//* 1=adelante; 0=atras *//* *//* PIN_C7 -> habilita motores *//* 1=funcionan; 0=no funci *//**********************************//******************************************//* declaraciones globales *//* ————————————– *//* mapaLimpiar[134][134] *//* 0: sin visitar *//* 1: obstaculo *//* 2: pared virtual *//* 3: dudoso, diagonal, sin limpiar *//* 4: limpiado *//* 5:/* 6:/* 7:/******************************************//******************************************//* LISTA DE FUNCIONES *//******************************************/// ver si se puede pasar en memoria. Devuelve 1 sino se puede// bit memoriaDer()// bit memoriaIzq()// bit memoriaAde()// inicializa el mapa// limpiarMapa()// lee el estado de los sensores// bit leerSensores()// calcular en que valdosa esta ahora// valdosaDondeEsta()// escapar cuando encuentra obstaculo delante. Devuelve 1 si tiene que buscar un nuevo punto de limpieza y 0 para avanzar// bit escapar()// busca un nuevo punto sin limpiar cuando se queda atrapado. Solo actua si recibe un 1 de escapar()// bit buscarPuntoSinLimpiar(unsigned char sinSalida)// se mueve hacia delante y creando el mapaen memoria// moverAdelante(unsigned char unaValdosa) 0= solo se frena si obstaculo; 1= se frena con memoria tambien// dibuja el mapa en memoria// dibujarMapa()/****************************//* pines del micro *//****************************/unsigned char posxVal, posyVal; // posicion de valdosa. Es relativofloat posxReal, posyReal; // posicion real del robot en cmunsigned char mapaLimpiar[134][134]; // mapa del robotfloat tamanoValdosa=7.5; // tamaño en cm de la valdosa del mapabit sensorAdeIzq, sensorAdeDer; // 0=no hay obstaculo; 1=hay obstaculo en la parte delanterabit sensorIzq, sensorDer; // 0=no hay obstaculo; 1=hay obstaculo en los lateralesbit sensorAtrIzq, sensorAtrDer; // 0=no hay obstaculo; 1=hay obstaculo en la parte traserabit giro; // 0=derecha; 1=izquierdafloat tempF; // temporal para calculosunsigned char unaValdosa // cuantos pasos para una valdosaunsigned char cardinal=0; // 0=^; 1=v; 2=>; 3=< hacia donde miraunsigned char accion=1; // 1=limpiando; 0=buscando zona sin limpiarbit pulsoDer, pulsoIzq; // cada pulso es un grado de giroint ruedaDer=0, ruedaIzq=0; // cuenta los pulsos del movimiento de las ruedasint Vueltas90grados=200; // cantidad de pulsos para los 90 gradosint VueltasBaldosa=360; // cantidad de pulsos por valdosaunsigned char posxIni=67, posyIni=133; // posicion inicial de la base del robot/***************************//* declarar pines *//***************************/// P1=0 al 3 sensores// P1=5 al 7 motores// P1=4 bateria baja/****************************//* declaracion de funciones *//****************************//* ver si se puede pasar en memoria. Devuelve 1 sino se puede */bit memoriaDer(){salida=0;// mirando hacia arribaif( cardinal==0 && (mapaLimpiar[posxVal+1][posyVal]==1 || mapaLimpiar[posxVal+1][posyVal]==2 || mapaLimpiar[posxVal+1][posyVal]==4) ) salida=1;// mirando hacia abajoif( cardinal==1 && (mapaLimpiar[posxVal-1][posyVal]==1 || mapaLimpiar[posxVal-1][posyVal]==2 || mapaLimpiar[posxVal-1][posyVal]==4) ) salida=1;// mirando hacia derechaif( cardinal==2 && (mapaLimpiar[posxVal][posyVal+1]==1 || mapaLimpiar[posxVal][posyVal+1]==2 || mapaLimpiar[posxVal][posyVal+1]==4) ) salida=1;// mirando hacia izquierdaif( cardinal==3 && (mapaLimpiar[posxVal][posyVal-1]==1 || mapaLimpiar[posxVal][posyVal-1]==2 || mapaLimpiar[posxVal][posyVal-1]==4) ) salida=1;return salida;}bit memoriaIzq(){salida=0;// mirando hacia arribaif( cardinal==0 && (mapaLimpiar[posxVal-1][posyVal]==1 || mapaLimpiar[posxVal-1][posyVal]==2 || mapaLimpiar[posxVal-1][posyVal]==4) ) salida=1;// mirando hacia abajoif( cardinal==1 && (mapaLimpiar[posxVal+1][posyVal]==1 || mapaLimpiar[posxVal+1][posyVal]==2 || mapaLimpiar[posxVal+1][posyVal]==4) ) salida=1;// mirando hacia derechaif( cardinal==2 && (mapaLimpiar[posxVal][posyVal-1]==1 || mapaLimpiar[posxVal][posyVal-1]==2 || mapaLimpiar[posxVal][posyVal-1]==4) ) salida=1;// mirando hacia izquierdaif( cardinal==3 && (mapaLimpiar[posxVal][posyVal+1]==1 || mapaLimpiar[posxVal][posyVal+1]==2 || mapaLimpiar[posxVal][posyVal+1]==4) ) salida=1;return salida;}bit memoriaAde(){salida=0;// mirando hacia arribaif( cardinal==0 && (mapaLimpiar[posxVal][posyVal-1]==1 || mapaLimpiar[posxVal][posyVal-1]==2 || mapaLimpiar[posxVal][posyVal-1]==4) ) salida=1;// mirando hacia abajoif( cardinal==1 && (mapaLimpiar[posxVal][posyVal+1]==1 || mapaLimpiar[posxVal][posyVal+1]==2 || mapaLimpiar[posxVal][posyVal+1]==4) ) salida=1;// mirando hacia derechaif( cardinal==2 && (mapaLimpiar[posxVal+1][posyVal]==1 || mapaLimpiar[posxVal+1][posyVal]==2 || mapaLimpiar[posxVal+1][posyVal]==4) ) salida=1;// mirando hacia izquierdaif( cardinal==3 && (mapaLimpiar[posxVal-1][posyVal]==1 || mapaLimpiar[posxVal-1][posyVal]==2 || mapaLimpiar[posxVal][posyVal-1]==4) ) salida=1;return salida;}// inicializa el mapalimpiarMapa(){for(i=0;i<134;i++){for(j=0;j<134;j++){mapaLimpiar[i][j]=0;}}}// lee el estado de los sensoresbit leerSensores(){sensorAdeIzq=P1^0;sensorAdeDer=P1^1;sensorIzq=P1^2;sensorDer=P1^3;return 0;}// calcular en que valdosa esta ahoravaldosaDondeEsta(){tempF=posxReal/tamanoValdosa;posxVal=redondear(tempF);tempF=posyReal/tamanoValdosa;posyVal=redondear(tempF);}// escapar cuando encuentra obstaculo delante. Devuelve 1 si tiene que buscar un nuevo punto de limpieza y 0 para avanzarbit escapar(){bit devuelve=0;switch(cardinal){case 0:{/* subiendo con obstaculo delante y libre a la derecha */if( (sensorAdeIzq==1 || sensorAdeDer==1 || !memoriaAde()) && sensorDer==0 && !memoriaDer() ){// 90 grados a la derechagiro90der();cardinal=2; // mira a la derecha// una valdosa adelantemoverAdelante(1);// 90 grados derechagiro90der();cardinal=1; // mira hacia abajo}// subiendo con obstaculo delante, derecha y libre a la izquierdaif( (sensorAdeIzq==1 || sensorAdeDer==1 || !memoriaAde()) && sensorDer==1 && sensorIzq==0 && !memoriaIzq() ){// 90 grados a la derechagiro90izq();cardinal=3; // mira a la izquierda// una valdosa adelantemoverAdelante(1);// 90 grados derechagiro90izq();cardinal=1; // mira hacia abajo}// subiendo con obtaculo delante, derecha e izquierdaif( (sensorAdeIzq==1 || sensorAdeDer==1 || !memoriaAde()) && sensorDer==1 && sensorIzq==1 && !memoriaDer() && !memoriaIzq() ){// no hay salidadevuelve=1;}break;}case 1:{/* bajando con obstaculo delante y libre a la derecha */if( (sensorAdeIzq==1 || sensorAdeDer==1 || !memoriaAde()) && sensorDer==0 && !memoriaDer() ){// 90 grados a la derechagiro90der();cardinal=3; // mira a la izquierda// una valdosa adelantemoverAdelante(1);// 90 grados derechagiro90der();cardinal=0; // mira hacia arriba}// bajando con obstaculo delante, derecha y libre a la izquierdaif( (sensorAdeIzq==1 || sensorAdeDer==1 || !memoriaAde()) && sensorDer==1 && sensorIzq==0 && !memoriaIzq() ){// 90 grados a la derechagiro90izq();cardinal=2; // mira a la derecha// una valdosa adelantemoverAdelante(1);// 90 grados derechagiro90izq();cardinal=0; // mira hacia arriba}// bajando con obtaculo delante, derecha e izquierdaif( (sensorAdeIzq==1 || sensorAdeDer==1 || !memoriaAde()) && sensorDer==1 && sensorIzq==1 && !memoriaDer() && !memoriaIzq() ){// no hay salidadevuelve=1;}break;}case 2:{/* -> con obstaculo delante y libre a la derecha */if( (sensorAdeIzq==1 || sensorAdeDer==1 || !memoriaAde()) && sensorDer==0 && !memoriaDer() ){// 90 grados a la derechagiro90der();cardinal=1; // mira a abajo// una valdosa adelantemoverAdelante(1);// 90 grados derechagiro90der();cardinal=3; // mira izquierda}// -> con obstaculo delante, derecha y libre a la izquierdaif( (sensorAdeIzq==1 || sensorAdeDer==1 || !memoriaAde()) && sensorDer==1 && sensorIzq==0 && !memoriaIzq() ){// 90 grados a la izquierdagiro90izq();cardinal=0; // mira arriba// una valdosa adelantemoverAdelante(1);// 90 grados izquierdagiro90izq();cardinal=3; // mira derecha}// -> con obtaculo delante, derecha e izquierdaif( (sensorAdeIzq==1 || sensorAdeDer==1 || !memoriaAde()) && sensorDer==1 && sensorIzq==1 && !memoriaDer() && !memoriaIzq() ){// no hay salidadevuelve=1;}break;}case 3:{/* <- con obstaculo delante y libre a la derecha */if( (sensorAdeIzq==1 || sensorAdeDer==1 || !memoriaAde()) && sensorDer==0 && !memoriaDer() ){// 90 grados a la derechagiro90der();cardinal=0; // mira arriba// una valdosa adelantemoverAdelante(1);// 90 grados derechagiro90der();cardinal=2; // mira ->}// <- con obstaculo delante, derecha y libre a la izquierdaif( (sensorAdeIzq==1 || sensorAdeDer==1 || !memoriaAde()) && sensorDer==1 && sensorIzq==0 && !memoriaIzq() ){// 90 grados a la izquierdagiro90izq();cardinal=1; // mira abajo// una valdosa adelantemoverAdelante(1);// 90 grados izquierdagiro90izq();cardinal=2; // mira ->}// <- con obtaculo delante, derecha e izquierdaif( (sensorAdeIzq==1 || sensorAdeDer==1 || !memoriaAde()) && sensorDer==1 && sensorIzq==1 && !memoriaDer() && !memoriaIzq() ){// no hay salidadevuelve=1;}break;}}return devuelve;}// se mueve hacia delante y creando el mapa en memoriamoverAdelante(unsigned char unaValdosa) // 0= se para solo si hay obstaculo{salir=0;bit moverUnaSola;moverUnaSola=unaValdosa;ruedaDer=0;ruedaIzq=0;P1^6=1; // derecho avanzaP1^5=1; // izquierda avanzaP1^7=1; // habilita motores// mueve hasta obstaculo o limpiadowhile(!moverUnaSola) // con 0=asta obstaculo o limpiado;{if( memoriaAde() || leerSensores() ){dibujarMapa();break; // sale del while}if(pulsoDer) ruedaDer++;if(pulsoDer) ruedaIzq++;// suma una valdosa al movimientoif(ruedaDer>=VueltasBaldosa && ruedaIzq>=VueltasBaldosa){switch(cardinal){case 0: // arriba{ posyVal–; ruedaDer=0; ruedaIzq=0; break; }case 1: // abajo{ posyVal++; ruedaDer=0; ruedaIzq=0; break; }case 2: // ->{ posxVal++; ruedaDer=0; ruedaIzq=0; break; }case 3: // <-{ posxVal–; ruedaDer=0; ruedaIzq=0; break; }}}} // cierre de mueve asta obstaculo o limpiado// Solo una baldosa = mueve asta obstaculo o valdosa limpiadawhile(moverUnaSola) // 1=solo una valdosa{if( memoriaAde() || leerSensores() ){dibujarMapa();break; // sale del while}if(pulsoDer) ruedaDer++;if(pulsoDer) ruedaIzq++;// suma una valdosa al movimientoif(ruedaDer>=VueltasBaldosa && ruedaIzq>=VueltasBaldosa){switch(cardinal){case 0: // arriba{ posyVal–; salir=1; ruedaDer=0; ruedaIzq=0; break; }case 1: // abajo{ posyVal++; salir=1; ruedaDer=0; ruedaIzq=0; break; }case 2: // ->{ posxVal++; salir=1; ruedaDer=0; ruedaIzq=0; break; }case 3: // <-{ posxVal–; salir=1; ruedaDer=0; ruedaIzq=0; break; }}}if(salir) break;} // cierre de mueve una sola valdosaP1^7=0; // deshabilita motoresreturn salir;}// dibuja el mapa en memoriadibujarMapa(){switch(cardinal){case 0: // arriba{if(sensorIzq==1) mapaLimpiar[posxVal-1][posyVal]=1;if(sensorDer==1) mapaLimpiar[posxVal+1][posyVal]=1;if(sensorAdeIzq==1 || sensorAdeDer==1) mapaLimpiar[posxVal][posyVal-1]=1;break;}case 1: // abajo{if(sensorIzq==1) mapaLimpiar[posxVal+1][posyVal]=1;if(sensorDer==1) mapaLimpiar[posxVal-1][posyVal]=1;if(sensorAdeIzq==1 || sensorAdeDer==1) mapaLimpiar[posxVal][posyVal+1]=1;break;}case 2: // ->{if(sensorIzq==1) mapaLimpiar[posxVal][posyVal-1]=1;if(sensorDer==1) mapaLimpiar[posxVal][posyVal+1]=1;if(sensorAdeIzq==1 || sensorAdeDer==1) mapaLimpiar[posxVal+1][posyVal]=1;break;}case 3: // <-{if(sensorIzq==1) mapaLimpiar[posxVal][posyVal+1]=1;if(sensorDer==1) mapaLimpiar[posxVal][posyVal-1]=1;if(sensorAdeIzq==1 || sensorAdeDer==1) mapaLimpiar[posxVal-1][posyVal]=1;break;}}}// girar a la izquierda 90 gradosgiro90izq(){P1^6=1; // derecho avanzaP1^5=0; // izquierda retrocedeP1^7=1; // habilita motoreswhile(ruedaDer<Vueltas90grados && ruedaIzq<Vueltas90grados){leerSensores();if(pulsoDer) ruedaDer++;if(pulsoDer) ruedaIzq++;}P1^7=0; // deshabilita motores// orientarloswitch(cardinal){case 0: // arriba{ cardinal=3; break; }case 1: // abajo{ cardinal=2; break; }case 2: // ->{ cardinal=0; break; }case 3: // <-{ cardinal=1; break; }}}// girar a la derecha 90 gradosgiro90der(){P1^6=0; // derecho retroP1^5=1; // izquierda avanzaP1^7=1; // habilita motoreswhile(ruedaDer<Vueltas90grados && ruedaIzq<Vueltas90grados){leerSensores();if(pulsoDer) ruedaDer++;if(pulsoDer) ruedaIzq++;}P1^7=0; // deshabilita motores// orientarloswitch(cardinal){case 0: // arriba{ cardinal=2; break; }case 1: // abajo{ cardinal=3; break; }case 2: // ->{ cardinal=1; break; }case 3: // <-{ cardinal=0; break; }}}// busca un nuevo punto sin limpiar cuando se queda atrapado. Solo actua si recibe un 1 de escapar()bit buscarPuntoSinLimpiar(unsigned char sinSalida){salida=1;if(sinSalida){for(i=0;mapaLimpiar[i][j]!=3;i++){for(j=0;mapaLimpiar[i][j]!=3;j++){if(j>133) break; // sale de posible bucle infinito}// sale porque ha encontrado un punto sin limpiarif(mapaLimpiar[i][j]==3){posxValIr=i;posyValIr=j;break;}// sale de posible bucle infinitoif(i>133){salida=0;// esta todo limpiobreak;}}}return salida;}// viaja a un punto del mapairAUnPunto(bit SiNo){if(SiNo){salir=1;}else{ // establece el punto de la baseposxValIr=posxIni;posyValIr=posyIni;salir=0;}do{if(posxValIr<posxVal){if(mapaLimpiar[posxVal-1][posyVal]==0 || mapaLimpiar[posxVal-1][posyVal]==1 || mapaLimpiar[posxVal-1][posyVal]==4){switch(cardinal){case 0: { giro90izq(); break; } // arribacase 1: { giro90der(); break; } // abajocase 2: { giro90izq(); giro90izq(); break; } // ->case 3: { while(!memoriaAde()) moverAdelante(1); break; } // <-}}else{ // fin de if mapa..mapa..mapa}}else{ // fin if(posxValIr<posxVal)if(mapaLimpiar[posxVal+1][posyVal]==0 || mapaLimpiar[posxVal+1][posyVal]==1 || mapaLimpiar[posxVal+1][posyVal]==4){switch(cardinal){case 0: { giro90der(); break; } // arribacase 1: { giro90izq(); break; } // abajocase 2: { while(!memoriaAde()) moverAdelante(1); break; } // ->case 3: { giro90der(); giro90der(); break; } // <-}}else{ // fin de if mapa..mapa..mapa}} // fin else if(posxValIr<posxVal)/////////////////////////////////////////////////////////////if(posyValIr<posyVal){if(mapaLimpiar[posxVal][posyVal-1]==0 || mapaLimpiar[posxVal][posyVal-1]==1 || mapaLimpiar[posxVal][posyVal-1]==4){switch(cardinal){case 0: { while(!memoriaAde()) moverAdelante(1); break; } // arribacase 1: { giro90der(); giro90der(); break; } // abajocase 2: { giro90izq(); break; } // ->case 3: { giro90der(); break; } // <-}}else{ // fin de if mapa..mapa..mapa}}else{ // fin if(posyValIr<posyVal)if(mapaLimpiar[posxVal][posyVal+1]==0 || mapaLimpiar[posxVal][posyVal+1]==1 || mapaLimpiar[posxVal][posyVal+1]==4){switch(cardinal){case 0: { giro90der(); giro90der(); break; } // arribacase 1: { while(!memoriaAde()) moverAdelante(1); break; } // abajocase 2: { giro90der(); break; } // ->case 3: { giro90izq(); break; } // <-}}else{ // fin de if mapa..mapa..mapa}} // fin else if(posyValIr<posyVal)}while(1);return salir;}main(){// inicializacion del mapalimpiarMapa();/* programa limpiando */do{// comienza a moversemoverAdelante(0);// escapar de los obstaculostemp=escapar();// comprobar si todo esta limpio. 1=falta por limpiartemp=buscarPuntoSinLimpiar(temp);// comprobar bateria. 0=bateria baja. 1=bateria altabateria=P1^4;// viaja hasta el punto sin limpiar. 1=va al punto para limpiar. 0=vuelve a la baseif(!bateria) { irAUnPunto(0); break; }if(bateria && temp) irAPunto(1);}while(1);return 0;}

Si, ya lo se, hay aun muy poco código para realizar la IA necesaría para que el robot sea capaz de volver a su base sin atascarse pero la limpieza la hace -en teoría- bien.Si lo ve mi profesor que antes de pensarse que estoy copiando el código que me pregunte o mejor te dejo una frase que seguro que la asocias a la clase.

AGUAS

¿Porque ofrecer este código? Nose. Creo que toda ayuda para los que comienzan es buena y, ademas, las líneas no son tan enrevesadas como hacen otros programadores para que parezca mas dificil de lo que es.Mucho OJO con considerar esto como algo realizado por un experto -porque no lo soy- y puede tener errores de compilación (seguro que tiene porque todavía no lo he compilado para probarlo)Continuaré mostrando mas código, depurandolo hasta que funcione y, como postre, los esquemas para el harware del bicho.Para que veas, Como juan palomo, yo me lo guiso yo me lo como xD

1 comentario

  1. Daniel

    Jejej esta muy bien el codigo aunque no me detuve mucho a leerlo bien, seguro a alguen le es de utilidad y mas si no tiene muchas ganas de pasar la aspiradora por su casa XD

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Puedes utilizar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

CommentLuv badge