Robot Mecanum Claudia y Santi

Este robot consta de unas ruedas mecanum como base de diseño. Además llevará un sensor de distancia y otros dos sensoremecanums de proximidad para poder llevar a cabo todas las pruebas propuestas, junto con dos baterías de 9 v, 4 motores de servo 360 y Display 16*8. Estará impreso en 3D y se podrá usar mediante Bluetooth.

La prueba que realizara constará de un laberinto diseñado con trozos de cartón que servirán de paredes, para poder montarlo contendrá unas piezas que servirán como puente de unión diseñadas en 3D.

El objetivo principal del robot será salir de forma autónoma desde el inicio del laberinto. Para hacerlo, usará los sensores que detectarán los huecos de pared libre y así, dirigirse hacia ellos, hasta llegar a la salida. Se tendrá que hacer en el tiempo mínimo posible.

Los materiales que usaremos serán los siguientes:

Un shield nano, donde pondremos el arduino nano para introducir hacer funcionar el código que será introducido en el arduino nano. De esta forma será más fácil de conectar.UNO-Shield-Nano-Shield-para-placa-de-expansi-n-NANO-3-0-y-UNO-R3-duemilanove.jpg_Q90.jpg_

Un arduino nano donde pondremos el código que programaremos.

ardino nano

 4 servo motores SG90 de 360º

índice

Sensor de distancia HC-SR04

índicere

Módulo de sensor (sigue líneas)

TCRT5000 3 Channel Infrared Line Track Sensor - Pixel Electric Company  Limited

2 sensores de proximidad

Sensor de proximidad infrarrojo IR, módulo de Sensor de evitación de  obstáculos Compatible con Arduino - AliExpress

Un display de 16×8 leds.

Módulo de pantalla de matriz de puntos LED Pantalla de celosía DC 3.3V 5V  HT16K33 Driver 168 Cascada Compatible 16x8 IIC Interfaz

Un módulo BlueTooth HC-06.

hc-06-wireless-serial-4-pin-bluetooth-rf-transceiver-module-rs232-ttl-500x500

4 ruedas mecanum 48 mm.

mec

cables DuPont.

cable

2 conectores para batería de 9 V.

conector

Dos baterías de 9 v.

pila

Un interruptor.

inter

Material en 3D.

1.Acople ruedas

acople rueda

https://www.tinkercad.com/things/lOhjcEkC33G-acople-ruedas-mecanum

https://www.tinkercad.com/things/2GhNcGlfYrR-acoples-ruedas/edit?sharecode=0wbyuSnwako1u0K-zVp9Ew1qAWwybiDwqMBpuw0CChI

2.Base del robot mecanum

basd robot

https://www.tinkercad.com/things/iwfFTulAQXX-base-robot-mecanum

3.Esquema completo eléctrico

4.Algunos de los elementos utilizados:

5.Robot completo montaje.

https://www.tinkercad.com/things/4vKEpAfXnkb-robot-mecanum-arduino

6.Fotos del robot ya montado

oplus_34
oplus_34

7.Código de programación.

#include <Servo.h>

#include <SoftwareSerial.h>

Servo servoDI, servoDD, servoTI, servoTD;

#include <Adafruit_LEDBackpack.h>

Adafruit_8x16matrix matrix = Adafruit_8x16matrix();

#define trigPin 7

#define echoPin 6

SoftwareSerial BT(13, 12);

long dist;

char x;

static const uint8_t PROGMEM

  smile_bmp[] = {

    B00111100,

    B01000010,

    B10100101,

    B10000001,

    B10100101,

    B10011001,

    B01000010,

    B00111100

  },

  neutral_bmp[] = { B00111100, B01000010, B10100101, B10000001, B10111101, B10000001, B01000010, B00111100 }, frown_bmp[] = { B00111100, B01000010, B10100101, B10000001, B10011001, B10100101, B01000010, B00111100 };

