Análisis y comparativas
Eventos GuíasNo hay páginas en esta sección.
No hay páginas en esta sección.
Análisis y comparativas
Eventos GuíasNo hay páginas en esta sección.
No hay páginas en esta sección.
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.
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.
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.
Lista de la compra en Amazon https://www.amazon.es/hz/wishlist/ls/9FKST3X6WCM?viewType=list
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.
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.
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.
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.
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.
ALTERNATIVA. Hay también la opción de montar motores N20, cambiando el soporte y las ruedas.
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.
La codificación de pines del driver TB6612 es la siguiente
Para el driver DRV883 se tiene
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.
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.
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.
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.
Si al probar las funciones de movimiento alguna rueda gira al revés, hay que intercambiar los cables de ese motor.
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.
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.
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); }
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.
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).
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.
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.
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.
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.
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.
Con dos sensores de distancia podemos ver por donde está más cerca el obstáculo y girar hacia el lado contrario evitándolo.
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); } }
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.
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).
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); }