Proyecto MAX – Primer prototipo funcional

santinge2Proyecto MAX – Primer prototipo funcional

Pues antes de lo previsto ya tenemos el primer prototipo funcional (y funcionando).

Nuestros equipos han trabajado a tope para poder entregar el primer prototipo completamente funcional.

Resumen:

max-4_bbHemos utilizado el chasis “Mario” (reciclado de un juguete viejo) que consta de dos ruedas motorizadas independientemente (dos motores DC), dos ruedas más de apoyo y una plataforma. El sistema de alimentación consta de una batería recargable “Power Bank” con conexión USB. La base es un sistema Arduino con panel de conexiones breadboard. Circuitería: chip controlador de motores H bridge L293D; receptor de infrarrojos (reciclado); juego de tres LED con sus correspondientes resistencias de 220Ω; mini LED conectado a la pata 13 de Arduino. Varios: mando a distancia por infrarrojos (reciclado)

A continuación añadimos los vídeos de las pruebas y el código de programación.

Encendido y apagado (LED verde) y juego de luces, todo controlado desde el mando a distancia.

Prueba de movimiento controlando con las teclas de flechas del mando.


Funcionalidad:

El prototipo, una vez conectado, arranca en modo REPOSO indicado por el LED rojo. Con el botón de encendido/apagado del mando pasamos de modo REPOSO a modo ACTIVO (LED verde) y viceversa. El prototipo sólo es operativo en modo ACTIVO.

En el modo activo tenemos las siguientes opciones (según botones pulsados):

  • Botón On/Off. Apagado (pasa a modo reposo)
  • Botón cara sonriente o botón OK. Ejecuta un juego de luces con los tres LEDs.
  • Botón flecha arriba. Movimiento de avance.
  • Botón flecha abajo. Movimiento de retroceso.
  • Botón flecha derecha. Giro a la derecha.
  • Botón flecha izquierda. Giro a la izquierda.

Adicionalmente, en la fase de depuración se añadió una nueva funcionalidad consistente en activar o desactivar el modo test, que envía datos a la consola del ordenador (cuando está conectado al PC por el cable USB). Esta funcionalidad es útil para la fase de desarrollo y la de pruebas, y se activa o desactiva pulsando la tecla TOOL del mando (dibujo de una llave inglesa).

(Los datos que se mandan a la consola en modo test son: el estado en el que se encuentra el sistema (reposo, activo, juego LEDs) y el código leído del mando de infrarrojos.)

Tabla de conexiones (pines Arduino)

Arduino

L293D

Salida

0

1

2

LED verde

3

LED Verde

LED ámbar

4

LED Ambar

LED rojo

5

LED Rojo

6

In 2

7

7

In 1

8

2

In 3

9

15

In 4

10

10

11

Receptor IR

12

LED

13

LED

Out 1

3

Motor-1

Out 2

6

Motor-1

Out 4

11

Motor-2

Out 3

14

Motor-2

5 V

1

GND

4

GND

5

5 V

8

5 V

9

GND

12

GND

13

5 V

16

Esquema de conexiones

Código de programa: MAX-4

// +———————————————————-+
// ! ** A R D U I N O ** !
// ! PROGRAMA : MAX – 4 !
// ! AUTOR : DAVID SANTAOLALLA !
// ! FECHA : 22-02-2017 !
// ! DESCRIPCION : !
// ! Control de robot con dos motores DC. !
// ! Modulo de motorizacion. !
// ! -Funciones avance, retroceso, izquierda y derecha. !
// ! -Modo test con ejecucion secuencial de funciones. !
// ! -Juego de LEDs para indicar el estado del robot. !
// ! -Control con mando infrarrojos reciclado. !
// ! !
// ! Modulo de control. !
// ! -Lector de infrarrojos con mando a distancia reciclado !
// ! -Control de estados: REPOSO y ACTIVO. !
// ! -Con la tecla ON se cambia de estado REPOSO-ACTIVO !
// ! -Con la tecla TOOL se activa/desactiva el modo test. !
// ! -En estado ACTIVO el robot se mueve con las flechas. !
// ! – con la tecla sonrisa hace un juego de luces. !
// ! – con la tecla OK hace un juego de luces. !
// ! !
// +———————————————————-+

// ————————————————————–
// ———————— WORKING STORAGE ———————
// ————————————————————–

#include <IRremote.h>

