Tabla de Contenidos

Sapoconcho XL

Esta página se ha migrado a github en el repositorio https://github.com/brico-labs/sapoconcho que genera el sitio https://sapoconcho.bricolabs.cc/

El proyecto Sapoconcho se ha extendido con muchas versiones y forks. Esta entrada está centrada en el montaje mecánico, electrónico y programación de una versión concreta: Sapoconcho XL (o The Expanse). Se trata como todo el proyecto de un robot sencillo, versátil y (relativamente) barato con un chasis imprimible.

NOTA: El formato de esta wiki está pensado para el montaje paso a paso, pero también para poder ser proyectada durante un curso. Los asistentes podrán verla desde sus dispositivos y avanzar a su ritmo.

5d495b8a-2aa0-402c-b93e-4d75850903ff.jpeg

Piezas imprimibles

El chasis de Sapoconcho XL consta de las siguientes piezas:

En una impresora típica de 200x200mm se pueden imprimir todas las piezas en dos tandas.

prusa_sapoconcho.jpg

Todas las piezas están en este repositorio de Github. Ahí puedes encontrar los archivos originales de OpenSCAD para modificarlos a tu gusto o los STL para imprimir directamente.

Listado de materiales (BOM)

Enlaces para comprar material

Lista de la compra en Amazon https://www.amazon.es/hz/wishlist/ls/9FKST3X6WCM?viewType=list

Montaje mecánico

El chasis base tiene pocas piezas y el montaje es muy sencillo.

Paso 1: Los motores amarillos se unirán al soporte con 4 tornillos M3x30. Quizás quieras soldarles los cables de conexión antes, después es más complicado hacerlo.

foto_5-4-22_22_25_45.jpg

Paso 2: Unir la base inferior al soporte con dos tornillos M3x12. También se puede poner ahora la bola loca o 'ballcaster', el tercer punto de apoyo.

foto_5-4-22_22_28_43.jpg

Paso 3: Montar los 4 pilares a la base inferior con 4 tornillos M3x10. Deberás sujetarlos con un alicate para que no giren mientras aprietas el tornillo allen.

foto_5-4-22_22_34_04.jpg

Paso 4: Montar la base superior a los pilares con otros 4 tornillos M3x10. Ojo a la orientación en la foto, el agujero pasacables grande debe estar del lado de los motores.

montaje_4.jpg

Paso 5: Colocar las ruedas -cada una con su 'neumático'-, montar el Arduino UNO con tornillos M3 (dos en diagonal son suficientes) y pinchar la Shield sobre él.

montaje_5.jpg

ALTERNATIVA. Hay también la opción de montar motores N20, cambiando el soporte y las ruedas.

Montaje eléctrico/electrónico

Arduino no puede operar directamente un motor. Necesita un intermediario o driver. Existen dos drivers de motores muy parecidos y válidos para Sapoconcho XL: el Toshiba TB6612 y el DRV8833. Aunque los pines no son iguales, el cableado y la programación hacen que sean intercambiables.

Cableado del driver

La codificación de pines del driver TB6612 es la siguiente

Para el driver DRV883 se tiene

drv8833-dual-driver-pinout.jpg

Para conectar el driver vamos a usar cable rígido de colores cortado a medida. Las conexiones son las de la imagen. Aunque el color de los cables no influye en el funcionamiento, para la alimentación y masa (negativo) se suelen utilizar los colores rojo y negro. Para el otro puedes usar amarillo o el que quieras.

ba6bb186-6486-4fa0-ba5e-d316b59d70b6.jpeg

El cableado de la foto sirve para ambos drivers y aquí está esquematizado. Cuenta bien el número de huecos libres desde la derecha o la izquierda.

Sin embargo, si utilizas el DRV8833, puedes simplificarlo.

A continuación hay que pinchar el driver teniendo cuidado con que los pines y los cable coincidan como en la foto.

3977782d-3744-4488-b835-67cebbc965b4.jpeg

Cableado de los motores

Necesitamos cuatro cables Dupont de 15-20cmm soldados en un extremos a los motores y con punta macho en el otro extremo para la protoshield. Pueden ir agrupados para hacer un montaje más elegante, aunque no es imprescindible. Tampoco es imprescindible, pero si una buena idea añadir un condensador cerámico de 0.1uF (código 104) en paralelo en cada motor.

