Archivo de la categoría: Programación

¿Por qué está resultando difícil construir robots para convivir y trabajar con nosotros en la vida real?

Hacer robots no es tarea fácil. Si usted habla con expertos en robótica, le dirán que les llevó años lograr que el último robot que construyeron o programaron fuese bueno para realizar una tarea específica. Y aunque es posible ver vídeos de hazañas impresionantes de algunos robots, a menudo la realidad es más aleccionadora

¿Recuerdan el video de la caída de los robots en el Desafío de Robots de DARPA?

¿Por qué es tan difícil construir robots? He aquí una recopilación de por qué la robótica aún requiere de años de investigación y desarrollo antes de verlos en nuestra vida cotidiana.

Fuente de alimentación

Se requiere que la mayoría de los robots operen sin estar conectados a una toma de corriente. Esto significa que deben llevar su propia fuente de energía, ya sea un paquete de baterías o un tanque de combustible. Los pequeños aviones no tripulados pueden operar normalmente durante menos de 1 hora, que es también la duración de la batería de la mayoría de los humanoides avanzados tales como el ATLAS de Boston Dynamics de Google. De manera que cuando el robot ha entrado por la puerta y ha dado algunos pasos, ya es el momento de una recarga de energía.

Se están haciendo progresos, y el impulso para lograr que las baterías permitan que los ordenadores portátiles y los teléfonos móviles funcionen durante días también está impulsando el aumento del tiempo de funcionamiento de los robots. Un ejemplo es el propio robot ATLAS, que estaba atado a cables hace apenas un año y ahora posee su propio conjunto de baterías. El principal desafío es que el movimiento del robot es a menudo el mayor consumidor de baterías. La mayoría de los drones utilizarán la mayor parte de su energía de encender sus hélices propulsoras en lugar de computar, realizar detecciones y comunicarse, todo al mismo tiempo. Se le puede aportar más potencia a un robot con baterías más grandes, pero esto también hará que sea más pesado, por lo que a su vez requerirá más energía para mover el robot. La realidad es que a menudo los robots son dependientes de una estación de carga.

Más allá de la energía, también existe un verdadero desafío: la eficiencia. Por ejemplo, los músculos humanos son capaces de ejercer una fuerza impresionante, sin embargo, muchos robots manipuladores no tienen fuerza para llevar cargas pesadas.

“Los músculos biológicos siguen siendo un orden de magnitud (x10)
más livianos y pequeños para generar la misma fuerza que los
motores de un robot”. – Herman Bruyninckx

Elementos de senseo

¿Se ha preguntado por qué la mayoría de las demostraciones muestran robots manipulando objetos con colores brillantes o que poseen un código QR?

Los robots aún tienen dificultades para reconocer los objetos cotidianos. Y a pesar de que los algoritmos de aprendizaje automático han demostrado ser eficaces en las computadoras, lo que les permite etiquetar las imágenes con frases tales como “gato negro en una silla blanca”, los robots también requieren saber para qué se utilizan los objetos, y cómo se debe hacer para interactuar con ellos. Una camisa fucsia, una camisa a rayas, o un par de pantalones se verán con un aspecto muy diferente para un robot plegador de ropa, y requerirían una secuencia diferente de movimientos. Y a pesar de que resulta útil utilizar cámaras, el procesamiento de imágenes es todavía una tarea muy intensa.

Los sensores como el Kinect de Microsoft y los Laser Rangefinders han permitido que los robots conformen mapas 3D de su entorno. Con las nubes de puntos resultantes, pueden detectar obstáculos, construir mapas y saber dónde se encuentran dentro de esos entornos. Inferir el significado de la escena, sin embargo, es un paso más allá. Fuera del video, el tacto y el sonido aún se utilizan poco en los sistemas robóticos. Afortunadamente, los robots tienen acceso a una cantidad de sentidos dedicados que no son como los de los humanos, y resultan más adecuados para tareas específicas. Entre ellos está los acelerómetros, sensores de temperatura o de gas, y los GPS.

Manipulación

Los robots industriales son muy exitosos en la manipulación de objetos predefinidos y específicos de manera repetitiva. Uno de los mayores desafíos en la robótica es lograr la manipulación fuera de estos entornos restringidos. Hay una razón por la que los robots comerciales más exitosos para el entorno del hogar, incluyendo los robots de telepresencia, las aspiradoras y los robots personales no están construidos para recoger objetos. Amazon resolvió este problema en su área de almacenaje creando equipos de humanos junto a robots para cumplir con los pedidos. Los robots se mueven por los estantes y los trabajadores son los responsables de recoger los objetos de los estantes y colocarlos en cajas. Recién el año pasado, Amazon corrió un “desafío de manipuleo” en ICRA para ayudar a avanzar en el estado del desarrollo. El concurso fue ganado por el equipo RBO de Berlín. La competencia Rockin en Europa también se centra en la manipulación en entornos domésticos y de trabajo.

Empresas como Shadow Robot están tratando de lograr el control motriz delicado que nos permite interactuar con los objetos de uso cotidiano en una mano robótica. El uso de estos manipuladores a menudo requiere una planificación precisa. A menudo, una solución alternativa fue utilizar manipuladores probados del sector industrial o robots con manipuladores cada vez más blandos que se ajusten a las diferentes formas de los objetos.

Cognición

Los robots actuales suelen utilizar algoritmos bien determinados que les permiten realizar tareas específicas, por ejemplo la navegación desde el punto A al punto B, o mover un objeto en una cadena de montaje. El diseño de robots colaborativos para las empresas, o de robots para el hogar, requerirá que éstos entiendan cada vez mejor los nuevos entornos y aprendan en el trabajo. Lo que parece una tarea simple para nosotros, podría convertirse en un ejercicio cognitivo complejo para un robot. Los proyectos como el iCub han avanzado en esta dirección, con el objetivo de alcanzar los niveles cognitivos de un niño de 2,5 años.

El aprendizaje profundo también está aportando nuevos rumbos. Un equipo de la Universidad de Zurich y IDSIA mostró recientemente drones que están aprendiendo a volar a través de senderos en un bosque utilizando redes neuronales profundas (Deep Neural Networks).

Cualquiera que sea el aprendizaje que se integre en el robot, es importante darse cuenta de que todavía estamos lejos de algo que se asemeje a la inteligencia o el entendimiento humano. La navegación por un recorrido forestal manipula con intensidad, principalmente, datos de un montón de imágenes de senderos forestales, y en respuesta ejecuta los comandos correctos en los motores. Esto está más cerca del aprendizaje de un humano para equilibrar un palo en forma vertical en la palma de su mano a través de la práctica, en lugar del desarrollo de una comprensión real de las leyes de la física.