int IRpin = 12;
IRrecv irrecv(IRpin);
decode_results results;
// ——————- MAPEO DE TECLAS —————–
// Mando ONO

const int ONOFF = 1936644142;
const int FARRIBA = 741245183;
const int FABAJO = 1511671869;
const int FIZDA = 2507695210;
const int FDCHA = 3692585004;
const int Sonrisa = 418717449;
const int TOOL = 3691547977;
const int OK = 3409756287;

// ——————- Constantes ———————-
const int pinENA = 6; // enable motor A – pin 1 bridge
const int pinIN1 = 7; // pata motor A – pin 7 bridge
const int pinIN2 = 8; // pata motor A – pin 2 bridge
const int pinIN3 = 9; // pata motor B – pin 15 bridge
const int pinIN4 = 10; // pata motor B – pin 10 bridge
const int pinENB = 11; // enable motor B – pin 9 bridge

const int Rojo = 5; // LED
const int Ambar = 4; // LED
const int Verde = 3; // LED
const int SysLED = 13; // LED

const int waitTime = 1000; //espera entre fases TEST
const int ledTime = 100;

const int REPOSO = 0;
const int ACTIVO = 1;
const int TEST = 2;

// ——————- Variables globales ————–
int pinMotorA[3] = { pinENA, pinIN1, pinIN2 };
int pinMotorB[3] = { pinENB, pinIN3, pinIN4 };

int speed = 254; //velocidad de giro
int estado = REPOSO;
int testmode = 0;
int Valor = 0;

// ————————————————————–
// ———————- INICIALIZACIONES ———————-
// ————————————————————–
void setup() {

// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// Start the IR receiver
irrecv.enableIRIn();

// Declaracion de pines entrada

// Declaracion de pines de salida
pinMode(pinIN1, OUTPUT); // Motor A
pinMode(pinIN2, OUTPUT);
pinMode(pinENA, OUTPUT);

pinMode(pinIN3, OUTPUT); // Motor B
pinMode(pinIN4, OUTPUT);
pinMode(pinENB, OUTPUT);

pinMode(Rojo, OUTPUT); // LED
pinMode(Ambar, OUTPUT); // LED
pinMode(Verde, OUTPUT); // LED
pinMode(SysLED, OUTPUT); // LED sys

digitalWrite(Verde, LOW);
digitalWrite(Ambar, LOW);
digitalWrite(Rojo, LOW);

}
// ————————————————————–
// ——————— PROGRAMA PRINCIPAL ———————
// ————————————————————–
void loop() {

// — Valores posibles *case*
// — Tecla on/off cambio de estado REPOSOS-ACTIVO
// — Tecla SONRISA – estado = TEST

if (testmode) {
Serial.print(“Estado: “);
Serial.println(estado);
}

switch (estado) {
case TEST: //——————————————
juegoLEDS();
// testloop();
estado = ACTIVO;
break;
case ACTIVO: //——————————————

//controlMando ————————————–
while (estado == ACTIVO)
{
digitalWrite(Verde, HIGH);
digitalWrite(Rojo, LOW);
switch (leemando()) {
case TOOL:
if (testmode){
testmode = 0;
Serial.println(“— TESTMODE OFF —“);
}
else {
testmode = 1;
Serial.println(“— TESTMODE ON —“);
};
break;
case ONOFF:
estado = REPOSO;
break;
case Sonrisa:
case OK:
estado = TEST;
break;
case FARRIBA:
Avance();
delay(waitTime/4);
break;
case FABAJO:
Retroceso();
delay(waitTime/4);
break;
case FIZDA:
Izquierda();
delay(waitTime/8);
break;
case FDCHA:
Derecha();
delay(waitTime/8);
break;
default:
Parada();
}
}
break;
case REPOSO: //——————————————
while (estado == REPOSO)
{
digitalWrite(SysLED, HIGH);
digitalWrite(Verde, LOW);
switch (leemando()) {
case TOOL:
if (testmode){
testmode = 0;
Serial.println(“— TESTMODE OFF —“);
}
else {
testmode = 1;
Serial.println(“— TESTMODE ON —“);
};
break;
case ONOFF:
estado = ACTIVO;
break;
}
} // estado REPOSO end
break;
}

} // end loop———————————

// ————————————————————–
// ———————— RUTINAS —————————–
// ————————————————————–

// ————– LECTURA DE MANDO —————

