{"id":386,"date":"2007-01-20T19:30:37","date_gmt":"2007-01-21T03:30:37","guid":{"rendered":"http:\/\/mundobot.com\/blog\/2007\/01\/21\/econobot-cap-34-programacion\/"},"modified":"2007-01-20T19:30:37","modified_gmt":"2007-01-21T03:30:37","slug":"econobot-cap-34-programacion-y-fin","status":"publish","type":"post","link":"https:\/\/www.robotic-lab.com\/blog\/2007\/01\/20\/econobot-cap-34-programacion-y-fin\/","title":{"rendered":"EconoBOT. Cap. 34. Programaci\u00f3n y Fin"},"content":{"rendered":"<p>B\u00e1sicamente el algoritmo que queremos implantar en el robot es el que se muestra en la imagen. El robot se mueve hasta encontrar un obst\u00e1culo. Cuando lo encuentra, retrocede, gira y sigue su camino tratando de evitar el obst\u00e1culo.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/mundobot.com\/blogdata\/algoritmo.gif\" \/>\u00a0<\/p>\n<p>Existen muchos lenguajes de programaci\u00f3n y pr\u00e1cticamente todos nos servir\u00edan para implementar este algoritmo. No obstante, utilizaremos uno extremadamente sencillo de aprender y que es utilizado con frecuencia en las primeras etapas de aprendizaje en rob\u00f3tica. Este lenguaje es el <a href=\"http:\/\/es.wikipedia.org\/wiki\/Logo_%28lenguaje_de_programaci%C3%B3n%29\" >LOGO<\/a>.<\/p>\n<p>Existen varios interpretes de este lenguaje que podemos descargar de Internet. Los m\u00e1s interesantes son MSWLogo, que es freeware y WinLogo, que aunque es comercial, se puede utilizar la versi\u00f3n demo, que tiene el 100% de funcionalidad de la versi\u00f3n comercial, pero no permite grabar los programas. En cualquier caso los programas se puedes escribir desde otro editor, como el block de notas y guardarlos con extensi\u00f3n &#8220;.log&#8221; y posteriormente cargarlos en el int\u00e9rprete. Utilizar\u00e9 el WinLogo por resultarme m\u00e1s c\u00f3modo. Puede descargarse la versi\u00f3n demo de WinLogo <a href=\"http:\/\/mundobot.com\/blogdata\/winlogo.zip\" >AQU\u00cd<\/a>. Tambi\u00e9n hay una p\u00e1gina con recursos interesantes sobre WinLogo <a href=\"http:\/\/mondragon.angeltowns.net\/paradiso\/WinLogo.html\" >AQU\u00cd<\/a>.<\/p>\n<p>B\u00e1sicamente los comandos clave que utilizaremos ser\u00e1n:<\/p>\n<p><strong>escribepuerto (puerto) (dato):<\/strong> Permite escribir a un puerto. Para escribir un byte a las salidas del puerto paralelo, se elegir\u00e1 el puerto 888. Los datos que escribiremos ser\u00e1n: 0 (0000b) para detener los motores, 9 (1001b) para avanzar con ambos motores en la misma direcci\u00f3n, 6 (0110b) para retroceder, 5 (0101b) para girar a la derecha y 10 (1010b) para girar a la izquierda. Los cuatro bits afectados por cada uno de estos valores corresponde a D3, D2, D1, D0, que son los que controlan los motores.<\/p>\n<p><strong>leepuerto (puerto):<\/strong> Es una funci\u00f3n que devuelve el valor de las entradas de un puerto. Para leer las del puerto paralelo se utilizar\u00e1 el puerto 889. Los valores le\u00eddos ser\u00e1n: 72 para indicar que los bumpers no han detectado obst\u00e1culo, 104 para indicar que el bumber derecho (S5) ha detectado obst\u00e1culo, 88 para indicar que el bumper izquierdo (S4) ha detectado obst\u00e1culo y 120 para indicar que ambos bumpers han detectado obst\u00e1culo.<\/p>\n<p><strong>espera (csg):<\/strong> permite hacer una pausa de un numero de cent\u00e9simas de segundo determinado. Como el Logo es un lenguaje interpretado, su ejecuci\u00f3n es lenta y en la realidad no se consigue una precisi\u00f3n de pausa de cent\u00e9simas de segundo. Por ello se ha creado en el programa un procedimiento llamado &#8220;pausar&#8221; que hace una pausa muy corta. Este procedimiento se utiliza para generar el <a href=\"http:\/\/es.wikipedia.org\/wiki\/PWM\" >PWM<\/a>\u00a0de los motores.<\/p>\n<p>Los motores son demasiado r\u00e1pidos, por lo que el robot se mueve de forma incontrolada. Por ello se ha utilizado la t\u00e9cnica de generar una se\u00f1al PWM para hacer que los motores se muevan m\u00e1s lentos. Esta t\u00e9cnica consiste en mandar pulsos altos y bajos alternos. Cuanto m\u00e1s duren los pulsos altos y menos los bajos, el motor ir\u00e1 m\u00e1s r\u00e1pido y viceversa.<\/p>\n<div ><img decoding=\"async\" src=\"http:\/\/mundobot.com\/blogdata\/pwm.gif\" \/><\/div>\n<p>\u00a0El c\u00f3digo del programa es el siguiente:<\/p>\n<blockquote>\n<p><em><strong>Para robot_parar<\/strong><br \/>\nescribepuerto 888 0<br \/>\nespera 100<br \/>\nFin<\/em><\/p>\n<p><em><strong>Para robot_adelante<\/strong><br \/>\nescribepuerto 888 0<br \/>\npausar<br \/>\nescribepuerto 888 9<br \/>\npausar<br \/>\nFin<\/em><\/p>\n<p><em><strong>Para robot_atras<\/strong><br \/>\nescribepuerto 888 0<br \/>\nespera 10<br \/>\nescribepuerto 888 6<br \/>\nespera 5<br \/>\nFin<\/em><\/p>\n<p><em><strong>Para robot_derecha<\/strong><br \/>\nescribepuerto 888 0<br \/>\nespera 10<br \/>\nescribepuerto 888 5<br \/>\nespera 200<br \/>\nFin<\/em><\/p>\n<p><em><strong>Para robot_izquierda<\/strong><br \/>\nescribepuerto 888 0<br \/>\nespera 10<br \/>\nescribepuerto 888 10<br \/>\nespera 200<br \/>\nFin<\/em><\/p>\n<p><em><strong>Para robot_bumpers<\/strong><br \/>\nHaz &#8220;bumpers leepuerto 889<br \/>\nSi :bumpers=104 [robot_parar robot_atras robot_izquierda robot_parar]<br \/>\nSi :bumpers=88\u00a0 [robot_parar robot_atras robot_derecha robot_parar]<br \/>\nSi :bumpers=120 [robot_parar robot_atras robot_derecha robot_parar]<br \/>\nFin<\/em><\/p>\n<p><em><strong>Para pausar<\/strong><br \/>\nrepite 5 [Haz &#8220;loquesea 20]<br \/>\nFin<\/em><\/p>\n<p><em><strong>Para inicio<br \/>\n<\/strong>repite 5000 [robot_adelante robot_bumpers]<br \/>\nrobot_parar<br \/>\nFin<\/em><\/p>\n<p><em>inicio<\/em><\/p>\n<\/blockquote>\n<p>\u00a0Los valores de pausas y repeticiones se han calculado emp\u00edricamente, haciendo funcionar el robot y cambi\u00e1ndolos para mejorar su respuesta. El resultado es que Econobot finalmente funciona!!. Se puede descargar un video del robot en acci\u00f3n <a href=\"http:\/\/mundobot.com\/blogdata\/econobot.mpg\" >AQU\u00cd<\/a>. (MPEG. 1,2Mb)<\/p>\n<p align=\"center\"><strong>&#8212;&#8212;&#8212;&#8211;<\/strong><\/p>\n<p align=\"center\"><strong>El reto queda por tanto conseguido: Demostrar que la creatividad es capaz de superar las barreras econ\u00f3micas. Ha quedado con ello comprobado que es posible fabricar un robot b\u00e1sico por cero euros y con herramientas muy limitadas.<\/strong><\/p>\n<p align=\"center\"><strong>&#8212;&#8212;&#8212;&#8211;<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>B\u00e1sicamente el algoritmo que queremos implantar en el robot es el que se muestra en la imagen. El robot se mueve hasta encontrar un obst\u00e1culo. Cuando lo encuentra, retrocede, gira y sigue su camino tratando de evitar el obst\u00e1culo.<br \/>\n\u00a0<br \/>\nExisten muchos lenguajes de programaci\u00f3n y pr\u00e1cticamente todos nos servir\u00edan para implementar este algoritmo. No obstante, utilizaremos [&#8230;]<\/p>\n","protected":false},"author":13,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1],"tags":[],"class_list":["post-386","post","type-post","status-publish","format-standard","hentry","category-otros"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1YYAx-6e","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/posts\/386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/comments?post=386"}],"version-history":[{"count":0,"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/posts\/386\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/media?parent=386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/categories?post=386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/tags?post=386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}