Otto Motor Servos

Robot #OttoDIY con RUEDAS, utilizando servos con rotación continua. Opcionalmente matriz LED para expresiones bucales.

Utiliza el ultrasonido para evitar obstáculos, podemos crear un robot de sumo, un coche de control remoto o incluso un seguidor de línea. 

Otto_01

Lista de Componentes:

Estos son los materiales que necesitará para construir Otto.

Ottowheels1

  • 1 x Nano ATmega328
  • 1 × E / S Nano Shield
  • 1 × Cable USB-A a Mini-USB
  • 8 x cables  hembra a hembra
  • 1 x Zumbador pasivo 5V
  • 2 x Servo de rotación continua SG90
  • 2 x Ruedas
  • 1 x sensor de ultrasonido HC-SR04
  • 1 x módulo  de potencia y carga
  • 1x 16340 batería de litio

Piezas impresas en 3D.

Las piezas para imprimir están disponibles en el siguiente enlace.

Sigue estos parámetros comunes:
Recomendado para utilizar una impresora 3D FDM con material PLA.

  • No necesita soportes.
  • Resolución: 0,20 mm
  • Densidad de relleno 20%

La impresión en 3D de un juego completo de piezas para un Otto debería llevar alrededor de 8 horas.

Electrónica.

Antes de insertar la batería, debes verificar las conexiones y probar el robot con el cable USB conectado al ordenador.

Como buena práctica, debes verificar la electrónica y software en el ordenador antes de ensamblar todo el robot para evitar tener que desmontar todo el robot para arreglar algo. Puedes hacer esto simplemente conectando los servos, en el lugar indicado y cargando un código de ejemplo correspondiente.

OttoWwiring

      • Servo 1 al pin 2
      • Servo 2 al pin 3
      • Sensor de distancia trig al pin 8
      • Sensor de distancia echo al pin 9
      • Buzzer al pin 13

El módulo de la batería viene con un interruptor en la parte posterior, solo hay conectar gnd a cualquier G y conectar 5V a cualquier pin V en el shield.

Instrucciones de montaje

Comienza con los servos que se  ensambla desde afuera, utiliza 2 tornillos para fijar cada servo al cuerpo del robot.

Ottowheels2

Monta las ruedas y sujetalas con los tornillos pequeños.

Ahora monta el Arduino nano y el sensor de distancia.

Ottowheels4

Coloca la bola loca o el soporte trasero del robot.

Ahora el módulo de la batería dentro del cuerpo también utilizaremos tornillos para sujetarlo.

Ya podemos comenzar a conectar todos los componentes.

Ottowheels8

Por último, pero no menos importante, podemos añadir un interruptor o usar el que viene con el amplificador.

No te olvides del Buzzer.

Debes tener suficiente espacio para organizar los cables de forma sencilla y ordenada antes de ajustar la cabeza al cuerpo.

Ottowheels10

Control de los servos

El control de un servo de rotación continua es idéntico al control de un servo convencional, la única diferencia es el comportamiento del servo, que en el caso de un servo de rotación continua variará la velocidad en lugar de la posición.

Por tanto, usamos la librería «servo.h», incorporada en el IDE Standard, que nos permite controlar hasta 12 servos en Arduino Uno/Nano, y hasta 48 en Arduino Mega.

El siguiente ejemplo hace variar la velocidad del servo de rotación continua entre servo parado, servo al 100% de velocidad en un sentido, y servo al 100% en el sentido contrario, manteniendo cada velocidad 1.5 segundos.

#include <Servo.h>

Servo myservo; // crea el objeto servo

int vel = 0; // velocidad del servo

void setup() {
myservo.attach(9); // vincula el servo al pin digital 9
}

void loop() {
//servo parado (equivalente a angulo 90º)
vel = 90;
myservo.write(vel);
delay(1500);

//servo 100% CW (equivalente a angulo 180º)
vel = 180;
myservo.write(vel);
delay(1500);

//servo 100% CCW (equivalente a angulo 0º)
vel = 0;
myservo.write(vel);
delay(1500);
}

Código de prueba.

Vamos a hacer que el robot busque un objeto y se acerque a él.

#include <Servo.h>

Servo myservo1, myservo2, garra; // crea los objetos servo
// para el sonser SR-04
const int EchoPin = 10;
const int TriggerPin = 9;

int vel1 = 0, vel2 = 0, i, cm; // velocidad del servo

void setup() {
Serial.begin(9600);
myservo1.attach(2); // vincula el servo al pin digital 2
myservo2.attach(3); // vincula el servo al pin digital 3
garra.attach(5); // vincula el servo al pin digital 5
pinMode(TriggerPin, OUTPUT);
pinMode(EchoPin, INPUT);
stop();
garra.write(100);
delay(2000);
}

void loop() {

cm = ping(TriggerPin, EchoPin);
while (cm > 20 && cm != 0) {
Serial.println(cm);
derecha(50, 50);
delay(200);
stop();
delay(500);
cm = ping(TriggerPin, EchoPin);
}
derecha(50, 50);
delay(120);
if (cm <= 20 && cm != 0) {
// he encontrado un objeto
stop();
izquierda(40, 40);
delay(50);
stop();
delay(500);
while (cm > 6 && cm != 0) {
adelante(60, 50);
cm = ping(TriggerPin, EchoPin);
delay(20);
}
stop();
garra.write(20);
delay(500);
atras();
delay(400);
garra.write(100);
atras();
delay(400);
derecha(50,50);
delay(300);
}
}

void stop() {
myservo1.write(90);
myservo2.write(90);
}

void adelante(int v1, int v2) {
myservo1.write(v1 + 90);
myservo2.write(90 – v2);
}

void atras() {
myservo1.write(0);
myservo2.write(180);
}

void derecha(int v1, int v2) {
// de 90 a 180
myservo1.write(v1 + 90);
myservo2.write(v2 + 90);
}

void izquierda(int v1, int v2) {
myservo1.write(90 – v1);
myservo2.write(90 – v2);
}

int ping(int TriggerPin, int EchoPin) {
long duration, distanceCm;

digitalWrite(TriggerPin, LOW); //para generar un pulso limpio ponemos a LOW 4us
delayMicroseconds(4);
digitalWrite(TriggerPin, HIGH); //generamos Trigger (disparo) de 10us
delayMicroseconds(10);
digitalWrite(TriggerPin, LOW);

duration = pulseIn(EchoPin, HIGH); //medimos el tiempo entre pulsos, en microsegundos

distanceCm = duration * 10 / 292 / 2; //convertimos a distancia, en cm
return distanceCm;
}

Video