niubit dev

Un espacio de contenidos "tech" dedicado a los desarrolladores más inquietos.

¿Quieres construir un coche que conduzca de forma autónoma? Puede hacerse por menos de lo que piensas. En este artículo vemos el hardware necesario.

Introducción

Hace un par de años nos llamó la atención el proyecto libre Donkey Car. Se trata de un coche teledirigido controlado por una Raspberry Pi (en su primera versión era la única opción; actualmente hay más) que se utiliza como plataforma para desarrollar sistemas de conducción autónoma y realizar competiciones con ellos. El esquema básico del coche lleva una cámara que alimenta modelos de inteligencia artificial (IA) ejecutados en la Raspberry Pi con los que se puede lograr que el coche conduzca de forma completamente desatendida.

En seguida nos pusimos manos a la obra y terminamos la versión "nominal" del proyecto, es decir utilizamos el hardware recomendado que se basaba en un chasis de un coche teledirigido todoterreno bastante potente. El coche original tenía en su día un precio que rondaba los 200€, aunque conseguimos un clon por la mitad de precio. Hoy en día puede encontrarse algo equivalente por alrededor de 50€ o menos, pero con esta base los coches resultan demasiado rápidos, lo que dificulta el entrenamiento del algoritmo de IA a no ser que seas muy bueno pilotando en remoto este tipo de coches. También necesita dos juegos de baterías (una para el motor y otra para Raspberry Pi) que además se consumen muy rápido (sobre todo la del motor). Por estos motivos pensamos en realizar nuestro coche desde cero con menos piezas y más económicas o idealmente que pudiéramos reciclar de juguetes desechados.

A continuación vamos a describir el desarrollo que realizamos en niubit, centrándonos en este artículo en todo lo relativo al hardware. En un artículo posterior hablaremos de la instalación y configuración del software, el entrenamiento del modelo IA y la operativa de manejo de nuestro coche.

Enfoque inicial

Como acabamos de comentar, nuestro principal objetivo era conseguir una versión del coche más económica y sencilla que la versión "nominal". Por una parte para poder disponer de varias unidades que nos permitan dar clase con ellas a varios grupos simultáneos (aquí perseguíamos la economía) y por otra para que la construcción pudiera ser abordada por los propios alumnos de niubit (aquí la sencillez).

El coche del proyecto original se controla mediante dos servos; uno gestiona el acelerador y el otro la dirección. El interfaz entre estos servos y Raspberry Pi se hace mediante una placa controladora de servos que se conecta por I2C y que permite gestionar 16 servos. Aunque no es una placa cara, como vemos está sobredimensionada para este proyecto y por otro lado, como luego detallaremos, vamos a prescindir también de los servos en nuestro diseño simplificado.

Precisamente las cuestiones de motor, dirección y el control de ambos son clave para lograr simplificar el coche. En anteriores proyectos de niubit, hemos experimentado con el control de motores con Puente H. Existen varios integrados muy baratos que implementan este sencillo circuito como por ejemplo: L293D, L298N o SN754410. Utilizando estos integrados, dos sencillos motores DC y señales de tipo PWM para comandar los integrados, podemos conseguir control de avance y dirección simultáneamente, gobernando los motores de forma diferencial, de manera similar a como hacen los tanques, que impulsan la cadena de cada lado con distinta velocidad para girar. Para que este planteamiento sea operativo, el software del proyecto Donkey Car tenía que soportar este tipo de control. Tras estudiar el código encontramos que afortunadamente así era. De hecho hay muchos tipos de control soportados. Pueden verse entre las líneas 52 y 70 del fichero donkeycar/templates/cfg_complete.py del repositorio del proyecto:

Los distintos tipos de control que allí vemos son:

  • PWM_STEERING_THROTTLE: Usa dos pines de salida PWM para controlar el servo de la dirección y un ESC (Electronic Speed Controller), como en un coche RC estándar.
  • MM1: Robo HAT MM1 board.
  • SERVO_HBRIDGE_2PIN: Servo para la dirección y Puente H para el motor en modo 2 pin.
  • SERVO_HBRIDGE_3PIN: Servo para la dirección y Puente H para el motor en modo 3 pin.
  • DC_STEER_THROTTLE: Usa Puente H PWM para controlar un motor DC vinculado a la dirección y otro para el motor.
  • DC_TWO_WHEEL: Usa un Puente H en modo 2 pin para controlar dos motores de forma diferencial, uno a la izquierda y otro a la derecha. ¡BINGO! Éste es el nuestro.
  • DC_TWO_WHEEL_L298N: Usa un Puente H en modo 3 pin para controlar dos motores de forma diferencial, uno a la izquierda y otro a la derecha.
  • MOCK: No conecta con dirección o motor. Se utiliza para tests de software.
  • SERVO_HBRIDGE_PWM: Obsoleto. Usa ServoBlaster para controlar el servo de la dirección directamente desde Raspberry Pi y un Puente H para el motor.
  • PIGPIO_PWM: Obsoleto. Usa el control PWM interno de Raspberry Pi.
  • I2C_SERVO: Obsoleto. Usa el controlador de servos PCA9685 para controlar los servos de dirección y motor (ESC), como en un coche RC estándar. Era el utilizado inicialmente en el Donkey Car original.