Entornos no estructurados

El mundo es un lugar desordenado para la mayoría de los robots, por lo que operar en entornos no estructurados les es difícil. Es por eso que los robots comerciales han tenido más éxito en las fábricas, en los pisos de almacenes o en carreteras, al aire libre y bajo el agua. Por otro lado, hay muy pocos robots que operan de forma autónoma en el entorno del hogar, los distintos robots aspiradora. La Dyson 360 Eye requirió más de 100.000 horas de tiempo de producción y 16 años de desarrollo antes de que la compañía estuviese convencida de que iba a hacer un buen trabajo al navegar por una habitación. Sus ensayos mostraron que los niños a veces bailan delante de su robot o juegan con él, adjuntando pequeñas orejas de cartón delante de su cámara, o la cubren por completo. No es necesario remarcar que cada casa es única.

Integración

El truco para comprender la integración es pensar como un robot. ¿Qué se necesita para que un nuevo robot lleve un vaso de agua a un paciente de edad avanzada en una casa? En primer lugar el robot tendría que tener un mapa de la casa, tal vez construirlo desde cero mediante la navegación a través de los pasillos y habitaciones. Sería entonces necesario comprender la indicación de la persona de que le alcance el agua, para lo que podría utilizar el reconocimiento de voz. El robot entonces utilizaría su mapa para planificar una trayectoria a la cocina, evitando los obstáculos, en una constante actualización de su estimación de dónde es que se mueve. Una vez frente al armario, el robot tendría que abrir el armario, buscar un vaso transparente, y recogerlo. El robot giraría hacia el fregadero, abriría el grifo de agua usando las habilidades motoras finas, colocaría el vaso debajo del chorro de agua hasta que el vaso esté lleno, e iría hacia la persona sin derramar agua. A continuación, debería poner suavemente el vaso sobre una mesa. Esta tarea requiere un hardware seguro, un conjunto de sensores impresionante y algoritmos complejos que actualmente sólo existen como piezas independientes, en todo caso. La integración de todos estos componentes en un solo robot es muy difícil, y eso es sólo para una tarea: ir a buscar un vaso de agua.

Acerca de la integración, John Hallam de la Universidad del Sur de Dinamarca dice
“Usted está construyendo un robot -está haciendo la ingeniería de un sistema- y con
demasiada frecuencia la gente se centra en la fabricación del dispositivo.
Al hacer esto se olvidan de importantes posibilidades”.

Marco legal y la percepción pública

Nuevas empresas están construyendo cada vez más robots que tienen el potencial de ser perjudiciales porque sólo resuelven bien problemas específicos. Los drones y los autos autónomos son un buen ejemplo de esto. El desafío para estas nuevas empresas es que la regulación aún no está definida como para permitir que sus productos se comercialicen.

Andrea Bertolini de la Scuola Superiore Sant’Anna en Italia dice que hay “demasiada litigios y muy poca regulación ex ante”, lo cual significa que nuevas empresas pueden terminar tomando riesgos legales innecesarios, que podrían evitarse si ya hubiese una mejor regulación establecida para apoyar la innovación avanzada.





Y en un mundo donde la seguridad y la expectativa del cliente son de suma importancia humana, la búsqueda de las normas adecuadas para hacer que los robots se vuelvan realidad ha sido un esfuerzo continuo en la comunidad.

Por último, la tergiversación en el público acerca de lo que pueden hacer los robots aumenta la preocupación de este público. Esto conlleva el peligro de que los reguladores puedan reaccionar ante la opinión pública a causa de la falta de una información equilibrada. Las preocupaciones del público deben ser discutidas y se debe promover un uso responsable de los robots, de manera que la política se centre en lo que necesita la comunidad.

Sigue siendo difícil hacer un robot

La robótica está avanzando en el desarrollo de tecnologías y soluciones para tareas específicas. Después de años de desarrollo en laboratorios de investigación, los robots están empezando a encontrar un camino hacia el mercado de consumo. Sin embargo, todavía estamos muy lejos del robot Rosie (la mucama robot de Los Supersónicos, o “Jetsons” en su original en inglés). Hacer una Rosie requeriría profundos avances en fuentes de alimentación, detección, manipulación, cognición y la unión mágica de todo esto: la integración.

Información adicional:
Desafío de robots de DARPA
Robots Atlas de Boston Dynamics
Robot ATLAS ahora con baterías
Robot Dyson 360 Eye
Artículo original

La nueva revolución china: de la mano de obra barata a la mano de obra robótica

Robótica

La nueva revolución china: de la mano de obra barata a la mano de obra robótica

Los sueldos han aumentado y ya no son competitivos a nivel global. El país está haciendo grandes inversiones para sustituir a millones de trabajadores por robots, pero ¿qué será de ellos?

Dentro de una gran sala sin ventanas en una fábrica de electrónica al sur de Shanghái (China), unos 15 trabajadores contemplan un pequeño brazo robótico con frustración. Cerca del final de la línea de producción, donde unos equipos ópticos de red están siendo introducidos en cajas para su envío, el robot permanece inmóvil.

“El sistema se ha caído”, explica la responsable del control de calidad, Nie Juan, una mujer de veintipocos años. Su equipo lleva probando el robot durante la última semana. La máquina está encargada de colocar pegatinas en las cajas que contienen enrutadores nuevos, y parecía haber dominado la tarea bastante bien. Pero entonces dejó de funcionar de repente. “El robot sí ahorra mano de obra, pero resulta difícil de mantener”, me cuenta Nie con el ceño fruncido.

Esta complicación refleja el gran reto tecnológico al que se enfrentan actualmente los fabricantes chinos. Los sueldos en Shanghái han aumentado en más del doble durante los últimos siete años. Así que la empresa propietaria de la fábrica, Cambridge Industries Group (CIG), se enfrenta a una feroz competencia por parte de unas operaciones cada vez más tecnológicamente avanzadas en Alemania, Japón y Estados Unidos. Para abordar ambos problemas, CIG quiere reemplazar dos terceras partes de su plantilla con máquinas este año. Dentro de un par de años más, quiere que la operación se ejecute de forma prácticamente automatizada. De lograrlo, CIG conseguiría crear lo que se define como una “fábrica oscura” o “de luces apagadas”. La idea es que con tan pocas personas presentes, se podrían apagar las luces y dejar las máquinas trabajar a sus anchas.