9297d22d-305f-47bb-bfdc-8db34adc8550.jpeg

Los cables Dupont que vengan de los motores se conectarán ahora en los pines correspondientes. En este caso sí que coinciden los cuatro pines de los drivers TB6612 y DRV8833.

montaje_8.jpg

Si al probar las funciones de movimiento alguna rueda gira al revés, hay que intercambiar los cables de ese motor.

Alimentación

Para alimentación utilizaremos un portapilas para 4 pilas AA. Y para que valga para cualquier proyecto, puedas usar pilas recargables y reduzcamos la contaminación añadiremos siempre un regulador dc-dc elevador para elevar la tensión de salida (step-up). El LM2587 y el XL6009 valen y tienen un tornillo para regular la tensión de salida; un buen valor es 7,5v.

b81b3d06-ffa5-4bf8-bc31-b1728914424d.jpeg

Las conexiones del step-up son muy sencillas: entrada positiva/negativa (IN+ rojo/IN- negro) desde el portapilas y salida positiva/negaviva (OUT+ rojo/OUT- negro) a la clavija. Además sacaremos un cable con un extremo Dupont macho para alimentar el driver antes del step-up, de IN+ a VM.

e9990159-cb36-4224-b8ae-dac534b8b2ad.jpeg

Programación

Función de movimiento básica

Para programar el Arduino con código escrito puedes utilizar la función de movimiento siguiente (copia y pega el código en el IDE).

El código tiene tres partes:

La función drive incluye la numeración y configuración de pines. Puede ponerse en una pestaña aparte en el IDE de Arduino, eso hará que el código principal con el setup y el loop se lea más fácil.

void setup() {

}

//programa principal
void loop(){

}

//función de movimiento de motores
void drive(int L, int R, int t) //velocidad de las ruedas izquierda y derecha, positivo hacia delante, tiempo en milisegundos
{
//Arduino UNO y driver TB6612/DRV8833
  const int AIN2 = 9; // PWMA
  const int AIN1 = 8;
  const int BIN1 = 7;
  const int BIN2 = 6; // PWMB

//iniciar el modo de los pines para los motores
  pinMode(AIN1,OUTPUT);
  pinMode(AIN2,OUTPUT);
  pinMode(BIN1,OUTPUT);
  pinMode(BIN2,OUTPUT);

// evitar valores no válidos para el PWM
  L=constrain(L,-255,255);
  R=constrain(R,-255,255);

// poner valores a los pines
  digitalWrite(AIN1, L<0);
  analogWrite(AIN2, L+255*(L<0));
  digitalWrite(BIN1, R<0);
  analogWrite(BIN2, R+255*(R<0));

  delay(t);
}

Movimientos de prueba

El uso de la función drive es sencillo. Se llama como drive (velocidad rueda izquierda, velocidad rueda derecha, tiempo) Las velocidades pueden estar entre -255 y 255. Positivo hacia delante, negativo hacia atrás. El tiempo en milisegundos.

Hay cuatro funciones básicas:

La última es importante. Si no la incluimos después de cualquiera de las otras, el robot no parará.

El primer ejercicio puede ser ajustar los valores de movimiento hacia adelante para que se mueva en línea recta. Es poco probable que con dos valores iguales lo haga, los motores no son idénticos.

El segundo ejercicio puede ser ajustar los valores de movimiento de giro para que rote un ángulo fijado, por ejemplo 90 grados o 180 grados.

El tercer ejercicio puede ser encadenar órdenes para hacer figuras, por ejemplo un cuadrado, una estrella…

Ejercicios más complejos:

La función drive con dos valores positivos pero diferentes describe un arco. Probar a encadenar arcos para hacer un movimiento en eses. Probar a poner obstáculos y salvarlos serpenteando.

Montaje de los sensores

Los sensores tienen casi siempre dos pines de alimentación y uno o más pines de datos. La protoshield tiene en un lateral dos líneas para conectar la alimentación a positivo (5V) y negativo (GND).

protoshield-mini.jpg

Sensores de ultrasonidos