int leemando()
{
int Val;
if (irrecv.decode(&results))
{
digitalWrite(SysLED, HIGH);
Val = results.value;
irrecv.resume(); // Receive the next value
if (testmode) {
Serial.print(“Valor leido: “);
Serial.println(Val);
}
}
else
{
Val = 0;
}

delay(ledTime);
digitalWrite(SysLED, LOW);
return Val;
}

// ————– FEEDBACK INICIO —————-

void inicio()
{
Izquierda();
delay(waitTime);

Parada();
delay(waitTime);

Derecha();
delay(waitTime);

Parada();
juegoLEDS();

}

// ————– JUEGO DE LEDS —————-

void juegoLEDS()
{
digitalWrite(Verde, LOW);
digitalWrite(Ambar, LOW);
digitalWrite(Rojo, LOW);

for (int i=0; i <= 5; i++){
digitalWrite(Verde, HIGH);
digitalWrite(Ambar, LOW);
digitalWrite(Rojo, LOW);
delay(ledTime);
digitalWrite(Verde, LOW);
digitalWrite(Ambar, HIGH);
digitalWrite(Rojo, LOW);
delay(ledTime);
digitalWrite(Verde, LOW);
digitalWrite(Ambar, LOW);
digitalWrite(Rojo, HIGH);
delay(ledTime);
}
for (int i=0; i <= 5; i++){
digitalWrite(Verde, HIGH);
digitalWrite(Ambar, HIGH);
digitalWrite(Rojo, HIGH);
delay(ledTime);
digitalWrite(Verde, LOW);
digitalWrite(Ambar, LOW);
digitalWrite(Rojo, LOW);
delay(ledTime);
}
}

// ————– TEST LOOP —————-

void testloop()
{
juegoLEDS();

Avance();
delay(waitTime);

Parada();
juegoLEDS();
delay(waitTime/2);

Retroceso();
delay(waitTime);

Parada();
juegoLEDS();
delay(waitTime/2);

Izquierda();
delay(waitTime);

Parada();
juegoLEDS();
delay(waitTime/2);

Derecha();
delay(waitTime);

Parada();
juegoLEDS();
delay(waitTime/2);
}

// ————————————————————–
// – RUTINAS DE MOVIMIENTO Y GIRO
// ————————————————————–

void Avance()
{
mForw(pinMotorA);
mForw(pinMotorB);

digitalWrite(Verde, HIGH);
digitalWrite(Ambar, HIGH);
digitalWrite(Rojo, LOW);

if (testmode) {
Serial.print(“Avance: “);
Serial.println(speed);}

}

void Retroceso()
{
mBack(pinMotorA);
mBack(pinMotorB);

digitalWrite(Verde, HIGH);
digitalWrite(Ambar, HIGH);
digitalWrite(Rojo, LOW);

if (testmode) {
Serial.print(“Retroceso: “);
Serial.println(speed);}

}

void Derecha()
{
mForw(pinMotorA);
mBack(pinMotorB);

digitalWrite(Verde, HIGH);
digitalWrite(Ambar, HIGH);
digitalWrite(Rojo, LOW);

if (testmode) {
Serial.print(“Derecha: “);
Serial.println(speed);}

}

void Izquierda()
{
mBack(pinMotorA);
mForw(pinMotorB);

digitalWrite(Verde, HIGH);
digitalWrite(Ambar, HIGH);
digitalWrite(Rojo, LOW);

if (testmode) {
Serial.print(“Izquierda: “);
Serial.println(speed);}

}

void Parada()
{
fStop(pinMotorA);
fStop(pinMotorB);

// digitalWrite(Verde, LOW);
digitalWrite(Ambar, LOW);
digitalWrite(Rojo, LOW);

}

// ————————————————————–
// – RUTINAS BASICAS DE MOVIMIENTO
// ————————————————————–

void mForw(int pinMotor[3])
{
digitalWrite(pinMotor[1], HIGH);
digitalWrite(pinMotor[2], LOW);

analogWrite(pinMotor[0], speed);
}

void mBack(int pinMotor[3])
{
digitalWrite(pinMotor[1], LOW);
digitalWrite(pinMotor[2], HIGH);

analogWrite(pinMotor[0], speed);
}

void fStop(int pinMotor[3])
{
digitalWrite(pinMotor[1], LOW);
digitalWrite(pinMotor[2], LOW);

analogWrite(pinMotor[0], 0);
}

// ————————————————————–
// ————————— F I N —————————-
// ————————————————————–

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s