Pero como sugiere el inactivo brazo robótico de la línea de embalaje de CIG, reemplazar humanos con máquinas no es tarea fácil. La mayoría de los robots industriales requieren programación en detalle, y solo realizarán una tarea correctamente si las cosas están perfectamente posicionadas. Gran parte de los trabajos que se realizan en fábricas chinas requieren destreza manual, flexibilidad y sentido común. Si una caja baja por la línea en un ángulo raro, por ejemplo, un trabajador tendrá que ajustar la posición de su mano antes de pegar la etiqueta. Varias horas después, al mismo trabajador se le podría encargar fijar una etiqueta distinta en otro tipo de caja. Y el día siguiente podría ser trasladado a otra parte de la línea de producción.

A pesar de estos enormes retos, innumerables fabricantes de China planean transformar sus procesos de producción con el uso de la robótica y la automatización a una escala sin precedentes. De algún modo, en realidad no tienen otra opción. La mano de obra humana en China ya no es tan barata como lo fue antaño, especialmente en comparación con la de los centros de fabricación de crecimiento rápido rivales en Asia. En Vietnam, Tailandia e Indonesia, los salarios de las fábricas pueden representar menos de la tercera parte de lo que son en los centros urbanos de China. Muchos fabricantes y funcionarios del Gobierno creen que una solución consistiría en reemplazar los trabajadores humanos con máquinas.


Foto:
El CEO de CIG, Gerald Wong, está desarrollando una fábrica de electrónica automatizada. Crédito: Daniele Mattioli.

Los resultados de este esfuerzo se sentirán a escala global. Casi la cuarta parte de los productos del mundo se fabrica en China. Si el país logra emplear robots y otras tecnologías avanzadas para reorganizar unos tipos de producción jamás automatizados con anterioridad, eso podría convertir el país, ahora la planta explotadora del mundo, en un centro de innovación tecnológica. Está menos claro, sin embargo, cómo afectaría esto a los millones de trabajadores reclutados por sus fábricas en auge.

Pero durante mi visita a la planta de CIG todavía había un buen número de trabajadores humanos. La recorrí junto a su CEO, Gerald Wong, un hombre compacto que obtuvo varios títulos del Instituto Tecnológico de Massachusetts (MIT, EEUU) durante la década de 1980. Observamos a un equipo de personas que realizaban delicados trabajos de soldadura en circuitos impresos, y otro grupo que introducía estos circuitos impresos en carcasas de plástico. Wong se paró para demostrar una tarea que les está resultando especialmente complicada de automatizar: la introducción de un cable flexible en los circuitos impresos. “Siempre se enroscan de manera distinta”, explica con irritación.

Pero la fábrica de Wong sí está empezando a aplicar algunos impresionantes ejemplos de automatización. Mientras pasamos por una fila de máquinas que incrusta chips en circuitos impresos, un robot sobre ruedas aproximadamente del tamaño de una mininevera pasó por nuestro lado portando componentes en dirección contraria. Wong se puso delante de la máquina para demostrar cómo le detecta y se para.

En otra parte de la fábrica observamos un brazo robótico recogiendo circuitos impresos de una cinta transportadora y colocándolos dentro de una máquina que comprueba su software automáticamente. Wong explica que su empresa está probando un robot que realiza el trabajo de soldadura que observamos antes de forma más rápida y fiable que un humano.

Después de terminar la visita dijo: “Está muy claro en China: la gente se meterá en la automatización o se verá obligada a abandonar la fabricación“.

Automatizarse o morir

El milagro económico de China es directamente atribuible a su industria de fabricación. Aproximadamente 100 millones de personas trabajan en la fabricación en China (en Estados Unidos esta cifra ronda los 12 millones), y el sector representa casi el 36% de su PIB. Durante las últimas dos décadas, se han forjado imperios de fabricación en torno al delta del río Yangtze, la bahía Bohai (a las afueras de Pekín) y el delta del río de las Perlas al sur. Millones de trabajadores migratorios poco cualificados encontraron trabajo en fábricas gigantes produciendo un abanico inimaginable de productos, desde calcetines hasta servidores. China sólo representaba el 3% de la producción global de fabricación en 1990. Hoy, produce casi el 25%, incluido el 80% de todos los equipos de aire acondicionado, el 71% de todos los móviles y el 63% de todos los zapatos del mundo. Para los consumidores de todo el planeta, este auge de fabricación ha generado muchos productos de bajo coste, desde asequibles iPhones hasta televisores de pantalla plana.

En años recientes, sin embargo, el motor de fabricación chino ha empezado a calarse. Los salarios han aumentado al demoledor ritmo del 12% al año de media desde 2001. Las exportaciones chinas se redujeron el año pasado por primera vez desde la crisis financiera de 2009. Y hacia finales de 2015, el Índice para Gerentes de Compras Caixin, un indicador de uso generalizado para la actividad de fabricación, demostró que el sector se había contraído por décimo mes consecutivo. Al igual que el auge de fabricación de China alimentó la economía global, la perspectiva de su declive ya ha empezado a inquietar a los mercados financieros de todo el mundo.

Dentro de poco, CIG planea disponer de una fábrica mayoritariamente automatizada, un concepto conocido como “fábrica oscura” o “fabricas de luces apagadas”.

La automatización parece ofrecer una solución tecnológica atractiva. China ya importa gran cantidad de robots industriales, pero el país está muy rezagado frente a sus rivales en cuanto al ratio de robots frente a trabajadores humanos. En Corea del Sur, por ejemplo, hay 478 robots por cada 10.000 trabajadores; en Japón esta cifra es de 315; en Alemania, 292; en Estados Unidos, 164. En China ese número es un pobre 36.

El Gobierno chino está ansioso por cambiar esto. El 16 de marzo, las autoridades aprobaron el próximo Plan a Cinco Años para la economía, del que se dice que incluye una iniciativa que pondrá miles de millones de yuanes a disposición de los fabricantes para mejorar sus tecnologías, incluidos robots y máquinas avanzadas. El Gobierno también tiene planes de crear docenas de centros de innovación por todo el país para servir de escaparate para las tecnologías avanzadas de fabricación. Algunas autoridades regionales han sido especialmente osadas. El año pasado el Gobierno de Guangdong, una provincia que aloja muchas grandes operaciones de fabricación, se comprometió a invertir 150.000 millones de dólares (unos 133.300 millones de euros) en equipar las fábricas con robots industriales y crear dos centros nuevos dedicados a la automatización avanzada.

El objetivo es superar a Alemania, Japón y Estados Unidos en términos de la sofisticación de la fabricación para 2049, el centenario de la República Popular de China. Para que esto suceda, el Gobierno necesita que los fabricantes chinos adopten millones de robots. También quiere que las empresas chinas empiecen a producir una cantidad mayor de estos robots. Se espera que esto genere un ciclo de retroalimentación que ayude a dar a luz a una nueva industria tecnológica inspirando innovaciones que puedan extenderse desde la fabricación a otros sectores y productos.