Los sensores del ultrasonidos HC-SR04 tienen cuatro pienes: alimentación (VCC), masa (GND), trigger y echo. Estos dos últimos los unimos con una soldadura para ahorrarnos un cable, aunque tenemos que advertir que algunos modelos de algunos fabricantes no permiten esto, y al hacerlo no funcionan. Cablearemos con Dupont hembra-macho del sensor a la protoshield.

hc-sr04_c.jpg

El montaje del soporte a la placa superior es sencillo, con un tornillo M3x10 y una tuerca. La placa tiene tres orificios, usaremos el central para montar un único sensor o los laterales para montar dos.

montaje_us.jpg

Para leer la distancia que mide el sensor usaremos una nueva función, que de nuevo podemos guardar en una pestaña nueva en el IDE para dejar más limpio el programa principal

unsigned long sonar(int trig)
{
  pinMode(trig, OUTPUT);
  digitalWrite(trig,LOW); // trigger envia un pulso ultrasónico
  delayMicroseconds(5);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  pinMode(trig, INPUT);
  unsigned long tiempo=pulseIn(trig, HIGH);    // echo espera a recibir la respuesta
  unsigned long distancia= int(0.17*tiempo);  // fórmula para calcular la distancia
  return distancia;
}

El uso es sencillo, la llamamos como

long int distancia = sonar(pin);

En donde le decimos a qué pin hemos conectado el sensor (en los siguientes programa utilizaremos el 2 y el 3), y la función nos devuelve la distancia al obstáculo en milímetros. Este código permite leer el sensor y mostrar el resultado por el monitor serie de Arduino para comprobar que funciona.

Mantener la distancia

Con un sensor de distancia montado de forma central probaremos la distancia a una pared. Si estamos aún lejos, avanzaremos. Si estamos muy cerca, retrocederemos para mantener la distancia. Si en vez de una pared ponemos la mano, probaremos a manejar 'a distancia' nuestro robot.

7e2ce77f-1e60-4c1a-8e3b-6a59a660f16e.jpeg

El código principal (al que añadiremos con las funciones drive y sonar) es el siguiente

void setup() {}

void loop() {
  long int distancia = sonar(2);
  if (distancia<100)
  {
    drive(150,150,50);
  }
  else
  {
    drive(-150,-150,50);
  }

}

Como diversión si estamos trabajando en grupo podemos poner todos los robots en fila y encenderlos a la vez a ver qué pasa.

Evitar obstáculos

Con dos sensores de distancia podemos ver por donde está más cerca el obstáculo y girar hacia el lado contrario evitándolo.

c5231346-ecce-44e3-ada5-e3ed3365f37e.jpeg

El código ahora es

void setup() {}

void loop() {
  long int izquierda = sonar(2);
  long int derecha = sonar(3);
  long int distancia = min(izquierda, derecha);
  if (distancia<100)
  {
    if (izquierda<derecha) // cambiar menor por mayor si gira hacia el obstaculo
    {
      drive(150,-150,100);
    }
    else
    {
      drive(-150,150,100);
    }
  }
  else
  {
    drive(150,150,50);
  }

}

Sensores de líneas

Los sensores infrarrojos de líneas, tanto con salida analógica como digital utilizan tres pines: alimentación (VCC), masa (GND) y señal. Debes revisar tu sensor, cada fabricante coloca los pines como quiere, y no tiene por qué coincidir con la foto.

tcrt5000r.jpg

Utilizaremos sensores basados en reflexión TCRT5000 con regulador (importante) que se montarán en el chasis inferior y se cablean a 5v, GND y dos entradas analógicas entre A0 y A5 (con cables Dupond H-M de 20cm).

foto_5-4-22_23_20_34.jpg

Seguir una línea

Para leer los sensores no necesitamos una función extra, Arduino puede hacerlo con su propia analogRead(pin). El siguiente código lee los dos sensores y si uno de ellos está sobre la línea negra gira hacia el otro lado para evitarla (necesita la función drive).

void setup() {}

void loop()
{
  if (analogRead(A0)<500) drive(-150,150,100);
  if (analogRead(A1)<500) drive(150,-150,100);
  drive(150,150,100);
}

Equipo

Enlaces