void setup() {

  // put your setup code here, to run once:

  Serial.begin(9600);

  servoDI.attach(2);

  servoDD.attach(3);

  servoTI.attach(4);

  servoTD.attach(5);

  servoDI.write(90);

  servoDD.write(90);

  servoTI.write(90);

  servoTD.write(90);

  matrix.begin(0x70);

  pinMode(trigPin, OUTPUT);

  pinMode(echoPin, INPUT);

  BT.begin(9600);

  Serial.begin(9600);

}

void loop() {

  // put your main code here, to run repeatedly:

  matrix.setRotation(1);

  dist = distancia();

  if (dist != 0 && dist < 15) {

    neutra();

    stop();

  }

  if (BT.available()) {

    x = BT.read();

    Serial.println(x);

    if (x == ‘1’) {

      adelante(30);

    }

    else if (x == ‘2’) {

      atras(30);

    } else if (x == ‘4’) {

      derecha(30);

    } else if (x == ‘3’) {

      izquierda(30);

    } else if (x == ‘5’) {

      stop();

    } else if (x == ‘6’) {

        diagonalizqadelante(30);

    } else if (x == ‘7’) {

          diagonalderechaadelante(30);

    } else if (x == ‘8’) {

            diagonalizqatras(30);

    } else if (x == ‘9’) {

              diagonalderechaatras(30);

    } else if (x == ‘B’) {

              giroCircIz(30);

    } else if (x == ‘A’) {

              giroCircDer(30);

    }

  }

}

void stop() {

  servoDI.write(90);

  servoDD.write(90);

  servoTI.write(90);

  servoTD.write(90);

}

void atras(int v) {

  triste();

  servoDI.write(90 – v);

  servoDD.write(90 + v);

  servoTI.write(90 – v);

  servoTD.write(90 + v);

}

void adelante(int v) {

  contento();

  servoDD.write(90 – v);

  servoDI.write(90 + v);

  servoTD.write(90 – v);

  servoTI.write(90 + v);

}

void giroCircIz(int v) {

  servoDD.write(90 – v);

  servoDI.write(90 – v);

  servoTD.write(90 – v);

  servoTI.write(90 – v);

}

void giroCircDer(int v) {

  servoDD.write(90 + v);

  servoDI.write(90 + v);

  servoTD.write(90 + v);

  servoTI.write(90 + v);

}

void derecha(int v) {

  servoDD.write(90 + v);

  servoDI.write(90 + v);

  servoTD.write(90 – v);

  servoTI.write(90 – v);

}

void izquierda(int v) {

  servoDD.write(90 – v);

  servoDI.write(90 – v);

  servoTD.write(90 + v);

  servoTI.write(90 + v);

}

void contento() {

  matrix.clear();

  matrix.drawBitmap(4, 0, smile_bmp, 8, 8, LED_ON);

  matrix.writeDisplay();

}

void neutra() {

  matrix.clear();

  matrix.drawBitmap(4, 0, neutral_bmp, 8, 8, LED_ON);

  matrix.writeDisplay();

}

void triste() {

  matrix.clear();

  matrix.drawBitmap(4, 0, frown_bmp, 8, 8, LED_ON);

  matrix.writeDisplay();

}

void apagado() {

  matrix.clear();

}

long distancia() {

  long duracion, distancia;

  digitalWrite(trigPin, LOW);

  delayMicroseconds(10);

  digitalWrite(trigPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);

  duracion = pulseIn(echoPin, HIGH);

  distancia = duracion * 0.017;

  return distancia;

}

void diagonalizqadelante(int v) {

  contento();

  servoDD.write(90 – v);

  servoDI.write(90);

  servoTD.write(90);

  servoTI.write(90 + v);

}

void diagonalderechaadelante(int v) {

  contento();

  servoDD.write(90);

  servoDI.write(90 + v);

  servoTD.write(90 – v);

  servoTI.write(90);

}

void diagonalderechaatras(int v) {

  triste();

  servoDD.write(90 + v);

  servoDI.write(90);

  servoTD.write(90);

  servoTI.write(90 – v);

}

void diagonalizqatras(int v) {

  triste();

  servoDD.write(90);

  servoDI.write(90 – v);

  servoTD.write(90 + v);

  servoTI.write(90);

}