Introducir multitud de trabajadores robóticos, sin embargo, no es algo que pueda lograrse de la noche a la mañana. Así lo ha demostrado Foxconn, un fabricante taiwanés de 130.000 millones de dólares (unos 116.000 millones de euros) famoso por emplear a cientos de miles de trabajadores en fábricas del tamaño de una ciudad y por fabricar, entre otros productos, los iPhones de Apple. En 2011, el fundador y CEO de Foxconn, Terry Gou, dijo que esperaba disponer de un millón de robots en las fábricas de su empresa para 2014. Tres años más tarde, el esfuerzo se había demostrado más difícil de lo anticipado, y tan sólo se habían desplegado varias decenas de miles de robots.

A pesar de los retos, el director gerente del Comité de Desarrollo de la Automatización Tecnológica de Foxconn, Day Chia-peng, afirma que la empresa está automatizando un número creciente de tareas en sus líneas de producción. Estas incluyen la fabricación de pantallas y circuitos impresos, aunque los procesos que incluyan doblar los componentes o encajarlos a presión todavía presentan muchos retos. La empresa hasta explora maneras de rediseñar los propios productos para facilitar la fabricación automatizada. Y recientemente ha afirmado que venderá algunos de los robots que ha desarrollado a otros fabricantes.

La transición hacia trabajadores robóticos puede que revolucione la sociedad china, dado que una gran parte de su población se dedica a la fabricación.

La transición hacia trabajadores robóticos puede que revolucione la sociedad china. Algunos trabajadores desplazados podrían encontrar trabajo en el sector de servicios, pero no todos los 100 millones de trabajadores que ahora trabajan en fábricas encontrarán una buena afinidad con tales trabajos. Así que un cambio repentino hacia los robots y la automatización podría provocar dificultades económicas y malestar social. “Se puede argumentar que la tecnología robótica es la manera de salvar la fabricación en China”, afirma el profesor de la Escuela Sloan de Negocios del MIT, Yasheng Huang. Aunque el experto advierte: “Pero China también dispone de una enorme fuerza laboral. ¿Qué será de ella?”

Robots bailones

Varios días antes de visitar CIG, acudí al primer evento chino de robótica, la Conferencia Mundial de Robótica, celebrada dentro de una enorme sala de exhibiciones del Parque Olímpico de Pekín. La ciudad estaba experimentando una inesperada ola de frío, y la producción de electricidad para cumplir con sus necesidades energéticas había generado una contaminación atmosférica procedente de las cercanas plantas a carbón que abrasaba los pulmones. Pero ni la nieve ni la niebla tóxica lograron disuadir a los cientos de investigadores y empresas y miles de asistentes de acudir al evento.

Primero se celebró una teatral ceremonia de apertura, durante la cual una enorme pared de vídeo mostró las innovaciones alcanzadas en la historia de China mezcladas, de forma algo extraña, con videoclips de robots de películas de ciencia ficción. La lista de invitados incluía a varios líderes políticos importantes. El vicepresidente de China, Li Yuanchao, leyó mensajes de felicitaciones del presidente, Xi Jinping, y del primer ministro, Li Kequiang. El vicepresidente dijo que las inversiones en investigaciones robóticas no sólo alimentarían la industria de fabricación del país, sino también fomentarían un mayor nivel de innovación nacional.


Foto:
Un trabajador de CIG inspecciona una máquina diseñada para montar circuitos impresos. Crédito: Daniele Mattioli.

Después de varias ponencias, paseé por interminables demostraciones de empresas de robótica e institutos de investigación. Pude observar un enorme robot industrial con un apéndice con forma de horquilla que realizaba algún tipo de trabajo rutinario de fábrica a un ritmo frenético. Otras demostraciones fueron más caprichosas, como una pequeña máquina industrial que realizaba una cautivante interpretación de un tradicional baile de dragón chino (con el traje típico puesto)  y un robot móvil equipado con dos raquetas que jugaba al bádminton con unos emocionados asistentes. Un robot humanoide con ojos parpadeantes portaba una pequeña aspiradora en una bandeja.

También se pudo entender la ambición de China a la hora de intentar reemplazar trabajadores humanos en sus fábricas. HIT Robot Group, una empresa afiliada con una de las universidades tecnológicas más destacadas del país, el Instituto Harbin de Tecnología, había desarrollado un prototipo de línea de producción de baterías que se estructuraba en forma de un único robot gigante. Los vehículos robóticos transportaban componentes entre varias máquinas de fabricación. Los únicos sitios para los humanos eran dentro de una sala de control en el centro y en una línea de producción donde se realizaban trabajos manuales especialmente finos. Después aprendí que HIT calcula que la nueva fábrica podría reducir las labores humanas en hasta un 85%.

Pero también era evidente que como país con un historial interminable de mano de obra barata, China se ha quedado rezagada frente a la revolución robótica. Rethink Robotics, una empresa de Boston (EEUU), exhibió un par de máquinas industriales flexibles e inteligentes. A diferencia de los convencionales robots industriales, estos productos, llamados Baxter y Sawyer, requieren muy poca programación, y están equipados con sensores que los permiten reconocer objetos y evitar chocar con la gente. También cuestan entre 20.000 y 30.000 dólares (entre unos 18.000 y 27.000 euros) en lugar de los cientos de miles de dólares que cuestan generalmente los robots industriales. Hablando después del evento, el fundador de Rethink Robotics y pionero de la robótica, Rodney Brooks, dijo que China representa un enorme mercado en potencia para su empresa, que abrió recientemente una sede en Shanghái. También es probable que los fabricantes chinos de robots empiecen a producir unos robots más flexibles e inteligentes. Pero por ahora, sus productos van por detrás de los de los fabricantes occidentales.

Así, Brooks me contó un pequeño juego que su empresa practica cuando acude a una feria comercial en Extremo Oriente: “Miramos los robots industriales de empresas pequeñas y decimos: ‘Este es una copia de este, y eso es un copia de lo otro'”. El experto cree que a las empresas chinas les costará algo de tiempo recuperar terreno perdido.

Reinventado en China

Para comprobar en primera persona todo lo que les queda por hacer a los investigadores chinos, visité la Universidad Jiao Tong de Shanghái, una de las instituciones más prestigiosas del país y el hogar del laboratorio de robótica académico más antiguo de China, fundado en 1979. Me encontré en un frondoso y extenso campus en las afueras de Shanghái, rodeado por estudiantes montados sobre unas chirriantes bicicletas. Allí encontré un moderno edificio que alojaba el laboratorio de robótica.

