Coche robot 2WD Arduino: Programación L298N


Continuamos con la serie dedicada a nuestro primer proyecto de robot. Tras ver el presupuesto, montaje, y esquema eléctrico, por fin llegamos a nuestra primera sesión de programación.

Y sí, decimos primera sesión, porque va a haber más de una entrada dedicada a la programación del robot. Lógico, teniendo en cuenta la insistencia que hemos hecho en que es un robot que puede tener múltiples comportamientos y programaciones distintas.

Además, hay mucho que contar para una única sesión, así que iremos pasito a pasito. En esta entrada vamos a ver cómo controlar los motores con el controlador L298N, y nos servirá también para ver la dinámica general que vamos a seguir en estas entradas.

No me enrollo más que sé que a estas alturas estáis deseando ver código, código y código. Así que vamos a ello.

Anuncio:

Ejemplo control del L298N

En realidad, una programación básica del robot que haga uso del controlador L298N no es en absoluto difícil. De hecho, ya vimos el código necesario en la entrada sobre el controlador L298N.

Este es el ejemplo que vimos en su día, que tiene funciones para mover adelante, y detrás, y un pequeño loop que realiza ambos movimientos.

Códigos similares a estos podréis encontrarlos cientos de veces por Internet. Más limpios, menos limpios, pero similares. Podemos seguir añadiendo funciones para girar, controlar los encoders, activar sensores, etc.

El problema de esta programación es que, aunque sencilla y didáctica, en seguida crece incontroladamente de tamaño, y se convierte en lo que se llama “espagueti” code :D.

Nosotros no queremos hacer esto, así que vamos a ver como pasar de una programación funcional a una programación orientada a objetos y con una arquitectura definida.

Robot Car en objetos

Vamos a ver cómo implementar el control de motores de una forma más organizada. Todo el código siguiente lo tenéis disponible en GitHub en este enlace, así que no os preocupéis ahora de copiar y pegar el código, sólo nos detendremos en cómo se organiza el robot. Por ello, sólo nos vamos a detener en las declaraciones de cada clase, no su implementación, que podéis consultar en el código de GitHub.

En primer lugar, es evidente que tenemos un robot que tiene dos motores. Parece una tontada bien gorda, pero es el primer paso pasa comenzar la abstracción. Necesitamos una clase “Robot” y una clase “motor”. A estas clases les añadiremos clases “encoder”, “sensor”; “comportamiento”, “comunicación”, y podremos juntarlos y combinarlos. Pero vayamos poco a poco.

RobotCar Constants

En primer lugar, tenemos un fichero RobotCar_Constants, que contendrá todas las constantes de nuestro robot (datos de geometría, conexiones, etc). En este primer ejemplo, únicamente tenemos los seis pines de control del L298N.

RobotCar L298N

Por otro lado, tenemos una clase llamada RobotCar_L298N, que controla un único motor del robot. Aquí tenemos la declaración de la clase, con los principales métodos para controlar el sentido y velocidad de giro del motor.

RobotCar Lib

Por su parte, la clase RobotCarLib, que representa la clase principal del robot. De momento, nuestro robot consta de dos motores, izquierdo y derecho, y de las funciones para mover el robot, y girar con dos ruedas (Turn) o una rueda(SlowTurn).

Sketch test motores

Finalmente tenemos el sketch, que simplemente instancia un robot y le ejecuta una serie de movimientos para comprobar su funcionamiento.

Probando el código de nuestro Robot

Subimos el código a nuestro robot y comprobamos que todo funciona correctamente. Si alguno de los motores gira en sentido equivocado (o ambos) podéis, o bien cambiar los cables físicamente en la clema de conexión del L298N, o intercambiar los pines IN1 e IN2 (para el motor A) o IN3 e IN4 para el motor B).

De forma similar, si tenéis los motores intercambiados (el izquierdo es el derecho y viceversa), simplemente cambiar en código los pines del grupo IN1, IN2, ENA, con el grupo IN3, IN4, ENB.

Cuando consigáis que el robot avance en orden, adelante, detrás, girar a la izquierda, girar a la derecha, parar… ¡Enhorabuena! Habéis terminado este primer tutorial, y tenéis un robot funcionando.

Este es el resultado de esta primera sesión de programación. No es demasiado espectacular, pero ya estamos controlando los movimientos básicos.

Lamentablemente, de momento sólo podemos moverlo con funciones programadas por tiempo. No podemos controlar la distancia que recorremos, ni el ángulo que giramos. Es más, es posible que vuestro robot no vaya totalmente recto, y tenga una deriva a izquierda o derecha.

Es el problema de no tener funcionando los encoders. Pero tranquilos, vemos esto en las próximas entradas de programación de nuestro primer robot.

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección
tutoriales de Arduino

Anuncio:

Previous Implementar una red de Petri en Arduino
Next Aplicaciones con UI moderno en C# con Material Design XAML

¡Deja un comentario!...

1000
newest oldest
¡Muy buenas Luis! La verdad es que he estado echando un ojo a todas las partes del tutorial que estás montando y están muy muy bien, de hecho, estoy haciendo ahora mismo un chasis para este tipo de robots y estoy pensando en meter lo de los encoders por ahí, la verdad es que es muy buena idea. Por lo que he visto en general, este tipo de robots tienen dos formas de moverse según sus componentes, la primera es dirigidos por el usuario y la segunda, como el robot Roomba. La verdad es que en cuestíon de programación da… Read more »

Cuando dices que “es posible que vuestro robot no vaya totalmente recto, y tenga una deriva a izquierda o derecha” seguro que te refieres precisamente al que yo estoy montando ja ja ja.

Espero que no te olvides de terminar este tutorial, estoy deseando ver cómo usas los encoders para resolver el problema.