Como utilizar Listas con mBot

Introducción

Las listas o arrays nos permiten realizar programas más complejos, donde poder almacenar una serie de valores  para posteriormente utilizarlos para realizar cualquier acción.

Vamos a ver cómo usar las listas para convertir al mBot en un robot que pueda almacenar pasos para ejecutarlos uno a uno posteriormente ( como funcionan los robots como el Beebot o el Escornabot)

Para realizar este programa usaremos eBlock ya que nos permite trabajar con listas tanto en modo online como compilando y subiendo el programa a la placa

Programa

Utilizamos las flechas del mando remoto incluido en el mBot, para almacenar cada una de las direcciones que queremos que ejecute y posteriormente podremos pulsar el botón central "Icono de Setting" para ejecutar las acciones almacenadas.

Para ello hemos creado una lista (array) que se llama pasos,  para almacenar cada una de las direcciones pulsadas en forma de números
( Flecha arriba =1, Flecha abajo = 2, Izquierda = 3, Derecha =4 )

Resumen

  • Si el mBot no está en modo caminando , permitir añadir pasos con las flechas del mando
  • Si pulso el botón central, cambiar el modo a caminando
  • Si estamos en modo caminando ejecutar cada uno de los pasos almacenados

Código en Bloques

Bucle principal

Funciones de ayuda

Se han creado las siguientes funciones de ayuda para hacer mucho más legible el programa.

Código Arduino resultante 

#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <MeMCore_basic.h>
#include "ListLib.h"

MeDCMotor motor_9(9);
MeDCMotor motor_10(10);
void move(int direction, int speed);

void AnadirPaso();
double direccion;
List<double> pasos;
MeIR ir;
MeBuzzer buzzer;
void CaminarSiguientePaso();
double paso;
void Inicializar();
double caminando;

void setup(){
    ir.begin();
    Inicializar();
}

void loop(){
    if(((caminando)==(0))){
        AnadirPaso();
    }else{
        paso += 1;
        if((paso) < (pasos.Count())){
            CaminarSiguientePaso();
        }else{
            Inicializar();
        }
    }
    if(ir.keyPressed(21)){
        paso = 0;
        caminando = 1;
    }
    _loop();
}

void _loop(){
    ir.loop();
}

void AnadirPaso()
{
    if(ir.keyPressed(64)){
        direccion = 1;
    }
    if(ir.keyPressed(25)){
        direccion = 2;
    }
    if(ir.keyPressed(7)){
        direccion = 3;
    }
    if(ir.keyPressed(9)){
        direccion = 4;
    }
    if((direccion) > (0)){
        pasos.Add(direccion);
        direccion = 0;
        buzzer.tone(262, 500);
        delay(20);
        _delay(0.2);
    }
}

void CaminarSiguientePaso()
{
    direccion = pasos[paso];
    if(((direccion)==(1))){
        move(1,100);
    }
    if(((direccion)==(2))){
        move(2,100);
    }
    if(((direccion)==(3))){
        move(4,100);
    }
    if(((direccion)==(4))){
        move(3,100);
    }
    _delay(0.6);
    move(1,0);
    _delay(0.5);
}

void Inicializar()
{
    paso = 0;
    pasos.RemoveRange(0, pasos.Count()-1 );
    caminando = 0;
    buzzer.tone(98, 500);
    delay(20);
}

void register_callback( uint8_t event,   void (*in_main_func)()  ){
}

void _delay(float seconds){
    long endTime = millis() + seconds * 1000;
    while(millis() < endTime)_loop();
}

void move(int direction, int speed)
{
          int leftSpeed = 0;
          int rightSpeed = 0;
          if(direction == 1){
                	leftSpeed = speed;
                	rightSpeed = speed;
          }else if(direction == 2){
                	leftSpeed = -speed;
                	rightSpeed = -speed;
          }else if(direction == 3){
                	leftSpeed = -speed;
                	rightSpeed = speed;
          }else if(direction == 4){
                	leftSpeed = speed;
                	rightSpeed = -speed;
          }
          motor_9.run((9)==M1?-(leftSpeed):(leftSpeed));
          motor_10.run((10)==M1?-(rightSpeed):(rightSpeed));
}