Zhu Ziangyang, un profesor de cuarenta y muchos años con gafas de montura fina y un chaleco de forro polar, me dio la bienvenida a su despacho con un té y una sonrisa incontenible. El laboratorio dispone de varias docenas de profesores y científicos de investigación y más de 100 estudiantes de postgrado y doctorado, y Zhu se siente justificadamente orgulloso de sus investigaciones. En una sala había una silla de ruedas que controlaba con el cerebro y operaba mediante una gorra de electroencefalograma que llevaba un alumno de postgrado. Un vídeo mostraba una cucaracha cíborg equipada con un implante inalámbrico que se conectaba a su sistema nervioso periférico, lo que permitía controlar los movimientos de la criatura desde un ordenador. En otra sala, un investigador demostró unos robots de cuerpo blando, a modo de serpiente, capaces de estirarse y arrastrarse por espacios estrechos. Dentro de un garaje, un prototipo de coche autónomo, no muy distinto a los de Google, está siendo desarrollado en colaboración con un fabricante automovilístico chino llamado Chery.


Foto:
Investigadores de la Universidad Jiao Tong de Shanghái están desarrollando robots humanoides y andantes. Crédito: Daniele Mattioli.

A pesar de los impresionantes proyectos de investigación de la Universidad de Jiao Tong, seguía preguntándome cómo cumplirá China con sus ambiciones de fabricación. Kai Yu es el fundador de una start-up llamada Horizon Robotics y anteriormente fue el director de un laboratorio de investigación centrado en la inteligencia artificial (IA) de Baidu, la empresa de internet dominante en China. Dentro del laboratorio de Baidu, Yu y sus compañeros se centran en un campo de la IA llamado aprendizaje profundo, que implica el entrenamiento de grandes redes neuronales simuladas para reconocer patrones dentro de los datos. Los investigadores ahora empiezan a explorar cómo el aprendizaje de máquinas podría hacer que la próxima generación de robots industriales sea aún más inteligente y flexible. Yu me contó: “En el futuro, lo que yo veo es a China siendo más creativa [en la robótica]. Diseños originales, ideas originales, pero también algunas de las tecnologías fundamentales, como el aprendizaje profundo, redes neuronales y la inteligencia artificial“.

Yu cree que las técnicas de IA desarrolladas por las grandes empresas chinas de internet para búsquedas, comercio electrónico y otros propósitos podrían aplicarse a los robots. El experto se defendió: “China tiene una muy buena oportunidad para ponerse al día. Las técnicas que han aprendido durante los últimos cinco años pueden ser aplicadas al desarrollo de máquinas inteligentes”.

Necesitamos introducirnos cada vez más en la robótica avanzada. Eso podrá ayudarnos a lograr una fábrica oscura.

Cuando visité después la fábrica de CIG, no resultó demasiado difícil imaginar cómo tales avances podrían empezar a alimentar los esfuerzos de Wong por automatizar sus operaciones. Para empezar, un robot capaz de aprender y adaptarse no debería confundirse ante una caja mal alineada que necesite una etiqueta.

Después de la visita, Wong me enseñó una presentación de PowerPoint que explicaba el plan de la empresa durante los próximos años, y después la conversación se tornó a la robótica inteligente. El responsable detalló: “Emplearemos unos robots básicos, y luego pasaremos a otros más avanzados. Necesitamos introducirnos cada vez más en la robótica avanzada. Eso podrá ayudarnos a lograr una fábrica oscura“.

Dada la imperativa económica, la determinación del Gobierno y la creciente sofisticación tecnológica del país, parece muy probable que las empresas de fabricación del país se automaticen con éxito y China se convierta en un líder de las tecnologías de automatización avanzada.

Y aun así, resulta extraño imaginar los cambios venideros para los trabajadores chinos de la fabricación. En un momento de nuestra visita, habíamos pasado por un grupo de 20 personas disfrutando de su descanso de tarde. Todos parecían dormir, con sus cabezas apoyadas sobre los brazos cruzados y colocados delante de ellos. Para nada es algo que necesitaría hacer un robot. Pero no pude evitar preguntarme qué les pasará a esos trabajadores cuando los robots se hayan hecho con sus trabajos. Wong dice que probablemente vuelvan a sus pueblos natales y encuentren trabajo allí, en una granja o tal vez en una tienda o un restaurante. Puede ser, pero para algunos no resultará tan sencillo.

Una semana después de volver de China, recibí un correo electrónico de Wong con más detalles sobre sus planes, junto con una promesa característicamente atrevida. Wong escribió: “Mantengamos el contacto. Haremos realidad la fábrica oscura”.

Algunas notas sobre programación del robot didáctico programable

En esta publicación: Robot Programable: Diagrama Básico en Bloques prometo, al final, que voy a continuar con los detalles de circuito y de programación. En la entrada: El microcontrolador “cerebro” del robot programable (básico) hay mucho de circuito (hardware), ya que el artículo contiene una descripción bastante detallada de las secciones del chip microcontrolador que utilizamos por ahora, y también detalles de configuración y uso del chip que tienen una enorme relación con la programación.

Concretamente, que algo he cumplido de la promesa.

Los artículos hasta ahora venían más o menos sincronizados con el avance de las clases, pero para esta fecha obviamente estamos en receso de verano y no hay actividad, ni la habría aunque me lo propusiera, ya que por suerte los chicos asisten a una colonia de verano. A mí tampoco el calor me favorece mucho para mover las neuronas, por eso estuve dedicando algunos artículos a la mecánica, a la búsqueda de soluciones para abaratar la construcción de la base mecánica del robot.

De eso aún falta, me quedan algunas cosas por solucionar, y me dedico casi diariamente al tema. Ya les contaré.

El robot programableRobot programable

Pero hay un programa básico ya escrito con el que hemos trabajado en clase, haciendo mover al robot. Este programa (escrito en assembler, o ASM) permite ordenar una secuencia de movimientos al robot. El programa tiene tres niveles: 1) las instrucciones básicas para mover los motores en el lenguaje del microcontrolador (son las mismas para toda la familia PIC16F, y se podrían utilizar en todos los modelos disponibles, si bien nuestro chip elegido es el PIC16F876A), 2) la inclusión posterior de las instrucciones básicas dentro de subrutinas a las que se puede llamar programando con palabras en castellano en lugar de con los mnemónicos de la programación ASM, lo cual facilita la comprensión, y finalmente 3) la conversión de estas subrutinas en macros.




Utilizando macros se programa directamente con la palabra que hemos definido para el comando; ni siquiera hace falta utilizar la instrucción CALL de ASM que se necesita para hacer correr una subrutina.