Veremos en el artículo del mes próximo todos los detalles sobre esta configuración. En este momento sólo nos interesa saber que el control del coche mediante el uso de dos motores de forma diferencial es posible.

Chasis

Una vez que sabemos que podemos controlar el coche (dirección y velocidad) con dos simples motores DC, el abanico de posibilidades que tenemos para escoger un chasis se abre enormemente. Desde utilizar el chasis de un mBot (de los que en niubit tenemos varios), o construirlo nosotros mismos con los clásicos y baratos motores con reductora que se encuentran fácilmente en el mercado. Por prácticamente el precio de los dos motores sueltos, existen kits que incluyen además un sencillo chasis y un par de ruedas y roldana. Nos decantamos por esta última opción.

Baterías

Nos enfocamos ahora en el aspecto de la alimentación. Tenemos que alimentar por una parte la Raspberry Pi que como sabemos funciona a 5V y podemos estimar su consumo en medio Amperio. Además habrá que suministrar potencia a los motores por medio del chip controlador. Escogemos utilizar el chip L293D que funciona perfectamente a la misma tensión que Raspberry Pi, es decir 5V. Los motores DC del kit de chasis comentado en el apartado anterior también pueden alimentarse a 5V. Así pues sólo nos falta estimar el consumo de los motores. Alimentando un motor a 5V, es decir a plena carga, medimos un consumo de 150mA. Teniendo en cuenta todo, necesitamos una fuente de 5V y por lo menos 1A.

Hace tiempo cuando construimos el ejército de Escornabots de niubit, descubrimos un sencillo y barato circuito regulador de tensión y controlador de carga de baterías de Litio. En aquel proyecto utilizamos la versión que produce 6V, pero el mismo circuito existe en versión 5V y suministra hasta 1,2A, por lo que parece perfecto.

Como baterías utilizaremos las clásicas celdas de Litio 18650 que montaremos sobre un portapilas que fabricaremos con la impresora 3D.

Controlador motores

El chip L293D controlador de motores por medio de Puente H requiere de unos pocos componentes para estabilizar las corrientes que lo atraviesan, sobre todo si queremos compartir la alimentación con la Raspberry Pi, ya que esta última es muy sensible a las interferencias o corrientes parásitas que pueden producir los motores durante su operación. Para alojar dichos componentes junto al módulo de regulación de tensión y controlador de carga de las baterías comentado en el apartado anterior, pensamos diseñar una PCB a medida con forma de HAT para Raspberry Pi. Como no necesitamos mucho espacio y pensamos que el modelo ideal de Raspberry Pi para este proyecto es la recientemente aparecida Zero 2 W, diseñamos la PCB con la misma planta de ésta (en este formato, estas placas se suelen llamar bonnet en lugar de hat).

El esquemático del circuito será el siguiente:

La PCB que diseñamos en base al esquemático anterior es la siguiente:

Como comentábamos antes tiene las mismas dimensiones que Raspberry Pi Zero 2 W. La foto anterior es un render 3D. El aspecto real con los componentes montados (salvo el interruptor que sustituimos por una tira de pin para conectar el interruptor que lleva el chasis de coche) es el siguiente:

Atención: A las tres primeras personas interesadas en este montaje que pasen por niubit, les regalaremos una de las PCBs que fabricamos junto con alguno de los componentes más raros para hacer el montaje (los conectores y cables JST y el socket del jack de alimentación).

Cámara

El software de control del coche basa en una cámara de vídeo el entrenamiento y las decisiones que se toman durante la conducción autónoma, es decir es el único sensor que se utiliza. El software de Donkey Car soporta varios modelos de cámara (puede verse en el parámetro que apunta a las distintas opciones en la línea 28 del fichero de configuración). Nosotros usamos la opción de la cámara oficial de Raspberry Pi en su modalidad de gran angular. Raspberry Pi Zero (tanto el modelo original como el 2 utilizado en este montaje) tienen un conector para el cable de datos de la cámara más compacto que el normal que viene con la misma. Por tanto tendremos que adquirir este cable especial junto a la cámara.

Para montar la cámara completaremos el chasis con un arco. Diseñamos el arco con FreeCAD y lo imprimimos con una impresora 3D. Adjuntamos el fichero STL por si alguien quiere imprimirlo. El alojamiento de la parte superior es el adecuado para montar una Raspi Cam y la distancia de los postes coincide con algunos de los agujeros que hay en el chasis de metacrilato que elegimos. Se sujeta al chasis con un par de tornillos M3x10 y sus tuercas correspondientes.

Nuestro coche

Finalmente este es el aspecto tras reunir todos los componentes del coche que hemos visto en este artículo:

Continuará...

Como hemos comentado en la introducción, este artículo es el primero de una serie de dos. Para ofrecer alguna satisfacción hasta que aparezca la segunda entrega, os dejamos con un vídeo realizado sobre el primer modelo que construimos (la versión "nominal" de Donkey Car) conduciendo de forma autónoma (os lo prometemos) sobre un pequeño circuito que dibujamos en el suelo con cinta:

Esta página web utiliza cookies para que sea posible mejorar tu experiencia de navegación.