Este robot consta de unas ruedas mecanum como base de diseño. Además llevará un sensor de distancia y otros dos sensores 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.
Un arduino nano donde pondremos el código que programaremos.
4 servo motores SG90 de 360º
Sensor de distancia HC-SR04
Módulo de sensor (sigue líneas)
2 sensores de proximidad
Un display de 16×8 leds.
Un módulo BlueTooth HC-06.
4 ruedas mecanum 48 mm.
cables DuPont.
2 conectores para batería de 9 V.
Dos baterías de 9 v.
Un interruptor.
Material en 3D.
1.Acople ruedas
https://www.tinkercad.com/things/lOhjcEkC33G-acople-ruedas-mecanum
2.Base del robot mecanum
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
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);
}