Voy a explicar poco a poco la programación, en todos los pasos.

Primero que nada: la configuración inicial del chip

Recordemos primero el diagrama en bloques, ya que hay que definir las funciones de las patas del chip teniendo en cuenta este circuito.

Diagrama básico en bloquesDiagrama en bloques
Veamos las instrucciones ASM en la parte de configuración:


        list P = 16F876a       ; indica el modelo de microprocesador a usar
        include "P16f876a.inc" ; provee declaraciones necesarias para el chip

        ERRORLEVEL 1;-302      ; para evitar los mensajes de cambio de
                               ; banco en el resultado del compilador

        ; Declaraciones que definen el funcionamiento básico del chip
        __config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF

        CBLOCK 0x20            ; Declarar las variables
          d1 ; usada en Retardos
          d2 ; usada en Retardos
          d3 ; usada en Retardos
        ENDC
;
; -----------
; INICIALIZAR
; -----------
        org 0x0000              ; Indica la dirección de origen del programa
        clrf STATUS             ; limpia el registro de estado
        movlw 0x00              ; valor cero 00
        movwf PCLATH            ; al contador de programa = comienzo 
        goto Comienzo           ; Salto a comienzo
;
Comienzo
; BANCO
        bcf STATUS,RP0          ; Prepara
        bcf STATUS,RP1          ; RAM Página 0, en pág 0 están los registros
                                ; de salida de los puertos
; ------------------------------------
; PUERTOS
        movlw 0x00      
        movwf PORTA             ; Inicializar valores del PORT A
        movlw 0x00
        movwf PORTB             ; Inicializar valores del PORT B
        movlw 0x80
        movwf PORTC             ; Inicializar valores del PORT C 
; ------------------------------------
; BANCO
        bsf STATUS,RP0          ; RAM Page 1, en pág 1 están los registros
                                ; de configuración de los puertos y
                                ; otros módulos del microcontrolador
; ---------------------------------------------------------------
; FUNCION DE LAS PATAS DE LOS PORTS
; ---------------------------------------------------------------
        movlw b'00000000'
        movwf TRISA             ; Todas las patas port A como salidas
        movlw b'00000000'
        movwf TRISB             ; Todas las patas port B como salidas
        movlw b'10111111'
        movwf TRISC             ; Todas las patas port C como entradas excepto RC6/TX
        movlw 0x06              ; Todas las patas del puerto entrada/salida digital
        movwf ADCON1            ; esto es necesario para el buen funcionamiento
                                ; de los puertos que tienen 
                                ; opciones analógicas (convertidor A/D)
;
; -----------------------------------------------------------
; BANCO
        bcf STATUS,RP0          ; Página RAM 0, la operación normal se realiza
                                ; en la página 0 de RAM
; -----------------------------------------------------------

 

Es conveniente que vayamos explicando las líneas de instrucciones por partes:


; -----------------------------------------------------------
        list P = 16F876a       ; indica el modelo de microprocesador a usar
        include "P16f876a.inc" ; provee declaraciones necesarias para el chip
; -----------------------------------------------------------

La indicación list P es muy directa, con ella se le dice al programa de compilación que vamos a trabajar en un programa para el PIC16F876A.

La indicación include incluye en el programa, en el momento de compilarlo, todo el texto que se encuentra dentro del archivo que se indica a continuación P16f876a.inc. En estos archivos (provistos por el fabricante) se definen nombres en letras para todas las partes del microcontrolador, que de otro modo deberían estar indicadas en el programa con números hexadecimales. Esta práctica evita el trabajo de estar memorizando o buscando en una tabla estos números, y facilita la comprensión al leer el programa, y permite un fácil intercambio de programas (migración) entre diferentes microprocesadores.

Por ejemplo, dentro de P16f876a.inc define así al puerto A: PORTA EQU H’0005′. Podríamos cambiar la declaración dentro de este archivo y llamar al puerto con un nombre en español, por ejemplo: PuertoA EQU H’0005′. Luego podríamos programar utilizando este nombre y funcionaría correctamente.


; -----------------------------------------------------------
        ERRORLEVEL 1;-302      ; para evitar los mensajes de cambio de
                               ; banco en el resultado del compilador
; -----------------------------------------------------------

Esta línea no es imprescindible y se utiliza para evitar molestas indicaciones de aviso cuando se cambia de banco de RAM en el programa. Las indicaciones no son necesarias si en el programa hemos realizado correctamente los cambios de banco.



; -----------------------------------------------------------
        ; Declaraciones que definen el funcionamiento básico del chip
        __config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF
; -----------------------------------------------------------

Los microcontroladores poseen una serie de configuraciones que se fijan por única vez al principio de la operación y definen ciertas partes esenciales de su funcionamiento. En el ejemplo:

_CP_OFF (Code Protection) define que no protegeremos el código de ser leído desde la memoria de programa del chip. Es posible definir _CP_ON cuando ya tenemos un programa totalmente probado en un equipo que vamos a entregar y no deseamos que alguien se lo copie leyéndolo desde la memoria de programa del microcontrolador.

_XT_OSC define el modo de oscilador de reloj del chip. En este caso, la opción _XT_OSC indica que se utilizará un cristal o resonador conectado al chip para definir la frecuencia de trabajo.

_WDT_OFF está relacionado con la función de “Despertador” (“Watchdog timer” en inglés) que se utiliza en aquellos casos en que se desea que el microcontrolador sea “despertado” de posibles estados en que haya quedado detenido, sea porque quedó esperando una señal de activación externa o porque falló su programa o porque se lo puso intencionalmente en ese estado por programa. El watchdog timer (WDT) puede producir un reinicio del microcontrolador PIC cada cierto período de tiempo, y recomenzar la ejecución del programa. Esto es para evitar que el dispositivo entre en un lazo infinito (se “cuelgue”), o se quede en una espera muy prolongada por un determinado evento que no ocurre. Durante la operación normal, el watchdog timer (en español “perro guardián” o “despertador”) genera un reinicio del microcontrolador PIC después del final de su período WDT. También cumple la función de sacar al dispositivo del modo Sleep (“Dormir”). En este caso el watchdog timer ocasiona que se despierte el microcontrolador PIC y continúe con la operación normal (sin producir reinicio), lo que se conoce como despertar WDT. No lo utilizamos en este programa en particular, de modo que fijamos _WDT_OFF, o sea, Watchdog Timer apagado.

_PWRTE_ON (Power-up Timer) Habilita un temporizador que se dispara en el encendido y permite que, durante su espera, se estabilicen todos los circuitos antes de comenzar a correr el programa.

_LVP_OFF define el modo en que se puede programar el chip. Esta definición en OFF determina que no se puede programar el chip utilizando un sistema de programación de bajo voltaje. Los programadores de PICs utilizan un voltaje de 12 volts en la pata MCLR del chip para poder escribir en su memoria de programa. Al definir el estado OFF de esta configuración se previene una programación accidental (que modificaría el programa y dejaría no operativo al microcontrolador) con los voltajes estándar de funcionamiento en sus patas.

_BODEN_OFF El bit BODEN (Brown Out Reset) en la configuración define la activación o no de una detención del microcontrolador por un descenso de voltaje de alimentación. Puede ser útil, pero no lo utilizamos en este diseño, por eso lo definimos en OFF.


; -----------------------------------------------------------
        CBLOCK 0x20            ; Declarar las variables
          d1 ; usada en Retardos
          d2 ; usada en Retardos
          d3 ; usada en Retardos
        ENDC
; -----------------------------------------------------------

En este bloque se declaran las variables que necesitaremos utilizar (y se reservan sus espacios en la memoria RAM). Por defecto, las variables son bytes (8 bits).



; -----------------------------------------------------------
; INICIALIZAR
; -----------
        org 0x0000              ; Indica la dirección de origen del programa
        clrf STATUS             ; limpia el registro de estado
        movlw 0x00              ; valor cero 00
        movwf PCLATH            ; al contador de programa = comienzo 
        goto Comienzo           ; Salto a comienzo
;
Comienzo
; BANCO
        bcf STATUS,RP0          ; Prepara
        bcf STATUS,RP1          ; RAM Página 0, en pág 0 están los registros
                                ; de salida de los puertos
; ------------------------------------
; PUERTOS
        movlw 0x00      
        movwf PORTA             ; Inicializar valores del PORT A
        movlw 0x00
        movwf PORTB             ; Inicializar valores del PORT B
        movlw 0x80
        movwf PORTC             ; Inicializar valores del PORT C 
; ------------------------------------
; BANCO
        bsf STATUS,RP0          ; RAM Page 1, en pág 1 están los registros
                                ; de configuración de los puertos y
                                ; otros módulos del microcontrolador
; ---------------------------------------------------------------
; FUNCION DE LAS PATAS DE LOS PORTS
; ---------------------------------------------------------------
        movlw b'00000000'
        movwf TRISA             ; Todas las patas port A como salidas
        movlw b'00000000'
        movwf TRISB             ; Todas las patas port B como salidas
        movlw b'10111111'
        movwf TRISC             ; Todas las patas port C como entradas excepto RC6/TX
        movlw 0x06              ; Todas las patas del puerto entrada/salida digital
        movwf ADCON1            ; esto es necesario para el buen funcionamiento
                                ; de los puertos que tienen 
                                ; opciones analógicas (convertidor A/D)
;
; -----------------------------------------------------------
; BANCO
        bcf STATUS,RP0          ; Página RAM 0, la operación normal se realiza
                                ; en la página 0 de RAM
; -----------------------------------------------------------

Las líneas de inicialización en este bloque están ampliamente explicadas con comentarios. En la última parte, debo aclarar que los registros TRIS son los que definen si una pata de entrada/salida es una entrada o una salida. Hay un registro TRIS para cada puerto: TRISA, TRISB y TRISC. Un 0 las define como salidas, un 1 las define como entradas. Por último, los microcontroladores con puertos cuyas patas se pueden definir como entradas al módulo Convertidor Analógico Digital (Analog/Digital Converter, o ADC, en inglés) tienen un registro de configuración en el que se debe definir si se utilizarán o no esas patas como entradas analógicas. Esto lo define el registro ADCON1 y el valor a definir para utilizar todas las patas como entrada/salida digital (tal como las utilizaremos por el momento) es 0x06 (hexadecimal 06).

Esencial: La parte del programa en sí

Observando el diagrama en bloques del robot programable, y con una lectura al artículo de apoyo sobre el chip de manejo de motores, podemos determinar que uno de los motores, el derecho, se maneja a través de dos patas del puerto A, RA0 y RA1, y el otro (izquierdo) a través de las patas RA2 y RA3 del puerto A.

La tabla de señales de control para los motores es como sigue:

     MOTOR DERECHO     
|
       MOTOR IZQUIERDO       
    RA0     RA1     ACCIÓN | RA2 RA3 ACCIÓN
    1     0     AVANCE | 0 1 AVANCE
    0     1     RETROCESO | 1 0 RETROCESO
    0     0     DETENIDO | 0 0 DETENIDO
    1     1     DETENIDO | 1 1 DETENIDO


Por lo tanto, las instrucciones de manejo de los motores se pueden definir del siguiente modo:

;------------
; SUBRUTINAS
;------------

DerechoAdelante
        bsf PORTA,0        ; PORTA 0 = 1 - Motor derecho ad.
        bcf PORTA,1        ; PORTA 1 = 0 - Motor derecho ad.
return
;-------------------------------------

DerechoAtras
        bcf PORTA,0        ; PORTA 0 = 0 = Motor derecho atr.
        bsf PORTA,1        ; PORTA 1 = 1 = Motor derecho atr. 
return
;-------------------------------------

DerechoDetenido
        bcf PORTA,0        ; PORTA 0 = 0 = Motor derecho det.
        bcf PORTA,1        ; PORTA 1 = 0 = Motor derecho det.
return
;-------------------------------------

IzquierdoAdelante
        bcf PORTA,2        ; PORTA 2 = 0 = Motor izquierdo ad.
        bsf PORTA,3        ; PORTA 3 = 1 = Motor izquierdo ad.
return
;-------------------------------------

IzquierdoAtras
        bsf PORTA,2        ; PORTA 2 = 1 = Motor izquierdo atr.
        bcf PORTA,3        ; PORTA 3 = 0 = Motor izquierdo atr.
return
;-------------------------------------

IzquierdoDetenido
        bcf PORTA,2        ; PORTA 2 = 0 = Motor izquierdo det.
        bcf PORTA,3        ; PORTA 3 = 0 = Motor izquierdo det.
return
; -----------------------------------------------------------

Para realizar un movimiento necesitamos definir tiempos, y para eso, para empezar, podemos utilizar un simple rutina de “pérdida de tiempo” (el microcontrolador se queda “perdiendo tiempo” dentro de esta subrutina, y no hace ninguna otra cosa). La rutina la calculé utilizando los servicios del sitio Delay Code Generator donde se puede crear un código de retardo para PICs definiendo algunos parámetros (en el futuro usaremos un módulo TIMER del microcontrolador, pero cada cosa a su tiempo).

La rutina de pérdida de tiempo es:

;------------
Retardo1seg
        movlw d'0'
; Frecuencia de reloj = 4 MHz
; Retardo real = 1 segundo = 1000000 ciclos
; Error = 0 %
                ;999997 ciclos
        movlw        d'8'        ; 0x08
        movwf        d1
        movlw        d'47'        ; 0x2F
        movwf        d2
        movlw        d'3'        ; 0x03
        movwf        d3
Retardo_01
        decfsz        d1, f
        goto        $+2
        decfsz        d2, f
        goto        $+2
        decfsz        d3, f
        goto        Retardo_01
                ; 3 ciclos más
        goto        $+1
        nop
        return
; -----------------------------------------------------------

Veamos entonces cómo es un programa que utilice estas subrutinas para ordenar al robot un movimiento en L.

; -----------------------------------------------------------
Principal
        call DerechoAdelante
        call IzquierdoAdelante
;
        call Retardo1seg
;
        call DerechoAdelante
        call IzquierdoDetenido
;
        call Retardo1seg
;
        call DerechoAdelante
        call IzquierdoAdelante
;
        call Retardo1seg
;
        call DerechoDetenido
        call IzquierdoDetenido
;
; las siguientes llamadas al retardo son para que el robot 
; se detenga unos segundos antes de moverse nuevamente en 'L'
; y repetir esta secuencia constantemente...
        call Retardo1seg 
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
;
        goto Principal

; -----------------------------------------------------------

El programa completo en ASM con el método de llamado a subrutinas es el que sigue. Más abajo encontrarán un enlace para bajarse el archivo en formato TXT con el programa completo en ASM listo para compilar. En el próximo artículo presentaré la conversión del programa al método de programación con MACROS y una serie de ejemplos de programas con distintas rutinas de movimiento.

;************************************************************************
; Procesador: PIC16F876 con Xtal 4 MHz
; Función: Manejo del robot programable
; Hardware: Protoboard
; Archivo: 01
; Autor: Eduardo J. Carletti 
; Fecha: 21 septiembre 2014
;
; Historia: El robot avanza formando una L   
;    
;*************************************************************************

        list P = 16F876a
        include "P16f876a.inc"

        ERRORLEVEL 1;-302        ; para evitar los mensajes de cambio de
                                ; banco en el resultado del compilador

        __config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF

        CBLOCK 0x20        ; Declarar las variables
          d1 ; usada en Retardo1seg
          d2 ; usada en Retardo1seg
          d3 ; usada en Retardo1seg
        ENDC
;
; -----------
; INICIALIZAR
; -----------
;
        org 0x0000                ; Indica la dirección de origen del programa
        clrf STATUS                ; limpia el registro de estado
        movlw 0x00                ; valor cero 00
        movwf PCLATH                ; al contador de programa = comienzo 
        goto Comienzo                ; Salto a comienzo
        org 0x0004                
;
Comienzo
; BANCO
        bcf STATUS,RP0
        bcf STATUS,RP1                  ; RAM Página 0
; ------------------------------------
        movlw 0x00      
        movwf PORTA                ; Inicializar PORT A
        movlw 0x00
        movwf PORTB                ; Inicializar PORT B
        movlw 0x80
        movwf PORTC                ; Inicializar PORT C 
;
; ------------------------------------
; BANCO
        bsf STATUS,RP0                ; RAM Page 1
; ---------------------------------------------------------------
; FUNCION DE LAS PATAS DE LOS PORTS
; ---------------------------------------------------------------
;
        movlw 0x00
        movwf TRISA                ; Todas las patas port A salida
        movlw 0x00
        movwf TRISB                ; Todas las patas port B salida
        movlw b'10000000'
        movwf TRISC                ; Todas las patas port C salida excepto RC7/RX

        movlw 0x06                ; Todas las patas entrada/salida digital
        movwf ADCON1
;
; -----------------------------------------------------------
; BANCO
        bcf STATUS,RP0        ; Página RAM 0
; -----------------------------------------------------------
; -----------------------------------------------------------
; PRINCIPAL
; -----------------------------------------------------------

Principal
        call DerechoAdelante
        call IzquierdoAdelante
;
        call Retardo1seg
;
        call DerechoAdelante
        call IzquierdoDetenido
;
        call Retardo1seg
;
        call DerechoAdelante
        call IzquierdoAdelante
;
        call Retardo1seg
;
        call DerechoDetenido
        call IzquierdoDetenido
;
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
        call Retardo1seg
;
        goto Principal
;
;-------------------------------------
; SUBRUTINAS
;-------------------------------------

DerechoAdelante
        bsf PORTA,0        ; PORTA 0 = 1 - Motor derecho ad.
        bcf PORTA,1        ; PORTA 1 = 0 - Motor derecho ad.
return
;-------------------------------------

DerechoAtras
        bcf PORTA,0        ; PORTA 0 = 0 = Motor derecho atr.
        bsf PORTA,1        ; PORTA 1 = 1 = Motor derecho atr. 
return
;-------------------------------------

DerechoDetenido
        bcf PORTA,0        ; PORTA 0 = 0 = Motor derecho det.
        bcf PORTA,1        ; PORTA 1 = 0 = Motor derecho det.
return
;-------------------------------------

IzquierdoAdelante
        bcf PORTA,2        ; PORTA 2 = 0 = Motor izquierdo ad.
        bsf PORTA,3        ; PORTA 3 = 1 = Motor izquierdo ad.
return
;-------------------------------------

IzquierdoAtras
        bsf PORTA,2        ; PORTA 2 = 1 = Motor izquierdo atr.
        bcf PORTA,3        ; PORTA 3 = 0 = Motor izquierdo atr.
return
;-------------------------------------

IzquierdoDetenido
        bcf PORTA,2        ; PORTA 2 = 0 = Motor izquierdo det.
        bcf PORTA,3        ; PORTA 3 = 0 = Motor izquierdo det.
return
;-------------------------------------

Retardo1seg
        movlw d'0'
; Frecuencia de reloj = 4 MHz
; Retardo real = 1 seconds = 1000000 cycles
; Error = 0 %
                ;999997 cycles
        movlw        d'8'        ; 0x08
        movwf        d1
        movlw        d'47'        ; 0x2F
        movwf        d2
        movlw        d'3'        ; 0x03
        movwf        d3
Retardo_01
        decfsz        d1, f
        goto        $+2
        decfsz        d2, f
        goto        $+2
        decfsz        d3, f
        goto        Retardo_01
                ; 3 ciclos más
        goto        $+1
        nop
        return

; ----------------------------

        END

El archivo ASM se puede bajar de AQUÍ.